【导读】WINCC在进行Modbus TCP通信时,由于WINCC默认是大端模式存储,即数据高字存在低位存储器中,这就导致有些小端模式的现场仪表的的浮点数不能正确在WINCC上进行显示,必须进行大小端匹配转换(有的品牌可以直接设置)。下面详细阐述处理方法。(一)模拟服务器环境搭建
本例并不采用Modbus SIM或Modbus Slave做为服务器的原因是这两个软件可以通过DINT和REAL的显示格式。通常在实际现场,设备侧的寄存器存储模式已经固定,不能修改,这样就必须在上位中进行处理。利用施耐德UnityPro建立一个Modbus
TCP的仿真服务器,并新建变量如下图,变量aa和bb分别为REAL和Dint类型,在内存中都是占据%MW0,%MW1四个字节,通过在线监视可以看出,施耐德数据存储是“小端模式”即数据高字存在高位存储器中,即CDAB形式。(二)WINCC通信
在WINCC中新建驱动并新建a3和a4变量,分别为FLOAT和DINT类型,同样在内存中都是占据%MW0和%MW1共四个字节,并在上位画面中与相应的IO域关联。
与施耐德仿真PLC通信成功后,不难发现%MW0和%MW1均与PLC上一一对应,但是REAL类型的a3变量不能显示,a4类型的DINT变量与PLC侧的DINT数据不一样。通过对比不难发现在WINCC侧DINT和REAL的存储结构是高字储存在低位,而在PLC侧是高字储存在高位,这样就造成这种双字类型的变量显示异常。(三)输出值处理
为了能正确显示,需要在IO域输出中利用C脚本进行高低字转化,具体过程如下图:通过上述C脚本处理后REAL类型显示值就与PLC侧一致了,DINT类型的处理过程类似,就不在赘述。(四)输入值处理
通过上述方法处理后,这样虽然可以正常的显示,但是无法通过上位IO域输入修改PLC侧的变量数据。
因此本文通过监听输入值改变的事件,然后在事件中利用脚本将输入的值按照小端模式进行重新组合后再写给变量,从而改变相应变量的值并且与PLC侧数据同步。具体过程如下:
(五)IO域输入/输出连接不同变量的间接方法
在西门子论坛中看到过两个咨询帖子,关于IO域的输出和输入连接不同变量的问题,通过官方的回复,基本确定目前并不支持该功能。通过前面解决浮点数显示和输入问题的思路,我们同样可以可以利用C脚本间接实现一个IO域输出、输入关联不同的变量。具体实现过程,各位网友可以按上述思路完成。(六)博途WINCC Modbus TCP驱动
默认情况在博途WINCC中新建Modbus TCP驱动时,有一个改变字顺序复制框,默认情况是没有勾选的。
同时在博途WINCC下建立相同的变量进行测试,结果如下:(1)不勾选更改字顺序,按小端处理,与PLC侧数据一致。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。