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