前言
大家好,之前在其它公众号上看到有篇 付费文章 介绍 ABB机器人profinet通讯传输正负整数及浮点数 ,抽空测试了以下,发现它提供的代码还是有问题的。
今天我把完整的测试后的代码发布出来,供大家参考!
PLC发送到ABB机器人
这部分代码是没问题的,注意一下高低字节转换就行。
- 高低字节转换配置
- 代码实现,
是功能块程序,可以程序调用返回特定数据类型的值。FUNC
FUNC num recvdata(\switch Float|switch Dint|switch Int|switch Sint,VAR signalgi ginput)
!Float :32 bit , PLC is REAL data type
!Dint :32 bit , PLC is DINT data type
!Int :16 bit , PLC is INT data type
!Sint :8 bit , PLC is SINT data type
VAR num result;
VAR rawbytes rawbytes1;
ClearRawBytes rawbytes1;
PackRawBytes GinputDnum(ginput),rawbytes1,1\intx:=UDINT;
IF Present(Float) THEN
UnpackRawBytes rawbytes1,1,result\Float4;
ENDIF
IF Present(Dint) THEN
UnpackRawBytes rawbytes1,1,result\intx:=-4;
ENDIF
IF Present(Int) THEN
UnpackRawBytes rawbytes1,1,result\intx:=-2;
ENDIF
IF Present(Sint) THEN
UnpackRawBytes rawbytes1,1,result\intx:=-1;
ENDIF
RETURN result;
ENDFUNC
- 接收实例,
为ABB机器人配置的32位的组输入Plc_offset_X
PERS num ntest;
PROC Routine1()
ntest:=recvdata(\Float,Plc_offset_X);
Stop;
ENDPROC
问题就出在,ABB机器人发送给PLC上
按照它的代码,会提示如下错误。
- PackRawBytes打包指令\IntX := UDINT或\IntX := LINT,报错参数Value不是整数,只能对应为\Float4类型。
- PackRawBytes打包指令\Float4类型,只能打包num数据类型,如果把num改成dnum,报错存在非法数据类型。
- 32位的组输出不能在if语句中出现
那么,如何发送浮点数呢?
无法发送32个bit,那就把32个bit分开,分成4个字节;同样的,也需要把Go组输出分成4个,信号名称例如,GoutputX
,GoutputX_1
,GoutputX_2,GoutputX_3
,GoutputX_4
。
PROC senddata(\switch Float|switch Dint|switch Int|switch Sint,string str_goutput,num data)
!Float :32 bit , PLC is REAL data type
!Dint :32 bit , PLC is DINT data type
!Int :16 bit , PLC is INT data type
!Sint :8 bit , PLC is SINT data type
VAR num i;
VAR num result;
VAR byte result_byte{4};
VAR rawbytes rawbytes1;
VAR signalgo signalgo1;
IF Present(Float) THEN
PackRawBytes data,rawbytes1,1\Float4;
FOR i FROM 1 TO 4 DO
UnpackRawBytes rawbytes1,i,result_byte{i}\Hex1;
GetDataVal str_goutput+"_"+ValToStr(i),signalgo1;
SetGO signalgo1,result_byte{i};
ENDFOR
ENDIF
IF Present(Dint) THEN
PackRawBytes data,rawbytes1,1\intx:=-4;
FOR i FROM 1 TO 4 DO
UnpackRawBytes rawbytes1,i,result_byte{i}\Hex1;
GetDataVal str_goutput+"_"+ValToStr(i),signalgo1;
SetGO signalgo1,result_byte{i};
ENDFOR
ENDIF
IF Present(Int) THEN
PackRawBytes data,rawbytes1,1\intx:=-2;
UnpackRawBytes rawbytes1,1,result\intx:=UDINT;
GetDataVal str_goutput,signalgo1;
SetGO signalgo1,result;
ENDIF
IF Present(Sint) THEN
PackRawBytes data,rawbytes1,1\intx:=-1;
UnpackRawBytes rawbytes1,1,result\intx:=UDINT;
GetDataVal str_goutput,signalgo1;
SetGO signalgo1,result;
ENDIF
RETURN ;
ENDPROC
接收实例,Rob_offset_X
为ABB机器人配置的32位的组输出,Rob_offset_X_1
Rob_offset_X_2
Rob_offset_X_3
Rob_offset_X_4
是分开的8位的组输出
PROC Routine1()
senddata\Float,"Rob_offset_X",-1.23;
Stop;
ENDPROC
THE END
暂无评论内容