cpu224xp作为主站,接收modbus从站的数值,数值的变化范围0——10万(可能),请问如何编程实现,如何选择合适的V寄存器,如果选字,肯定不够,如果选双字,就会出现下面图片的问题,接收为1时,显示如下,接收为4000时,显示如下,如果采用双字循环移位16,对于4000是可以的,但对于1,是不适合的,求解答,如何编程实现正确转化:
图片一显示的数值,二进制为:0000 0000 0001 0000 0000 0000 0000 0000
图片二显示的数值,二进制为:0000 1111 1010 0000 0000 0000 0000 0000
图片说明:
最佳答案
不是这么搞的。你要看从站的数据格式,是字还是双字。然后再看PLC侧,如何处理数据。
你的截图,应该不是最初接收的数据。因为当你的数据为1时,VW50=256,而当数据是4000时,VW50=4000.
接收数据的处理,不需要移动。只需要把数据,重新按字节组合就可以。
如接收数据存在vd50.
MOVW VW50,VW102
MOVW VW52,VW100
那么VD100可能就是你需要的值。具体如何组合,要看你仪表和PLC的数据存储方式。详细的资料,你可以搜索大端对齐和小端对齐。但是搞明白这些是很烧脑的。也有简单的方式。
-
比如,十进制400,058,552的二进制为(0001 0111)(1101 1000)(0110 1000)(1011 1000).最前面是31位,最后面是第0位。在任何设备中,只要是双整都是这么显示的,不同的是存储方式。但是最基本的存储单元是字节,也就是8个位,所以每个( )中的8个位一定是在一起的。
对于西门子的200系列PLC,如果把400,058,552存到VD100,那么上面的4个字节依次为(VB100)(VB101)(VB102)(VB103)
假设从仪表读过来的数据存在VD50。如果VD50的数值就是400,058,552,那么你就不需要做任何处理。这一般是和西门子的PLC通信的时候。
如果数值不是400,058,552,那你把VD50以二进制显示(16进制最好)。比如显示的是这样:(1011 1000)(0110 1000)(1101 1000)(0001 0111)=(VB50)(vb51)(VB52)(VB53)。你对比正确的二进制就会发现,他只是把顺序反过来了,你直接把顺序搞正,再放到一个新的地址(比如:VD100)就可以了。具体就是VB53->VB100,VB52->VB101,VB51->VB102,VB50->VB103.此时,VD100就应该和从站的数值相同了。
提问者对于答案的评价:
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc370901.html