Modbus那些事

Modbus在江湖上已经有三十多年的历史了,最早由莫迪康(Modicon)于1979年发明,因其简单实用,且易开发,迅速赢得了工程师的喜爱,已应用到成千上万的控制器中,目前也成为我国国家标准工业通信协议中的重要一员。

记得第一次接触Modbus是在08,09年间,那时正值新能源发电大力兴起之时,为了响应国家节能减排的号召,一时间,大量的单位开始研发光伏发电,Modbus也成了光伏逆变器必配的一种通讯协议。当第一次面对开发这个协议软件的时候,我是手足无措,因为不懂,所以无知,于是就晚上大量查阅网上资料,白天写程序调试,最后终于成功将Modbus协议引入逆变器。自此,对Modbus有了初步的认识。其实软件的流程图就在协议的文档中,只要扎实理解了协议的描述,就能开发出Modbus通讯软件。

Modbus具有以下几个特点:

(1)标准、开放,用户可以免费、放心地使用Modbus协议,目前,支持Modbus的厂家超过几百家,支持Modbus的产品超过几百种。

(2)Modbus可以支持多种电气接口,如RS-232,RS422,RS-485等,还可以在各种介质上传送,如双绞线、光纤、无线等。

(3)Modbus的帧格式简单、紧凑,通俗易懂。用户使用容易,厂商开发简单。

MODBUS 是一个请求/应答协议,并且提供功能码规定的服务。常用的有

Modbus ASCII,

Modbus RTU,

Modbus TCP/IP

RTU是必须要支持的,其余可选,Modbus RTU 帧最大为 256 字节。

如果你留意就会发现,其实市场上的产品,好多并不是完全遵守Modbus标准,有的硬件工程师对电气标准也不是很清楚,其实Modbus对电缆规格,长度,以及波特率,终端电阻,接地,连接器,通信状态的LED指示,都有电气标准,我一直有一个观点,如果有既有的标准,那么你的开发就应该建议按照标准来执行。

有兴趣的童鞋可以看看你接触到的是否按照了标准来执行,举个简单的例子,标准中对LED指示的要求。

在RTU模式的软件实现上,

默认的通信配置是波特率9600bps,8位数据位,偶校验,一位停止位。

奇校验和无校验是可选的。系统必须支持默认的配置,并且对配置错误有异常管理。

由发送设备将 Modbus报文构造为带有已知起始和结束标记的帧。这使设备可以在报文的开始接收新帧,并且知道何时报文结束。不完整的报文必须能够被检测到而错误标志必须作为结果被设置。在RTU模式,报文帧由时长至少为 3.5 个字符时间的空闲间隔

在软件的实现上,主要是对帧开始,帧结束的中断,串口接收中断的实现,在高波特率的情况下,必须严格按照标准的要求实现帧检测,协议文档中都有状态机和流程图供开发工程师参考,每种波特率,对发送方,要求其精度必须高于1%,而对接收方,必须允许2%误差。Modbus报文帧格式如下:

另外一点需要注意的就是Modbus是大端模式,就是比如一个16位的电流有效值,是先发送高字节,在发送低字节,但在CRC校验域切记是先发送低字节,在发送高字节,每个字节是先发送低位在发送高位,如下图所示。

对异常诊断的管理是每一个通讯协议都要求的,经常会有工程师只注意实现正常通信的功能,对异常的管理不重视,这样在通信异常的时候,就不便主机的诊断。

文章分享自微信公众号:
嵌入式程序猿

本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!

作者:武国平
原始发表时间:2015-04-20
如有侵权,请联系 cloudcommunity@tencent.com 删除。
登录 后参与评论
0 条评论

相关文章

  • C++那些事之static那些事

    当与不同类型一起使用时,Static关键字具有不同的含义。我们可以使用static关键字:

    公众号guangcity
  • BaseDexClassLoader那些事

    BaseDexClassLoader这个类有三种构造方法,只分析两个(因为另外一个只不过是其中一个的扩展,对于加载DexElements的方式并没有改变)。首先...

    用户7528483
  • Asynctask那些事

    耗时操作?更新UI?这些都是我们经常听到的词汇了,最常用的方法就是Thread+Handler的方法,今天就来聊聊另一个熟悉的Asynctask,或许你没有听过...

    用户1337002
  • 缓存那些事

    导语:在网络分层应用服务中,缓存的使用已比较普及,本文将结合作者实际工作经验总结,讲述在不同的场景下如何选择和使用适用的缓存框架,以达到提升服务质量,优化系统...

    CSDN技术头条
  • NodeJS那些事

    下半年做了挺多活动型需求,因为我们业务人力有限,我在业务的策略是不依赖NodeJS。

    libo1106
  • XFF那些事

    X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTTP请求头字段。 Squid 缓...

    yumusb
  • CORB那些事

    本站底部调用了ip.sb的API以显示访客IP,突然某一天不能显示了。本以为是now.sh的hugo部署问题。闲暇时分析一下才明白是CORB问题。

    yumusb
  • Block那些事

    __main_block_func_0这个是block的执行函数,参数是__main_block_impl_0类型。

    Helloted
  • jstack那些事

    工作多年,经常遇到灵异事件,比如说: "任务为什么不跑了" , "没什么复杂业务呀,怎么cpu这么高" ,"用了缓存,怎么查询还是这么慢" , 一些工作一两年的...

    勇哥java实战分享
  • 素数那些事

    在我们刚开始编写程序的时候,往往会要求写一个输出n以内(n大于等于2)的所有素数。首先来介绍一下什么是素数。有些数具有特殊的属性,它们不能被表示为两个较小的数字...

    不可言诉的深渊
  • FastJson那些事

    Fastjson是一个Java语言编写的高性能功能完善的JSON库。它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致,是目前Jav...

    open
  • 引用那些事

    普通对象在标记为垃圾时。会把他添加到一个队列中,然后唤醒一个专门用于调用finazlly的damen守护线程去掉用队列里面对象的finazlly函数。

    用户7528483
  • ResNet那些事~

    增加网络的深度可以很好的提高网络的性能,深的网络一般都比浅的的网络效果好,一个比较好的例子就是VGG,该网络就是在AlexNex的基础上通过增加网络深度大幅度提...

    yzh
  • 缓存那些事

    前言 一般而言,现在互联网应用(网站或App)的整体流程,可以概括如图1所示,用户请求从界面(浏览器或App界面)到网络转发、应用服务再到存储(数据库或文件系统...

    美团技术团队
  • 网线那些事

    ① 输出数据 (+) ② 输出数据 (-) ③ 输入数据 (+) ④ 保留网络传输 ⑤ 保留网络传输 ⑥ 输入数据 (-) ⑦ 保留网络传输 ⑧ 保留网络传输 ...

    逍遥子大表哥
  • js那些事

    今天我尝试让大家理解只有在绝对需要的情况下才使用匿名函数的想法。匿名函数不应该是首选,而且你自己也应该知道为什么使用它。当理解这种想法之后,你的代码会变得更简洁...

    李才哥
  • 代码优化那些事

    /**************************************************************************/

    哲洛不闹
  • OpenSL ES那些事

    本次分享主要是将JNI层的声音采集,传输以及播放过程做相应介绍,若是大家有更好的优化建议,欢迎指教。

    QQ音乐技术团队
  • AutoreleasePool的那些事

    我们看到在main中有个@autoreleasepool,那它到底是什么呢?让我们转成.cpp看下:

    全栈程序员站长

扫码关注腾讯云开发者

领取腾讯云代金券