python modbus RTU 03功能码和10功能码

该文演示了如何使用Python的pymodbus库创建ModbusRTU客户端,连接到COM7端口,以115200波特率通信。它执行了读取和写入保持寄存器的操作,读取地址0的30个寄存器值,并向地址90开始的位置写入一系列数值。最后,它会关闭连接。
部署运行你感兴趣的模型镜像

from pymodbus.client.sync import ModbusSerialClient#pip3 install pymodbus==2.5.3

创建Modbus RTU客户端

client = ModbusSerialClient(method=‘rtu’, port=‘COM7’, baudrate=115200, stopbits=1, bytesize=8, parity=‘N’)

连接Modbus设备

client.connect()

读取保持寄存器

result = client.read_holding_registers(address=0, count=30, unit=1)
if result.isError():
print(“读取保持寄存器失败:”, result)
else:
print(“保持寄存器值:”, result.registers)

写入多个寄存器

register_values = [1, 2, 3, 4, 5] # 要写入的寄存器值列表
starting_address = 90 # 要写入的寄存器起始地址
result = client.write_registers(address=starting_address, values=register_values, unit=1)
if result.isError():
print(“写入寄存器失败:”, result)
else:
print(“寄存器写入成功”)

关闭连接

client.close()

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### Modbus RTU 功能码 03 取保持寄存器 示例代码 为了实现通过 Modbus RTU 协议的功能码 `03` 来取保持寄存器的操作,可以按照以下 Python 实现来构建请求并解析响应。 #### 构建请求帧 当需要向地址为1的从设备发出取命令时,目标是从该设备获取特定起始位置上的一个或多个保持寄存器的数据。对于本例中的需求——即取位于地址100处的一个保持寄存器——则需构造如下形式的消息: - **站号 (Slave ID)**: 设备地址,在此设为 `01` - **功能码**: 对应于取保持寄存器操作的是 `03` - **起始地址高8位/低8位**: 地址100转换成十六进制后拆分为两部分,分别是 `00` `64`(十进制),因此这里应该是 `00 64` - **寄存器数量高8位/低8位**: 请求单个寄存器,则设置为 `00 01` 之后还需计算CRC校验值附加到消息结尾形成完整的查询报文[^1]。 ```python import struct from crcmod.predefined import mkCrcFun def create_modbus_request(slave_id, function_code, start_address, register_count): # 将起始地址寄存器数打包成两个字节的形式 packed_start_addr = struct.pack('>H', start_address) packed_reg_count = struct.pack('>H', register_count) # 创建crc函数对象 crc_func = mkCrcFun('modbus') # 组合消息体前半部 message_body = bytes([slave_id]) + \ bytes([function_code]) + \ packed_start_addr + \ packed_reg_count # 计算crc校验值,并将其追加至消息尾端 crc_value = crc_func(message_body).to_bytes(2, byteorder='little') full_message = message_body + crc_value return full_message.hex().upper() request_hex_string = create_modbus_request( slave_id=1, function_code=3, start_address=100, register_count=1 ) print(f"Request Frame HEX String: {request_hex_string}") ``` 这段脚本会输出用于发送给Modbus服务器的实际Hex字符串表示形式的请求帧。 #### 解析返回帧 一旦接收到回应数据包,就需要对其进行解码以提取实际存储在指定寄存器里的数值。下面给出了解析这部分内容的方法示例: ```python def parse_response(response_frame): """ 假定response_frame是一个包含有效响应的bytes对象, 并且已经验证过其长度至少有5个字节(不包括可能存在的额外错误信息) """ if response_frame[:2] != b'\x01\x03': raise ValueError("Invalid Response Header") data_length = int.from_bytes(response_frame[2:3], 'big') // 2 raw_data = response_frame[3:-2] registers_values = [] for i in range(data_length): offset = i * 2 value = int.from_bytes(raw_data[offset : offset + 2], 'big') registers_values.append(value) return registers_values # Example usage with a hypothetical received frame. received_frame_example = bytearray(b'\x01\x03\x02\xDD\xDD\xXX\xYY') parsed_registers = parse_response(received_frame_example) print(f"Parsed Register Values: {parsed_registers}") ``` 上述Python片段展示了如何处理来自远程RTU设备针对先前发起的功能码`03`指令作出的回答,从中抽取所需的信息[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值