繁体   English   中英

如何使用 pymodbus 写入 PLC 输入寄存器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM