485组网通讯时有时主机询问后,从机没有返回数据

平凡世界6 2019-06-27 11:35:58
测试环境是一个485主机负责连续循环地向7个从机发送指令,主机发送指令后,收到从机的正确回复后,向下一个从机发送指令,依次循环,
如果从机不返回数据,或收到的数据不正常,主机则会等上60s左右,才会发下一条指令。所有的数据都通过串口调试助手观察。
485节点间用的是类似杜邦线的软线,长度不越过100cm.
现在的问题是主机询问从机,过一段时间就会有某个从机不返回数据的情况,每个节点都有这样的情况。
后来给其中一个节点断电了(有点半蒙式的给他断电,因为检查数据时总觉得是发送数据的间隔太频繁才会这样),这样主机就会有1分钟左右的间隔不向从机发询问指令,然后我就发现在除断电的从机没有数据外,其他从机的数据都正常返回。
难道真的让我蒙对了吗,但还是不了解真相啊。所以请各位前辈指点下我测试的这种情况的原因,及解决方法。
...全文
2141 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
ma-chao 2019-09-11
  • 打赏
  • 举报
回复
MCU控制RS485芯片的收发引脚的时间问题。MCU通过串口发送完一个数据包后,不能马上把RS485_DE1转换成接收状态,要根据串口所使用的波特率情况,适当延时1ms再转换成接收状态。假定波特率为9600,那么1000ms可以发送960个字节,相当串出发送1个字节需要1ms时间。当MCU发送完数据包最后一个字节时,不能在发送寄存器空中断中将485转成接收,因为发送寄存器空并不代表字节已经全部串出完成,此时转成接收,会使得最后一个字节发送到一半就被转换线路终止了。查看使用MCU有无发送完成中断标志,比如AVR和STM32都有两个中断,发送寄存器空和发送完成。
平凡世界6 2019-09-11
  • 打赏
  • 举报
回复
引用 22 楼 韩若水 的回复:
[quote=引用 8 楼 zhshliu 的回复:]
对于RS485,芯片手册上是每个收发器节点为都放置,职下图:
我使用的是这种配置:

这种上下拉配置可以保证空闲时的RS485总线不会触 发UART接收中断。可同可以保证9个主从节点并联时的负载阻抗不会超 出驱动能力范围。(已长期验证过)

电感是必须要的吗?
没加电感,因为之前的板子上没做这个,要是加的话我得割板子,没加电感,这效果不行啊,[/quote]之前弄错了,以为是电感,网上查了下是磁珠。
平凡世界6 2019-09-04
  • 打赏
  • 举报
回复
引用 8 楼 zhshliu 的回复:
对于RS485,芯片手册上是每个收发器节点为都放置,职下图:
我使用的是这种配置:

这种上下拉配置可以保证空闲时的RS485总线不会触 发UART接收中断。可同可以保证9个主从节点并联时的负载阻抗不会超 出驱动能力范围。(已长期验证过)

电感是必须要的吗?
没加电感,因为之前的板子上没做这个,要是加的话我得割板子,没加电感,这效果不行啊,
worldy 2019-08-21
  • 打赏
  • 举报
回复
引用 10 楼 迷雾绿洲 的回复:
先单机通讯,去除其他。后面调试总线仲裁


485主从模式不需要总线仲裁
hhhh63 2019-08-19
  • 打赏
  • 举报
