![](/img/trans.png)
[英]How to write INPUT REGISTERS using pymodbus for external Modbus client which will read them
[英]How to write to PLC input registers using pymodbus
我想使用 pymodbus 写入 PLC 输入寄存器。 我能够阅读它们:
from pymodbus.client.sync import ModbusTcpClient
client = ModbusTcpClient('10.10.10.32')
client.connect()
reg = client.read_input_registers(1,5)
print(reg.registers)
但是我仍然没有找到任何方法来向它们写入任何值。 我很感激任何帮助。 谢谢。
输入寄存器是只读的。 您可以使用 Modbus 函数写入单个寄存器或写入多个寄存器(pymodbus 中的 ModbusTcpClient.write_register 或 ModbusTcpClient.write_registers)写入保持寄存器。
使用 Festo MODBUS/TCP 的示例:
# First digital input address
address = 40003
# Written value
value = 255
# It will send '11111111' to the output
client.write_register(address, value)
根据文档:
http://pymodbus.readthedocs.org/en/latest/library/sync-client.html
// 功能
write_register(地址,值)
// 参数
address - 要写入的起始地址
value - 要写入指定地址的值
PLC 有一组专用的寄存器供您读取和一组供您写入。 写入寄存器组因 PLC 而异。 您读取寄存器,例如可以从寄存器“1”开始。 您从“1”读取但不写入。 您必须查找您的 PLC 的 modbus 寄存器映射。
我对 Python 的了解很少,但您似乎正在尝试读取最多 5 个寄存器,从 1 开始? 要编写,您可能需要使用
reg = client.write_output_registers(?,??)
我通常使用 Wago 880。我可以写入寄存器 0-999 并从 1000-1999 读取。 我假设 Python 会为您处理函数代码。
2022 年更新。
写入整数值:您可以将整数值直接写入寄存器。
from pymodbus.client.sync import ModbusTcpClient as pyTcp
client = pyTcp(host="127.0.0.1",port=502)
client.write_registers(1,1234,unit= 1) #(register, value, unit)
写入浮点值:您不能将浮点值直接写入寄存器。 您必须构建有效负载来写入值。
from pymodbus.payload import BinaryPayloadDecoder, BinaryPayloadBuilder
builder = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big)
builder.add_32bit_float(45.77)
payload = builder.build()
client.write_registers(0,payload,count=2,unit= 1,skip_encode = True)
然后读取浮点值:
res=client.read_holding_registers(address=0,count=2,unit=1)
decoder = BinaryPayloadDecoder.fromRegisters(res.registers,byteorder=Endian.Big, wordorder=Endian.Big)
str(decoder.decode_32bit_float())
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.