gpt4 book ai didi

python - Pymodbus 读取保持寄存器

转载 作者:太空宇宙 更新时间:2023-11-03 21:39:12 25 4
gpt4 key购买 nike

我被指派在没有任何文档的情况下执行该任务。我在从 MODBUS 读取数据时遇到问题。这是我能够创建的脚本:

from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.payload import BinaryPayloadBuilder
from pymodbus.client.sync import ModbusTcpClient

client = ModbusTcpClient('X.X.X.X')
connection = client.connect()

request = client.read_holding_registers(12606,2)
result = request.registers
decoder = BinaryPayloadDecoder.fromRegisters(result, Endian.Big, wordorder=Endian.Little)
print "Counter1: %0.2f" % decoder.decode_32bit_float()

request = client.read_holding_registers(12482,2)
result = request.registers
decoder = BinaryPayloadDecoder.fromRegisters(result, Endian.Big, wordorder=Endian.Little)
print "Counter2: %0.2f" % decoder.decode_32bit_float()

client.close()

一切看起来都很好,但是计数器上的数据与脚本中的数据不同,例如:

Value on the counter : 39558853.30 (value is decimal)
Value from the script: 58853.30
(value is decimal)

Read input registers (HEX): E54D 4765

这就是地址文档的样子”

P   12458       Q2  4\DW12458 = 1\ND20_Q2\P(F)
Q 12462 Q2 4\DW12462 = 1\ND20_Q2\Q(F)
S 12466 Q2 4\DW12466 = 1\ND20_Q2\S(F)
I 12470 Q2 4\DW12470 = 1\ND20_Q2\I(F)
U 12474 Q2 4\DW12474 = 1\ND20_Q2\U(F)
f 12478 Q2 4\DW12478 = 1\ND20_Q2\f(F)
EP_POB 12482 Q2 4\DW12482 = 1\ND20_Q2\EP_POB(F)
EP_ODD 12486 Q2 4\DW12486 = 1\ND20_Q2\EP_ODD(F)
EQ_IND 12490 Q2 4\DW12490 = 1\ND20_Q2\EQ_IND(F)
EQ_POJ 12494 Q2 4\DW12494 = 1\ND20_Q2\EQ_POJ(F)
THDVL1 12498 Q2 4\DW12498 = 1\ND20_Q2\THDVL1(F)
THDVL2 12502 Q2 4\DW12502 = 1\ND20_Q2\THDVL2(F)
THDVL3 12506 Q2 4\DW12506 = 1\ND20_Q2\THDVL3(F)
THDIL1 12510 Q2 4\DW12510 = 1\ND20_Q2\THDIL1(F)
THDIL2 12514 Q2 4\DW12514 = 1\ND20_Q2\THDIL2(F)
THDIL3 12518 Q2 4\DW12518 = 1\ND20_Q2\THDIL3(F)
UL1 12522 Q2 4\DW12522 = 1\ND20_Q2\UL1(F)
UL2 12526 Q2 4\DW12526 = 1\ND20_Q2\UL2(F)
UL3 12530 Q2 4\DW12530 = 1\ND20_Q2\UL3(F)
IL1 12534 Q2 4\DW12534 = 1\ND20_Q2\IL1(F)
IL2 12538 Q2 4\DW12538 = 1\ND20_Q2\IL2(F)
IL3 12542 Q2 4\DW12542 = 1\ND20_Q2\IL3(F)
PL1 12546 Q2 4\DW12546 = 1\ND20_Q2\PL1(F)
PL2 12550 Q2 4\DW12550 = 1\ND20_Q2\PL2(F)
PL3 12554 Q2 4\DW12554 = 1\ND20_Q2\PL3(F)
QL1 12558 Q2 4\DW12558 = 1\ND20_Q2\QL1(F)
QL2 12562 Q2 4\DW12562 = 1\ND20_Q2\QL2(F)
QL3 12566 Q2 4\DW12566 = 1\ND20_Q2\QL3(F)
S1 12570 Q2 4\DW12570 = 1\ND20_Q2\S1(F)
S2 12574 Q2 4\DW12574 = 1\ND20_Q2\S2(F)
S3 12578 Q2 4\DW12578 = 1\ND20_Q2\S3(F)

最佳答案

我改进了您的代码如下:

from pymodbus.constants import Endian
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.client.sync import ModbusTcpClient

def validator(instance):
if not instance.isError():
'''.isError() implemented in pymodbus 1.4.0 and above.'''
decoder = BinaryPayloadDecoder.fromRegisters(
instance.registers,
byteorder=Endian.Big, wordorder=Endian.Little
)
return float('{0:.2f}'.format(decoder.decode_32bit_float()))

else:
# Error handling.
print("The register does not exist, Try again.")
return None


client = ModbusTcpClient('X.X.X.X', port=502) # Specify the port.
connection = client.connect()

if connection:
request = client.read_holding_registers(12606, 2, unit=1) # Specify the unit.
data = validator(request)
print(data)

request = client.read_holding_registers(12482, 2, unit=1) # Specify the unit.
data = validator(request)
print(data)

client.close()

else:
print('Connection lost, Try again')
<小时/>

[注意]:

您确定所需的 float32 解码吗?

  1. 浮点 AB CD == byteorder=Endian.Big, wordorder=Endian.Big
  2. float CD AB == byteorder=Endian.Big, wordorder=Endian.Little
  3. float BA DC == byteorder=Endian.Little, wordorder=Endian.Big
  4. 浮点 DC BA == byteorder=Endian.Little, wordorder=Endian.Little

设置unit_id:

  • 在许多情况下,unit 默认为 1
<小时/>

[更新]:

也许您需要将结果读取并解码为 12482 寄存器地址的 double/float64 值,因为我认为当文档中的相应寄存器为 12482,下一个寄存器是12846,您需要读取4regs - float64/double:

request = client.read_holding_registers(12482, 4, unit=1)

还有

return float('{0:.2f}'.format(decoder.decode_64bit_float()))

关于python - Pymodbus 读取保持寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53010239/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com