[CodeSys] Codesys数据截断概念

[复制链接]
查看267 | 回复0 | 2024-7-21 15:43:01 | 显示全部楼层 |阅读模式
>
官方参考文档

CODESYS编译器会为目标设备生成代码,并始终以目标设备定义的本机大小来计算临时结果。例如,至少在x86和ARM系统上使用32位临时值执行计算,而在x64系统上始终使用64位临时值执行计算。这在计算速度上提供了相当大的优势,并且通常还产生期望的结果。但这也意味着在某些情况下不会截断数据类型的上溢或下溢。


什么情况下会导致截断


定义一个DINT类型的数据为dCount := 65537;

定义一个INT类型的数据iCount := 0;

将DINT类型的数据dCount通过数据转换赋值给INT类型的数据iCount,得到的结果为1,则数据产生了截断。




100篇原创文章【公众号-我的原创】
EPLAN部件库下载链接
EPLAN激活教程
西门子作为OPC UA服务端
西门子制作HMI页面切换效果


65535+1=0?


由于我们定义了一个WORD类型的数据值为65535,在执行+1运算时候,原来的16Bit寄存器溢出,以我的64位Windows10为例,由于系统是64位系统,则开辟的临时存储区长度为64Bit,用于存放计算结果。


则计算65535+1=0后的寄存器表达为
(2#)1111 1111 1111 1111 + (2#)1 = (2#)1 0000 0000 0000 0000
由于接收数据的寄存器为16Bit的WORD类型,所以,系统会将和的后16Bit截断后,赋值给WORD类型的变量,于是就产生了65535+1=0的现象。




如何使用串口调试助手
如何使用以太网调试助手
松下    MEWTOCOL-COM协议解析
三菱    CC-Link协议解析
欧姆龙 HostLink协议解析
ModbusTCP协议解析
ModbusRTU协议解析
ModbusASCII协议解析




0-1不等于65535?


我们定义一个WORD类型的数据W1:=0 和 W2:=0, 让W1执行减1操作,赋值给W2,这样,W2就会得到65535的结果。这样就发生了截断。


当执行W1-1操作时,得到临时寄存器Bit0-Bit63都为1的数据,当将结果赋值给W2时,系统就会产生截断。将Bit0-Bit15的值赋值给W2,这样,W2的值为65535。



然而,在数据截断之前我们可以进行比较——比较0-1=65535是否和65535相等。


如下所示:


我们定义一个WORD类型的数据W3,初始值为0,让它执行减1操作。让它和W1(初始值为65535)进行比较,比较完之后,赋值给BOOL量数据,若BOOL量数据为TRUE,则表示数据相同,若BOOL量为FALSE,则表示数据不同。如下图所示







总结:

在进行编程时候,一定要注意数据是否溢出,采用合适的数据类型,可以避免出现难以解决的问题。








感谢你的打赏支持,送你部件库一份 ↓↓↓↓↓



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

本帖子中包含更多资源

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

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

本版积分规则