為了這個Fanuc(發那科)數控機床數據的采集也花費了不少精力,先是去供應商那里了解,基本都是代理商,沒有技術支持。
在網上也有關於Fanuc的以太網Ethernet連接文檔,那里面有說明,大概是開發需要SDK(focas2),知道這點就是進步很大,就在淘寶上買了SDK,但是打開才發現里面的接口眾多,光看這接口文檔就花了不少時間,終於找到了關於網絡通信的兩個重要接口,打開連接
public static extern short cnc_allclibhndl3([In, MarshalAs(UnmanagedType.AsAny)] Object ip, ushort port, int timeout, out ushort FlibHndl);
關閉連接 public static extern short cnc_resetconnect(ushort FlibHndl); 這一步很重要,但是后面的就難了。
最基本的,我想知道Fanuc當前已完成的工件數,要想取工件計數就不知道調用哪個接口了,大海撈針。幾乎我把所有和read相關的接口都試了一遍,和當前機台面板上的工件計數比較都不對。這深層次的計數問題,找代理商根本沒用,他們要不是電話不通,就是“我也不了解”、“我不懂開發”。
最后發現,發那科的C#開發包只用到了 Fwlib32.dll 和 fwlibe1.dll 是關於以太網通信的。
調用的接口 public static extern short cnc_rdmacro(ushort FlibHndl, short a, short b, [Out, MarshalAs(UnmanagedType.LPStruct)] ODBM c); 也就是讀取Fanuc里面的宏變量的值。
具體代碼C#:
1 private bool ConnectFanuc(string ip, ref ushort handler, ushort port = 10000) 2 { 3 try 4 { 5 short result = Focas1.cnc_allclibhndl3(ip, port, 3, out handler); 6 return result == 0; 7 } 8 catch (Exception err) 9 { 10 _logger.Error(ip, err); 11 return false; 12 } 13 } 14 15 private void CloseFanuc(ushort handler) 16 { 17 try 18 { 19 short result = Focas1.cnc_resetconnect(handler); 20 if (result != 0) 21 { 22 _logger.Error("Fanuc關閉連接異常"); 23 } 24 } 25 catch (Exception err) 26 { 27 _logger.Error("Fanuc關閉連接", err); 28 } 29 } 30 31 private int GetFanucData(ushort handler) 32 { 33 try 34 { 35 Focas1.ODBM result = new Focas1.ODBM(); 36 short r = Focas1.cnc_rdmacro(handler, 0xF3D, 0xA, result); 37 var qty = result.mcr_val.ToString().Substring(0, result.mcr_val.ToString().Length - result.dec_val); 38 return Convert.ToInt32(qty); 39 } 40 catch (Exception err) 41 { 42 _logger.Error(err); 43 return -1; 44 } 45 }