打印

关于modbus在485项目中的应用问题

[复制链接]
4576|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yuse|  楼主 | 2009-12-5 18:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yuse 于 2009-12-8 20:49 编辑

按照前辈们的意见,最近在研究modbus通信。我的modbus协议在只有上位机和多个光杆司令下位机的情况下仿真初步通信成功。但是感觉自己还有很多欠考虑的。目前我的上位机是每100ms发送一组数据给485上的下位机,轮询下去,地址匹配的下位机即传送温度数据。
问题是我的下位机需要不断通过18b20测量温度,18b20每测量一次温度就需要将近1s,不知道整个系统的最佳时间分配应该是怎样呢,因为modbus对时间和中断很严格,我很怕搞乱。所以希望前辈们可以具体指点下,怎么样的时间顺序方案最适合我的系统呢? 谢谢!
/////////////////////////////////////////////////////////////////////////////////////////
谢谢前辈指点,我调试了下程序,一旦通讯发生进入中断,返回后很容易会导致破坏了18b20的时序图,导致进入死循环,或者出错

091208175688d9f166aeeee701.jpg (12.14 KB )

091208175688d9f166aeeee701.jpg

091208175694f03cc91f379894.jpg (10.24 KB )

091208175694f03cc91f379894.jpg

DS18B20.pdf

218.99 KB

相关帖子

沙发
chunyang| | 2009-12-5 18:43 | 只看该作者
从协议本身讲,Modbus并无特别的轮询时间要求,只是在某些特定应用中才有要求。针对楼主的测温系统,合适的轮询时间由主机需要在多长时间内采集到全部节点的数据决定,但再短也不能短于传感器读取时间周期。对与Modbus,关键是理解其思想,该协议是一个典型的、严谨的主从查询会话式协议,这类协议的应用相对比较广泛,理解其精髓然后根据自己的实际应用编制即可。

使用特权

评论回复
板凳
yuse|  楼主 | 2009-12-5 21:09 | 只看该作者
本帖最后由 yuse 于 2009-12-5 21:14 编辑

恩 那在波特率在9600的情况下 主机发送一组数据去一号从机并且一号从机回复,到主机开始发送一组数据到二号从机这之间的时间间隔还可以更短吧 只要保证这组数据发送过去并且响应回来就可以吧 100MS有些长吧,不知道这个最短时间应该如何算?因为我的测温点有多达100多个,所以轮询一遍肯定会超过1S的传感器读取时间吧 2# chunyang

使用特权

评论回复
地板
yuse|  楼主 | 2009-12-5 21:36 | 只看该作者
上位机收集多个下位机传上来的温度数据 因为下位机的温度传感器检测温度每次需要1s 如果上位机一直轮询发送接收的话那么下位机就一直进中断了 是不是应该给一部分时间让下位机进行温度测量,在这期间不发生通信事件

使用特权

评论回复
5
yuse|  楼主 | 2009-12-5 21:45 | 只看该作者
我这样做行不行 就是通信和下位机检测完全分开 通信时不执行下位机的检测工作,等通信结束后 执行一遍下位机检测,然后停止再开始执行通信

使用特权

评论回复
6
chunyang| | 2009-12-6 21:57 | 只看该作者
主机发送数据或指令后延时1mS左右即可进行收发切换,从机开始回应的时间略长于这个延时即可。数据采集和通讯是不同的任务,二者可以同时进行。如果编程技巧和思想不能实现多任务调度的话,一个节点通讯完成后立刻进行数据采集即可,只要网络循环时间大于数据采集周期即可。

使用特权

评论回复
7
yuse|  楼主 | 2009-12-8 17:55 | 只看该作者
本帖最后由 yuse 于 2009-12-8 17:57 编辑

谢谢前辈指点,我调试了下程序,一旦通讯发生进入中断,返回后很容易会导致破坏了18b20的时序图,导致进入死循环,或者出错

QQ截h图未命名.jpg (10.24 KB )

QQ截h图未命名.jpg

未命名.jpg (12.14 KB )

未命名.jpg

DS18B20.pdf

218.99 KB

使用特权

评论回复
8
ccxlslr| | 2009-12-8 19:53 | 只看该作者
本帖最后由 ccxlslr 于 2009-12-8 19:54 编辑

下位机不停地检测温度,放入一个寄存器,modbus直接读就可以了,这样温度会有一些不同步,但对于温度这样的慢系统,是没有影响的!
PLC就是这样工作的,并不是要什么数据再去操作!

使用特权

评论回复
9
yuse|  楼主 | 2009-12-8 21:11 | 只看该作者
恩关键就是modbus来读时会进入中断,等在返回后就会导致影响了18b20的时序,就会出错了 8# ccxlslr

使用特权

