日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈几种主流数控机床的数据采集技术

發布時間:2024/1/1 编程问答 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈几种主流数控机床的数据采集技术 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ?馬上即將畢業了,就自己在學校做的項目中包含有幾種主流數控系統需要進行數據采集,總結一下之前的一些經驗和開發工作,也希望后面再做相關技術研究的時候少踩點坑,同時也算是一個階段的總結吧,畢竟馬上要從事一個與這個行業不太相關的領域了,記錄一下,以后翻翻還能記起以前做過什么。

1.1?Fanuc數控系統機床數據采集方法

???以下介紹的為帶有以太網接口的Fanuc數控系統的數據采集方法,如果不帶有以太網接口,需要采用串口通訊進行采集。

1.1.1 FOCAS簡介和基本功能

采集Fanuc系列的機床數據,我們需要用到FOCAS1/2開發包,FOCAS是FANUC Open CNC API Specifications version 1 or 2的縮寫,FOCAS1主要應用于0i和16i/18i/21i/系列,FOCAS2則針對30i/31i/32i系列CNC。

CNC/PMC數據窗口功能可以通過HSSB或以太網(TCP/IP)接口在PC和CNC之間完成交換數據和信息共享,他的主要功能包括以下幾部分:

1:CNC:NC控制的伺服軸、主軸相關數據的讀寫。

?????????包括絕對坐標、相對坐標、機床坐標、剩余移動量以及實際進給速度等。

2:CNC:加工程序的相關操作。

? ? ? ? ?這些操作包括NC程序的上傳/下載、程序校檢、查找以及刪除。讀取CNC程序目錄以及通過電腦實現CNC加工。

3:CNC:讀寫CNC文件數據。

???????? 這些數據包括刀具偏置、工件坐標系偏置、參數、設定、用戶宏程序變量、P-Code宏程序變量以及螺距誤差補償數值。

4:CNC:讀寫刀具壽命管理信息。

5:CNC:讀取歷史信息記錄。

?????????這些信息包括操作歷史記錄和報警歷史記錄。

6:CNC:讀取伺服、主軸數據。

7:CNC:讀寫數據服務器、DNC1、DNC2、OSI-Ethernet(只能使用HSSB)相關信息。

8:CNC:讀寫波形診斷數據。

9:CNC:讀寫沖床CNC數據。

10:CNC:讀寫激光器CNC數據。

11:CNC:讀寫伺服學習控制相關數據(只能使用HSSB)。

12:CNC:讀寫其他數據。

13:PMC:讀寫PMC相關數據。

??????????這些數據包括G、F、Y、X、A、R、T、C、D地址等。

14:PMC:讀寫PROFIBUS-DP相關內容。

1.1.2使用以太網方式連接的相關設定

FOCAS 通過以太網方式連接電腦和 CNC 系統時,使用 TCP/IP 通訊協議。在 CNC 上通常使用 FANUC 以太網板,或者 FANUC 快速以太網板。對于 16i/18i/21i 系列或者 30i/31i/32i系列,還可以使用內嵌以太網功能。

