发表于:2009/5/21 11:11:10
#0楼
今天发现了一个组态王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、我以后也会尽量少用组态王了。
我用组态王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、我以后也会尽量少用组态王了。