合信论坛

快捷导航
查看: 9169|回复: 3

HMI通过modbus协议访问 C系列CPU不同类型数据的方法

[复制链接]

146

主题

229

帖子

3054

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3054
发表于 2019-1-17 17:42:39 | 显示全部楼层 |阅读模式
一种利用结构体变量使HMI通过modbus协议访问C系列CPU不同类型数据的方法
(1)建立一个结构体
方法:右击codesys设备界面的“application”,选择“添加对象”中的“DUT”,类型选择“结构”打开,就成功建立一个结构体,如下图:
图片1.png
(2)在结构体中声明不同类型的变量
图片2.png
(3)访问结构体中的变量
访问前必须声明一个变量(如stru),类型为DUT;声明之后就可以访问结构体中的变量,访问方法是:声明的结构体名.结构体中声明的变量名。
图片3.png
(4)将modbus从站初始化指令的缓冲区改为声明的结构体名
图片4.png
注意:当一个变量是bool或byte类型时,均占1个字节,int类型占2个字节,real类型占4个字节。
在codesys中缓冲区数据遵循字对齐、双字对齐的原理,故与屏通信时需要注意对应关系。
以上述定义的结构体为例,下面是具体占用缓冲区(字节)的地址:
图片5.png
上图中变量a4占用缓冲区5、6,变量5是real型需占4个字节,变量5自动存放到9~12中,而非7~10中这就是双字对齐;若变量a2改为Int类型,则变量a2占用缓冲区3~4,而不是2~3,这就是字对齐;缓冲区15存放的是shuzu[3]的值,对应屏的40008.16,即每个bool类型的数据占一个字节的缓冲区;由于屏中建立变量,连接选择modbus通信时,不能选择byte类型(从下图可以看到),屏中的地址40001的低字节对应缓冲区1a1),高字节对应缓冲区2(a2),故屏中4x40001地址写入的值与监控到的a2的值不同。(如C37中将变量a2写入16#7B,对应屏中4x40001显示16#7B00
图片6.png
补充说明
1、bool类型的变量,通过屏访问时高低字节相反, 如上面40007.16对应变量shuzu[1],40007.8对应变量shuzu[2],40008.16对应shuzu[3],40008.8对应shuzu[4],依次类推;
2、如果程序中使用字节类型的变量,则建议将其定义到缓冲区字对齐的位置:
图片7.png
如上面定义a3占缓冲区3a4占缓冲区5~6,要访问a3在屏上定义4x40002,此时给4x40002写入16#007B,则7B就写入到缓冲区3a3中,这样屏上写入的值就与监控到的变量值相同。(a2需定义但可以不使用,目的是让有用的a3变量便于屏访问)
3、查看缓冲区、变量的大小可以使用SIZEOF (缓冲区/变量名)实现,如下图可以看到结构体所占缓冲区的大小,单位是字节;从图中可以看到a1~a5占用了12个字节,数组占用了2000个字节,故所得结果是2012。
图片8.png

发表于 2019-1-18 01:37:19 来自手机 | 显示全部楼层
点赞
回复

使用道具 举报

0

主题

17

帖子

84

积分

注册会员

Rank: 2

积分
84
发表于 2019-7-23 10:12:29 | 显示全部楼层
回复

使用道具 举报

5

主题

9

帖子

108

积分

注册会员

Rank: 2

积分
108
发表于 2020-2-17 17:17:53 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则

客服热线
400-700-4858 周一至周五:09:00 - 18:00
深圳市南山区打石一路深圳国际创新谷6栋A座9层

深圳市合信自动化技术有限公司(简称“合信技术”)成立于2003年,高新技术企业,专注于工业自动化产品的研发、生产、销售和技术服务,依靠高质量、高性能的自动化控制产品与方案为客户创造最大价值,立志于成为全球领先的工业自动化解决方案供应商。

Archiver|手机版|小黑屋|COTRUST Inc. ( 粤ICP备13051915号 )

GMT+8, 2024-3-29 00:34 , Processed in 0.101070 second(s), 23 queries .

快速回复 返回顶部 返回列表