OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5057|回复: 15

Modbus主站轮询发送问题

[复制链接]

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-9-19
在线时间
33 小时
发表于 2019-1-16 16:00:56 | 显示全部楼层 |阅读模式
5金钱
有没有用过Modbus主站的大神,我在轮询从站的时候出了问题,站与站之间会有延时,不知道为什么?代码如下: 1547625442(1).jpg
望大神指点一二,不胜感激。。。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-9-19
在线时间
33 小时
 楼主| 发表于 2019-1-16 16:02:02 | 显示全部楼层
在主循环只跑了这些代码,但是查看报文发现,站与站之间切换,会有明显的延时,哪里有问题呢?
回复

使用道具 举报

7

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2011-8-8
在线时间
50 小时
发表于 2019-1-16 16:37:17 | 显示全部楼层
站与站之间延时是什么意思?描述的不明白,
modbus是主从结构,一般用的485总线,无论那端,主从切换都是要一点延时的。这是硬件造成的。
回复

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-9-19
在线时间
33 小时
 楼主| 发表于 2019-1-16 17:15:06 | 显示全部楼层
snail_dongbin 发表于 2019-1-16 16:37
站与站之间延时是什么意思?描述的不明白,
modbus是主从结构,一般用的485总线,无论那端,主从切换都是 ...

就是我主站轮询从站,从1#站开始发送数据,1#站处理数据完成之后,主站要查询2#站的信息,就在1#和2#切换的时候,会有报文冲突。也就是当2#开始接收主站的报文时,2#站会同时接收 1#站返回给主站的报文和主站发送给2#站的报文,这样,2#站收到的报文就会有错误,当主站发现2#站第一个报文没回应之后,就会产生延时。
你说的那个硬件造成的延时不太懂。
回复

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-9-19
在线时间
33 小时
 楼主| 发表于 2019-1-16 18:09:38 | 显示全部楼层
有没有大神清楚怎么玩的?谢谢了
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2019-1-16 19:22:04 | 显示全部楼层
10101100 发表于 2019-1-16 18:09
有没有大神清楚怎么玩的?谢谢了

你从站不会过滤不是发给自己的报文?
一分耕耘一分收获。
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2019-1-7
在线时间
13 小时
发表于 2019-1-17 08:54:52 | 显示全部楼层
大哥你这是没了解啥叫半双工?当你host发送查询命令的时候,485线上是不能有回数的。怎么能确保没有回数?那你要先计算设定的波特率,还有回多少字节数据。host的查询指令需要至少比这个时间大3.5个字节间隔发送。你给的这段代码并没有体现你主机发送的间隔时间的,切换这里没啥毛病。当然如果你不是用RTU而是ASII的话3.5那个可以不遵守,但是也要给从机回数留时间。最后确认下你2个从站是不是物理上距离主机超级远,那需要计算数据传输速度与距离的关系,适当增加Host发送间隔来解决
回复

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-9-19
在线时间
33 小时
 楼主| 发表于 2019-1-17 09:11:46 | 显示全部楼层
wangzhaohui 发表于 2019-1-17 08:54
大哥你这是没了解啥叫半双工?当你host发送查询命令的时候,485线上是不能有回数的。怎么能确保没有回数? ...

恩恩,你说的对。谢谢,我想明白这个问题了,但是我在从站1#切换到2#从站时加了个延时并没有解决问题,但我在while(1)里面加了个延时就可以了,但看报文会发现,一段时间就会卡顿一次,不知道什么原因。这个间隔时间应该加在什么地方呢?
回复

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-9-19
在线时间
33 小时
 楼主| 发表于 2019-1-17 09:14:39 | 显示全部楼层
yklstudent 发表于 2019-1-16 19:22
你从站不会过滤不是发给自己的报文?

从站接收到数据之后,会对比CRC校验,如果CRC不对,说明报文不对,但是没办法控制接收,从站是只要有数据我就会接收。这个问题出现在帧与帧之间的间隔时间没有做。当从站1返回给主站时,主站需要间隔多长时间再查询2#从站,这样就行了,但是我加了间隔时间,还是没解决问题。
回复

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
58
金钱
58
注册时间
2019-1-7
在线时间
13 小时
发表于 2019-1-17 10:34:30 | 显示全部楼层
10101100 发表于 2019-1-17 09:11
恩恩,你说的对。谢谢,我想明白这个问题了,但是我在从站1#切换到2#从站时加了个延时并没有解决问题,但 ...

