Modbus协议使用
不熟悉的会认为很高深,了解的会觉得其实没啥,Modbus协议就是这样,简单到除了看说明书,基本没啥需要说明的程度。
可以认为它是一个纯软件协议,和硬件没啥关系,唯一的那点关系是在不同的传输介质上采用的格式不一样。Modbus协议可以通过RS232、RS485或者以太网等进行传输,通过RS232、RS485等不可靠介质上传输时,需要添加校验信息以验证数据传输的正确性;而在以太网上传输时,因为TCP/IP协议已经可以保证传输的数据包的正确性,因此额外的校验已不必要。关于Modbus报文和Modbus TCP报文的格式请参见相关的资料。
Modbus广泛用于工业通信领域。比如典型的可编程控制器(PLC),包含数字量输入、模拟量输入、数字量输出、模拟量输出以及内部寄存器等,如果一台主机连接到该PLC并需要对其进行控制,就需要一种双方都能识别的格式进行通信,Modbus就是为此而生的。
Modbus协议规定了主机和PLC双方通信的格式,通信双方只要各自遵从这份规定就能正确解析通信的内容。至于主机如何控制PLC的输出、报文如何传输等均不在此协议的关心范围之内。
Modbus为主从通信协议,主机(master)发送请求、辅机(slave)进行应答的一问一答的形式进行通信。
Modbus提供了各种功能码供主机读写辅机的寄存器,比如0x03读保持寄存器的内容、0x06写保持寄存器的内容等,其它功能码请查询Modbus协议的相关文档。
Modbus支持一对多的通信方式,在一个网络中只能有一个主机(master),可以有多个辅机(slave),每个slave以slave id进行标示。Master查询时将查询报文广播到网络上,每个slave都能接收到次报文但只有slave id匹配的slave才能进行应答,如果多个slave进行应答将会造成通信故障。
【Modbus协议使用】串口发送、接收Modbus报文的一些事项:
当Modbus在RS232或者RS485网络上传输时,主机和辅机均通过串口进行收发。
1、报文接收
Modbus报文通过发送间隙来标示一个完整的报文,即从Modbus报文本身分辨不出报文与报文之间的结合处,两个报文之间应最少有3.5倍字符传输时间的间隔。在有UART FIFO的嵌入式系统中,比如ARM、DSP等,当有字符接收到之后,如果在接下来的时间内有3.5倍以上的字符间隔的时间范围内没有字符接收到,则会产生一个超时中断,据此可判断一个完整的报文已经接收到。
如果使用像51单片机这类的没有此中断的嵌入式芯片,通常假定第一个接收到的字符为本身的slave id,然后接收报文中的长度字段,据其判断还需接收多少字节来构成完整的报文。
以太网是以数据包的形式发送数据,不存在类似的接收问题。
2、数据发送
数据的发送在大部分情况下不是问题,但考虑以下情况,使用一个实时性不太强的系统(比如Rabbit 3700模块)做master,通讯芯片使用半双工的MAX485,由于需要控制485芯片的收发,在实时性不太强的情况下可能造成以下问题:当发送完成后需要置585芯片为接收数据状态以接收slave的应答,这就需要在发送和置接收状态之间加几毫秒的延时,如果延时加的太短,则数据发送不完全;如果延时加的过长,则数据接收不完全。
此类系统需要考虑slave的响应时间,对于裸奔的单片机或者arm来说,这个响应时间很可能会很短暂。因为串口对这类芯片来说是个很低速的外设,计算时间远远小于数据收发所用的时间。如果master在调整发送后的延时能正确通信的话固然好,如果不能,就要在slave的接收和响应之间加几毫秒的延时,延时时长根据示波器观察和调试确定。如果不用示波器观察,这个问题很难发现。在非裸奔的Rabbit 3700上,串口接收到数据不进行任何处理就往外发送,也需要将近20毫秒的时间,但在裸奔的系统上,这个间隔基本可以忽略了。
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- iOS中的Block
- Linux下面如何查看tomcat已经使用多少线程
- 使用composer自动加载类文件
- android|android studio中ndk的使用
- 使用协程爬取网页,计算网页数据大小