发布于 2008-09-08 17:47:41
0楼
今天杂事多,但还是抽空做了几个实验.
第一,按你的方法,MODBUS协议,对DB1修改数值,用定时器1:1方波,周期2秒.=1,触发03功能,=0,触发16功能.用SSCOM32接收数据,实验情况和你类似,虽然看变量表,需要修改的数据都在变,但是不是理想情况.确实没有规律。可能发几十条“写指令”,再发几十条“读指令”。这显然是失败的。
大概代码情况如下(我各复制了两条):
02 10 00 00 00 06 0C 00 0A 00 0B 00 0C 00 0D 00 0E 00 0F DC 7D
02 10 00 00 00 06 0C 00 0A 00 0B 00 0C 00 0D 00 0E 00 0F DC 7D
01 03 00 00 00 03 05 CB
01 03 00 00 00 03 05 CB
第二,用ASCII协议,使用两个FB8,各自有自己背景数据块和源数据块。(源数据块长度固定,也就是LEN,分别为6和18,一个读,一个写)用定时器1:1方波,周期2秒。=1,触发03功能,=0,触发16功能.用SSCOM32接收数据,这完全是理想情况。交替发送03功能代码和16功能代码,非常规律。我想如多设计指令,对四个站论询有可能成功。代码如下:
02 10 00 00 00 06 00 0A 00 0B 00 0C 00 0D 00 0E 00 0F
01 10 00 00 00 06
02 10 00 00 00 06 00 0A 00 0B 00 0C 00 0D 00 0E 00 0F
01 10 00 00 00 06
02 10 00 00 00 06 00 0A 00 0B 00 0C 00 0D 00 0E 00 0F
01 10 00 00 00 06
02 10 00 00 00 06 00 0A 00 0B 00 0C 00 0D 00 0E 00 0F
01 10 00 00 00 06
。。。。。。。
这里没有RCR校验码。对03功能等偶数字节的比较好办,自己添加CRC可以正确发MODBUS代码。但是恰恰FC16比较别扭,它的代码总数是奇数。第七字节是BYTE,我曾以前尝试在DB块里自己加,但是DB把中间加的BYTE作为WORD,总数变为偶数。(当然也可能我的方法还不对)所以有朋友建议自己以ASCII协议和ASCII码按MODBUS格式发,即使不考虑校验计算和双方握手,可能也有问题。
明天有时间再实验。你有什么进展吗?