CNC Fanuc 設備數據採集

爲了這個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         }
相關文章
相關標籤/搜索