一、简介说明
Modbus通信协议是一种工业现场总线协议标准,常用的Modbus协议有以下三种类型:Modbus TCP、Modbus RTU、Modbus ASCll。
Modbus通信协议解决了通过串行线路在电子设备之间发送信息的问题。该协议在遵循该协议的体系结构中实现主/从模型。Modbus主站(Master)负责从其他设备(Slave)请求信息。标准Modbus网络中只有一个Modbus主站。
二、主站(Master)与从站(Slave)的区别
主站(Master)是发起Modbus通信的设备,它控制通信的进行,向从站发送请求,并处理从站返回的响应数据。主站可以同时连接多个从站,但每个从站都必须具有唯一的地址。
从站(Slave)是接收并响应主站请求的设备。从站只有在主站向其发送请求时才会响应,它不能主动发起通信。从站的地址用于唯一标识其在通信网络中的位置。
三、简单代码示例
Modbus RTU 请求示例(Python)
import serial
import time
from crcmod import predefined# 定义Modbus功能码
READ_COIL_STATUS = 0x01
READ_HOLDING_REGISTERS = 0x03# 串行端口设置
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1)def build_modbus_request(unit_id, function_code, start_address, quantity):# 构建Modbus RTU请求帧request = bytearray([unit_id, function_code])# 添加起始地址和数量,地址和数量是16位的request.extend(start_address.to_bytes(2, 'big'))request.extend(quantity.to_bytes(2, 'big'))# 计算CRC校验码crc = predefine.dvb_s2_crc.compute(bytes(request))request.extend(crc.to_bytes(2, 'big'))return requestdef send_request(request):# 发送请求到串行端口ser.write(request)time.sleep(0.05) # 等待响应的延时def receive_response():# 接收响应,这里简化处理,实际需要考虑超时和错误处理response = ser.read(ser.in_waiting)return response# 使用示例
unit_id = 0x01 # 从机地址
function_code = READ_HOLDING_REGISTERS # 功能码:读取保持寄存器
start_address = 0x00 # 起始地址
quantity = 0x01 # 读取数量request = build_modbus_request(unit_id, function_code, start_address, quantity)
send_request(request)
response = receive_response()print("Response:", response)
说明
-
串行端口设置:使用Python的
serial
库设置串行端口参数。 -
构建请求:
build_modbus_request
函数根据Modbus RTU协议构建请求帧,包括从机地址、功能码、起始地址、数量以及CRC校验码。 -
发送请求:
send_request
函数通过串行端口发送构建好的请求帧。 -
接收响应:
receive_response
函数从串行端口接收响应数据。 -
使用示例:示例中演示了如何构建读取保持寄存器的请求并发送。