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