早在2008年左右,我就在产品中使用Modbus协议与其它设备进行通信。记得第一款是智能马达保护器,其作为Modbus从,与Modbus主设备进行通信。这么多年来,一直都没有使用开源的Modbus协议代码,而在在不断在自己编写的Modbus协议代码上进行优化,发现问题并解决。自己写的代码用起来比较得心应用可以针对不同的平台进行优化,将处理器的性能发挥到极致。在此期间,也踩过一些坑,现在做一些总结:

串口数据接收完之后,到通过IO口重新使用接收的时间间隔。

发送完成之后切换接收的延时时间如上图所示的Td,按照Modbus协议的规定,接收完数据之后,必须要间隔3.5个字符对应的时间才能发送。如果是9600bps的波特率,8位数据位,1位起始位,1位停止位,无奇偶校验位,则1个字符为10个 bit,对应1.04ms,3.5个字符对应3.5ms。考虑到总线上的电容对传输延时的影响,建议在发送完数据1.7个字符的时间之后再使能接收。对于这个时间,可能会犯一些错误,比如:

  • 在发送完最后一个字节的发送完成中断中,直接将控制IO口使能485芯片的接收。殊不知,由于电容导致的信号延时,串口数据还没有完全发送到总线,485芯片就被置为接收状态,导致最后几个bit的数据误码;

  • 没有正确理解发送完成中断以及发送缓存器空中断之间的差别;

  • 发送完成中断一般是指串口数据已经从移位寄存器从端口送出。但是并不说明已经被送到RS485总线。从MCU的IO口到RS485总线还需要考虑隔离光耦、电容、RS485芯片的延时;

  • 发送缓存器空中断是指腾出了缓存的位置,可以缓存数据。此时,上一个数据可能还在移位寄存器中被紧张有序地按位移出到IO口,此时把RS485芯片置为接收。还正在移位的数据就嗝屁了。

因此

  • 一定要搞清楚选用的中断是发送完成中断还是缓存器空的中断;

  • 在发送中断中,不能立即切为接收,应当延时一段时间,我现在的做法是不管三七二十一,在发送中断中,如果判断为最后一个byte,则延时1.7ms将RS485设置为接收;

  • 不应该启动定时器进行延时,定时器资源很宝贵,应该在100us左右的定时器中断中,通过变量计数来进行1.7ms左右的延时;

MODBUS从设备多少时间会应答

Modbus是问答式的通信,主设备发送完数据之后,从设备会做出响应。按照Modbus协议规定,从设备3.5个字符时间之后做出响应都是合法的。不同的传感器应答响应时间各不相同。有些差的传感器可能到几十ms才响应,有些3.5ms左右就立即响应了。有些甚至没有按照Modbus的协议出牌,还没有到3.5ms左右的时间就响应了。这就要求主设备在将RS485接收使能之后,立即进行接收状态。如果是用串口中断进行接收,则应该注意在主程序中是否有关中断的操作,关中断的操作是否影响接收。

每一个串口数据之间的时间间隔

Modbus根据数据之间的时间间隔来判断一桢消息的结束,需要保证一桢消息内的前后数据之间的间隔不超过3.5个字符。而数据一般在发送中断中发送,有些人为了保证数据完整性,保证数据访问的互斥,很喜欢关中断来保护现场。这种做法一不小心就会使发送两个数据的间隔超过3.5个字符。特别是当波特率比较高时,更容易出现这种情况。比如,当波特率为38400时,3.5 个字符仅为850us左右,在发送串口数据的时间内,中断关闭850us,Modbus通信就嗝屁了。如果MCU支持DMA,建议使用DMA+定时器进行数据收发。

作为Modbus从设备时,收到数据之后,多少时间应答

按照Modbus协议要求,3.5个字符之后就可以应答。有些Modbus主设备可以是为了保证实时性,对这个应答时间要求比较苛刻。比如我们前一段时间跟西门子的工控屏对接时,就碰到过这样的问题,总线的波特率为19200bps,我们的设备在收到西门子的命令之后大概在5ms左右做出了应答。但是西门子工控屏却判为错误。之后,我们将应答时间缩短到2ms左右,与西门子的通信才变得正常。建议在3.5个字符之后,立即应答。

来源:头条号-IT自动化交流

原文链接:https://www.toutiao.com/i6894161680406675981/

【1】RS232和RS485有啥区别,主要体现在五点上

【2】为什么集电极开路输出端口一定要加上拉电阻?

【3】都说C语言的精髓是指针,但是指针太难懂了,怎么办?

【4】单相电机为什么要加电容,有啥作用?

【5】PWM如何线性转化为电压,集成方案推荐

【6】51单片机的定时器如何计算初值?