回复
引用 15 楼 韩若水 的回复:
[我调了主机询问间隔,不到20s,现在从机数据正常了,我现在想问下这个间隔是正常的吗,是不是太大了。
从机的程序我基本上也都调了,除了对继电器的操作有1s延时外,其他的modbus数据基本上在200ms左右就返回数据了,但是如果询问间隔过小的话,还是会有假死机的情况。
感觉把程序都调整了之后,跟以前没调整的时候情况一样。

20s时间太长了
hhhh63 2019-08-19
  • 打赏
  • 举报
回复
2s以内吧,从机反应太慢。
我实际使用时,AGV控制,无线,一般在0.5秒内,6台车。
平凡世界6 2019-08-19
  • 打赏
  • 举报
回复
引用 16 楼 韩若水 的回复:
[quote=引用 13 楼 SupermanTm 的回复:]
先搞清楚终端电阻的真正意义,是为了防止波反射带来的问题的,就是对于交流分量,传输线的末端可以被视作无穷长的线路
众所周知,电信号传输是光速(3*10^8m/s),那么如果信号在线路末端形成反射则会与正在发出的信号叠加从而令接收出错,但这是有前提的,就是信号自身的频率要足够高,所以在较低速的RS422/485通讯上,这个所谓终端电阻事实上是不必要的,其唯一的功能是释放掉总线上的残余电荷。
针对楼主问题,我建议是总线上接个10K的电阻(终端电阻),取消所有节点中A上拉和B下拉的电阻,问题估计就解决掉了。

对电路还真不太明白,您的说法有机会了我测试看看。[/quote]
一直认为是我的程序的问题呢。
平凡世界6 2019-08-19
  • 打赏
  • 举报
回复
引用 13 楼 SupermanTm 的回复:
先搞清楚终端电阻的真正意义,是为了防止波反射带来的问题的,就是对于交流分量,传输线的末端可以被视作无穷长的线路
众所周知,电信号传输是光速(3*10^8m/s),那么如果信号在线路末端形成反射则会与正在发出的信号叠加从而令接收出错,但这是有前提的,就是信号自身的频率要足够高,所以在较低速的RS422/485通讯上,这个所谓终端电阻事实上是不必要的,其唯一的功能是释放掉总线上的残余电荷。
针对楼主问题,我建议是总线上接个10K的电阻(终端电阻),取消所有节点中A上拉和B下拉的电阻,问题估计就解决掉了。

对电路还真不太明白,您的说法有机会了我测试看看。
平凡世界6 2019-08-19
  • 打赏
  • 举报
回复
引用 14 楼 hhhh63 的回复:
看看从机是不是正常收到数据了

我调了主机询问间隔,不到20s,现在从机数据正常了,我现在想问下这个间隔是正常的吗,是不是太大了。
从机的程序我基本上也都调了,除了对继电器的操作有1s延时外,其他的modbus数据基本上在200ms左右就返回数据了,但是如果询问间隔过小的话,还是会有假死机的情况。

感觉把程序都调整了之后,跟以前没调整的时候情况一样。
平凡世界6 2019-08-19
  • 打赏
  • 举报
回复
引用 18 楼 hhhh63 的回复:
[quote=引用 15 楼 韩若水 的回复:]
[我调了主机询问间隔,不到20s,现在从机数据正常了,我现在想问下这个间隔是正常的吗,是不是太大了。
从机的程序我基本上也都调了,除了对继电器的操作有1s延时外,其他的modbus数据基本上在200ms左右就返回数据了,但是如果询问间隔过小的话,还是会有假死机的情况。
感觉把程序都调整了之后,跟以前没调整的时候情况一样。

20s时间太长了[/quote]
一般多长时间,
把时间调小,基本上询问两三轮就有一个从机假死。
hhhh63 2019-08-18
  • 打赏
  • 举报
回复
看看从机是不是正常收到数据了
SupermanTm 2019-08-18
  • 打赏
  • 举报
回复
先搞清楚终端电阻的真正意义,是为了防止波反射带来的问题的,就是对于交流分量,传输线的末端可以被视作无穷长的线路
众所周知,电信号传输是光速(3*10^8m/s),那么如果信号在线路末端形成反射则会与正在发出的信号叠加从而令接收出错,但这是有前提的,就是信号自身的频率要足够高,所以在较低速的RS422/485通讯上,这个所谓终端电阻事实上是不必要的,其唯一的功能是释放掉总线上的残余电荷。
针对楼主问题,我建议是总线上接个10K的电阻(终端电阻),取消所有节点中A上拉和B下拉的电阻,问题估计就解决掉了。
平凡世界6 2019-08-17
  • 打赏
  • 举报
回复
引用 1 楼 一树梅 的回复:
[quote=引用 2 楼 韩若水 的回复:]
[quote=引用 1 楼 zhshliu 的回复:]
估计是你的总线负载电阻太小,导致各接收到的RS485电平处于临界,RS485总线可以支持多设备并联在一起,但总体的驱动能力是有限的(这个以RS485收发器芯片的参数决定),建议调整终端电阻(主从机都要调整),但总线并联总负载电阻大于120欧,另外最好做A上拉B下拉匹配(一般10K),这样就可以并联多个从机了。

终端电阻不是只在主节点和未节点有就可以了吗,我的是120欧,A上拉B下拉用的是3K。[/quote]
485串行组网,终端电阻在拓扑结构的首节点和尾节点放置,而不是主机节点和尾节点;主机节点可以在任何一个节点处。[/quote]加了终端,没啥效果。
平凡世界6 2019-07-02
  • 打赏
  • 举报
回复
引用 10 楼 迷雾绿洲 的回复:
先单机通讯,去除其他。后面调试总线仲裁

总线仲裁怎么调
fly 100% 2019-07-02
  • 打赏
  • 举报
回复
先单机通讯,去除其他。后面调试总线仲裁
平凡世界6 2019-06-28
  • 打赏
  • 举报
回复
引用 8 楼 zhshliu 的回复:
对于RS485,芯片手册上是每个收发器节点为都放置,职下图:
我使用的是这种配置:

这种上下拉配置可以保证空闲时的RS485总线不会触 发UART接收中断。可同可以保证9个主从节点并联时的负载阻抗不会超 出驱动能力范围。(已长期验证过)

太感谢了,那我不客气,收下了,谢谢您的分享
zhshliu 2019-06-28
  • 打赏
  • 举报
回复
对于RS485,芯片手册上是每个收发器节点为都放置,职下图:
我使用的是这种配置:

这种上下拉配置可以保证空闲时的RS485总线不会触 发UART接收中断。可同可以保证9个主从节点并联时的负载阻抗不会超 出驱动能力范围。(已长期验证过)
平凡世界6 2019-06-28
  • 打赏
  • 举报
回复
引用 4 楼 一树梅 的回复:
[quote=引用 2 楼 韩若水 的回复:]
[quote=引用 1 楼 zhshliu 的回复:]
估计是你的总线负载电阻太小,导致各接收到的RS485电平处于临界,RS485总线可以支持多设备并联在一起,但总体的驱动能力是有限的(这个以RS485收发器芯片的参数决定),建议调整终端电阻(主从机都要调整),但总线并联总负载电阻大于120欧,另外最好做A上拉B下拉匹配(一般10K),这样就可以并联多个从机了。

终端电阻不是只在主节点和未节点有就可以了吗,我的是120欧,A上拉B下拉用的是3K。[/quote]
485串行组网,终端电阻在拓扑结构的首节点和尾节点放置,而不是主机节点和尾节点;主机节点可以在任何一个节点处。[/quote]
谢谢了解了,那么我要做实验了。
平凡世界6 2019-06-28
  • 打赏
  • 举报
回复
引用 5 楼 zgl7903 的回复:
主机1分钟没有发送数据,那应该查主机端
主机端是怎么检测超时的? 超时时间又是多少?

一分钟不发是我故意这么写的,之前就有这个问题,我以为是从机返应慢,就让主机等了,但问题并没解决
zgl7903 2019-06-28
  • 打赏
  • 举报
回复
主机1分钟没有发送数据,那应该查主机端 主机端是怎么检测超时的? 超时时间又是多少?
加载更多回复(4)

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