转载请先后台留言,大家一起支持原创,推动机器人使用和发展
本公众号对各类ABB机器人应用,仿真,毕业设计提供技术支持,详细后台留言
本公众号诚挚希望与各机器人培训机构,机器人使用单元合作,提供技术支持,详细后台留言
1. PLC希望实时得到机器人当前位置(XYZ,ABC),如何实现?
2. 由于传输数据较大,建议通过总线进行传输。
3. 此处举例机器人通过PROFINET总线(机器人作为Device),实时向PLC发送当前位置(此处PLC以CODESYS为例)
4. 机器人创建若干组信号(此处每个信号使用32位,即4byte),如下图
5. 机器人可以通过定时中断(例如0.2s),或者通过多任务在后台读取当前位置并将发送到对应组输出上。
6. 由于得到的位置数据为num型(带符号的小数),为避免传输问题,可以先统一将数据*1000再取整。
7. 由于ABB机器人组输出只能存放非负整数,故我们将个数据以DINT(带符号整数,32位)形式打包并转化为DWORD(不带符号整数,32位)形式进行发送
8. Setdata指令的实现方式参见 通过总线发送实数及负整数
9. 代码如下
VAR intnum intno1;
PROC init1()
IDelete intno1;
CONNECT intno1 WITH get_pos;
ITimer 0.2,intno1;
ENDPROC
PROC main()
init1;
WHILE TRUE DO
Mainroutine;
ENDWHILE
ENDPROC
TRAP get_pos
VAR robtarget ptmp:=[[0,0,0],[1,0,0,0],[0,0,0,0],[9E9,9E9,9E9,9E9,9E9,9E9]];
VAR num rx;
VAR num ry;
VAR num rz;
ptmp:=crobt();
以下内容包括机器人代码以及完整CODESYS配置PROFINET通讯及数据处理步骤
rx:=eulerzyx(\X,ptmp.rot);
ry:=eulerzyx(\Y,ptmp.rot);
rz:=eulerzyx(\Z,ptmp.rot);
setdata\DINT,g_pox_x,round(1000*ptmp.trans.x);
setdata\DINT,g_pox_y,round(1000*ptmp.trans.y);
setdata\DINT,g_pox_z,round(1000*ptmp.trans.z);
setdata\DINT,g_pox_rx,round(1000*rx);
setdata\DINT,g_pox_rY,round(1000*ry);
setdata\DINT,g_pox_rZ,round(1000*rz);
ENDTRAP
10. 此处举例使用CODESYS V3.5 SP9
11. 在设备库中添加ABB机器人GSDML文件
12. 右击 device,添加对应总线和ABB机器人从站模块
13. 在PLC程序中创建若干变量
Currspeed:REAL;
PosX:REAL;
PosY:REAL;
PosZ:REAL;
PosRZ:REAL;
PosRY:REAL;
PosRX:REAL;
14. 对输入数据进行处理
CurrSpeed:=DWORD_TO_REAL(%ID0)/10;
PosX:=DWORD_TO_DINT(%ID1)/1000.0;
PosY:=DWORD_TO_DINT(%ID2)/1000.0;
PosZ:=DWORD_TO_DINT(%ID3)/1000.0;
PosRX:=DWORD_TO_DINT(%ID4)/1000.0;
PosRY:=DWORD_TO_DINT(%ID5)/1000.0;
PosRZ:=DWORD_TO_DINT(%ID6)/1000.0;
15. 打开
并将程序下载,启动运行16. 此时可以看到总线通讯正常
17. 机器人运行程序后,在PLC侧可以实时看到如下数据变化
此时对应机器人位置:
18. 为直观显示,可以在CODESYS中创建HMI
19. 拖入相应控件,并将变量进行关联
20. 启动PLC后,可以在HMI上实时看到机器人当前位置。
联系客服