恭喜,你发布的帖子
发布于 2016-10-28 14:30:13
38楼
这个贴还没沉,我就继续跟吧。
昨天在200版区有人传上来一个modbus master的源程序,本人初步读了以后(还没读完),错误6已经明白了。
什么叫做“只有一个MSG激活”,什么是不能多次调用。有新认识。
先看这个,库符号定义:
里面有一个mModbusState,是记录modbus内部处理进程的。0表示当前没有活动进程,可以接受新的first,发送新请求。>0表示当前还在处理前一个first指令,不接受新的first。所以,你这个时候,first=1去调用MSG,不管一个周期是否只有一次MSG,都报6错误。
再看,mModbusSignature1、mModbusSignature2、mModbusSignature3,共12字节,是调用指纹,它记录的是由拿个指令框(CALL)发的first请求。一但某个指令框发成功first请求,后续的MSG都要由这个指令框调用MSG,其它的不行,不管是否一个周期只有一个MSG。
这个指纹、只调用一次,逻辑是这样子的:
同一从站、相同的读写要求,其指纹是一样的。一般情况下,这样的指令框在程序中只有一个。
如果你在不同的地方,使用的是相同的调用参数(从站地址、读写、从站数据地址、数量等都一样),它们产生的指纹一样,MSG其实不能区分差别,不会产生错误6的。
同一指纹的MSG,一个周期内多次调用,也不会产生错误6的。
还有一个要说明,就是当前mModbusState=0,也就是已经空闲了,可以接受新的first请求。此时如果不发first请求,调用MSG,也是必须和上一次的指纹相同的那个MSG调用,否则一样是错误6。
再来说done。我之前有一个贴子说,Done就表示MSG当前空闲,其实不对。
Done只是说明那个Error数值有效。所以done=1时,你要查看error码,看看是什么情况。
这个mModbusState 跟LJCLWYF的想法应该一致了。
程序我没看到,不讨论。看也不明白。
请填写推广理由:
分享
只看
楼主