我被指派在没有任何文件的情况下执行任务。从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()
一切看起来都很好,但计数器上的数据与脚本中的数据不同,例如:
^{pr2}$地址文档就是这样的。”
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)
我很确定39558853.30的值太大了,不能存储在IEEE单精度浮点中。有7.22位精度,这个数字需要9位数字。我做了一些实验,将值赋给float和C中的double值,证实了这一点。在
相信我:
1)就像Benyamin Jafari建议的那样,你需要读四个寄存器。但是,十六进制中的数字(双精度)是0x4182dcf62a66666,它似乎与您正在读取的任何数据都不对应。在
或者
2)它也有可能作为UINT32返回,它必须按(1/100)的比例缩放,以显示计数器显示的内容。0xE54D4765=3847047013=>;按1/100.0=38470470470.13缩放,这与您在计数器上看到的非常接近。根据我的经验,这是Modbus中的常见做法。在
或者
3)他们正在使用其他(非标准)格式来表示数据。在
你能告诉我们产品名称、型号等吗?在
我对您的代码进行了如下改进:
[注意]:
你能保证你想要的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
是1
作为默认ID[更新]:
也许您需要读取并解码为
^{pr2}$12482
寄存器地址的double/float64值,因为我认为当doc中需要的寄存器是12482
,而下一个寄存器是12846
,因此我们需要读取4regs(float64/double):以及
相关问题 更多 >
编程相关推荐