今天发现了一个组态王MODBUS驱动的问题。
我用组态王6.5读一个DI模块。该模块是MODBUS RTU协议的,16路开关量输入。由于只用了前7个输入,所以我就只定义了7个DI点。运行良好。
今天,客户要求用力控来做,于是我就该力控了。同样定义了7个DI点。可是运行的时候力控老是说该DI模块通讯故障,百思不得其解。
终于用串口捕获软件看看通讯过程后,发现原因了!!!!
原因如下:
原因1、我用的DI模块是sb。本来我只用前7个DI,力控读的时候,也只读了钱7个DI,发出如下命令(1号站):
01 02 00 00 00 07 39 C8
正常情况下,模块返回:01 02 01 xx crc,可是这个sb模块返回的是:01 02 02 xx xx crc。就是说我只读了7个DI,他返回了大于8个的DI(应该是16个吧)。所以力控检查返回的时候,检查出错误了,就抱错了。
原因2、组态王没仔细检查模块返回。(用组态王时,通讯过程和上面相同。)
为了验证,我用MODBUS poll来读了一下该DI模块。读大于8个DI的时候,通讯正常;读小于9个DI的时候,MODBUS poll就报CRC校验错。
我一直用组态王配该模块,而组态王就一直把问题掩盖了。
不知道是组态王的BUG呢,还是组态王体贴用户,知道有些sb模块会不遵守MODBUS标准呢?
总之,1、我以后再也不用那个公司的模块了。虽然便宜,可是保不准还有什么问题;2、我以后也会尽量少用组态王了。
我个人觉得组态王这样的设计不妥当。
举个例子。
看样子,本例中,DI模块不管收到的读开关量命令是什么,都把16个开关量返回,那么DI0就在byte0的bit0,DI1在byte0的bit1,DI2在byte0的bit2,...,DI8在byte1的bit0,...。可是如果我要读的不是从DI0开始,比如是从DI2开始的几个开关量输入,那么根据协议,在返回中,DI2在byte0的bit0,DI3在byte0的bit1,...。显然组态王会把本例中模块的DI0作为DI2读入,...。
简单的说,MODBUS协议响应中,并没有包含寄存器的起始地址信息,所以本例中的模块和组态王配合一定会产生问题,只是没暴露罢了。
可能是这个公司的产品用的少吧,没有暴露出问题来。
我有一个问题,用的是modbus RTU, 我现在用kingview链接 一个控制器,走modbus RTU ,不能写实数过去,读的时候有的数对,有的数差一点,请高手指教
广东\袁(17505756)6:33:40 PM
我用modscan 32就能正常操作,多半是驱动问题,请问如何处理?
找回工程密码(952311560)6:38:42 PM
数据类型问题
广东\袁(17505756)6:39:05 PM
请说说看?
广东\袁(17505756)6:39:42 PM
广东\袁(17505756)6:39:57 PM
就这个4.1,用modscan 读写都可以
找回工程密码(952311560)6:39:52 PM
多试试,我也说不好
找回工程密码(952311560)6:40:03 PM
你的寄存器地址是多少
广东\袁(17505756)6:40:22 PM
广东\袁(17505756)6:40:51 PM
我选的驱动是莫迪康的modbus RTU
广东\袁(17505756)6:41:05 PM
我都试了
找回工程密码(952311560)6:41:00 PM
对
找回工程密码(952311560)6:41:03 PM
看不到图
广东\袁(17505756)6:41:29 PM
第一个读能看到不?
找回工程密码(952311560)6:41:22 PM
你的地址加1了吗
找回工程密码(952311560)6:41:29 PM
转换成十进制了吗
找回工程密码(952311560)6:41:46 PM
所有的图都看不到
广东\袁(17505756)6:42:02 PM
都没问题,只是小数后面有的对不上
找回工程密码(952311560)6:42:13 PM
看不到图
广东\袁(17505756)6:43:02 PM
比如说我在仪表上设置的4.5,我在kingview里也能读到4.5,如果是4.2可能读到的就不是4.2,整数似乎没问题
广东\袁(17505756)6:43:13 PM
写的话,就不会变
找回工程密码(952311560)6:44:03 PM
不是4.2,是什么
广东\袁(17505756)6:44:19 PM
如果都读不上来,那倒好说,现在主要是写不了,如果我写个4,发现我的仪表启动了
广东\袁(17505756)6:44:22 PM
等
广东\袁(17505756)6:45:19 PM
4.1875
广东\袁(17505756)6:45:43 PM
4.3, 4.2813
广东\袁(17505756)6:46:02 PM
4.4 4.3750
广东\袁(17505756)6:46:29 PM
4.5 4.5
广东\袁(17505756)6:46:45 PM
4.6 4.5938
找回工程密码(952311560)6:46:42 PM
哦,你只让他显示1位小数啊
广东\袁(17505756)6:47:05 PM
4.9 4.8750
找回工程密码(952311560)6:46:54 PM
正常
广东\袁(17505756)6:47:28 PM
5.0 5.0
广东\袁(17505756)6:48:24 PM
应该不正常,我以前用honeywell HC900应该是能都对上的
找回工程密码(952311560)6:48:22 PM
是你仪表的问题,这个正常
广东\袁(17505756)6:48:51 PM
但是我写不过去
找回工程密码(952311560)6:49:36 PM
读写属性,看看对吗
广东\袁(17505756)6:51:15 PM
这个没问题,而且我如果写数的话,如果我写16, 我的机器就开起来了,相当于给了启动信号
广东\袁(17505756)6:51:28 PM
说明有数写过去了
找回工程密码(952311560)6:52:18 PM
哦
找回工程密码(952311560)6:52:28 PM
、这不知道了,慢慢研究
广东\袁(17505756)6:53:15 PM
只要我写过去的数,BCD第5位为1,就自己开起来,比如说16, 17,19
广东\袁(17505756)6:55:12 PM
比较郁闷,有时间也帮我想想,看来是要搞驱动了