单位让我做Modbus通讯程序,我用了03,06两个功能,PC机做上位机(主机),我们的产品变频器是从机。1台主机,3台从机。我调试有一段时间了,06的功能我加上了,03的功能我也加了,可是会丢数,即便是读一个地址,也是会丢的。大家能帮我分析分析原因吗?
1.06不丢,03丢。
2.03功能如果是手动发送,回数据正常,如果是自动发送,3台里就丢1台的数据。
具体现象:手动发送,先1#机读一个地址,1#机回复。再2#机读一个地址,2#机回复,3#机读一个地址,3#机回复。从读一个地址到10个地址,都是可以的。
自动发送:轮流读3台从机的一个地址,一开始都有回复,一段时间后(十分钟吧)就只有2台了。有一台就好像是死机了是的,怎么发指令都不管用。而且这两台回复的数据也有丢失。读一个地址是这样,读多个地址也这样,指令间隔从200ms到1000ms都这样。
3.我们的程序是PWM的中断级别最高,通讯是在定时器中断里的。CPU是DSP2808,没用通讯自己的中断(以前用过,通讯丢数,后来不用了),用的是FIFO,在定时器中断中查询FIFO接收的个数,够1帧就处理。
现在我想不出原因,是CRC校验码程序耗时太长,导致一部分指令没收到,所以就不能回复,导致丢失?还是硬件有局限,导致这样?好烦啊,领导老催我,好像我是万能的,什么问题都能解决。
嘿嘿,CPU绝对是没有问题的。要从自身找原因,技术饭不是那么好吃的。
每个子程序的耗时可以使用软件模拟器或者直接硬件仿真来测试确定。
够一帧就处理是很不好的策略,没有考虑到现场干扰或偶发丢失数据等问题。例如每一帧10个字节,结果你收到了这次的9个字节和下帧的1个字节,校验就肯定不通过了。而且这个错误会不断累计到下次通信处理上。
如果使用软件查询法,可建立一个通信FIFO,滑动判断是否存在特定的帧结构数据,然后校验帧尾的方式来判断是否获得完整的数据帧。
如果使用中断法,根据每个接收字节之间的延迟时间可以判断出数据帧的开始和结束。
我们现在从机(变频器)接收采用FIFO,软件查询法。发送没采用FIFO.。我自己大概也猜到是程序的原因,但是因为对变频器来说,PWM中断始终是最高级的,所以我总是担心通讯的反应不够及时。您说的滑动判断是指判断一帧的开始吗?然后再判断帧尾。程序我思前想后改动了好多回了,一直都没起色,直到我把判断帧结束的语句放在PWM中断里,死机问题才解决。丢数的问题还在改进中。我觉得做一个程序员挺累的,如果一个问题偶尔发生一次,原因不好找,如果老发生,原因反倒好找。大家有同感吗?我有时觉得自己快江郎才尽了。程序员是否是吃青春饭的?我有时觉得自己老了。
专为Modbus PLUS(MB+)总线光传输提供的完善的产品和技术解决方案
--------------------------------------------------------------------------------
NS230系列产品是参考Modicon的Modbus PLUS系列光纤中继器产品的功能,采用多项最新技术研发而成的Modbus PLUS(MB+)总线光纤链路模块。它可以完成通过光纤传输Modbus PLUS现场总线,在功能上可以代替490NRP253,490NRP254,NWFR85D200等产品。此产品具有的优点有:体积小、低功耗、工业级设计、电源适应性、优美的外观与导轨式安装机壳等等……,同时,还有如下几个突出的特点:金属铸造工艺外壳,特有的LisRing解环协议、型号丰富的系列化产品等。
NS230系列产品的总线接口采用DB9-F同轴接口,兼容Modicon的MB+总线规范。本产品采用TrueBus总线技术,真正逻辑上的全对等总线,支持Modbus总线速率,在性能上与Modicon的产品相当。