import socket
def write_multiple_registers(host, port, device_id, start_address, values):
# 创建TCP连接
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
# 构造Modbus TCP请求消息
transaction_id = 0x0001 # 事务标识符
protocol_id = 0x0000 # 协议标识符
length = 7 + 2 * len(values) # 消息长度
unit_id = device_id # 设备ID
function_code = 0x10 # 功能码:写多个保持寄存器
# 构造PDU(协议数据单元)
pdu = bytearray([
(start_address >> 8) & 0xFF, # 寄存器起始地址的高位字节
start_address & 0xFF, # 寄存器起始地址的低位字节
(len(values) >> 8) & 0xFF, # 要写入的寄存器数量的高位字节
len(values) & 0xFF, # 要写入的寄存器数量的低位字节
len(values) * 2 # 写入字节数
])
for value in values:
pdu.extend([(value >> 8) & 0xFF, value & 0xFF]) # 将每个寄存器的值添加到PDU中
# 构造MBAP头(Modbus应用协议头)
mbap_header = bytearray([
(transaction_id >> 8) & 0xFF, # 事务标识符的高位字节
transaction_id & 0xFF, # 事务标识符的低位字节
(protocol_id >> 8) & 0xFF, # 协议标识符的高位字节
protocol_id & 0xFF, # 协议标识符的低位字节
(length >> 8) & 0xFF, # 消息长度的高位字节
length & 0xFF, # 消息长度的低位字节
unit_id # 设备ID
])
# 组合MBAP头和PDU
request = mbap_header + pdu
# 发送请求消息
sock.send(request)
# 接收响应消息
response = sock.recv(1024)
# 关闭连接
sock.close()
return response
# 使用示例
host = '192.168.0.20' # Modbus TCP设备的IP地址
port = 502 # Modbus TCP设备的端口号
device_id = 1 # Modbus 设备地址
start_address = 0 # 要写入的起始保持寄存器地址
values = [123, 456, 789] # 要写入的值列表
response = write_multiple_registers(host, port, device_id, start_address, values)
print("收到的响应消息:", response.hex())
03-18
1万+
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交