while是主程序的执行流程,你在这里加延迟,实际每次Host发送查询指令的间隔时间都可能有波动。但是当你的延迟时间够长,理论上来说不应该出现485总线上的数据收发冲突现象,卡死这个状态你需要具体确认原因才行。做如下几步操作:1.用串口助手观察你host发送的间隔大概是多少。2将断点设置在串口重新初始化的地方,也就是串口复位或者看门狗复位的地方。如果你有设计的话,不过看你描述的现象应该有设计。3如果有进入串口或者看门狗复位,接示波器看下实际收发的波形来判断真正原因。4对于如何能比较准确发送间隔,可以采用定时器计时,用串口中断的方式发送查询指令,比查询模式好一些。
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2019-1-17 11:26:38 | 显示全部楼层
10101100 发表于 2019-1-17 09:14
从站接收到数据之后,会对比CRC校验,如果CRC不对,说明报文不对,但是没办法控制接收,从站是只要有数据 ...

你從機沒有地址?地址不匹配軟件過濾處理啊
一分耕耘一分收获。
回复

使用道具 举报

7

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
221
金钱
221
注册时间
2011-8-8
在线时间
50 小时
发表于 2019-1-17 11:34:41 | 显示全部楼层
你的主站和从站都是自己写的代码吗?这个标准的设备都是有站号过滤功能的,不是自己的信息不处理,也不会有冲突这个说法。
modbus 分rtu和ascill,rtu要求一帧结束等3.5个字符时间,ascill没有此要求,回车代表结束。
我说的硬件延时是指的485是半双工通信,硬件ic上需要用一个io控制切换是发送还是收,这个切换也是要时间的,us级的延时。
另外,modbus同一时刻,只有一个节点是处于发送或着回复状态,其他的无伦主从都是接收,只是看接收后处理不处理而已。不会有同时发送又接收这种冲突。还有主站必须是发#1命令,等待接收完成,(延时)发#2命令,等待接收完成,(延时)发#3命令,等待接收完成。严格遵守一发一收。
回复

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-9-19
在线时间
33 小时
 楼主| 发表于 2019-1-17 11:43:20 | 显示全部楼层
yklstudent 发表于 2019-1-17 11:26
你從機沒有地址?地址不匹配軟件過濾處理啊

我明白你的意思。从站是有地址的,但是地址不对我从站不处理,并不代表我从站不接收啊,关键还是在帧与帧之间时间间隔问题。
回复

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-9-19
在线时间
33 小时
 楼主| 发表于 2019-1-17 11:47:17 | 显示全部楼层
wangzhaohui 发表于 2019-1-17 10:34
while是主程序的执行流程,你在这里加延迟,实际每次Host发送查询指令的间隔时间都可能有波动。但是当你 ...

恩恩,是的,我加延时时间就好了,我发送确实是用的中断方式。但我主机写的时候也是判断帧与帧之间是否达到了3.5个字符的时间间隔,按道理来说,当主机接收到从机1#的报文时会间隔3.5个字符之后才会发送下一帧,但是很显然现在不是这个样子。
回复

使用道具 举报

6

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
176
金钱
176
注册时间
2017-9-19
在线时间
33 小时
 楼主| 发表于 2019-1-17 11:49:24 | 显示全部楼层
snail_dongbin 发表于 2019-1-17 11:34
你的主站和从站都是自己写的代码吗?这个标准的设备都是有站号过滤功能的,不是自己的信息不处理,也不会有 ...

从站不是,主站是的。站号过滤功能应该只起到我处理不处理的作用,并没有起到我收或者不收的问题。即使不是自己的信息,我也会接收,我只不过不处理。
回复

使用道具 举报

3

主题

1155

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
7464
金钱
7464
注册时间
2015-1-15
在线时间
1368 小时
发表于 2019-1-17 17:20:41 | 显示全部楼层
楼主主机接收到从机回复就开始发送?
一分耕耘一分收获。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-11 20:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表