Modbus是由Modicon公司开发的通讯协议,目前已经成为工业领域通信协议的业界标准,是工业电子设备之间常用的连接方式。这篇文章将简单介绍Modbus总线以及如何在stm32平台上移植开源的freemodbus并进行相关的开发。
Modbus的简要介绍
Modbus协议可以用于串口或者以太网作为信息交互的介质。串行连接分为Modbus RTU和Modbus ASCII。Modbus RTU是一种紧凑的,采用二进制表示数据的方式,Modbus ASCII是一种人类可读的,冗长的表示方式。被配置为RTU变种的节点不会和设置为ASCII变种的节点通信。Modbus TCP是应用于以太网的通讯协议。这三种通信协议在数据模型和功能调用上都是相同的,只有封装方式是不同的。
Modbus协议是一个master/slave架构的协议。有一个节点是master节点,其他使用Modbus协议参与通信的节点是slave节点。每一个slave设备都有一个唯一的地址。
Modbus消息帧
参考:
https://blog.csdn.net/byxdaz/article/details/77892778blog.csdn.net1.Modbus ASCII
使用ASCII模式,消息以冒号(:)字符(ASCII码 3AH)开始,以回车换行符结束(ASCII码 0DH,0AH)。其它域可以使用的传输字符是十六进制的0...9,A...F。网络上的设备不断侦测“:”字符,当有一个冒号接收到时,每个设备都解码下个域(地址域)来判断是否发给自己的。
起始位 设备地址 功能代码 数据 LRC校验 结束符
1个字节 2个字节 2个字节 n个字节 2个字节 2个字节
2.Modbus RTU
使用RTU模式,消息发送至少要以3.5个字节时间的停顿间隔开始。在网络波特率下多样的字节时间,这是最容易实现的(如T1-T2-T3-T4所示)。T代表传输一个字节的停顿时间。传输的第一个域是设备地址。可以使用的传输字符是十六进制的0...9,A...F。网络设备不断侦测网络总线,包括停顿间隔时间内。当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己的。在最后一个传输字节之后,一个至少3.5个字节时间的停顿标定了消息的结束。
起始位 设备地址 功能代码 数据 CRC校验 结束符
T1-T2-T3-T4 8Bit 8Bit n个8Bit 16Bit T1-T2-T3-T4
消息帧的地址域包含两个字节(ASCII)或8Bit(RTU)。可能的从设备地址是0...247 (十进制)。单个设备的地址范围是1...247。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。地址0是用作广播地址,以使所有的从设备都能认识。
3. Modbus TCP
由MBAP 头和PDU 构成
MBAP= Modbus Application Protocol Header(Modbus应用协议) 头部
PDU = Protocol Data Unit (数据单元)
Modbus的功能码
modbus的操作对象有四种:线圈、离散输入、输入寄存器、保持寄存器
线圈:PLC的输出位,开关量,在MODBUS中可读可写
离散量:PLC的输入位,开关量,在MODBUS中只读
输入寄存器:PLC中只能从模拟量输入端改变的寄存器,在MODBUS中只读
保持寄存器:PLC中用于输出模拟量信号的寄存器,在MODBUS中可读可写
根据对象的不同,modbus的功能码有:
0x01:读线圈
0x02:读离散量输入
0x03:读保持寄存器
0x04:读输入寄存器
0x05:写单个线圈
0x06:写单个保持寄存器
0x10:写多个保持寄存器
0x0F:写多个线圈
关于Modbus更多的介绍可以点击下面的链接看Modbus协议的pdf版本和更多资料
http://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdfwww.modbus.org https://blog.csdn.net/elie_yang/article/details/89203577blog.csdn.netfreemodbus在stm32平台的移植
freemodbus的官网在下面这个链接
FreeMODBUS - A free MODBUS ASCII/RTU and TCP implementation - SILAwww.embedded-solutions.atFreeMODBUS 是针对通用的Modbus协议栈在嵌入式系统中应用的一个实现。Modbus协议是一个在工业制造领域中得到广泛应用的一个网络协议。一个Modbus通信协议栈包括两层:定义了数据结构和功能Modbus应用协议和网络层。在FreeMODBUS的当前版本中,提供了Modbus Application Protocol v1.1a 的实现并且支持在Modbus over serial line specification 1.0中定义的RTU/ASCII传输模式。从0.7版本开始,FreeModbus也支持在TCP defined in Modbus Messaging on TCP/IP Implementation Guide v1.0a中定义的TCP传输。Freemodbus遵循BSD[1] ,这意味着本协议栈的实现代码可以应用于商业用途。目前版本的FreeModbus支持如下的功能码
- 读输入寄存器 (0x04)
- 读保持寄存器 (0x03)
- 写单个寄存器 (0x06)
- 写多个寄存器 (0x10)
- 读/写多个寄存器 (0x17)
- 读取线圈状态 (0x01)
- 写单个线圈 (0x05)
- 写多个线圈 (0x0F)
- 读输入状态 (0x02)
- 报告从机标识 (0x11)
FreeModbus协议的底层移植主要包括串口和定时器的移植。定时器的移植主要有定时器初始化和35uS定时中断函数等。串口的移植工作主要包括串口的初始化、发送和接收中断函数,RS485的发送和接收选择管脚的初始化和使能函数等。
FreeModbus协议的顶层函数移植主要是线圈的读写函数、离散量的读函数、输入寄存器的度函数和保持寄存器的读写函数等

被折叠的 条评论
为什么被折叠?



