Pymodbus写入保持寄存器报错‘required argument is not an integer’求助
问题分析与解决
可能的错误原因及对应解决方案
1. 参数类型不匹配(最可能)
报错required argument is not an integer说明传入的某个参数不是整数类型,重点检查以下几点:
- 地址参数类型:确认
modbus_address_reset(或直接写的41023)是整数而非字符串。如果是从配置文件/输入读取的地址,必须转换为整数:modbus_address_reset = int(41023) # 确保是整数类型 - 写入值的类型:单寄存器写入时,
value必须是整数,若传入浮点数会触发类型错误(比如write_register(41023, 0.0, unit=1)就会报错,需改为0)。
2. 类初始化方法错误
你的类初始化方法写的是def init(self):,但Python类的标准初始化方法是__init__(双下划线)。如果没有手动调用init()方法,self.client可能未被正确创建,导致后续写入操作异常。修正为:
class modbusRW(object): def __init__(self, method, port, stopbits, bytesize, baudrate, timeout): self.method = method self.port = port self.stopbits = stopbits self.bytesize = bytesize self.baudrate = baudrate self.timeout = timeout self.client = ModbusClient( method=self.method, port=self.port, parity='N', stopbits=self.stopbits, bytesize=self.bytesize, baudrate=self.baudrate, timeout=self.timeout)
实例化时直接传入参数,无需手动调用初始化方法。
3. BinaryPayloadBuilder使用问题
确保已导入Endian常量,否则会触发其他错误,同时确认build()返回的是整数列表:
from pymodbus.constants import Endian # 打印payload确认类型 print(payload_reset) # 正常应为[0, 0]这样的整数列表
另外,write_registers的count参数是可选的,可省略(会自动取len(values)作为计数),避免手动传入时出现不匹配:
result_reset = self.client.write_registers( address=modbus_address_reset, values=payload_reset, unit=modbus_unit)
4. 客户端连接状态问题
确保connect()方法正确调用了客户端的连接逻辑,比如:
def connect(self): return self.client.connect()
写入前可检查连接状态:
if not self.connect(): print("连接失败") return
验证步骤
- 在写入代码前添加类型检查:
print(type(modbus_address_reset)) # 应为<class 'int'> print(type(payload_reset[0])) # 应为<class 'int'> - 用最简代码测试写入:
# 直接创建客户端测试,排除类的问题 client = ModbusClient(method='rtu', port='COM3', baudrate=9600, timeout=1) if client.connect(): result = client.write_register(41023, 0, unit=1) print(result) client.close()
内容的提问来源于stack exchange,提问作者CTAspec
相关产品推荐
相关产品推荐

