網(wǎng)上有很多關(guān)于即時(shí)到pos機(jī)使用方法,使用定時(shí)器中斷程序向西門(mén)子PLC發(fā)送實(shí)時(shí)位置數(shù)據(jù)的知識(shí),也有很多人為大家解答關(guān)于即時(shí)到pos機(jī)使用方法的問(wèn)題,今天pos機(jī)之家(www.rcqwhg.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來(lái)看下吧!
本文目錄一覽:
即時(shí)到pos機(jī)使用方法
概述在ABB機(jī)器人系統(tǒng)集成項(xiàng)目中,很多時(shí)候由于控制需求,我們需要對(duì)機(jī)器人的實(shí)時(shí)位置進(jìn)行監(jiān)控,這樣就需要機(jī)器人向主控系統(tǒng)實(shí)時(shí)發(fā)送當(dāng)前位置數(shù)據(jù)。
對(duì)于不同的主控系統(tǒng),機(jī)器人發(fā)送當(dāng)前位置數(shù)據(jù)的方式也多種多樣。如果使用PC機(jī)作為上位機(jī)來(lái)讀取機(jī)器人實(shí)時(shí)位置信息,那么我們就可以通過(guò)使用IRC5 OPC Server來(lái)讀取機(jī)器人位置數(shù)據(jù),然后再發(fā)送給PC上位機(jī);當(dāng)然,也可以通過(guò)PC SDK對(duì)機(jī)器人控制器進(jìn)行二次開(kāi)發(fā),然后通過(guò)PC Interface選項(xiàng),直接讀取控制器中機(jī)器人的位置信息。如果是使用PLC作為上位機(jī)來(lái)讀取機(jī)器人實(shí)時(shí)位置信息,那么我們就可以通過(guò)工業(yè)現(xiàn)場(chǎng)通信,如ProfiBus、ProfiNet、DeviceNet等,然后使用ABB機(jī)器人內(nèi)置的數(shù)據(jù)處理指令編寫(xiě)實(shí)時(shí)位置數(shù)據(jù)發(fā)送程序,來(lái)實(shí)現(xiàn)機(jī)器人位置數(shù)據(jù)的發(fā)送。
本期,就來(lái)為大家介紹一下ABB機(jī)器人通過(guò)現(xiàn)場(chǎng)通信形式,向西門(mén)子PLC發(fā)送實(shí)時(shí)位置數(shù)據(jù)的方法。
變量聲明機(jī)器人的當(dāng)前位置就是工具末端的當(dāng)前位置,也就是TCP的當(dāng)前坐標(biāo),它是由x、y、z的坐標(biāo)值以及分別繞x、y、z軸旋轉(zhuǎn)的角度值組成,這些數(shù)據(jù)的類型均是實(shí)數(shù)類型。在ABB機(jī)器人中,使用num與dnum來(lái)表示實(shí)數(shù),其中num類型與西門(mén)子PLC中的real類型一致,都是32位的單精度實(shí)數(shù);而dnum類型數(shù)據(jù)是64位的雙精度實(shí)數(shù)。因此,在機(jī)器人中,我們可以聲明num類型變量來(lái)存放機(jī)器人的當(dāng)前位置數(shù)據(jù)。同時(shí),聲明其他類型的數(shù)據(jù)變量,作為數(shù)據(jù)處理的中間轉(zhuǎn)換變量。變量聲明代碼如下所示。
變量聲明程序代碼如下所示:
!聲明機(jī)器人當(dāng)前位姿變量 VAR robtarget pCurrentPos; !聲明機(jī)器人位姿存儲(chǔ)變量 VAR num x; VAR num y; VAR num z; VAR num rx; VAR num ry; VAR num rz; !聲明機(jī)器人位姿通用數(shù)據(jù)容器中間轉(zhuǎn)換變量 VAR rawbytes rawbyte_x; VAR rawbytes rawbyte_y; VAR rawbytes rawbyte_z; VAR rawbytes rawbyte_rx; VAR rawbytes rawbyte_ry; VAR rawbytes rawbyte_rz; !聲明機(jī)器人位姿字節(jié)型中間數(shù)據(jù)轉(zhuǎn)換變量 VAR byte byte_x{4}; VAR byte byte_y{4}; VAR byte byte_z{4}; VAR byte byte_rx{4}; VAR byte byte_ry{4}; VAR byte byte_rz{4}; !聲明雙精度類型機(jī)器人位姿數(shù)據(jù)變量 VAR dnum dn_x; VAR dnum dn_y; VAR dnum dn_z; VAR dnum dn_rx; VAR dnum dn_ry; VAR dnum dn_rz; !聲明中斷數(shù)據(jù)變量 VAR intnum TrapNum;組輸出信號(hào)配置
ABB機(jī)器人傳輸實(shí)數(shù)數(shù)據(jù)的方式大致可以分為兩種:一、使用模擬量輸出信號(hào)傳輸實(shí)數(shù)數(shù)據(jù),由于模擬量信號(hào)自身抗干擾性能差,并且需要加裝價(jià)格昂貴的模量信號(hào)擴(kuò)展模塊,因此,在傳輸大量的實(shí)數(shù)數(shù)據(jù)的場(chǎng)合中,一般很少使用模擬量信號(hào);二、使用組輸出信號(hào)傳輸實(shí)數(shù)數(shù)據(jù),組輸出信號(hào)不僅可以通過(guò)加裝價(jià)格相對(duì)低廉的數(shù)字量I/O信號(hào)擴(kuò)展模塊實(shí)現(xiàn),也可以通過(guò)加裝現(xiàn)場(chǎng)通信模塊的方式實(shí)現(xiàn)。本例,使用第二種方式,通過(guò)ProfiBus現(xiàn)場(chǎng)總線通信的形式來(lái)傳輸機(jī)器人當(dāng)前位置數(shù)據(jù)。
由于機(jī)器人當(dāng)前位置數(shù)據(jù)都是32位的單精度實(shí)數(shù)類型,所以,我們定義的每一個(gè)組輸出信號(hào)長(zhǎng)度也應(yīng)該是32位。
中斷子程序編寫(xiě)
創(chuàng)建中斷子例行程序,并在其中編寫(xiě)讀取機(jī)器人當(dāng)前位置x、y、z坐標(biāo)數(shù)據(jù)程序。由于ABB機(jī)器人系統(tǒng)中使用四元數(shù)形式表示TCP繞相應(yīng)坐標(biāo)軸的旋轉(zhuǎn)角度,因此,這里需要使用EulerZYX指令將以四元數(shù)形式表示的角度數(shù)據(jù)轉(zhuǎn)換為歐拉角形式表示的旋轉(zhuǎn)角度數(shù)據(jù)。完整的中斷子程序代碼如下所示。
中斷子程序代碼如下所示:
TRAP iTrap!中斷程序iTrap !讀取機(jī)器人當(dāng)前位置,并將讀取數(shù)據(jù)賦值給pCurrentPos pCurrentPos:=CRobT(); !將讀取到的機(jī)器人當(dāng)前位置x、y、z坐標(biāo)值分別賦值給變量x、y、z x:=pCurrentPos.trans.x; y:=pCurrentPos.trans.y; z:=pCurrentPos.trans.z; !將將讀取到的機(jī)器人當(dāng)前位置四元數(shù)角度值轉(zhuǎn)換為歐拉角之后,分別賦值給變量rx、ry、rz rx:=EulerZYX(\\x,pCurrentPos.rot); ry:=EulerZYX(\\y,pCurrentPos.rot); rz:=EulerZYX(\\z,pCurrentPos.rot); !調(diào)用發(fā)送機(jī)器人當(dāng)前位置例行程序 send_pCurrentPos; ENDTRAP機(jī)器人當(dāng)前位置數(shù)據(jù)發(fā)送子程序編寫(xiě)
創(chuàng)建發(fā)送機(jī)器人當(dāng)前位置數(shù)據(jù)子例行程序,并將其在中斷子程序中調(diào)用。首先,將讀取的機(jī)器人當(dāng)前位置數(shù)據(jù)使用PackRawbytes指令按照Float形式進(jìn)行打包,然后將其存放到已經(jīng)聲明的rawbyte類型容器變量的連續(xù)四個(gè)字節(jié)中。
然后使用FOR指令進(jìn)行循環(huán)解包操作,即將打包好的數(shù)據(jù)使用UnpackRawBytes指令解包到聲明的byte類型四維數(shù)組變量中,每一個(gè)字節(jié)對(duì)應(yīng)數(shù)組變量中的一維byte元素。
由于西門(mén)子PLC中數(shù)據(jù)采用大端存儲(chǔ)模式,而ABB機(jī)器人中的數(shù)據(jù)采用的是小端存儲(chǔ)模式,為了發(fā)送的數(shù)據(jù)能夠被PLC正確解析,因此,我們需要對(duì)機(jī)器人的位置數(shù)據(jù)進(jìn)行移位操作。所謂的大端模式(Big-endian),是指數(shù)據(jù)的高字節(jié),保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié),保存在內(nèi)存的高地址中,地址由小向大增加,而數(shù)據(jù)從高位往低位放;小端模式(Little-endian)是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中,這種存儲(chǔ)模式將地址的高低和數(shù)據(jù)位權(quán)值有效結(jié)合起來(lái),高地址部分權(quán)值高,低地址部分權(quán)值低,和我們的邏輯方法一致。
對(duì)于ABB機(jī)器人當(dāng)前位置數(shù)據(jù)的移位操作:首先使用NumToDnum指令將解包后的byte類型數(shù)據(jù)轉(zhuǎn)換為dnum類型,然后按照西門(mén)子PLC中實(shí)數(shù)類型數(shù)據(jù)高低字節(jié)順序進(jìn)行移位操作,數(shù)據(jù)移位指令使用BitLShDnum。同時(shí),將四個(gè)移位后的byte類型數(shù)據(jù)使用BitOrDnum指令進(jìn)行“邏輯或”運(yùn)算,重新組成32位的單精度數(shù)據(jù),并將其存放到聲明好的dnum類型變量中。當(dāng)然,這個(gè)移位操作,我們也可以在PLC中實(shí)現(xiàn)。
最后,使用setgo指令將轉(zhuǎn)換好的機(jī)器人當(dāng)前位置數(shù)據(jù)賦值到相應(yīng)的組輸出信號(hào),然后發(fā)送給PLC。
機(jī)器人當(dāng)前位置數(shù)據(jù)發(fā)送子程序代碼如下所示:
PROC send_pCurrentPos()!發(fā)送機(jī)器人當(dāng)前位置例行程序 !清空機(jī)器人位姿通用數(shù)據(jù)容器中間轉(zhuǎn)換變量 ClearRawBytes rawbyte_x; ClearRawBytes rawbyte_y; ClearRawBytes rawbyte_z; ClearRawBytes rawbyte_rx; ClearRawBytes rawbyte_ry; ClearRawBytes rawbyte_rz; !將機(jī)器人當(dāng)前位置數(shù)據(jù)按照f(shuō)loat形式打包 PackRawBytes x,rawbyte_x,RawBytesLen(rawbyte_x)+1\\Float4; PackRawBytes y,rawbyte_y,RawBytesLen(rawbyte_y)+1\\Float4; PackRawBytes z,rawbyte_z,RawBytesLen(rawbyte_z)+1\\Float4; PackRawBytes rx,rawbyte_rx,RawBytesLen(rawbyte_rx)+1\\Float4; PackRawBytes ry,rawbyte_ry,RawBytesLen(rawbyte_ry)+1\\Float4; PackRawBytes rz,rawbyte_rz,RawBytesLen(rawbyte_rz)+1\\Float4; !將機(jī)器人位姿通用數(shù)據(jù)容器里的前4個(gè)字節(jié)數(shù)據(jù)分別保存到字節(jié)數(shù)組變量中 FOR i FROM 1 TO 4 DO UnpackRawBytes rawbyte_x,i,byte_x{i}\\Hex1; UnpackRawBytes rawbyte_y,i,byte_y{i}\\Hex1; UnpackRawBytes rawbyte_z,i,byte_z{i}\\Hex1; UnpackRawBytes rawbyte_rx,i,byte_rx{i}\\Hex1; UnpackRawBytes rawbyte_ry,i,byte_ry{i}\\Hex1; UnpackRawBytes rawbyte_rz,i,byte_rz{i}\\Hex1; ENDFOR !機(jī)器人數(shù)據(jù)格式轉(zhuǎn)換(西門(mén)子PLC高低字節(jié)與機(jī)器人高低字節(jié)定義相反) dn_x:=BitLShDnum(NumToDnum(byte_x{1}),24);!將單精度數(shù)據(jù)byte_x{1}轉(zhuǎn)換為雙精度類型后,左移24位,然后賦值給dn_x dn_x:=BitOrDnum(dn_x,BitLShDnum(NumToDnum(byte_x{2}),16));!將單精度數(shù)據(jù)byte_x{2}轉(zhuǎn)換為雙精度類型后,左移16位,并與dn_x做或運(yùn)算,然后賦值給自己 dn_x:=BitOrDnum(dn_x,BitLShDnum(NumToDnum(byte_x{3}),8));!將單精度數(shù)據(jù)byte_x{2}轉(zhuǎn)換為雙精度類型后,左移8位,并與dn_x做或運(yùn)算,然后賦值給自己 dn_x:=BitOrDnum(dn_x,NumToDnum(byte_x{4}));!將單精度數(shù)據(jù)byte_x{2}轉(zhuǎn)換為雙精度類型后,與dn_x做或運(yùn)算,然后賦值給自己 !機(jī)器人數(shù)據(jù)格式轉(zhuǎn)換 dn_y:=BitLShDnum(NumToDnum(byte_y{1}),24); dn_y:=BitOrDnum(dn_y,BitLShDnum(NumToDnum(byte_y{2}),16)); dn_y:=BitOrDnum(dn_y,BitLShDnum(NumToDnum(byte_y{3}),8)); dn_y:=BitOrDnum(dn_y,NumToDnum(byte_y{4})); !機(jī)器人數(shù)據(jù)格式轉(zhuǎn)換 dn_z:=BitLShDnum(NumToDnum(byte_z{1}),24); dn_z:=BitOrDnum(dn_z,BitLShDnum(NumToDnum(byte_z{2}),16)); dn_z:=BitOrDnum(dn_z,BitLShDnum(NumToDnum(byte_z{3}),8)); dn_z:=BitOrDnum(dn_z,NumToDnum(byte_z{4})); !機(jī)器人數(shù)據(jù)格式轉(zhuǎn)換 dn_rx:=BitLShDnum(NumToDnum(byte_rx{1}),24); dn_rx:=BitOrDnum(dn_rx,BitLShDnum(NumToDnum(byte_rx{2}),16)); dn_rx:=BitOrDnum(dn_rx,BitLShDnum(NumToDnum(byte_rx{3}),8)); dn_rx:=BitOrDnum(dn_rx,NumToDnum(byte_rx{4})); !機(jī)器人數(shù)據(jù)格式轉(zhuǎn)換 dn_ry:=BitLShDnum(NumToDnum(byte_ry{1}),24); dn_ry:=BitOrDnum(dn_ry,BitLShDnum(NumToDnum(byte_ry{2}),16)); dn_ry:=BitOrDnum(dn_ry,BitLShDnum(NumToDnum(byte_ry{3}),8)); dn_ry:=BitOrDnum(dn_ry,NumToDnum(byte_ry{4})); !機(jī)器人數(shù)據(jù)格式轉(zhuǎn)換 dn_rz:=BitLShDnum(NumToDnum(byte_rz{1}),24); dn_rz:=BitOrDnum(dn_rz,BitLShDnum(NumToDnum(byte_rz{2}),16)); dn_rz:=BitOrDnum(dn_rz,BitLShDnum(NumToDnum(byte_rz{3}),8)); dn_rz:=BitOrDnum(dn_rz,NumToDnum(byte_rz{4})); !使用相應(yīng)的組輸出信號(hào),將機(jī)器人當(dāng)前位置數(shù)據(jù)進(jìn)行輸出 setgo go_cx,dn_x; setgo go_cy,dn_y; setgo go_cz,dn_z; setgo go_crx,dn_rx; setgo go_cry,dn_ry; setgo go_crz,dn_rz; ENDPROC機(jī)器人主程序編寫(xiě)
在主程序中編寫(xiě)定時(shí)器中斷程序,中斷時(shí)間間隔為0.5s,即每個(gè)0.5s讀取一次機(jī)器人當(dāng)前位置,并將當(dāng)前位置數(shù)據(jù)發(fā)送給PLC。完整機(jī)器人主程序代碼如下所示。
機(jī)器人主程序代碼如下所示:
PROC main() IDelete TrapNum;!取消識(shí)別號(hào)為T(mén)rapNum的中斷 CONNECT TrapNum WITH iTrap;!將識(shí)別號(hào)為T(mén)rapNum的中斷與中斷程序iTrap連接 ITimer 0.5,TrapNum;!循環(huán)調(diào)用中斷程序TrapNum,循環(huán)周期為0.5s !循環(huán)執(zhí)行機(jī)器人運(yùn)動(dòng)程序 WHILE TRUE DO MoveAbsJ jpos10\\NoEOffs,v50,z50,tool0; MoveJ p10,v50,z50,tool0; MoveJ p20,v50,z50,tool0; MoveAbsJ jpos10\\NoEOffs,v50,z50,tool0; ENDWHILEENDPROC
完整的機(jī)器人程序代碼如下所示。
完整的機(jī)器人程序代碼如下所示:
MODULE Module1CONST jointtarget jpos10:=[[0,0,0,0,30,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];CONST robtarget p10:=[[392.836308491,-156.6306903,309.536253784],[0.165037067,-0.000000128,0.986287365,0.000000003],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];CONST robtarget p20:=[[392.836306583,149.260106132,309.53614795],[0.165037087,-0.000000142,0.986287362,0],[0,-1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]]; !聲明機(jī)器人當(dāng)前位姿變量 VAR robtarget pCurrentPos; !聲明機(jī)器人位姿存儲(chǔ)變量 VAR num x; VAR num y; VAR num z; VAR num rx; VAR num ry; VAR num rz; !聲明機(jī)器人位姿通用數(shù)據(jù)容器中間轉(zhuǎn)換變量 VAR rawbytes rawbyte_x; VAR rawbytes rawbyte_y; VAR rawbytes rawbyte_z; VAR rawbytes rawbyte_rx; VAR rawbytes rawbyte_ry; VAR rawbytes rawbyte_rz; !聲明機(jī)器人位姿字節(jié)型中間數(shù)據(jù)轉(zhuǎn)換變量 VAR byte byte_x{4}; VAR byte byte_y{4}; VAR byte byte_z{4}; VAR byte byte_rx{4}; VAR byte byte_ry{4}; VAR byte byte_rz{4}; !聲明雙精度類型機(jī)器人位姿數(shù)據(jù)變量 VAR dnum dn_x; VAR dnum dn_y; VAR dnum dn_z; VAR dnum dn_rx; VAR dnum dn_ry; VAR dnum dn_rz; !聲明中斷數(shù)據(jù)變量 VAR intnum TrapNum;PROC main() IDelete TrapNum;!取消識(shí)別號(hào)為T(mén)rapNum的中斷 CONNECT TrapNum WITH iTrap;!將識(shí)別號(hào)為T(mén)rapNum的中斷與中斷程序iTrap連接 ITimer 0.5,TrapNum;!循環(huán)調(diào)用中斷程序TrapNum,循環(huán)周期為0.5s !循環(huán)執(zhí)行機(jī)器人運(yùn)動(dòng)程序 WHILE TRUE DO MoveAbsJ jpos10\\NoEOffs,v50,z50,tool0; MoveJ p10,v50,z50,tool0; MoveJ p20,v50,z50,tool0; MoveAbsJ jpos10\\NoEOffs,v50,z50,tool0; ENDWHILEENDPROC TRAP iTrap!中斷程序iTrap !讀取機(jī)器人當(dāng)前位置,并將讀取數(shù)據(jù)賦值給pCurrentPos pCurrentPos:=CRobT(); !將讀取到的機(jī)器人當(dāng)前位置x、y、z坐標(biāo)值分別賦值給變量x、y、z x:=pCurrentPos.trans.x; y:=pCurrentPos.trans.y; z:=pCurrentPos.trans.z; !將將讀取到的機(jī)器人當(dāng)前位置四元數(shù)角度值轉(zhuǎn)換為歐拉角之后,分別賦值給變量rx、ry、rz rx:=EulerZYX(\\x,pCurrentPos.rot); ry:=EulerZYX(\\y,pCurrentPos.rot); rz:=EulerZYX(\\z,pCurrentPos.rot); !調(diào)用發(fā)送機(jī)器人當(dāng)前位置例行程序 send_pCurrentPos; ENDTRAP PROC send_pCurrentPos()!發(fā)送機(jī)器人當(dāng)前位置例行程序 !清空機(jī)器人位姿通用數(shù)據(jù)容器中間轉(zhuǎn)換變量 ClearRawBytes rawbyte_x; ClearRawBytes rawbyte_y; ClearRawBytes rawbyte_z; ClearRawBytes rawbyte_rx; ClearRawBytes rawbyte_ry; ClearRawBytes rawbyte_rz; !將機(jī)器人當(dāng)前位置數(shù)據(jù)按照f(shuō)loat形式打包 PackRawBytes x,rawbyte_x,RawBytesLen(rawbyte_x)+1\\Float4; PackRawBytes y,rawbyte_y,RawBytesLen(rawbyte_y)+1\\Float4; PackRawBytes z,rawbyte_z,RawBytesLen(rawbyte_z)+1\\Float4; PackRawBytes rx,rawbyte_rx,RawBytesLen(rawbyte_rx)+1\\Float4; PackRawBytes ry,rawbyte_ry,RawBytesLen(rawbyte_ry)+1\\Float4; PackRawBytes rz,rawbyte_rz,RawBytesLen(rawbyte_rz)+1\\Float4; !將機(jī)器人位姿通用數(shù)據(jù)容器里的前4個(gè)字節(jié)數(shù)據(jù)分別保存到字節(jié)數(shù)組變量中 FOR i FROM 1 TO 4 DO UnpackRawBytes rawbyte_x,i,byte_x{i}\\Hex1; UnpackRawBytes rawbyte_y,i,byte_y{i}\\Hex1; UnpackRawBytes rawbyte_z,i,byte_z{i}\\Hex1; UnpackRawBytes rawbyte_rx,i,byte_rx{i}\\Hex1; UnpackRawBytes rawbyte_ry,i,byte_ry{i}\\Hex1; UnpackRawBytes rawbyte_rz,i,byte_rz{i}\\Hex1; ENDFOR !機(jī)器人數(shù)據(jù)格式轉(zhuǎn)換(西門(mén)子PLC高低字節(jié)與機(jī)器人高低字節(jié)定義相反) dn_x:=BitLShDnum(NumToDnum(byte_x{1}),24);!將單精度數(shù)據(jù)byte_x{1}轉(zhuǎn)換為雙精度類型后,左移24位,然后賦值給dn_x dn_x:=BitOrDnum(dn_x,BitLShDnum(NumToDnum(byte_x{2}),16));!將單精度數(shù)據(jù)byte_x{2}轉(zhuǎn)換為雙精度類型后,左移16位,并與dn_x做或運(yùn)算,然后賦值給自己 dn_x:=BitOrDnum(dn_x,BitLShDnum(NumToDnum(byte_x{3}),8));!將單精度數(shù)據(jù)byte_x{2}轉(zhuǎn)換為雙精度類型后,左移8位,并與dn_x做或運(yùn)算,然后賦值給自己 dn_x:=BitOrDnum(dn_x,NumToDnum(byte_x{4}));!將單精度數(shù)據(jù)byte_x{2}轉(zhuǎn)換為雙精度類型后,與dn_x做或運(yùn)算,然后賦值給自己 !機(jī)器人數(shù)據(jù)格式轉(zhuǎn)換 dn_y:=BitLShDnum(NumToDnum(byte_y{1}),24); dn_y:=BitOrDnum(dn_y,BitLShDnum(NumToDnum(byte_y{2}),16)); dn_y:=BitOrDnum(dn_y,BitLShDnum(NumToDnum(byte_y{3}),8)); dn_y:=BitOrDnum(dn_y,NumToDnum(byte_y{4})); !機(jī)器人數(shù)據(jù)格式轉(zhuǎn)換 dn_z:=BitLShDnum(NumToDnum(byte_z{1}),24); dn_z:=BitOrDnum(dn_z,BitLShDnum(NumToDnum(byte_z{2}),16)); dn_z:=BitOrDnum(dn_z,BitLShDnum(NumToDnum(byte_z{3}),8)); dn_z:=BitOrDnum(dn_z,NumToDnum(byte_z{4})); !機(jī)器人數(shù)據(jù)格式轉(zhuǎn)換 dn_rx:=BitLShDnum(NumToDnum(byte_rx{1}),24); dn_rx:=BitOrDnum(dn_rx,BitLShDnum(NumToDnum(byte_rx{2}),16)); dn_rx:=BitOrDnum(dn_rx,BitLShDnum(NumToDnum(byte_rx{3}),8)); dn_rx:=BitOrDnum(dn_rx,NumToDnum(byte_rx{4})); !機(jī)器人數(shù)據(jù)格式轉(zhuǎn)換 dn_ry:=BitLShDnum(NumToDnum(byte_ry{1}),24); dn_ry:=BitOrDnum(dn_ry,BitLShDnum(NumToDnum(byte_ry{2}),16)); dn_ry:=BitOrDnum(dn_ry,BitLShDnum(NumToDnum(byte_ry{3}),8)); dn_ry:=BitOrDnum(dn_ry,NumToDnum(byte_ry{4})); !機(jī)器人數(shù)據(jù)格式轉(zhuǎn)換 dn_rz:=BitLShDnum(NumToDnum(byte_rz{1}),24); dn_rz:=BitOrDnum(dn_rz,BitLShDnum(NumToDnum(byte_rz{2}),16)); dn_rz:=BitOrDnum(dn_rz,BitLShDnum(NumToDnum(byte_rz{3}),8)); dn_rz:=BitOrDnum(dn_rz,NumToDnum(byte_rz{4})); !使用相應(yīng)的組輸出信號(hào),將機(jī)器人當(dāng)前位置數(shù)據(jù)進(jìn)行輸出 setgo go_cx,dn_x; setgo go_cy,dn_y; setgo go_cz,dn_z; setgo go_crx,dn_rx; setgo go_cry,dn_ry; setgo go_crz,dn_rz; ENDPROCENDMODULE運(yùn)行測(cè)試
在PLC中進(jìn)行組態(tài)編程,然后運(yùn)行機(jī)器人,同時(shí)對(duì)PLC中相應(yīng)的數(shù)據(jù)寄存器進(jìn)行監(jiān)視,可以看到機(jī)器人的實(shí)時(shí)位置數(shù)據(jù)已經(jīng)發(fā)送過(guò)來(lái)了,并且每隔0.5s刷新一次。西門(mén)子老版本的PLC實(shí)數(shù)數(shù)據(jù)的高低位字節(jié)順序與ABB機(jī)器人的實(shí)數(shù)數(shù)據(jù)的高低位順序是相反的;新版本的PLC,小編還沒(méi)有測(cè)試過(guò),若是使用新版本的PLC,測(cè)試時(shí)可以注意一下。如果高低位字節(jié)順序是一致的,那么只需要把發(fā)送機(jī)器人當(dāng)前位置數(shù)據(jù)子例行程序中的數(shù)據(jù)移位程序刪除即可。對(duì)于三菱PLC、歐姆龍PLC或是其他品牌的PLC,讀取機(jī)器人當(dāng)前位置的程序都是類似的,感興趣的小伙伴可以自己測(cè)試一下。
The End
上一篇:Robotstudio軟件:機(jī)床上下料工作站機(jī)器人主邏輯編寫(xiě)與仿真運(yùn)行
以上就是關(guān)于即時(shí)到pos機(jī)使用方法,使用定時(shí)器中斷程序向西門(mén)子PLC發(fā)送實(shí)時(shí)位置數(shù)據(jù)的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于即時(shí)到pos機(jī)使用方法的知識(shí),希望能夠幫助到大家!