浅谈几种主流数控机床的数据采集技术
? ? ? ?馬上即將畢業(yè)了,就自己在學(xué)校做的項(xiàng)目中包含有幾種主流數(shù)控系統(tǒng)需要進(jìn)行數(shù)據(jù)采集,總結(jié)一下之前的一些經(jīng)驗(yàn)和開(kāi)發(fā)工作,也希望后面再做相關(guān)技術(shù)研究的時(shí)候少踩點(diǎn)坑,同時(shí)也算是一個(gè)階段的總結(jié)吧,畢竟馬上要從事一個(gè)與這個(gè)行業(yè)不太相關(guān)的領(lǐng)域了,記錄一下,以后翻翻還能記起以前做過(guò)什么。
1.1?Fanuc數(shù)控系統(tǒng)機(jī)床數(shù)據(jù)采集方法
???以下介紹的為帶有以太網(wǎng)接口的Fanuc數(shù)控系統(tǒng)的數(shù)據(jù)采集方法,如果不帶有以太網(wǎng)接口,需要采用串口通訊進(jìn)行采集。
1.1.1 FOCAS簡(jiǎn)介和基本功能
采集Fanuc系列的機(jī)床數(shù)據(jù),我們需要用到FOCAS1/2開(kāi)發(fā)包,FOCAS是FANUC Open CNC API Specifications version 1 or 2的縮寫(xiě),FOCAS1主要應(yīng)用于0i和16i/18i/21i/系列,FOCAS2則針對(duì)30i/31i/32i系列CNC。
CNC/PMC數(shù)據(jù)窗口功能可以通過(guò)HSSB或以太網(wǎng)(TCP/IP)接口在PC和CNC之間完成交換數(shù)據(jù)和信息共享,他的主要功能包括以下幾部分:
1:CNC:NC控制的伺服軸、主軸相關(guān)數(shù)據(jù)的讀寫(xiě)。
?????????包括絕對(duì)坐標(biāo)、相對(duì)坐標(biāo)、機(jī)床坐標(biāo)、剩余移動(dòng)量以及實(shí)際進(jìn)給速度等。
2:CNC:加工程序的相關(guān)操作。
? ? ? ? ?這些操作包括NC程序的上傳/下載、程序校檢、查找以及刪除。讀取CNC程序目錄以及通過(guò)電腦實(shí)現(xiàn)CNC加工。
3:CNC:讀寫(xiě)CNC文件數(shù)據(jù)。
???????? 這些數(shù)據(jù)包括刀具偏置、工件坐標(biāo)系偏置、參數(shù)、設(shè)定、用戶宏程序變量、P-Code宏程序變量以及螺距誤差補(bǔ)償數(shù)值。
4:CNC:讀寫(xiě)刀具壽命管理信息。
5:CNC:讀取歷史信息記錄。
?????????這些信息包括操作歷史記錄和報(bào)警歷史記錄。
6:CNC:讀取伺服、主軸數(shù)據(jù)。
7:CNC:讀寫(xiě)數(shù)據(jù)服務(wù)器、DNC1、DNC2、OSI-Ethernet(只能使用HSSB)相關(guān)信息。
8:CNC:讀寫(xiě)波形診斷數(shù)據(jù)。
9:CNC:讀寫(xiě)沖床CNC數(shù)據(jù)。
10:CNC:讀寫(xiě)激光器CNC數(shù)據(jù)。
11:CNC:讀寫(xiě)伺服學(xué)習(xí)控制相關(guān)數(shù)據(jù)(只能使用HSSB)。
12:CNC:讀寫(xiě)其他數(shù)據(jù)。
13:PMC:讀寫(xiě)PMC相關(guān)數(shù)據(jù)。
??????????這些數(shù)據(jù)包括G、F、Y、X、A、R、T、C、D地址等。
14:PMC:讀寫(xiě)PROFIBUS-DP相關(guān)內(nèi)容。
1.1.2使用以太網(wǎng)方式連接的相關(guān)設(shè)定
FOCAS 通過(guò)以太網(wǎng)方式連接電腦和 CNC 系統(tǒng)時(shí),使用 TCP/IP 通訊協(xié)議。在 CNC 上通常使用 FANUC 以太網(wǎng)板,或者 FANUC 快速以太網(wǎng)板。對(duì)于 16i/18i/21i 系列或者 30i/31i/32i系列,還可以使用內(nèi)嵌以太網(wǎng)功能。
使用 FOCAS 通訊時(shí),可以按照以下步驟進(jìn)行設(shè)定:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
?
? ?2.?在 CNC 上設(shè)定以太網(wǎng)功能或者內(nèi)嵌以太網(wǎng)功能相關(guān)參數(shù),MDI 上 system 鍵 ->“向右” 擴(kuò)展鍵 -> “ETHPRM”軟鍵 -> “(操作)”軟鍵 -> “板卡”軟鍵
?
? ? ? ?在這個(gè)畫(huà)面設(shè)定端口號(hào)(TCP)8193,時(shí)間間隔10。
? 3 .?使用網(wǎng)線連接電腦和 CNC。一般使用交叉線,如果通過(guò)集線器、交換機(jī)等設(shè)備,則使用直通線。
1.1.3詳細(xì)開(kāi)發(fā)流程
? ? ? ?VisualStudio 2017;
? ? ? FOCAS說(shuō)明文檔(所有機(jī)床相關(guān)數(shù)據(jù)函數(shù)調(diào)用方法 )
? ? ? ?FOCAS_Api_Help;(以XML文件形式提供一些接口上的幫助)
? ? 2、開(kāi)發(fā)流程
?(1)連接方式:采用以太網(wǎng)連接,實(shí)驗(yàn)采用的CNC的IP地址為192.168.0.1,端口號(hào)為8193,PC側(cè)IP只要配在同一個(gè)局域網(wǎng)即可,實(shí)驗(yàn)用的PC機(jī)的IP為192.168.0.10。IP的配置方法這里不再贅述。
(2)PC端工程搭建操作:使用visual studio 2017新建一個(gè)C# Windows窗體應(yīng)用程序,如下圖:
? ??然后進(jìn)入工程文件,部署FOCAS文件,如下圖所示:
? ? ? ?如上圖所示,首先將將fwlib32.cs文件添加至工程文件,該文件在FOCAS2_Libraries\Fwlib\Dot NET sample路徑下。然后在你新建的項(xiàng)目的bin\Debug目錄下將要用到的動(dòng)態(tài)鏈接庫(kù)全部考進(jìn)去。如下圖所示,所用到的dll在FOCAS2_Libraries下的Fwlib文件夾中,直接全部拷到工程目錄下即可。?
??做完以上的所有準(zhǔn)備工作后就可以正式開(kāi)始開(kāi)發(fā)了。?
3、API函數(shù)的使用方法:API具體的函數(shù)調(diào)用方法可以參見(jiàn)FOCAS說(shuō)明文檔,如下圖所示:
? ? ?這里只對(duì)一些常用的API函數(shù)進(jìn)行介紹。
? ? 與CNC建立連接:參考FOCAS說(shuō)明文檔中的Function related to library handle, node文件夾中的Function Reference related to library handle, node_cnc_allclibhndl3.doc.在測(cè)試與機(jī)床連接函數(shù)時(shí),要首先建立機(jī)床與PC機(jī)的物理連接,保證他們之間能夠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){//“函數(shù)方法””}? ? 與CNC斷開(kāi)連接:參考FOCAS說(shuō)明文檔中的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(“與機(jī)床斷開(kāi)連接”);}else{MessageBox.Show(ret + "");}}? ?采集坐標(biāo)信息:我們需要參考FOCAS說(shuō)明文檔:
? ?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;
? ?他們分別是機(jī)床的絕對(duì)坐標(biāo),相對(duì)坐標(biāo)和機(jī)床坐標(biāo)。以下為本人自己寫(xiě)的獲取位置坐標(biāo)信息的函數(shù),可供參考。
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){//相對(duì)坐標(biāo)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));//絕對(duì)坐標(biāo)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));//機(jī)器坐標(biāo)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));//剩余移動(dòng)距離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));}}? ? ?采集主軸轉(zhuǎn)速:我們需要參考說(shuō)明文檔的Function related to controlled axis&spindle_cnc_acts.doc.以下為采集主軸轉(zhuǎn)速的函數(shù)參考:
?Fanuc.ODBACT?pindle = new?Focas1.ODBACT(); ?????public?void?get_pindle()//獲取主軸的轉(zhuǎn)速{short?num = 32;short?ret = Fanuc.cnc_acts(Fanuc.h, pindle);if?(ret == 0){SpindleSpeed.Text = pindle.data.ToString();}}? ??采集主軸、伺服軸的負(fù)載:參考說(shuō)明文檔:
? ? 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()//主,伺服軸的加載計(jì)//測(cè)試成功{short?a = 6;//伺服軸的數(shù)量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負(fù)載sv2_Load.Text = Convert.ToString(sv.svload2.data); ???//伺服軸2負(fù)載sv3_Load.Text = Convert.ToString(sv.svload3.data); ???//伺服軸3負(fù)載sv4_Load.Text = Convert.ToString(sv.svload4.data); ???//伺服軸4負(fù)載}? ?采集主軸名稱:參考說(shuō)明文檔的
? ?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;}? ?采集實(shí)際進(jìn)給速度:參考說(shuō)明文檔的
? ?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);}}? ?獲取機(jī)床的狀態(tài):參考說(shuō)明文檔的 Function related to others_cnc_statinfo.doc。參考代碼如下:
//機(jī)床狀態(tài)Fanuc.ODBST?obst = new?Focas1.ODBST();public?void?get_state()//獲取機(jī)器的狀態(tài){Fanuc.cnc_statinfo(Fanuc.h, obst);cnc_status.Text = Convert.ToString(obst.run);//0停止,1待機(jī),開(kāi)動(dòng)Alarm_Status.Text = Convert.ToString(obst.alarm);//0沒(méi)有警報(bào),1表示有警報(bào)RunningMode.Text = Convert.ToString(obst.tmmode);}? ?獲取主程序號(hào)、正在運(yùn)行的程序號(hào):參考說(shuō)明文檔的
? ?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);//}???????}? ?獲取報(bào)警類型:參考說(shuō)明文檔的Function related to others_cnc_alarm2.doc。參考代碼如下:
獲取報(bào)警類型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;}}}? ?獲取報(bào)警類型:參考說(shuō)明文檔的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();}}}? ? 獲取循環(huán)時(shí)間:這個(gè)API采FOCAS說(shuō)明文檔中沒(méi)有找到,但是在XML所提供的API Help中有介紹,這里我參考api help的介紹和對(duì)機(jī)床的一些基本了解寫(xiě)了一下采集循環(huán)時(shí)間的函數(shù),可供參考,代碼如下:
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這個(gè)函數(shù)中的第二個(gè)參數(shù)要明白其含義,它代表的是機(jī)床PARAMETER參數(shù)表的序號(hào),如下圖所示,編號(hào)6757和6758表示的是循環(huán)時(shí)間,其中6757存儲(chǔ)的值單位是ms,6758存儲(chǔ)的值單位是min。
?
? ? 獲取切削時(shí)間:同樣是在XML所提供的API Help中有介紹,6753和6754存儲(chǔ)的是切削時(shí)間的數(shù)值,同樣6753存儲(chǔ)的時(shí)間單位是ms,6754存儲(chǔ)的時(shí)間單位是min,最后全部換算成秒將其累加便是總時(shí)間,獲取切削時(shí)間的函數(shù)參考代碼如下:
//得到切削時(shí)間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) + "秒";}}}? ? ?獲取運(yùn)行時(shí)間:同樣是在XML所提供的API Help中有介紹,6751和6752存儲(chǔ)的是運(yùn)行時(shí)間的數(shù)值,同樣6751存儲(chǔ)的時(shí)間單位是ms,6752存儲(chǔ)的時(shí)間單位是min,最后全部換算成秒將其累加便是總時(shí)間,獲取切削時(shí)間的函數(shù)參考代碼如下:
//得到運(yùn)行時(shí)間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)+"秒";}}? ? 獲取開(kāi)機(jī)時(shí)間:同樣是在XML所提供的API Help中有介紹,6750存儲(chǔ)的是開(kāi)機(jī)時(shí)間的數(shù)值,同樣6750存儲(chǔ)的時(shí)間單位是min,每隔一分鐘更新一次,這個(gè)數(shù)值表示的是總共的累加值。獲取開(kāi)機(jī)時(shí)間的函數(shù)參考代碼如下:
//得到開(kāi)機(jī)時(shí)間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)+"秒";}}? ?得到工件總數(shù):同樣是在XML所提供的API Help中有介紹,6712存儲(chǔ)的加工工件總數(shù)的數(shù)值。獲取工件總數(shù)的函數(shù)參考代碼如下:
//得到加工件數(shù)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 西門(mén)子OPC采集數(shù)據(jù)采集方法(以840D為代表)
1.2.1利用VB編寫(xiě)OPC客戶端采集機(jī)床數(shù)據(jù)
? ? ?采用VB6.0調(diào)用sopcdaauto.dll和sopcaeauto.dll來(lái)進(jìn)行編程采集機(jī)床數(shù)據(jù)的,用此種方法用到的是OPC 的自動(dòng)化接口,需要將編寫(xiě)好的OPC客戶端嵌入到機(jī)床HMI中才能進(jìn)行采集,也就是只能實(shí)現(xiàn)本地的采集,配置dcom遠(yuǎn)程采集總是會(huì)報(bào)錯(cuò)。所以可以將采集程序集成到HMI中,再通過(guò)Socket發(fā)送到上位機(jī)中。
1.2.2利用C++(MFC)編寫(xiě)OPC客戶端采集機(jī)床數(shù)據(jù)
? ? ? ?此種方法需要對(duì)微軟的com技術(shù)有一定的了解,因?yàn)閛pc是基于com技術(shù)進(jìn)行通信的,而用MFC我們需要自己寫(xiě)這些接口函數(shù),也就是用到了OPC的自定義接口而不是直接調(diào)用動(dòng)態(tài)鏈接庫(kù),所以開(kāi)發(fā)成本和難度相對(duì)較高。因此開(kāi)發(fā)前需要先了解com原理,并懂得MFC的一些相關(guān)知識(shí)。
? ? ? 在開(kāi)發(fā)前,首先需要配置PC機(jī)和機(jī)床PC機(jī)的COM/DCOM,具體配置步驟如下:
? ? ? 1.從opcfoundation.org下載opc組件并安裝。目前測(cè)試所用的版本為3.0??蛻舳撕头?wù)器端均需要。
? ? ? 2.在客戶端和服務(wù)器端建立相同用戶名和密碼的賬戶(或是用戶組)。
? ? ? 3.防火墻配置。運(yùn)行wf.msc,允許Windows Management Instrumentation、OPC Server Enumerator(位于c:\windows\syswow64\opcenum.exe)(也可通過(guò)設(shè)置TCP135端口來(lái)實(shí)現(xiàn))、OPC客戶端程序、OPC服務(wù)器程序。
? ? ? 4.啟用網(wǎng)絡(luò)發(fā)現(xiàn)服務(wù),即在網(wǎng)上鄰居中需要看到另一臺(tái)電腦。
? ? ? 5.啟用文件和打印機(jī)共享。
? ? ? 6.運(yùn)行dcomcnfg。
? ? ? DCOM總體配置:默認(rèn)屬性:連接、標(biāo)識(shí)
? ? ? ? ? ? ?COM安全中的
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 訪問(wèn)權(quán)限條目:編輯限制中允許下列的本地和遠(yuǎn)程操作
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? Everyone、System、分布式用戶組、交互式用戶、匿名登錄
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?默認(rèn)值為以上幾個(gè)加上Self和Administration
? ? ? ? ? ? ?啟動(dòng)和激活權(quán)限條目:編輯限制中編輯限制中允許下列的本地和遠(yuǎn)程操作
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Everyone、System、Administration、分布式用戶、交互式用戶
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 默認(rèn)值為以上幾個(gè)加上Anonymous
? ? ? ? ? ? ? DCOM程序配置:OPCEnum: 身份驗(yàn)證級(jí)別:無(wú)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?安全:前兩個(gè)使用默認(rèn)值
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?標(biāo)識(shí):系統(tǒng)賬戶
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?服務(wù)器程序:身份驗(yàn)證級(jí)別:默認(rèn)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?安全:前兩個(gè)使用默認(rèn)值
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?標(biāo)識(shí):下列用戶(OPC用戶)
? ? ? 如果按照以上方式配置不成功,可以百度參考網(wǎng)上的教程,成功的標(biāo)志是你編寫(xiě)的客戶端調(diào)試過(guò)程中可以遠(yuǎn)程連接到機(jī)床便成功。我們?cè)陂_(kāi)發(fā)過(guò)程中可以用到一款叫OPC Server Demo的exe文件,它可以作為一款opc服務(wù)器運(yùn)行在自己的電腦上方便進(jìn)行開(kāi)發(fā)測(cè)試。
? ? ? 開(kāi)發(fā)主要流程和核心代碼如下,詳細(xì)開(kāi)發(fā)流程參見(jiàn)西門(mén)子OPC西門(mén)子工業(yè)通信第2卷。:
? ? ? 1.注冊(cè)COM
? ? ? ? HRESULT r1;
? ? ? ? r1 = CoInitialize(NULL);?
? ? ? 2. 將 ProgID?轉(zhuǎn)換為 CLSID
? ? ? ? r1 = CLSIDFromProgID(L"OPC.SimaticNET", &clsid);
? ? ? 3.?建立與OPC服務(wù)器的連接
? ? ? ? r1 = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER ,
? ? ? ?IID_IOPCServer, (void**)&m_pIOPCServer);
? ? ? 4. 建立OPC組對(duì)象
? ? ? ? r1 = m_pIOPCServer->AddGroup(L"grp1", TRUE, 500, 1,
? ? ? ?&TimeBias, &PercentDeadband, LOCALE_ID,
? ? ? ?&m_GrpSrvHandle, &RevisedUpdateRate,
? ? ? ?IID_IOPCItemMgt,
? ? ? (LPUNKNOWN*)&m_pIOPCItemMgt);
? ? ? 引號(hào)部分即為OPC標(biāo)簽的地址, OPC標(biāo)簽詳細(xì)地址參看LIS2sl_0212_en.pdf.
? ? ? 5.?添加數(shù)據(jù)項(xiàng)到組中
? ? ? ?r1 = pItemMgt->AddItems(1, m_Items, &m_pItemResult, &m_pErrors);
? ? ? 6.從OPC組對(duì)象中獲取?IOPCSyncIO異步訪問(wèn)?接口,該接口包括Read()和Write()函數(shù)。
? ? ? ?r1 = m_pIOPCItemMgt->QueryInterface(IID_IOPCSyncIO,
????????????????????????????????????????????????????????????????????(void**)&m_pIOPCSyncIO);
? ? ? 使用read()和Write()函數(shù)方法便可讀到opc項(xiàng)的值。
? ? ?7. 刪除對(duì)象并釋放內(nèi)存
????在退出程序錢(qián)必須要?jiǎng)h除OPC對(duì)象并釋放內(nèi)存,具體代碼如下:
? ? ? r1 = m_pIOPCItemMgt->RemoveItems(1, phServer, &pErrors);
? ? ? CoTaskMemFree(m_pItemResult);
? ? ?m_pItemResult=NULL;
? ? ?完成以上幾步便完成了opc遠(yuǎn)程客戶端的開(kāi)發(fā)。
? ? ?從西門(mén)子文檔中摘錄的OPC標(biāo)簽地址(部分):
? ? ?NCK系統(tǒng)類型:
? ??
? ? 此路徑下存放NCK的一些狀態(tài)信息。
? ? 手輪狀態(tài):
?
? ?系統(tǒng)時(shí)間:
?
? ?系統(tǒng)已開(kāi)啟時(shí)間:
?
? 此路徑下存放一些刀具坐標(biāo)數(shù)據(jù):
? 路徑下存放伺服軸的電流、加速度、負(fù)載、功率、進(jìn)給率、狀態(tài)等數(shù)
?
? ?主軸相關(guān)數(shù)據(jù):
? ? ? 以上只是摘錄自西門(mén)子官方手冊(cè)的一小部分,在西門(mén)子官方手冊(cè)上,能夠采集到的數(shù)據(jù)還有例如NC程序狀態(tài)相關(guān)的數(shù)據(jù),NC程序名、程序狀態(tài)、當(dāng)前程序行號(hào)、刀具編號(hào)、程序已運(yùn)行的時(shí)間等,還包括一些工藝參數(shù),報(bào)警信息等均可通過(guò)查閱該手冊(cè)找到所處的路徑,然后在程序中添加這些OPC item就可以采集到想要的數(shù)據(jù)。
1.2.3利用PLC進(jìn)行采集機(jī)床數(shù)據(jù)(此方法不僅適用于840d也適用于其他支持opc的數(shù)控系統(tǒng))
? ? ? ?西門(mén)子PLC的S7協(xié)議可以支持PLC與遠(yuǎn)程設(shè)備的數(shù)據(jù)交互,而在西門(mén)子數(shù)控系統(tǒng)內(nèi)部,PLC與NC之間是可以進(jìn)行數(shù)據(jù)通信的,在step7中通過(guò)調(diào)用FB2并設(shè)置相關(guān)的參數(shù)來(lái)實(shí)現(xiàn)間接的訪問(wèn)數(shù)控系統(tǒng)內(nèi)部的數(shù)據(jù)。具體實(shí)現(xiàn)方式為通過(guò)NC-VAR Selector和Step 7來(lái)完成。具體實(shí)現(xiàn)步驟為:
? ? ?(1)利用NC-VAR Selector工具來(lái)選擇NC系統(tǒng)中所需要讀取的系統(tǒng)變量,系統(tǒng)變量包括切削時(shí)間、機(jī)械坐標(biāo)、運(yùn)行模式等,然后將選擇的系統(tǒng)變量以“*.var”格式進(jìn)行保存。
? ? ?(2)將第一步所保存的.var文件通過(guò)NC-VAR Selector工具生成可供Step7調(diào)用的源文件,以“*.STL”格式進(jìn)行保存。
? ? ?(3)再通過(guò)Step7軟件將第二步的源文件導(dǎo)入,然后編譯生成一個(gè)DB塊,并給這個(gè)DB塊定義一個(gè)助記符以方便后續(xù)程序中進(jìn)行調(diào)用。
? ? ?(4)編寫(xiě)PLC程序,通過(guò)調(diào)用PLC中的FB2模塊并設(shè)置相應(yīng)的參數(shù)來(lái)讀取NC系統(tǒng)中的變量。遠(yuǎn)程應(yīng)用程序借助PLC的以太網(wǎng)接口,通過(guò)讀取DB塊中的數(shù)據(jù)即可采集到的對(duì)應(yīng)的數(shù)據(jù)。
1.3 西門(mén)子OPC UA數(shù)據(jù)采集方法(840DSL、828D等)
? ? ? ?對(duì)于近幾年比較新的西門(mén)子數(shù)控系統(tǒng),數(shù)控系統(tǒng)內(nèi)部支持OPC UA方式進(jìn)行數(shù)據(jù)采集。西門(mén)子數(shù)控系統(tǒng)內(nèi)部安裝有OPC UA服務(wù)器,跟機(jī)床有關(guān)的過(guò)程狀態(tài)、報(bào)警信息等都會(huì)存放在OPC UA服務(wù)器中,OPC UA服務(wù)器這一部分西門(mén)子廠商已經(jīng)封裝好無(wú)需再另外開(kāi)發(fā)。實(shí)際采集過(guò)程中只需要按照OPC UA規(guī)范開(kāi)發(fā)標(biāo)準(zhǔn)的OPC UA客戶端,然后訂閱OPC UA服務(wù)器節(jié)點(diǎn)中的數(shù)據(jù)項(xiàng)即可。但要使用西門(mén)子數(shù)控系統(tǒng)OPC UA這一項(xiàng)功能需要去西門(mén)子官方開(kāi)通該授權(quán)。
? ? OPC UA客戶端的開(kāi)發(fā)遵循以下幾個(gè)步驟:
? ? OPC UA服務(wù)器的開(kāi)發(fā)使用open62541官方開(kāi)源開(kāi)發(fā)包進(jìn)行開(kāi)發(fā),遵循以下幾個(gè)步驟:
? ? 建立OPC?UA工業(yè)統(tǒng)一接口來(lái)實(shí)現(xiàn)對(duì)異構(gòu)數(shù)控系統(tǒng)機(jī)床的數(shù)據(jù)采集,其實(shí)現(xiàn)方式主要包括以下幾點(diǎn):
? (1)建立異構(gòu)數(shù)控機(jī)床信息源模型。根據(jù)數(shù)控機(jī)床所存在的共同屬性進(jìn)行建模,縷清各個(gè)屬性之間的從屬關(guān)系。
? (2)將建立的信息源模型映射到OPC?UA信息模型上。建立的異構(gòu)數(shù)控機(jī)床信息源模型到OPC?UA信息模型的映射方法有兩種。一種是利用OPC?UA官方提供的建模工具來(lái)實(shí)現(xiàn)映射,此方法的優(yōu)勢(shì)是方便快捷,操作迅速,但是缺乏靈活性;另一種方式是手動(dòng)添加各個(gè)異構(gòu)機(jī)床信息源模型中的數(shù)據(jù)項(xiàng)到OPC?UA信息模型當(dāng)中,該方法的優(yōu)勢(shì)是準(zhǔn)確,能夠?qū)崿F(xiàn)一一對(duì)應(yīng)的關(guān)系,缺點(diǎn)是工作量太大。
? (3)建立OPC?UA客戶端來(lái)實(shí)現(xiàn)地址空間的訪問(wèn)。OPC?UA服務(wù)器建立完成后,按照OPC?UA的標(biāo)準(zhǔn)建立OPC?UA客戶端即可實(shí)現(xiàn)對(duì)OPC?UA服務(wù)器中建立的各個(gè)節(jié)點(diǎn)信息進(jìn)行訪問(wèn)。
? ? OPC?UA服務(wù)器的整體開(kāi)發(fā)流程如圖所示。將XML文檔所描述的異構(gòu)數(shù)控機(jī)床信息源加載到服務(wù)器中形成數(shù)控機(jī)床信息模型的OPC UA實(shí)例,從而實(shí)現(xiàn)對(duì)異構(gòu)數(shù)控機(jī)床接口的統(tǒng)一,為外部OPC?Client提供定義好的節(jié)點(diǎn)路徑實(shí)現(xiàn)數(shù)據(jù)采集。將所建立的異構(gòu)數(shù)控機(jī)床信息源的靜態(tài)屬性,例如設(shè)備名稱、設(shè)備編號(hào)等,此類數(shù)據(jù)直接通過(guò)XML文檔可以直接映射到OPC?UA地址空間的節(jié)點(diǎn)當(dāng)中;但是對(duì)于過(guò)程數(shù)據(jù),例如坐標(biāo)、轉(zhuǎn)速等,此類數(shù)據(jù)利用OPC?UA模型有一定的缺陷。可采用的解決方案為:通過(guò)機(jī)床通訊中間件實(shí)現(xiàn)對(duì)底層異構(gòu)數(shù)控系統(tǒng)的封裝,然后將統(tǒng)一的接口映射到OPC?UA服務(wù)器地址空間的節(jié)點(diǎn)上,每次調(diào)用接口函數(shù)時(shí)加載底層的動(dòng)態(tài)鏈接庫(kù)中提供的采集函數(shù),從而實(shí)現(xiàn)OPC?UA服務(wù)器對(duì)實(shí)時(shí)過(guò)程數(shù)據(jù)的采集。OPC?UA服務(wù)器的開(kāi)發(fā)流程如圖所示,使用的OPC?UA開(kāi)源庫(kù)為open62541:
? ?具體開(kāi)發(fā)流程為:
?(1) 配置config,包括安全證書(shū)、對(duì)外開(kāi)放的端口等,然后調(diào)用OPC_UA_Server_new(config)
對(duì)服務(wù)器進(jìn)行初始化操作。
?(2)根據(jù)建立的異構(gòu)機(jī)床信息源模型和OPC?UA的XML文檔建模規(guī)則,調(diào)用OPC?UA開(kāi)源庫(kù)中的AddObjectNode()方法和AddVariableNode()方法來(lái)建立OPC?UA地址空間中的各個(gè)節(jié)點(diǎn)的屬性和相互關(guān)系。
?(3)調(diào)用啟動(dòng)服務(wù)器監(jiān)聽(tīng)方法OPC_UA_Server_run(server),在控制臺(tái)界面會(huì)返回一個(gè)供OPC?UA Client連接的地址,OPC?UA?Client根據(jù)此地址即可訪問(wèn)OPC?UA?Sever內(nèi)部節(jié)點(diǎn)中的變量。
1.4 海德漢機(jī)床數(shù)據(jù)采集方法(Remo Tools開(kāi)發(fā)包)
? ? ? ?海德漢數(shù)控系統(tǒng)的數(shù)據(jù)采集需要用到Remo Tools開(kāi)發(fā)包,開(kāi)發(fā)包可在附件中查找。開(kāi)發(fā)前首先需要確定DNC功能選項(xiàng)#18打開(kāi),另外需要在上位機(jī)采集軟件中注冊(cè)COM組件,32位的操作系統(tǒng)注冊(cè)第一個(gè),64位的操作系統(tǒng)注冊(cè)第二個(gè)。下圖為Remo Tools SDK的軟件架構(gòu)圖,可以加深理解具體采用的通信原理。另外,開(kāi)發(fā)過(guò)程中建議先縷清對(duì)象和接口之間的關(guān)系,然后參照示例程序進(jìn)行開(kāi)發(fā)。
?
? ? ?以下將對(duì)兩種通信方式的數(shù)據(jù)采集方法進(jìn)行詳細(xì)闡述:
? ?(1)利用HeidenhainDNC Component組件進(jìn)行采集
? ? 針對(duì)上述Remo Tools SDK,開(kāi)發(fā)包中提供了的HeidenhainDNC Component組件,底層是采用RPC(Remote Procedure Call Protocol)來(lái)實(shí)現(xiàn)通信的。開(kāi)發(fā)者根據(jù)COM組件庫(kù)中所提供的API函數(shù)即可采集機(jī)床內(nèi)部的數(shù)據(jù)。采用此方式進(jìn)行數(shù)據(jù)采集時(shí),必須要將機(jī)床的DNC功能選項(xiàng)#18打開(kāi)。海德漢的DNC COM組件提供的對(duì)象接口遵循以下風(fēng)格:
3.3所示。
? ? ? ?在此模型中,Machine對(duì)象保持與NC控件的連接,連接的管理功能轉(zhuǎn)發(fā)到連接組件。連接組件用來(lái)管理具有關(guān)聯(lián)的連接參數(shù)的邏輯連接表。用戶使用連接對(duì)話框來(lái)創(chuàng)建連接以及選擇,編輯或刪除現(xiàn)有連接。連接的設(shè)置存儲(chǔ)在Windows注冊(cè)表中的HKEY_LOCAL_MACHINE區(qū)域中,因此可供所有用戶使用這些連接。如圖所示,為連接組件管理的創(chuàng)建的兩個(gè)連接參數(shù),連接參數(shù)包括連接名稱(Connection)、連接的海德漢數(shù)控系統(tǒng)類型(CNC Type)、連接的主機(jī)地址(Host Address)、連接所使用的的通訊協(xié)議(Protocol)以及連接的設(shè)備在線狀態(tài)(Online)。
? ? ? ?Machine對(duì)象的GetInterface方法返回其他對(duì)象之一,例如可以返回Automatic對(duì)象、ProcessData對(duì)象等。通過(guò)這種方法,可以將Machine對(duì)象與NC控件的連接傳遞給其他對(duì)象。接口按其提供的功能分組。 例如,用于NC自動(dòng)運(yùn)行的功能位于JHAutomatic對(duì)象中,用于讀取數(shù)控系統(tǒng)軸的配置信息位于JHConfiguration對(duì)象中。在各個(gè)對(duì)象中又包含了各種功能豐富的接口,例如JHMachine對(duì)象中包含了IJHMachine、IJHMachine2等接口,這些接口有提供了一些功能函數(shù),例如IJHMachine接口所包含的ConnectRequest(([in] BSTR bstrConnectionName)函數(shù),用于請(qǐng)求與某個(gè)CNC的連接;IJHConfiguration接口所包含的GetAxesInfo ([out, retval] IJHAxisInfoList **ppList)函數(shù),用于讀取數(shù)控系統(tǒng)配置的軸的信息。所有COM類的對(duì)象名稱前綴為JH(例如JHMachine),所有的接口都有用于標(biāo)識(shí)的IJH名稱前綴。HeidenhainDNC組件中所包含的部分接口與函數(shù)方法如下表所示:
| 接口名稱 | 函數(shù)列表 | 功能 |
| IJHMachine | Connect | 與服務(wù)器進(jìn)行連接 |
| ? | GetState | 獲取CNC啟動(dòng)狀態(tài) |
| ? | GetProgramStatus | 讀取當(dāng)前程序狀態(tài) |
| IJHAutomatic | GetCutterLocation GetOverrideInfo | 讀取當(dāng)前刀具坐標(biāo) 讀取當(dāng)前倍率值 |
| IJHProcessData | GetMachineRunningTime GetMachineUpTime | 讀取機(jī)床運(yùn)行時(shí)間 讀取機(jī)床開(kāi)機(jī)時(shí)間 |
? ? ?開(kāi)發(fā)過(guò)程中可以參考開(kāi)發(fā)包說(shuō)明文檔“HeidenhainDNC.chm”以及官方給的參照示例進(jìn)行開(kāi)發(fā)。
? ? ?(2)利用LSV-2 ActiveX Control控件進(jìn)行采集
? ? ? LSV2 ActiveX控件,是海德漢RemoTools SDK的另一組件,是用于與海德漢控件進(jìn)行通信的應(yīng)用程序的軟件開(kāi)發(fā)套件。它提供了LSV-2內(nèi)部自定義協(xié)議,可以實(shí)現(xiàn)與iTNC?530和TNC?426/430的TNC控件之間進(jìn)行通信,進(jìn)而可以進(jìn)行Windows應(yīng)用程序的編程。對(duì)于傳輸,可以在串行接口和以太網(wǎng)(TCP / IP)接口之間進(jìn)行選擇。LSV-2 ActiveX控件負(fù)責(zé)所有通信,應(yīng)用程序開(kāi)發(fā)者只能看到簡(jiǎn)單的方法,屬性和事件。調(diào)用方法通常會(huì)觸發(fā)一個(gè)動(dòng)作,通過(guò)設(shè)置屬性,可以影響動(dòng)作或詢問(wèn)狀態(tài)。每當(dāng)消息異步傳輸?shù)綉?yīng)用程序時(shí),總是會(huì)先報(bào)告事件,然后將該事件將添加到Windows消息隊(duì)列中,并且可以由父窗口處理。
? ? ? LSV-2庫(kù)提供了一種與控件進(jìn)行通信的方式,所以在開(kāi)發(fā)時(shí)無(wú)需直接處理純LSV2報(bào)文。 庫(kù)中的功能隱藏了低級(jí)通信機(jī)制,因此在開(kāi)發(fā)過(guò)程中可以輕松創(chuàng)建所需要的功能。在使用過(guò)程中,只需要引用lsv2_all.h頭文件即可,它幾乎包含了所有通用的頭文件,除了一些特殊的需要單獨(dú)添加頭文件。由于LSV-2庫(kù)中使用了數(shù)據(jù)類型和回調(diào),因此LSV-2庫(kù)與<windows.h>具有依賴關(guān)系,所以開(kāi)發(fā)的程序需要與ws2_32.lib鏈接。例如:以檢索版本信息為例,需要需要以下步驟:
? ? ?1)a將LSV2庫(kù)添加到程序所包含路徑;
? ? ? ? ? b.將lsv2.lib和ws2_32.lib添加到鏈接器。
? ? ?2)a.在程序中添加windows.h和lsv2_all.h頭文件;
? ? ? ? ? b.使用LSV2Open()函數(shù)建立與控件的連接;
? ? ? ? ? c.使用LSV2Login()函數(shù)完成注冊(cè);
? ? ? ? ? d.?使用LSV2ReceiveVersions()函數(shù)來(lái)實(shí)現(xiàn)檢索版本信息的功能;
? ? ? ? ? e.使用LSV2Logout()函數(shù)注銷。
? ? 常用的LSV2組件庫(kù)的API函數(shù)如下表所示
| API通訊函數(shù) | 功能 |
| LSV2Open | 與控件建立連接 |
| LSV2Login | 注冊(cè)控件 |
| LSV2Logout | 注銷控件 |
| LSV2Close | 斷開(kāi)連接 |
| LSV2ReceiveSystemInfo | 讀取系統(tǒng)狀態(tài)信息 |
| LSV2ReceiveVersion | 讀取版本信息 |
| LSV2ReceiveDncInfo | 讀取DNC信息 |
| LSV2ReceiveRunInfo ? ? LSV2ReceiveTime LSV2GetConnectionState | 讀取正在運(yùn)行的狀態(tài)信息(包括坐標(biāo)值、運(yùn)行模式、開(kāi)機(jī)時(shí)間、運(yùn)行時(shí)間、運(yùn)行刀具號(hào)等) 讀取數(shù)控系統(tǒng)當(dāng)前時(shí)間 讀取連接狀態(tài)信息 |
? ? ?以上就是一些所熟知的數(shù)控系統(tǒng)的數(shù)據(jù)采集方法,當(dāng)然現(xiàn)在也了解到市面上有很多針對(duì)數(shù)控系統(tǒng)做的數(shù)據(jù)采集網(wǎng)關(guān),各種各樣的都有,但采集方法應(yīng)該都是相通的,無(wú)非是它們把這些通訊庫(kù)還有函數(shù)庫(kù)移植到了arm平臺(tái)上。如果嵌入式功底扎實(shí)的大佬可以嘗試自己做這樣的網(wǎng)關(guān),里面肯定還是有很多坑要走。本來(lái)自己想嘗試做一個(gè)的,但最后忙畢業(yè)沒(méi)時(shí)間,也就把這個(gè)事放在一邊了。在嵌入式硬件設(shè)備上確實(shí)也有它的好處,部署方便簡(jiǎn)單,價(jià)格便宜,當(dāng)然便宜的是硬件設(shè)備,很多做這個(gè)數(shù)據(jù)采集網(wǎng)關(guān)的主要還是賣網(wǎng)關(guān)中集成的數(shù)據(jù)采集服務(wù),開(kāi)通一臺(tái)機(jī)床多收取一定的費(fèi)用。哎,為什么制造業(yè)一直發(fā)展緩慢,我在做項(xiàng)目的切身感受是,制造業(yè)的資源太閉塞了!很多時(shí)候難的不是開(kāi)發(fā)任務(wù),難的是找資料的過(guò)程,它不像互聯(lián)網(wǎng)那樣有各種各樣開(kāi)放的源代碼,可以直接站在前人的肩膀上繼續(xù)向前進(jìn)。制造業(yè)的發(fā)展必將是信息技術(shù)與操作技術(shù)相互結(jié)合的,需要的是兩者兼?zhèn)涞木C合性人才,還是希望制造業(yè)終有一天能夠發(fā)展起來(lái)吧。
?
總結(jié)
以上是生活随笔為你收集整理的浅谈几种主流数控机床的数据采集技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: hihocoder#1054之滑动解锁
- 下一篇: 2018秋c语言程序设计考试答案,201