- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我被指派在没有任何文档的情况下执行该任务。我在从 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 解码吗?
byteorder=Endian.Big, wordorder=Endian.Big
byteorder=Endian.Big, wordorder=Endian.Little
byteorder=Endian.Little, wordorder=Endian.Big
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/
我是 python 和 modbus 的初学者,现在我正在尝试使用 pymodbus 控制连接到串行端口的风扇几个小时。使用制造商的专有软件,我能够控制风扇,因此连接本身有效。然而,我自己的代码没有。
谁能解释如何通过 Modbus TCP/IP 使用 pymodbus 以正确的方式创建请求并获得响应? 我有 PLC,我想将其用作从站,PC 用作主站。 我尝试这样做: from pymodbus.c
我被指派在没有任何文档的情况下执行该任务。我在从 MODBUS 读取数据时遇到问题。这是我能够创建的脚本: from pymodbus.constants import Endian from pym
我对 pymodbus 相当陌生,我正在尝试使用 pymodbus 读取协作机器人的保存寄存器以获取当前 z 坐标的值。此类信息位于 7053 地址。我查看了较旧的问题,但无法让我的代码工作: fro
我有 pymodbus TcpClient 超时问题: import logging from pymodbus.client.sync import ModbusTcpClient logging.
我是 docker 和 Modbus 的新手,我正在尝试使用 Modbus(准确地说是 pymodbus 工具包)编写自定义客户端/服务器应用程序,我可能遇到了 docker 的一些问题。 我试过示例
我有一个 python 脚本,可以使用 pymodbus 库处理 Modbus 事务。为了进行故障排除,我想打印发送和接收到设备的原始字节,最好以十六进制格式。 这是简化的代码,请参阅底部的注释以获取
我有一些在 pymodbus 1.2 下编写的 modbus TCP 代码相关代码是 result = modbus_client.read_holding_registers(40093, 3) 在
如何从 Register with pymodbus 中读取数据? 我正在尝试这段代码: import pymodbus from pymodbus.pdu import ModbusRequest
我写了一个测试代码,它从 PLC 的 modbus 服务器读取一些线圈/寄存器。当我调用一个请求时,代码有效。我拔下电缆,然后 Twisted 调用 clientConnectionLost 函数,这
我对 Modbus 和 PyModBus 很陌生,但是我花了很多时间尝试阅读和试验它。如果有人能指出我正确的方向,我将不胜感激…… 我在寄存器 40001、40003、40005 和 40007(分别
我正在对 PLC 设备(Moxa ioLogik E1214)进行编程,并将 DI 端口连接到按钮,并将线圈连接到 LED 灯。这个想法是,当您按下按钮时,LED 应该亮起。 如果您按住按钮直到执行读
我正在尝试从Modbus TCP读取字符串(Usecase-1)和一个请求中的多种类型的数据(Usecase-2)数据 em> 设备,但是无法正确解码。 系统配置: Python 3.6.5 Pymo
希望你做得很好!我最近开始使用 python 进行 modbus 通信。我想澄清我的一些疑虑。 哪个模块更适合使用 Python 实现 modbus - minimalmodbus、pymodbus、
我想停止 pymodbus async ModbusTcpServer 然后启动一个新服务器。因此,我尝试使用以下简化的代码片段,但出现错误: from pymodbus.server.async i
一般来说,我是 pymodbus 和 modbus 的新手,我已经尝试了一段时间直接添加一个 float 到服务器上下文没有任何成功,我想知道你是否有任何关于如何去做的线索。我已经尝试通过执行以下操作
我使用 pymodbus 读取并解码 float_32 值。 之前,我使用以下代码简单地对其进行解码: from pymodbus.client.sync import ModbusTcpClient
当我尝试使用 pymodbus 和 raspberry pi 读取保持寄存器时遇到问题。我似乎无法同时连接两个服务器/从属设备(一个或另一个都可以工作,但在一起,我无法从两个设备读取寄存器)。这些连接
我已经开始使用 pymodbus 从 modbus 读取值以存储在异地数据库中。我一直在努力解决响应中收到的值与我在 Jace 上看到的值不同的问题。 我也尝试过 modbus-tk 并且我得到了同样
我正在做一个项目,我有两个都安装了 Pymodbus 的 Debian 虚拟机。我正在尝试设置一个虚拟测试环境,在其中我可以在它们通信时从第三个 Kali VM 对两者执行各种网络攻击。不幸的是,我对
我是一名优秀的程序员,十分优秀!