ABB通讯-profinet传输正负整数及浮点数

图片[1]-ABB机器人profinet通讯传输正负整数及浮点数

前言

大家好,之前在其它公众号上看到有篇 付费文章 介绍 ABB机器人profinet通讯传输正负整数及浮点数 ,抽空测试了以下,发现它提供的代码还是有问题的。

图片[2]-ABB机器人profinet通讯传输正负整数及浮点数

今天我把完整的测试后的代码发布出来,供大家参考!

PLC发送到ABB机器人

这部分代码是没问题的,注意一下高低字节转换就行。

  1. 高低字节转换配置
图片[3]-ABB机器人profinet通讯传输正负整数及浮点数
  1. 代码实现, 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
  1. 接收实例,Plc_offset_X 为ABB机器人配置的32位的组输入
PERS num ntest;

PROC Routine1()
    ntest:=recvdata(\Float,Plc_offset_X);
    Stop;
ENDPROC

问题就出在,ABB机器人发送给PLC上

按照它的代码,会提示如下错误。

  • PackRawBytes打包指令\IntX := UDINT或\IntX := LINT,报错参数Value不是整数,只能对应为\Float4类型。
图片[4]-ABB机器人profinet通讯传输正负整数及浮点数
  • PackRawBytes打包指令\Float4类型,只能打包num数据类型,如果把num改成dnum,报错存在非法数据类型。
图片[5]-ABB机器人profinet通讯传输正负整数及浮点数
  • 32位的组输出不能在if语句中出现
图片[6]-ABB机器人profinet通讯传输正负整数及浮点数

那么,如何发送浮点数呢?

无法发送32个bit,那就把32个bit分开,分成4个字节;同样的,也需要把Go组输出分成4个,信号名称例如,GoutputX,GoutputX_1,GoutputX_2,GoutputX_3,GoutputX_4

图片[7]-ABB机器人profinet通讯传输正负整数及浮点数
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
喜欢就支持一下吧
点赞4 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容