[程序源码] MODBUS协议20个从站后无法通信

[复制链接]
 楼主| gluebi 发表于 2013-10-14 21:07 | 显示全部楼层 |阅读模式
项目要求接60个左右的从站,我自己测试的时候4个从站通信完全没问题,但是到了实际测试的时候,20个左右的从站就会出现通信不通畅的问题,有的时候能正确通信,有的时候个别开关量无**常控制,比如智能打开不能关闭,监视串口的结果发现报文发送成功,但从站却没有返回报文。
确定接线上没有问题,我想请各位大牛帮我看看从站判断功能码上有没有问题,我对报文的处理是先判断地址码,再判断功能码最后判断CRC,因为功能只涉及到单一个开关量的打开和关闭报文很固定,所以并没有判断报文长度,不知道这样的逻辑顺序有没有问题,会不会有BUG

从站判断功能码段的代码如下:
if (receBuf[0]==localAddr)   //判断从机地址
        {
                switch(receBuf[1])
                {
                        case 3:                        //功能码=3
                        {
                                crcData=crc16(receBuf, 6);
                                if(crcData == receBuf[6]+(receBuf[7]<<8))        //CRC校验
                        {
                                        readRegisters(); //启动读取寄存器设置函数
                        }
                                break;
                        }//下同
                        case 5:
                        {
                                crcData=crc16(receBuf, 6);
                                if(crcData == receBuf[6]+(receBuf[7]<<8))
                        {
                                        setIO();
                        }
                                break;
                        }
                        case 1:
                        {
                                crcData=crc16(receBuf, 6);
                                if(crcData == receBuf[6]+(receBuf[7]<<8))
                        {
                                        readIO();
                        }
                                break;
                        }
                        case 16:
                        {
                                crcData=crc16(receBuf, receCount-2);
                                if(crcData == receBuf[receCount-2]+(receBuf[receCount-1]<<8))
                        {
                                        setRegisters();
                        }
                                break;
                        }
                        default:break;
                }
        }
 楼主| gluebi 发表于 2013-10-14 21:57 | 显示全部楼层
我跟网上的例程对比了下
我的程序的逻辑判断顺序是“判断从机地址---》判断功能码---》判断数据错误”,而您和网上例程上的顺序都是“判断功能码---》判断从机地址---》判断数据错误”,我想问下我这样写会不会导致多个从站无**常通信,会不会有BUG
linfeng24 发表于 2013-10-15 00:15 | 显示全部楼层
不懂,帮顶,莫沉了。。
lws 发表于 2013-10-15 08:29 | 显示全部楼层
项目要求接60个左右的从站?怎么接很有讲究。一主两从好用基本上可以排除软件问题。节点多出问题多数是总线本身的问题。
 楼主| gluebi 发表于 2013-10-15 09:48 | 显示全部楼层
lws 发表于 2013-10-15 08:29
项目要求接60个左右的从站?怎么接很有讲究。一主两从好用基本上可以排除软件问题。节点多出问题多数是总线 ...

前辈,节点多的话总线上连接有什么要点嘛
zhaoyu2005 发表于 2013-10-15 09:59 | 显示全部楼层
1.检查上下拉电阻是否取值过小,造成负载过重,至于多少合适,自己确定
2.检查下是否波特率高了,或者距离远了
3.检查485芯片是否质量好,别拿1块多2块的还想带很多节点,
4.检查节点拓扑结构、接地、终端匹配电阻,自己查下485的布线注意事项
 楼主| gluebi 发表于 2013-10-15 10:22 | 显示全部楼层
zhaoyu2005 发表于 2013-10-15 09:59
1.检查上下拉电阻是否取值过小,造成负载过重,至于多少合适,自己确定
2.检查下是否波特率高了,或者距离 ...

如何判断上下拉电阻过小造成负载过重??
zhaoyu2005 发表于 2013-10-15 10:25 | 显示全部楼层
gluebi 发表于 2013-10-15 10:22
如何判断上下拉电阻过小造成负载过重??

这都要给你详细说的话,你还是慢慢弄吧,要不然,思维僵化真不好处理
 楼主| gluebi 发表于 2013-10-15 10:25 | 显示全部楼层
zhaoyu2005 发表于 2013-10-15 09:59
1.检查上下拉电阻是否取值过小,造成负载过重,至于多少合适,自己确定
2.检查下是否波特率高了,或者距离 ...

我看有些说法说一个485网络只要接一个上下拉电阻,但我现在是每个板子的485都接了1.2K的上下拉电阻各一个
zhaoyu2005 发表于 2013-10-15 10:29 | 显示全部楼层
所以才要你检查,现在不用检查,确实取值太小了,我帮你确认,至于为什么,自己弄明白
xlsbz 发表于 2013-10-15 18:29 | 显示全部楼层
(1)测测波形
(2)放慢发送周期
dqyubsh1 发表于 2013-10-15 18:48 | 显示全部楼层
建议直接用freemodbus例程做测试。串口看似简单,实则要考虑的问题比较多,鲁棒性不容易做好。楼主的代码看不出分帧操作,这是modbus最关键的内容,没有这个,谈不上可靠性。

在软件没有问题的情况下,再查总线波形,考虑隔离、干扰等问题。这个有示波器帮助,至少可以看到端倪。
sxhhhjicbb 发表于 2013-10-15 21:09 | 显示全部楼层
32个以下应该是可以的.
cjseng 发表于 2013-10-15 21:43 | 显示全部楼层
有个工具叫示波器!
four_zhg 发表于 2013-10-17 18:12 | 显示全部楼层
这个一般跟硬件有关,不知楼主的485芯片是哪一种,这是我在网上搜的:
支持32个节点数的芯片:SN75176,SN75276,SN75179,SN75180,MAX485,MAX488,MAX490

支持64个节点数的芯片:SN75LBC184

支持128个节点数的芯片:MAX487,MAX1487

支持256个节点数的芯片:MAX1482,MAX1483,MAX3080~MAX3089  
coody 发表于 2013-10-18 08:59 | 显示全部楼层
示波器看下信号幅度是否过小了
joyme 发表于 2013-11-12 11:25 | 显示全部楼层
每块板的A/B都上下拉1.2K的电阻,肯定不行,终端电阻呢?不会也是每块板都有吧,这个匹配网络应该在最后一个设备上用就好了。
sidafuzhihe 发表于 2013-11-12 19:50 | 显示全部楼层
你先检查一下通信线路上面的信号是否正常,是否信号发生了衰减
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

39

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部