写一个MODBUStcp例子
时间: 2024-04-25 15:05:14 浏览: 91
MODBUS-TCP.zip_MODBUS/TCP_Modbus c# tcp_modbus TCP c++_modbus tc
下面是一个使用Python编写的MODBUS TCP客户端的示例代码:
```python
import socket
# MODBUS TCP请求报文
def build_request(addr, func_code, start_addr, num_regs):
return bytearray([
addr, # 从机地址
func_code, # 功能码
(start_addr >> 8) & 0xFF, # 寄存器起始地址高位
start_addr & 0xFF, # 寄存器起始地址低位
(num_regs >> 8) & 0xFF, # 寄存器数量高位
num_regs & 0xFF # 寄存器数量低位
])
# 解析MODBUS TCP响应报文
def parse_response(resp):
if len(resp) < 9:
raise Exception('Invalid response')
addr = resp[0]
func_code = resp[1]
if func_code > 0x80:
error_code = resp[2]
raise Exception('Function code error: %d' % error_code)
byte_count = resp[2]
data = resp[3:]
if len(data) != byte_count:
raise Exception('Data length error')
return data
# 读取多个保持寄存器
def read_holding_registers(host, port, addr, start_addr, num_regs):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
sock.connect((host, port))
req = build_request(addr, 0x03, start_addr, num_regs)
sock.sendall(req)
resp = sock.recv(1024)
data = parse_response(resp)
return data
finally:
sock.close()
# 示例:读取从机地址为1的设备的0x0001~0x0004寄存器的值
data = read_holding_registers('192.168.0.10', 502, 1, 0x0001, 4)
print(data)
```
这个示例代码是一个简单的MODBUS TCP客户端,它可以通过读取多个保持寄存器的功能码0x03来读取多个寄存器的值。在实际使用中,你需要根据自己的设备及协议要求进行修改才能正确地读取设备数据。
阅读全文