爲了這個Fanuc(發那科)數控機牀數據的採集也花費了很多精力,先是去供應商那裏瞭解,基本都是代理商,沒有技術支持。網絡
在網上也有關於Fanuc的以太網Ethernet鏈接文檔,那裏面有說明,大概是開發須要SDK(focas2),知道這點就是進步很大,就在淘寶上買了SDK,可是打開才發現裏面的接口衆多,光看這接口文檔就花了很多時間,終於找到了關於網絡通訊的兩個重要接口,打開鏈接spa
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相關的接口都試了一遍,和當前機臺面板上的工件計數比較都不對。這深層次的計數問題,找代理商根本沒用,他們要不是電話不通,就是「我也不瞭解」、「我不懂開發」。code
最後發現,發那科的C#開發包只用到了 Fwlib32.dll 和 fwlibe1.dll 是關於以太網通訊的。blog
調用的接口 public static extern short cnc_rdmacro(ushort FlibHndl, short a, short b, [Out, MarshalAs(UnmanagedType.LPStruct)] ODBM c); 也就是讀取Fanuc裏面的宏變量的值。接口
具體代碼C#:ip
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 }