杂货栈 2025-12-2 10:46:48 | 显示全部楼层 | 阅读模式

『7x24小时有问必答』

点/击/蓝/字 关/注/我/们
概述

ABB机器人的组输入(Group Input)和组输出(Group Output)信号的取值范围是非负整数。
当我们遇到需要传递实数(包括负整数,带小数的数据)的时候该怎么办呢。本篇文章会介绍两种通过总线传递实数的方法。

01
<i>常见的数据类型</i>
PLC 端均支持常见的计算机数据类型,包括USINT、UINT、UDINT、ULINT、SINT、INT、DINT、LINT及REAL(相当于标准 Float 32位单精度浮点数)。

      

02
<b><i>通过总线发送实数方法1</i>

       我们可以和PLC约定好,通过算式将实数转化成非负整数,进行传递。PLC在将收到的数据进行反运算即可,接收实数。
GO := (REAL + 基数)*倍数
举例说明:我们要传递一个大于-800的实数。就可以加上基数800转成非负整数,要保留三位小数就乘1000倍数。PLC在接收到数据后进行反运算即可。
!传递REAL=-3.1415!机器人端发送GO :=   RoundDnum((-3.1415 + 800)*1000) := 796859  !PLC端接收reg := 796859/1000-800 := -3.141

03
通过总线发送实数方法2

第二种方法,机器人可以通过指令将数据打包成二进制的形式发送。PLC端在接收数据时,将对应地址位数据的类型设置成与机器人侧数据相同的类型,则PLC端可自动获取对应类型的数据(如 REAL 和 DINT等)。

下面代码将转化程序编辑成函数,直接导入调用即可使用。

读取组输入数据
num1 := GetData(\FLOAT,gi1);

(\FLOAT|INT |DINT | SINT |FLOAT)  num1 :将组输入gi1的数据以float类型保存到num1中。

写入组输出数据
SetGO go1, SetData(\FLOAT,num2);

(\FLOAT|INT |DINT | SINT |FLOAT)将num2的值以float类型保存到组输出go1中。

完整代码
MODULE MainModule      VAR num num1;      VAR num num2;PROC main()            num2 := -3.14;            SetGO go1, SetData(\FLOAT,num2);      WaitTime 0.5;      num1 := GetData(\FLOAT,gi1);            WaitTime 0.5;            num2 := 3.14;            SetGO go1, SetData(\FLOAT,num2);      WaitTime 0.5;      num1 := GetData(\FLOAT,gi1);ENDPROC       FUNC num GetData(\switch INT | switch DINT | switch SINT | switch FLOAT,VAR signalgi INPUT_GI)                         VAR num result;            VAR rawbytes rawbyte1;                         ClearRawBytes rawbyte1;            PackRawBytes GInputDnum(INPUT_GI), rawbyte1,1\IntX:=UDINT;            IF Present(INT) THEN            UnpackRawBytes rawbyte1,1,result\IntX:=-2;            ENDIF            IF Present(DINT) THEN            UnpackRawBytes rawbyte1,1,result\IntX:=-4;            ENDIF            IF Present(SINT) THEN            UnpackRawBytes rawbyte1,1,result\IntX:=-1;            ENDIF            IF Present(FLOAT) THEN            UnpackRawBytes rawbyte1,1,result\Float4;            ENDIF            RETURN result;ENDFUNC              FUNC dnum SetData(\switch INT | switch DINT | switch SINT | switch FLOAT,num data)                         VAR dnum result;            VAR rawbytes rawbyte2;                         ClearRawBytes rawbyte2;                       IF Present(INT) THEN                  PackRawBytes data,rawbyte2,1\IntX:=-2;                  UnpackRawBytes rawbyte2,1,result\IntX:=UDINT;            ENDIF            IF Present(DINT) THEN                  PackRawBytes data,rawbyte2,1\IntX:=-4;                  UnpackRawBytes rawbyte2,1,result\IntX:=UDINT;            ENDIF            IF Present(SINT) THEN                  PackRawBytes data,rawbyte2,1\IntX:=-1;                  UnpackRawBytes rawbyte2,1,result\IntX:=UDINT;            ENDIF            IF Present(FLOAT) THEN                  PackRawBytes data,rawbyte2,1\Float4;                  UnpackRawBytes rawbyte2,1,result\IntX:=UDINT;            ENDIF            RETURN result;ENDFUNCENDMODULE

往期回顾
扫码关注
关注、分享、点赞
查看往期文章

</b>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码