modbus发送接收_自己编写MODBUS协议代码所踩过的坑相关推荐

  1. python登录教务系统_记python登陆学校教务系统踩过的坑

    最近开发关于学校服务类小程序,小程序后台需要从学校的系统获取到各同学的信息,所以语言优先选择了python,并用了Django框架.之前也有写过一些爬虫,但都是用其他语言写的.对python并不熟悉, ...

  2. python modbus tk 库_如何使用modbus tk rtu(python)设置简单的从机和主机

    我想通过modbus协议在树莓pi(从机)和pc(主机)之间建立通信.目前,我正在使用 modbus-tk (python)设置通信协议. 问题是主设备无法从从设备读取寄存器我能知道我的代码有什么问题 ...

  3. java工程如何跑起来的_你编写的Java代码是咋跑起来的?

    如果你是一名 Java 开发人员,你肯定指定 Java 代码有很多种不同的运行方式.比如说可以在开发工具(IDEA.Eclipse等)中运行,可以双击执行 jar 文件运行,也可以在命令行中运行,甚至 ...

  4. 编写代码的软件用什么编写的_当编写过多的代码可能会杀死您

    编写代码的软件用什么编写的 因此,既然我以这个挑衅性的标题吸引了您,我想我需要澄清一下. 是的,这是真的. 太多的编码会杀死您,真正的问题是"原因是什么?" 答案是: 慢性压力. ...

  5. pythonic 代码_如何编写Pythonic的代码?

    如果说优雅也有缺点的话,那就是你需要艰巨的工作才能得到它,需要良好的教育才能欣赏它. -- Edsger Wybe Dijkstra 什么是所谓的Pythonic呢? 我发现这是一个很常见的名词,但是 ...

  6. oracle 查重复_日常答疑|MySQL删除重复数据踩过得坑

    问题 群友提问:MySQL这样删除重复数据为啥不成功呢? 严小样儿:安排! 咋一看,大家都说where子句里面应该使用极值函数,加个max就对了,这么简单! # 大家想象中这样写是对的,其实仍然是错的 ...

  7. mysql 删除重复数据_日常答疑|MySQL删除重复数据踩过得坑

    问题 群友提问:MySQL这样删除重复数据为啥不成功呢? 严小样儿:安排! 咋一看,大家都说where子句里面应该使用极值函数,加个max就对了,这么简单! # 大家想象中这样写是对的,其实仍然是错的 ...

  8. c语言编写modbus程序,C语言编写modbus协议

    <C语言编写modbus协议>由会员分享,可在线阅读,更多相关<C语言编写modbus协议(23页珍藏版)>请在人人文库网上搜索. 1.include / 字地址 0 - 25 ...

  9. C#编写Modbus协议加速度传感器上位机

    C#编写Modbus协议加速度传感器上位机 项目概述 功能描述 上位机原理 初始化连接 读取寄存器原始数据 换算为实际物理量 自动模式 数据保存 数据可视化分析 尾言 项目概述 笔者利用下班时间,编写 ...

  10. python编写赛车_python udp 协议发送接收秒速赛车平台搭建数据

    python udp 协议发送接收秒速赛车平台搭建数据 Socket socket 简称套接字, 秒速赛车平台搭建 [企鹅 217-1793-408] 是进程间通信的一种方式. 与其他的方式的进程间的 ...

最新文章

  1. 逢低买入?比特币、莱特币和比特币现金反弹行情一触即发?
  2. 数学之美 系列一 -- 统计语言模型
  3. java常用的发送http请求的工具方法
  4. phpstorm的php函数文档插件
  5. oschina导出博客获取图片
  6. 手机应用开发的方式不能完全套用到iPad上
  7. 10个Python编程窍门,不懂就亏了
  8. win10系统自带的计算机无法使用吗,Win10如何使用系统自带的硬件设备检测工具?...
  9. [unity3d]再次修改socket聊天,完美的服务器端
  10. [PyTorch] autograd 自动求导
  11. 广东2022年下半年系统集成项目管理工程师上午真题及答案解析
  12. pycharm-.db文件打不开问题
  13. python isin_python numpy isin用法及代码示例
  14. 一个在ns3平台基于UDP协议实现的拥塞控制仿真框架
  15. python实现局域网内使用TCP服务器传输文件
  16. 芝加哥打字机_芝加哥打字机不是打字机
  17. JAVA单车管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
  18. 干涉法测微小量(牛顿环测透镜的曲率半径)
  19. 学编程遇到的数学知识
  20. 禅道管理员admin密码登录失败,更改密码

热门文章

  1. 【ZooKeeper Notes 6】客户端对zookeeper的操作是不可回退的 [OK]
  2. [经验]自定义ASP.NET服务器控件属性的状态不能保存的问题
  3. 6.剑指Offer --- 面试中的各项能力
  4. 7.深入分布式缓存:从原理到实践 --- Redis探秘
  5. 6.Nginx 的 Rewrite 规则
  6. hpm1216nfh驱动程序_惠普M1216nfh驱动下载
  7. git 合并指定目录到master
  8. Gitlab利用Webhook实现Push代码后的Jenkins自动构建
  9. CentOS7安装Jenkins Master
  10. PHP Mysql-简介