铃~~~!电话响起------您好!欢迎您拨打西门子技术支持热线。
客户:我这边是个S7-200的PLC系统,226 CN PLC 的port0口做modbus主站,读取一个仪表的数据,数据能通信,但是读过来的数据不对。
工程师:根据您的描述,那么应该已经通信上了,我们可以最后再排查程序问题。首先请检查接线,引脚3是信号+,引脚8是信号-。
另外,请问有核实两边的数据存储格式是否一致吗?因为西门子plc的数据存储格式是低位高字节,按照以VW0为例,就是高8位为VB0,低8位为VB1.如果仪表那边是高位高字节,即:高8位为VB1,低8位为VB0.那么两边正好相反,即便通信上了,数据对不上是可能的。西门子的低位高字节数据存储格式示意请参见:
客户:好,我先去核实一下。= = = = = =
客户:您好,modbus通信已经没问题了。PLC这边数据已经读取进来,我想问下读到的数应该是什么格式的。我这边一个数65500,PLC这边为什么是负数。
工程师:PLC在程序中监控和运算多是以有符号整数进行的,VW或者VD的最高位是符号位,如果对于Word来说,大于32767后数据为负。
通过modbus通信过来的数都是负数是吗?刚才65500的数是多少?除了程序块监控外,状态表在线监控,数据格式选择无符号后数据读取是否正常。
客户:哦,都是大数才为负数,应该是都大于32767的。状态表里譬如VW100吧,无符号数是65500,有符号数是-35,数据格式选择无符号的就正确。
工程师:数据存储实际上都是按照二进制进行的,只是读取它时的数据格式不同而已,您可以在状态表中选择无符号数。
客户:不是啊,我就是要正数。关键是我把这个数转换成实数后还带着负号,我port 1口连了第三方的触摸屏,触摸屏上选择的是实数连接,读上来后屏那边显示的是负数,不行啊。
工程师:嗯~,请问您是怎么进行编程转换的。
客户:我就是先用I_DI,再DI_R。不行啊,大数就错了,小数才不带符号。
工程师:您先别着急,按照正常的编程方式,您的思路是正确的,可对于负数来说就不行了。可以换种思路来考虑,对于word或者d-word的格式来说,数据的最高位是符号位。那么我们最开始转换成双字的时候,去掉符号就行了。
客户:我也试过,让这个数与16#7F相乘来去掉符号位,那就不对了,数就不对了。你这也不行啊
工程师:请先不要着急,我说的不是这个方法。在转换成双字的时候不要把最高位当作符号位,如下图,先来了解符号位的定义:
通过I_DI的转化,实际上是将VW0-VD0,可是如果将VW0直接放在VW2上,同时VW0清0,直接去读取VD0是什么情况?原先VW0中的符号位,在VW2中,并不是VD0的最高位即符号位,在VD0里就是数据了。而与此同时,我们去掉了负号是吗。
举例:VW0=65500(无符号整数),经过I_DI给VD10.
对比:VD0,双字转换后的VD10,和仅仅将VW0传送给VW6后的VD4,这几个数的比较,请参见下面的实验结果: