设为首页
收藏本站
PLC技术网
开启辅助访问
切换到宽版
登录
注册哦
只需一步,快速开始
微信扫码登录
门户
Portal
论坛
BBS
导读
Guide
排行榜
Ranklist
搜索
搜索
本版
文章
帖子
用户
PLC论坛-全力打造可编程控制器专业技术论坛
»
论坛
›
工控技术交流区
›
『国外:三菱/西门子/欧姆龙/松下』
›
Codesys数据截断概念
返回列表
发新帖
[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
回复
举报
返回列表
发新帖
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册哦
本版积分规则
发表回复
回帖后跳转到最后一页
工业技术互联
回复楼主
返回列表
『国外:三菱/西门子/欧姆龙/松下』
『国产:台达/汇川/信捷产品交流区』