使用 FOCAS 通訊時,可以按照以下步驟進行設定:

  • 設定電腦 ip,網上鄰居 -> 本地連接 -> Internet 協議(TCP/IP)。
  • ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    ?

    ? ?2.?在 CNC 上設定以太網功能或者內嵌以太網功能相關參數,MDI 上 system 鍵 ->“向右” 擴展鍵 -> “ETHPRM”軟鍵 -> “(操作)”軟鍵 -> “板卡”軟鍵

    ?

    ? ? ? ?在這個畫面設定端口號(TCP)8193,時間間隔10。

    ? 3 .?使用網線連接電腦和 CNC。一般使用交叉線,如果通過集線器、交換機等設備,則使用直通線。

    1.1.3詳細開發流程

  • 準備工作:FOCAS2開發包(包含Fwlib32.dll等需要用到的dll);
  • ? ? ? ?VisualStudio 2017;

    ? ? ? FOCAS說明文檔(所有機床相關數據函數調用方法 )

    ? ? ? ?FOCAS_Api_Help;(以XML文件形式提供一些接口上的幫助)

    ? ? 2、開發流程

    ?(1)連接方式:采用以太網連接,實驗采用的CNC的IP地址為192.168.0.1,端口號為8193,PC側IP只要配在同一個局域網即可,實驗用的PC機的IP為192.168.0.10。IP的配置方法這里不再贅述。

    (2)PC端工程搭建操作:使用visual studio 2017新建一個C# Windows窗體應用程序,如下圖:

    ? ??然后進入工程文件,部署FOCAS文件,如下圖所示:

    ? ? ? ?如上圖所示,首先將將fwlib32.cs文件添加至工程文件,該文件在FOCAS2_Libraries\Fwlib\Dot NET sample路徑下。然后在你新建的項目的bin\Debug目錄下將要用到的動態鏈接庫全部考進去。如下圖所示,所用到的dll在FOCAS2_Libraries下的Fwlib文件夾中,直接全部拷到工程目錄下即可。?

    ??做完以上的所有準備工作后就可以正式開始開發了。?

    3、API函數的使用方法:API具體的函數調用方法可以參見FOCAS說明文檔,如下圖所示:

    ? ? ?這里只對一些常用的API函數進行介紹。

    ? ? 與CNC建立連接:參考FOCAS說明文檔中的Function related to library handle, node文件夾中的Function Reference related to library handle, node_cnc_allclibhndl3.doc.在測試與機床連接函數時,要首先建立機床與PC機的物理連接,保證他們之間能夠ping通,具體方法這里不再贅述。參考代碼如下:

    private void btnConc_Click(object sender, EventArgs e){string ip = txtIp.Text;string port = txtPort.Text;string timeout = txtTimeOut.Text;int ret = Fanuc.cnc_allclibhndl3(ip, Convert.ToUInt16(port), Convert.ToInt32(timeout), out Fanuc.h);if (ret == Fanuc.EW_OK){//“函數方法””}

    ? ? 與CNC斷開連接:參考FOCAS說明文檔中的Function related to library handle, node文件夾中的Function Reference related to library handle, node_cnc_freelibhndl.doc,具體代碼如下:

    private void btnDisConn_Click(object sender, EventArgs e){ int ret = Fanuc.cnc_freelibhndl(Fanuc.h);if (ret == Fanuc.EW_OK){MessageBox.Show(“與機床斷開連接”);}else{MessageBox.Show(ret + "");}}

    ? ?采集坐標信息:我們需要參考FOCAS說明文檔:

    ? ?FANUC related to controlled axis&spindle_cnc_absolute.doc;

    ? ?Function related to controlled axis&spindle_cnc_relative.doc;

    ? ?Function related to controlled axis&spindle_cnc_machine.doc;

    ? ?他們分別是機床的絕對坐標,相對坐標和機床坐標。以下為本人自己寫的獲取位置坐標信息的函數,可供參考。

    Fanuc.ODBPOS?fos = new?Focas1.ODBPOS();public?void?get_postion()//獲取位置信息{ ????short?num = Fanuc.MAX_AXIS;short?type = -1;short?ret = Fanuc.cnc_rdposition(Fanuc.h, type, ref?num, fos);if?(ret == 0){//相對坐標label12.Text = fos.p1.rel.name.ToString();label13.Text = fos.p2.rel.name.ToString();//label14.Text = fos.p3.rel.name.ToString();label15.Text = fos.p4.rel.name.ToString();label16.Text = fos.p5.rel.name.ToString();X_Relative.Text = Convert.ToString(fos.p1.rel.data * Math.Pow(10, -fos.p1.rel.dec));Z_Relative.Text = Convert.ToString(fos.p2.rel.data * Math.Pow(10, -fos.p2.rel.dec));//textBox10.Text = Convert.ToString(fos.p3.rel.data * Math.Pow(10, -fos.p3.rel.dec));C_Relative.Text = Convert.ToString(fos.p4.rel.data * Math.Pow(10, -fos.p4.rel.dec));V_Relative.Text = Convert.ToString(fos.p5.rel.data * Math.Pow(10, -fos.p5.rel.dec));//絕對坐標label21.Text = fos.p1.abs.name.ToString();label20.Text = fos.p2.abs.name.ToString();label18.Text = fos.p4.abs.name.ToString();label17.Text = fos.p5.abs.name.ToString();X_Absolute.Text = Convert.ToString(fos.p1.abs.data * Math.Pow(10, -fos.p1.abs.dec));Z_Absolute.Text = Convert.ToString(fos.p2.abs.data * Math.Pow(10, -fos.p2.abs.dec));C_Absolute.Text = Convert.ToString(fos.p4.abs.data * Math.Pow(10, -fos.p4.abs.dec));V_Absolute.Text = Convert.ToString(fos.p5.abs.data * Math.Pow(10, -fos.p5.abs.dec));//機器坐標label26.Text = fos.p1.mach.name.ToString();label25.Text = fos.p2.mach.name.ToString();//label24.Text = fos.p3.mach.name.ToString();label23.Text = fos.p4.mach.name.ToString();label22.Text = fos.p5.mach.name.ToString();X_Machine.Text = Convert.ToString(fos.p1.mach.data * Math.Pow(10, -fos.p1.mach.dec));Z_Machine.Text = Convert.ToString(fos.p2.mach.data * Math.Pow(10, -fos.p2.mach.dec));C_Machine.Text = Convert.ToString(fos.p4.mach.data * Math.Pow(10, -fos.p4.mach.dec));V_Machine.Text = Convert.ToString(fos.p5.mach.data * Math.Pow(10, -fos.p5.mach.dec));//剩余移動距離label31.Text = fos.p1.dist.name.ToString();label30.Text = fos.p2.dist.name.ToString();label28.Text = fos.p4.dist.name.ToString();label27.Text = fos.p5.dist.name.ToString();X_DistanceToGo.Text = Convert.ToString(fos.p1.dist.data * Math.Pow(10, -fos.p1.dist.dec));Z_DistanceToGo.Text = Convert.ToString(fos.p2.dist.data * Math.Pow(10, -fos.p2.dist.dec));C_DistanceToGo.Text = Convert.ToString(fos.p4.dist.data * Math.Pow(10, -fos.p4.dist.dec));V_DistanceToGo.Text = Convert.ToString(fos.p5.dist.data * Math.Pow(10, -fos.p5.dist.dec));}}

    ? ? ?采集主軸轉速:我們需要參考說明文檔的Function related to controlled axis&spindle_cnc_acts.doc.以下為采集主軸轉速的函數參考:

    ?Fanuc.ODBACT?pindle = new?Focas1.ODBACT(); ?????public?void?get_pindle()//獲取主軸的轉速{short?num = 32;short?ret = Fanuc.cnc_acts(Fanuc.h, pindle);if?(ret == 0){SpindleSpeed.Text = pindle.data.ToString();}}

    ? ??采集主軸、伺服軸的負載:參考說明文檔:

    ? ? Function related to controlled axis&spindle_cnc_rdspmeter.doc

    ? ? Function related to controlled axis&spindle_cnc_rdsvmeter.doc.參考代碼如下:

    Fanuc.ODBSVLOAD?sv = new?Focas1.ODBSVLOAD();Fanuc.ODBSPLOAD?sp = new?Focas1.ODBSPLOAD();public?void?get_load()//主,伺服軸的加載計//測試成功{short?a = 6;//伺服軸的數量short?ret = Fanuc.cnc_rdsvmeter(Fanuc.h, ref?a, sv);short?ret2 = Fanuc.cnc_rdspmeter(Fanuc.h, 1, ref?a, sp);if?(ret == 0 && ret2 == 0){SpindleLoad.Text =Convert.ToString(sp.spload1.spload.data);sv1_Load.Text = Convert.ToString(sv.svload1.data); ???//伺服軸1負載sv2_Load.Text = Convert.ToString(sv.svload2.data); ???//伺服軸2負載sv3_Load.Text = Convert.ToString(sv.svload3.data); ???//伺服軸3負載sv4_Load.Text = Convert.ToString(sv.svload4.data); ???//伺服軸4負載}

    ? ?采集主軸名稱:參考說明文檔的

    ? ?Function related to controlled axis&spindle_cnc_rdspdlname.doc。參考代碼如下:

    //獲取主軸名稱Fanuc.ODBEXAXISNAME?spindlename = new?Focas1.ODBEXAXISNAME();public?void?get_spindlename(){short?data_num = 32;short?ret = Focas1.cnc_exaxisname(Fanuc.h,1,ref?data_num, spindlename);if(ret==0){Spindle_Name.Text = spindlename.axname1;}

    ? ?采集實際進給速度:參考說明文檔的

    ? ?Function related to controlled axis&spindle_cnc_actf.doc。參考代碼如下:

    ?Focas1.ODBACT?odbact = new?Focas1.ODBACT();public?void?get_actfeed() {short?ret = Focas1.cnc_actf(Fanuc.h,odbact);if?(ret == 0){RelFeedRate.Text = Convert.ToString(odbact.data);}}

    ? ?獲取機床的狀態:參考說明文檔的 Function related to others_cnc_statinfo.doc。參考代碼如下:

    //機床狀態Fanuc.ODBST?obst = new?Focas1.ODBST();public?void?get_state()//獲取機器的狀態{Fanuc.cnc_statinfo(Fanuc.h, obst);cnc_status.Text = Convert.ToString(obst.run);//0停止,1待機,開動Alarm_Status.Text = Convert.ToString(obst.alarm);//0沒有警報,1表示有警報RunningMode.Text = Convert.ToString(obst.tmmode);}

    ? ?獲取主程序號、正在運行的程序號:參考說明文檔的

    ? ?Function related to CNC program_cnc_rdprgnum.doc。參考代碼如下:

    Fanuc.ODBPRO?pro = new?Fanuc.ODBPRO();public?void?get_program(){short?ret = Focas1.cnc_rdprgnum(Fanuc.h, pro);if?(ret == 0){CurrentRunningProgramNumber.Text = Convert.ToString(pro.data);MainProgramNumber.Text = Convert.ToString(pro.mdata);//}???????}

    ? ?獲取報警類型:參考說明文檔的Function related to others_cnc_alarm2.doc。參考代碼如下:

    獲取報警類型public?void?get_alarmtype() {int?alarm = 0;short?ret = Focas1.cnc_alarm2(Fanuc.h,out?alarm);if?(ret == 0){switch?(alarm){case?0:listBox3.Items.Add("Parameter switch on (SW)");Global.AlarmType = "Parameter switch on (SW)";break;case?1:listBox3.Items.Add("Power off parameter set (PW)");Global.AlarmType = "Power off parameter set (PW)";break;case?2:listBox3.Items.Add("I/O error (IO)");Global.AlarmType = "I/O error (IO)";break;case?3:listBox3.Items.Add("Foreground P/S (PS)");Global.AlarmType = "Foreground P/S (PS)";break;case?4:listBox3.Items.Add("Overtravel,External data");Global.AlarmType = "Overtravel,External data";break;case?5:listBox3.Items.Add("Overheat alarm");Global.AlarmType = "Overheat alarm";break;case?6:listBox3.Items.Add("Servo alarm");Global.AlarmType = "Servo alarm";break;case?8:listBox3.Items.Add("Data I/O error");Global.AlarmType = "Data I/O error";break;case?9:listBox3.Items.Add("Spindle alarm");Global.AlarmType = "Spindle alarm";break;case?10:listBox3.Items.Add("Other alarm(DS)");Global.AlarmType = "Other alarm(DS)";break;case?11:listBox3.Items.Add("Alarm concerning Malfunction prevent functions (IE)");Global.AlarmType = "Alarm concerning Malfunction prevent functions (IE)";break;case?12:listBox3.Items.Add("Background P/S (BG)");Global.AlarmType = "Background P/S (BG)";break;case?13:listBox3.Items.Add("Syncronized error (SN)");Global.AlarmType = "Syncronized error (SN)";break;case?14:listBox3.Items.Add("reserved");Global.AlarmType = "reserved";break;case?15:listBox3.Items.Add("External alarm message");Global.AlarmType = "External alarm message";break;case?16:listBox3.Items.Add("reserved");Global.AlarmType = "reserved";break;case?17:listBox3.Items.Add("reserved");Global.AlarmType = "reserved";break;case?18:listBox3.Items.Add("reserved");Global.AlarmType = "reserved";break;case?19:listBox3.Items.Add("PMC error (PC)");Global.AlarmType = "PMC error (PC)";break;default:listBox3.Items.Add("No Alarm");Global.AlarmType = "No Alarm";break;}}}

    ? ?獲取報警類型:參考說明文檔的Function related to others_cnc_rdalmmsg2.doc。參考代碼如下:

    Fanuc.ODBALMMSG2?msg = new?Focas1.ODBALMMSG2();public?void?get_message(){short?b = 8;short?ret = Fanuc.cnc_rdalmmsg2(Fanuc.h, -1, ref?b, msg);string?str1 = "msg";System.Type?type = msg.GetType();if?(ret == 0){for?(int?i = 1; i < 3; i++){str1 = "msg"?+ i;object?obj = type.GetField(str1).GetValue(msg);System.Type?type1 = obj.GetType();AlarmNumber.Text = Convert.ToString(type1.GetField("alm_no").GetValue(obj));listBox4.Items.Add(type1.GetField("alm_msg").GetValue(obj).ToString());Global.AlarmMessage = type1.GetField("alm_msg").GetValue(obj).ToString();}}}

    ? ? 獲取循環時間:這個API采FOCAS說明文檔中沒有找到,但是在XML所提供的API Help中有介紹,這里我參考api help的介紹和對機床的一些基本了解寫了一下采集循環時間的函數,可供參考,代碼如下:

    public?void?get_circleTime(){Fanuc.IODBPSD_1?param6757 = new?Fanuc.IODBPSD_1();Fanuc.IODBPSD_1?param6758 = new?Fanuc.IODBPSD_1();short?ret = Fanuc.cnc_rdparam(Fanuc.h, 6757, 0, 8, param6757);if?(ret == 0){int?circlingTimeSec = param6757.ldata / 1000;ret = Fanuc.cnc_rdparam(Fanuc.h, 6758, 0, 8, param6758);if?(ret == 0){int?circlingTimeMin = param6758.ldata;int?workingTime = circlingTimeMin * 60 + circlingTimeSec;CirclingTime.Text = Convert.ToString(workingTime) + "秒";}}}

    ? ? ? ?這里需要注意的是Fanuc.cnc_rdparam這個函數中的第二個參數要明白其含義,它代表的是機床PARAMETER參數表的序號,如下圖所示,編號6757和6758表示的是循環時間,其中6757存儲的值單位是ms,6758存儲的值單位是min。

    ?

    ? ? 獲取切削時間:同樣是在XML所提供的API Help中有介紹,6753和6754存儲的是切削時間的數值,同樣6753存儲的時間單位是ms,6754存儲的時間單位是min,最后全部換算成秒將其累加便是總時間,獲取切削時間的函數參考代碼如下:

    //得到切削時間public??void?get_cuttingTime(){Fanuc.IODBPSD_1?param6753 = ?new?Fanuc.IODBPSD_1();Fanuc.IODBPSD_1?param6754 = ?new?Fanuc.IODBPSD_1();short?ret = Fanuc.cnc_rdparam(Fanuc.h, 6753, 0, 8+32, param6753);if?(ret == 0){int?cuttingTimeSec = param6753.ldata / 1000;ret = Fanuc.cnc_rdparam(Fanuc.h, 6754, 0, 8+32, param6754);if?(ret == 0){int?cuttingTimeMin = param6754.ldata;int?workingTime = cuttingTimeMin * 60 + cuttingTimeSec;CuttingTime.Text = Convert.ToString(workingTime) + "秒";}}}

    ? ? ?獲取運行時間:同樣是在XML所提供的API Help中有介紹,6751和6752存儲的是運行時間的數值,同樣6751存儲的時間單位是ms,6752存儲的時間單位是min,最后全部換算成秒將其累加便是總時間,獲取切削時間的函數參考代碼如下:

    //得到運行時間public?void?get_workingTime(){Fanuc.IODBPSD_1?param6751 = new?Fanuc.IODBPSD_1();Fanuc.IODBPSD_1?param6752 = new?Fanuc.IODBPSD_1();short?ret= Fanuc.cnc_rdparam(Fanuc.h, 6751, 0, 8, param6751);if?(ret == 0){int?workingTimeSec = param6751.ldata / 1000;ret = Fanuc.cnc_rdparam(Fanuc.h, 6752, 0, 8, param6752);if(ret==0){int?workingTimeMin = param6752.ldata;int?workingTime= workingTimeMin * 60 + workingTimeSec;OperatingTime.Text = Convert.ToString(workingTime)+"秒";}}

    ? ? 獲取開機時間:同樣是在XML所提供的API Help中有介紹,6750存儲的是開機時間的數值,同樣6750存儲的時間單位是min,每隔一分鐘更新一次,這個數值表示的是總共的累加值。獲取開機時間的函數參考代碼如下:

    //得到開機時間public?void?get_powerOnTime(){Fanuc.IODBPSD_1?param6750 = new?Fanuc.IODBPSD_1();short?ret = Fanuc.cnc_rdparam(Fanuc.h, 6750, 0, 8+32, param6750);if?(ret==0){int?powerOnTime= param6750.ldata*60;PowerOnTime.Text = Convert.ToString(powerOnTime)+"秒";}}

    ? ?得到工件總數:同樣是在XML所提供的API Help中有介紹,6712存儲的加工工件總數的數值。獲取工件總數的函數參考代碼如下:

    //得到加工件數public?void??get_totalparts(){Fanuc.IODBPSD_1?param6712 = new?Fanuc.IODBPSD_1();short?ret = Fanuc.cnc_rdparam(Fanuc.h, 6712, 0, 8, param6712);if?(ret == 0){int?totalparts = param6712.ldata;TotalParts.Text = Convert.ToString(param6712.ldata);}

    1.2 西門子OPC采集數據采集方法(以840D為代表)

    1.2.1利用VB編寫OPC客戶端采集機床數據

    ? ? ?采用VB6.0調用sopcdaauto.dll和sopcaeauto.dll來進行編程采集機床數據的,用此種方法用到的是OPC 的自動化接口,需要將編寫好的OPC客戶端嵌入到機床HMI中才能進行采集,也就是只能實現本地的采集,配置dcom遠程采集總是會報錯。所以可以將采集程序集成到HMI中,再通過Socket發送到上位機中。

    1.2.2利用C++(MFC)編寫OPC客戶端采集機床數據

    ? ? ? ?此種方法需要對微軟的com技術有一定的了解,因為opc是基于com技術進行通信的,而用MFC我們需要自己寫這些接口函數,也就是用到了OPC的自定義接口而不是直接調用動態鏈接庫,所以開發成本和難度相對較高。因此開發前需要先了解com原理,并懂得MFC的一些相關知識。

    ? ? ? 在開發前,首先需要配置PC機和機床PC機的COM/DCOM,具體配置步驟如下:

    ? ? ? 1.從opcfoundation.org下載opc組件并安裝。目前測試所用的版本為3.0。客戶端和服務器端均需要。

    ? ? ? 2.在客戶端和服務器端建立相同用戶名和密碼的賬戶(或是用戶組)。

    ? ? ? 3.防火墻配置。運行wf.msc,允許Windows Management Instrumentation、OPC Server Enumerator(位于c:\windows\syswow64\opcenum.exe)(也可通過設置TCP135端口來實現)、OPC客戶端程序、OPC服務器程序。

    ? ? ? 4.啟用網絡發現服務,即在網上鄰居中需要看到另一臺電腦。

    ? ? ? 5.啟用文件和打印機共享。

    ? ? ? 6.運行dcomcnfg。

    ? ? ? DCOM總體配置:默認屬性:連接、標識

    ? ? ? ? ? ? ?COM安全中的

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 訪問權限條目:編輯限制中允許下列的本地和遠程操作

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? Everyone、System、分布式用戶組、交互式用戶、匿名登錄

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?默認值為以上幾個加上Self和Administration

    ? ? ? ? ? ? ?啟動和激活權限條目:編輯限制中編輯限制中允許下列的本地和遠程操作

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Everyone、System、Administration、分布式用戶、交互式用戶

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 默認值為以上幾個加上Anonymous

    ? ? ? ? ? ? ? DCOM程序配置:OPCEnum: 身份驗證級別:無

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?安全:前兩個使用默認值

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?標識:系統賬戶

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?服務器程序:身份驗證級別:默認

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?安全:前兩個使用默認值

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?標識:下列用戶(OPC用戶)

    ? ? ? 如果按照以上方式配置不成功,可以百度參考網上的教程,成功的標志是你編寫的客戶端調試過程中可以遠程連接到機床便成功。我們在開發過程中可以用到一款叫OPC Server Demo的exe文件,它可以作為一款opc服務器運行在自己的電腦上方便進行開發測試。

    ? ? ? 開發主要流程和核心代碼如下,詳細開發流程參見西門子OPC西門子工業通信第2卷。:

    ? ? ? 1.注冊COM

    ? ? ? ? HRESULT r1;
    ? ? ? ? r1 = CoInitialize(NULL);?
    ? ? ? 2. 將 ProgID?轉換為 CLSID

    ? ? ? ? r1 = CLSIDFromProgID(L"OPC.SimaticNET", &clsid);
    ? ? ? 3.?建立與OPC服務器的連接

    ? ? ? ? r1 = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER ,
    ? ? ? ?IID_IOPCServer, (void**)&m_pIOPCServer);

    ? ? ? 4. 建立OPC組對象

    ? ? ? ? r1 = m_pIOPCServer->AddGroup(L"grp1", TRUE, 500, 1,
    ? ? ? ?&TimeBias, &PercentDeadband, LOCALE_ID,
    ? ? ? ?&m_GrpSrvHandle, &RevisedUpdateRate,

    ? ? ? ?IID_IOPCItemMgt,
    ? ? ? (LPUNKNOWN*)&m_pIOPCItemMgt);

    ? ? ? 引號部分即為OPC標簽的地址, OPC標簽詳細地址參看LIS2sl_0212_en.pdf.

    ? ? ? 5.?添加數據項到組中

    ? ? ? ?r1 = pItemMgt->AddItems(1, m_Items, &m_pItemResult, &m_pErrors);

    ? ? ? 6.從OPC組對象中獲取?IOPCSyncIO異步訪問?接口,該接口包括Read()和Write()函數。
    ? ? ? ?r1 = m_pIOPCItemMgt->QueryInterface(IID_IOPCSyncIO,
    ????????????????????????????????????????????????????????????????????(void**)&m_pIOPCSyncIO);

    ? ? ? 使用read()和Write()函數方法便可讀到opc項的值。

    ? ? ?7. 刪除對象并釋放內存

    ????在退出程序錢必須要刪除OPC對象并釋放內存,具體代碼如下:

    ? ? ? r1 = m_pIOPCItemMgt->RemoveItems(1, phServer, &pErrors);
    ? ? ? CoTaskMemFree(m_pItemResult);
    ? ? ?m_pItemResult=NULL;

    ? ? ?完成以上幾步便完成了opc遠程客戶端的開發。

    ? ? ?從西門子文檔中摘錄的OPC標簽地址(部分):

    ? ? ?NCK系統類型:

    ? ??

    ? ? 此路徑下存放NCK的一些狀態信息。

    ? ? 手輪狀態:

    ?

    ? ?系統時間:

    ?

    ? ?系統已開啟時間:

    ?

    ? 此路徑下存放一些刀具坐標數據:

    ? 路徑下存放伺服軸的電流、加速度、負載、功率、進給率、狀態等數

    ?

    ? ?主軸相關數據:

    ? ? ? 以上只是摘錄自西門子官方手冊的一小部分,在西門子官方手冊上,能夠采集到的數據還有例如NC程序狀態相關的數據,NC程序名、程序狀態、當前程序行號、刀具編號、程序已運行的時間等,還包括一些工藝參數,報警信息等均可通過查閱該手冊找到所處的路徑,然后在程序中添加這些OPC item就可以采集到想要的數據。

    1.2.3利用PLC進行采集機床數據(此方法不僅適用于840d也適用于其他支持opc的數控系統)

    ? ? ? ?西門子PLC的S7協議可以支持PLC與遠程設備的數據交互,而在西門子數控系統內部,PLC與NC之間是可以進行數據通信的,在step7中通過調用FB2并設置相關的參數來實現間接的訪問數控系統內部的數據。具體實現方式為通過NC-VAR Selector和Step 7來完成。具體實現步驟為:

    ? ? ?(1)利用NC-VAR Selector工具來選擇NC系統中所需要讀取的系統變量,系統變量包括切削時間、機械坐標、運行模式等,然后將選擇的系統變量以“*.var”格式進行保存。

    ? ? ?(2)將第一步所保存的.var文件通過NC-VAR Selector工具生成可供Step7調用的源文件,以“*.STL”格式進行保存。

    ? ? ?(3)再通過Step7軟件將第二步的源文件導入,然后編譯生成一個DB塊,并給這個DB塊定義一個助記符以方便后續程序中進行調用。

    ? ? ?(4)編寫PLC程序,通過調用PLC中的FB2模塊并設置相應的參數來讀取NC系統中的變量。遠程應用程序借助PLC的以太網接口,通過讀取DB塊中的數據即可采集到的對應的數據。

    1.3 西門子OPC UA數據采集方法(840DSL、828D等)

    ? ? ? ?對于近幾年比較新的西門子數控系統,數控系統內部支持OPC UA方式進行數據采集。西門子數控系統內部安裝有OPC UA服務器,跟機床有關的過程狀態、報警信息等都會存放在OPC UA服務器中,OPC UA服務器這一部分西門子廠商已經封裝好無需再另外開發。實際采集過程中只需要按照OPC UA規范開發標準的OPC UA客戶端,然后訂閱OPC UA服務器節點中的數據項即可。但要使用西門子數控系統OPC UA這一項功能需要去西門子官方開通該授權。

    ? ? OPC UA客戶端的開發遵循以下幾個步驟:

  • 查找OPC UA服務器,并建立連接。根據OPC UA的規范,查找服務器、創建安全通道、創建安全會話。
  • 根據OPC UA服務器中定義的節點地址空間,瀏覽地址集。
  • 讀取、修改、訂閱地址空間中的節點信息。
  • 斷開連接。根據OPC UA規范,關閉會話、關閉安全通道服務集。
  • ? ? OPC UA服務器的開發使用open62541官方開源開發包進行開發,遵循以下幾個步驟:

    ? ? 建立OPC?UA工業統一接口來實現對異構數控系統機床的數據采集,其實現方式主要包括以下幾點:

    ? (1)建立異構數控機床信息源模型。根據數控機床所存在的共同屬性進行建模,縷清各個屬性之間的從屬關系。

    ? (2)將建立的信息源模型映射到OPC?UA信息模型上。建立的異構數控機床信息源模型到OPC?UA信息模型的映射方法有兩種。一種是利用OPC?UA官方提供的建模工具來實現映射,此方法的優勢是方便快捷,操作迅速,但是缺乏靈活性;另一種方式是手動添加各個異構機床信息源模型中的數據項到OPC?UA信息模型當中,該方法的優勢是準確,能夠實現一一對應的關系,缺點是工作量太大。

    ? (3)建立OPC?UA客戶端來實現地址空間的訪問。OPC?UA服務器建立完成后,按照OPC?UA的標準建立OPC?UA客戶端即可實現對OPC?UA服務器中建立的各個節點信息進行訪問。

    ? ? OPC?UA服務器的整體開發流程如圖所示。將XML文檔所描述的異構數控機床信息源加載到服務器中形成數控機床信息模型的OPC UA實例,從而實現對異構數控機床接口的統一,為外部OPC?Client提供定義好的節點路徑實現數據采集。將所建立的異構數控機床信息源的靜態屬性,例如設備名稱、設備編號等,此類數據直接通過XML文檔可以直接映射到OPC?UA地址空間的節點當中;但是對于過程數據,例如坐標、轉速等,此類數據利用OPC?UA模型有一定的缺陷。可采用的解決方案為:通過機床通訊中間件實現對底層異構數控系統的封裝,然后將統一的接口映射到OPC?UA服務器地址空間的節點上,每次調用接口函數時加載底層的動態鏈接庫中提供的采集函數,從而實現OPC?UA服務器對實時過程數據的采集。OPC?UA服務器的開發流程如圖所示,使用的OPC?UA開源庫為open62541:

    ? ?具體開發流程為:

    ?(1) 配置config,包括安全證書、對外開放的端口等,然后調用OPC_UA_Server_new(config)

    對服務器進行初始化操作。

    ?(2)根據建立的異構機床信息源模型和OPC?UA的XML文檔建模規則,調用OPC?UA開源庫中的AddObjectNode()方法和AddVariableNode()方法來建立OPC?UA地址空間中的各個節點的屬性和相互關系。

    ?(3)調用啟動服務器監聽方法OPC_UA_Server_run(server),在控制臺界面會返回一個供OPC?UA Client連接的地址,OPC?UA?Client根據此地址即可訪問OPC?UA?Sever內部節點中的變量。

    1.4 海德漢機床數據采集方法(Remo Tools開發包

    ? ? ? ?海德漢數控系統的數據采集需要用到Remo Tools開發包,開發包可在附件中查找。開發前首先需要確定DNC功能選項#18打開,另外需要在上位機采集軟件中注冊COM組件,32位的操作系統注冊第一個,64位的操作系統注冊第二個。下圖為Remo Tools SDK的軟件架構圖,可以加深理解具體采用的通信原理。另外,開發過程中建議先縷清對象和接口之間的關系,然后參照示例程序進行開發。

    ?

    ? ? ?以下將對兩種通信方式的數據采集方法進行詳細闡述:

    ? ?(1)利用HeidenhainDNC Component組件進行采集

    ? ? 針對上述Remo Tools SDK,開發包中提供了的HeidenhainDNC Component組件,底層是采用RPC(Remote Procedure Call Protocol)來實現通信的。開發者根據COM組件庫中所提供的API函數即可采集機床內部的數據。采用此方式進行數據采集時,必須要將機床的DNC功能選項#18打開。海德漢的DNC COM組件提供的對象接口遵循以下風格:

  • 結構簡單易懂;
  • 結構適用于所有語言;
  • 接口和接口數量是可擴展的。海德漢的COM組件所使用的對象及接口模型如下圖
  • 3.3所示。

    ? ? ? ?在此模型中,Machine對象保持與NC控件的連接,連接的管理功能轉發到連接組件。連接組件用來管理具有關聯的連接參數的邏輯連接表。用戶使用連接對話框來創建連接以及選擇,編輯或刪除現有連接。連接的設置存儲在Windows注冊表中的HKEY_LOCAL_MACHINE區域中,因此可供所有用戶使用這些連接。如圖所示,為連接組件管理的創建的兩個連接參數,連接參數包括連接名稱(Connection)、連接的海德漢數控系統類型(CNC Type)、連接的主機地址(Host Address)、連接所使用的的通訊協議(Protocol)以及連接的設備在線狀態(Online)。

    ? ? ? ?Machine對象的GetInterface方法返回其他對象之一,例如可以返回Automatic對象、ProcessData對象等。通過這種方法,可以將Machine對象與NC控件的連接傳遞給其他對象。接口按其提供的功能分組。 例如,用于NC自動運行的功能位于JHAutomatic對象中,用于讀取數控系統軸的配置信息位于JHConfiguration對象中。在各個對象中又包含了各種功能豐富的接口,例如JHMachine對象中包含了IJHMachine、IJHMachine2等接口,這些接口有提供了一些功能函數,例如IJHMachine接口所包含的ConnectRequest(([in] BSTR bstrConnectionName)函數,用于請求與某個CNC的連接;IJHConfiguration接口所包含的GetAxesInfo ([out, retval] IJHAxisInfoList **ppList)函數,用于讀取數控系統配置的軸的信息。所有COM類的對象名稱前綴為JH(例如JHMachine),所有的接口都有用于標識的IJH名稱前綴。HeidenhainDNC組件中所包含的部分接口與函數方法如下表所示:

    接口名稱

    函數列表

    功能

    IJHMachine

    Connect

    與服務器進行連接

    ?

    GetState

    獲取CNC啟動狀態

    ?

    GetProgramStatus

    讀取當前程序狀態

    IJHAutomatic

    GetCutterLocation

    GetOverrideInfo

    讀取當前刀具坐標

    讀取當前倍率值

    IJHProcessData

    GetMachineRunningTime GetMachineUpTime

    讀取機床運行時間

    讀取機床開機時間

    ? ? ?開發過程中可以參考開發包說明文檔“HeidenhainDNC.chm”以及官方給的參照示例進行開發。

    ? ? ?(2)利用LSV-2 ActiveX Control控件進行采集

    ? ? ? LSV2 ActiveX控件,是海德漢RemoTools SDK的另一組件,是用于與海德漢控件進行通信的應用程序的軟件開發套件。它提供了LSV-2內部自定義協議,可以實現與iTNC?530和TNC?426/430的TNC控件之間進行通信,進而可以進行Windows應用程序的編程。對于傳輸,可以在串行接口和以太網(TCP / IP)接口之間進行選擇。LSV-2 ActiveX控件負責所有通信,應用程序開發者只能看到簡單的方法,屬性和事件。調用方法通常會觸發一個動作,通過設置屬性,可以影響動作或詢問狀態。每當消息異步傳輸到應用程序時,總是會先報告事件,然后將該事件將添加到Windows消息隊列中,并且可以由父窗口處理。

    ? ? ? LSV-2庫提供了一種與控件進行通信的方式,所以在開發時無需直接處理純LSV2報文。 庫中的功能隱藏了低級通信機制,因此在開發過程中可以輕松創建所需要的功能。在使用過程中,只需要引用lsv2_all.h頭文件即可,它幾乎包含了所有通用的頭文件,除了一些特殊的需要單獨添加頭文件。由于LSV-2庫中使用了數據類型和回調,因此LSV-2庫與<windows.h>具有依賴關系,所以開發的程序需要與ws2_32.lib鏈接。例如:以檢索版本信息為例,需要需要以下步驟:

    ? ? ?1)a將LSV2庫添加到程序所包含路徑;

    ? ? ? ? ? b.將lsv2.lib和ws2_32.lib添加到鏈接器。

    ? ? ?2)a.在程序中添加windows.h和lsv2_all.h頭文件;

    ? ? ? ? ? b.使用LSV2Open()函數建立與控件的連接;

    ? ? ? ? ? c.使用LSV2Login()函數完成注冊;

    ? ? ? ? ? d.?使用LSV2ReceiveVersions()函數來實現檢索版本信息的功能;

    ? ? ? ? ? e.使用LSV2Logout()函數注銷。

    ? ? 常用的LSV2組件庫的API函數如下表所示

    API通訊函數

    功能

    LSV2Open

    與控件建立連接

    LSV2Login

    注冊控件

    LSV2Logout

    注銷控件

    LSV2Close

    斷開連接

    LSV2ReceiveSystemInfo

    讀取系統狀態信息

    LSV2ReceiveVersion

    讀取版本信息

    LSV2ReceiveDncInfo

    讀取DNC信息

    LSV2ReceiveRunInfo

    ?

    ?

    LSV2ReceiveTime

    LSV2GetConnectionState

    讀取正在運行的狀態信息(包括坐標值、運行模式、開機時間、運行時間、運行刀具號等)

    讀取數控系統當前時間

    讀取連接狀態信息

    ? ? ?以上就是一些所熟知的數控系統的數據采集方法,當然現在也了解到市面上有很多針對數控系統做的數據采集網關,各種各樣的都有,但采集方法應該都是相通的,無非是它們把這些通訊庫還有函數庫移植到了arm平臺上。如果嵌入式功底扎實的大佬可以嘗試自己做這樣的網關,里面肯定還是有很多坑要走。本來自己想嘗試做一個的,但最后忙畢業沒時間,也就把這個事放在一邊了。在嵌入式硬件設備上確實也有它的好處,部署方便簡單,價格便宜,當然便宜的是硬件設備,很多做這個數據采集網關的主要還是賣網關中集成的數據采集服務,開通一臺機床多收取一定的費用。哎,為什么制造業一直發展緩慢,我在做項目的切身感受是,制造業的資源太閉塞了!很多時候難的不是開發任務,難的是找資料的過程,它不像互聯網那樣有各種各樣開放的源代碼,可以直接站在前人的肩膀上繼續向前進。制造業的發展必將是信息技術與操作技術相互結合的,需要的是兩者兼備的綜合性人才,還是希望制造業終有一天能夠發展起來吧。

    ?

    總結

    以上是生活随笔為你收集整理的浅谈几种主流数控机床的数据采集技术的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。