评论回复
10
zyok| | 2009-12-8 21:23 | 只看该作者
解析Modbus命令之后就由串口中断收发数据,进入串口中断处理一个字节的时间应该不会影响你18b20的时序吧..

使用特权

评论回复
11
原野之狼| | 2009-12-8 21:42 | 只看该作者
18B20时序很严格,但是在临界区的时间并不长。临界区之外能干别的事情。
用485进行MODBUS通信,当从机收到主机命令,直接发送温度数据即可,这个温度数据是之前放在缓冲里的数据,没有必要在收到命令之后再去控制18B20采集温度,这样会造成主机等待超时。
假设采用9600波特率,从机大约有1ms的时间去做别的事情,如果做一件事情(独占的,禁止中断)的时间超过了这个时间,就会造成串口的数据丢失,从而使命令无法解析。但是考察18b20的时序,根本就不需要这么长的时间去进入临界区进行操作,它们的时间都不在一个数量级,所以你有足够的时间响应串口的数据。另外在进入串口中断之后处理接收到的数据所经历的时间也不是很长,并不会影响18B20的操作,况且此时18B20的操作已经不再临界区了,所以就不用担心这个事了。

使用特权

评论回复
12
yuse|  楼主 | 2009-12-8 22:23 | 只看该作者
本帖最后由 yuse 于 2009-12-8 22:26 编辑
18B20时序很严格,但是在临界区的时间并不长。临界区之外能干别的事情。
用485进行MODBUS通信,当从机收到主机命令,直接发送温度数据即可,这个温度数据是之前放在缓冲里的数据,没有必要在收到命令之后再去控制18B ...
原野之狼 发表于 2009-12-8 21:42
谢谢各位前辈们这么详细的回答,我有如下问题:
1 18b20临界区指什么呢?是不能发生中断的区域吗?具体是在哪一个区域段呢?
2 我是这样编程的,18b20不断检测温度 把检测到的温度不断更新放在一个uint16的变量中,一旦上位机发来,就可以读该寄存器变量读走,您说的缓冲是这个意思吧。
3 调试了下,程序确实跑会进入了死循环,有时还会出现读错;如果去掉通信18b20则正常。
4 “另外在进入串口中断之后处理接收到的数据所经历的时间也不是很长,并不会影响18B20的操作,况且此时18B20的操作已经不再临界区了,所以就不用担心这个事了。”通过modbus过来进入中断后,会执行解析,校验,读寄存器等,时间会不会比较长,导致中断返回后出错?为何此时18B20的操作已经不再临界区了呢?因为我调试确实出了错

使用特权

评论回复
13
原野之狼| | 2009-12-8 22:36 | 只看该作者
回复yuse:
1 我指的临界区是说这个临界区的时间段内 最好不要去处理别的任务 否则会超越临界区导致错误 举个例子MCU在读取18b20的数据时要求在15us内进行操作 这个时候MCU最好不要去干别的事情 否则可能就错过了 但是也不是绝对的讲就不能去响应中断 如果干别的事情并不会影响这个时间的要求也是可以的 这就要求你对程序运行过程很了解。
2 你说的对。
3 估计问题在于18b20的操作不严谨 导致跨越了临界区
4 不在临界区 所以开了中断 然后响应了中断 既然已经不再临界区 那么中断处理多花些时间也无妨。

使用特权

评论回复
14
yuse|  楼主 | 2009-12-8 22:53 | 只看该作者
好的 谢谢前辈 也就是说问题的关键应该是要把整个系统程序各部分时间关系搞清楚并仔细查看datasheet,找到临界区,临界区时关中断,不在临界区时开中断,是这样吧。 13# 原野之狼

使用特权

评论回复
15
原野之狼| | 2009-12-8 22:56 | 只看该作者
回复yuse:
你说的对!

使用特权

评论回复
16
yuse|  楼主 | 2009-12-8 23:01 | 只看该作者
十分感谢!那我继续研究,不懂还要向前辈多讨教学习! 15# 原野之狼

使用特权

评论回复
17
haolaishi| | 2011-9-11 17:09 | 只看该作者
MARK

使用特权

评论回复
18
wuxj| | 2012-3-17 19:37 | 只看该作者
modbus 串行链路用RS485,想问下各个从站之间除了连A,B线之外还需要接一根共地线么

使用特权

评论回复
19
yesful| | 2012-3-18 00:44 | 只看该作者
上位机100ms召唤一次,那在50ms(例如,可改)任务里,处理接收到的命令报文并返回温度数据,在1S任务里,读取18B20上一次转换的温度数据,并启动下一次转换。这样是否可以实现了,在18B20处理温度转换期间来对进行modbus响应

使用特权

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

本版积分规则

152

主题

453

帖子

0

粉丝