打印
[程序源码]

MODBUS协议20个从站后无法通信

[复制链接]
2356|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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个左右的从站?怎么接很有讲究。一主两从好用基本上可以排除软件问题。节点多出问题多数是总线本身的问题。

使用特权

评论回复
5
gluebi|  楼主 | 2013-10-15 09:48 | 只看该作者
lws 发表于 2013-10-15 08:29
项目要求接60个左右的从站?怎么接很有讲究。一主两从好用基本上可以排除软件问题。节点多出问题多数是总线 ...

前辈,节点多的话总线上连接有什么要点嘛

使用特权

评论回复
6
zhaoyu2005| | 2013-10-15 09:59 | 只看该作者
1.检查上下拉电阻是否取值过小,造成负载过重,至于多少合适,自己确定
2.检查下是否波特率高了,或者距离远了
3.检查485芯片是否质量好,别拿1块多2块的还想带很多节点,
4.检查节点拓扑结构、接地、终端匹配电阻,自己查下485的布线注意事项

使用特权

评论回复
7
gluebi|  楼主 | 2013-10-15 10:22 | 只看该作者
zhaoyu2005 发表于 2013-10-15 09:59
1.检查上下拉电阻是否取值过小,造成负载过重,至于多少合适,自己确定
2.检查下是否波特率高了,或者距离 ...

如何判断上下拉电阻过小造成负载过重??

使用特权

评论回复
8
zhaoyu2005| | 2013-10-15 10:25 | 只看该作者
gluebi 发表于 2013-10-15 10:22
如何判断上下拉电阻过小造成负载过重??

这都要给你详细说的话,你还是慢慢弄吧,要不然,思维僵化真不好处理

使用特权

评论回复
9
gluebi|  楼主 | 2013-10-15 10:25 | 只看该作者
zhaoyu2005 发表于 2013-10-15 09:59
1.检查上下拉电阻是否取值过小,造成负载过重,至于多少合适,自己确定
2.检查下是否波特率高了,或者距离 ...

我看有些说法说一个485网络只要接一个上下拉电阻,但我现在是每个板子的485都接了1.2K的上下拉电阻各一个

使用特权

评论回复
10
zhaoyu2005| | 2013-10-15 10:29 | 只看该作者
所以才要你检查,现在不用检查,确实取值太小了,我帮你确认,至于为什么,自己弄明白

使用特权

评论回复
11
xlsbz| | 2013-10-15 18:29 | 只看该作者
(1)测测波形
(2)放慢发送周期

使用特权

评论回复
12
dqyubsh1| | 2013-10-15 18:48 | 只看该作者
建议直接用freemodbus例程做测试。串口看似简单,实则要考虑的问题比较多,鲁棒性不容易做好。楼主的代码看不出分帧操作,这是modbus最关键的内容,没有这个,谈不上可靠性。

在软件没有问题的情况下,再查总线波形,考虑隔离、干扰等问题。这个有示波器帮助,至少可以看到端倪。

使用特权

评论回复
13
sxhhhjicbb| | 2013-10-15 21:09 | 只看该作者
32个以下应该是可以的.

使用特权

评论回复
14
cjseng| | 2013-10-15 21:43 | 只看该作者
有个工具叫示波器!

使用特权

评论回复
15
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  

使用特权

评论回复
16
coody| | 2013-10-18 08:59 | 只看该作者
示波器看下信号幅度是否过小了

使用特权

评论回复
17
joyme| | 2013-11-12 11:25 | 只看该作者
每块板的A/B都上下拉1.2K的电阻,肯定不行,终端电阻呢?不会也是每块板都有吧,这个匹配网络应该在最后一个设备上用就好了。

使用特权

评论回复
18
sidafuzhihe| | 2013-11-12 19:50 | 只看该作者
你先检查一下通信线路上面的信号是否正常,是否信号发生了衰减

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

39

帖子

1

粉丝