如何在 PYMODBUS(Modicon?)中塑造 CALL

How to shape a CALL in PYMODBUS (Modicon?)

我正在与正确知道的太阳能逆变器 (INGETEAM 3play) 进行一场激烈的战斗,我通过 TCP / IP 连接。

我需要了解如何调整我的电话,因为我没有得到我想要的答案,而且我也不知道我在等待多少位答案。 这是我需要做的调用:

我确定 01 是 ID 03 表示 Holding Register,那么我该如何塑造其余部分 (00 00 00 06)? 这是代码:

FORMAT = ('%(asctime)-15s %(threadName)-15s '
          '%(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s')
logging.basicConfig(format=FORMAT)
log = logging.getLogger('pymodbus.protocol')
log.setLevel(logging.DEBUG)

variables = [0,6,12,18,24,30,36,70,72,74,76,78,342,344]

data = client.read_holding_registers(0, 2, unit=1)
decoder = BinaryPayloadDecoder.fromRegisters(data.registers, Endian.Big)
eastron = round(decoder.decode_32bit_float(), 3)
print (eastron) 

我知道我必须玩 client.read_holding_registers,但是怎么做呢? 文档是这样的:

也许我缺少的是所谓的 Modicon 的事实?

问题总结:

  1. 如何调整我的呼叫以匹配呼叫 01 03 00 00 00 06?
  2. 为什么当我拨打 01 03 00 00 00 06 时我得到了所有的答案(从年到秒)我不应该只得到秒? (认为​​pdf中的30006代表调用本身03 00 00 00 06)
  3. 如何记录调用时收到的 DEBUG?我在树莓派上做这个,我不确定我是否能像在 jupyter 上那样看到这个电话

例子

DEBUG:pymodbus.transaction:Current transaction state - TRANSACTION_COMPLETE
DEBUG:pymodbus.transaction:Running transaction 6
DEBUG:pymodbus.transaction:SEND: 0x1 0x3 0x0 0x0 0x0 0x2 0xc4 0xb
DEBUG:pymodbus.framer.rtu_framer:Changing state to IDLE - Last Frame End - 1580425865.276049, Current Time stamp - 1580425955.463177
DEBUG:pymodbus.client.sync:New Transaction state 'SENDING'
DEBUG:pymodbus.transaction:Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
DEBUG:pymodbus.transaction:Changing transaction state from 'WAITING FOR REPLY' to 'PROCESSING REPLY'
DEBUG:pymodbus.transaction:RECV: 0x1 0x3 0x4 0x41 0x60 0x0 0x0 0xee 0x11
DEBUG:pymodbus.framer.rtu_framer:Getting Frame - 0x3 0x4 0x41 0x60 0x0 0x0
DEBUG:pymodbus.factory:Factory Response[ReadHoldingRegistersResponse: 3]
DEBUG:pymodbus.framer.rtu_framer:Frame advanced, resetting header!!
DEBUG:pymodbus.transaction:Adding transaction 1
DEBUG:pymodbus.transaction:Getting transaction 1
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'
DEBUG:pymodbus.payload:[16736, 0]
DEBUG:pymodbus.payload:[b'A`', b'\x00\x00']

提前致谢!

  1. How to shape my call so it matchs the call 01 03 00 00 00 06?

解码我们得到:

01 - 单位编号; 1个字节; 01
03——功能代码; 1个字节; 0x03 = 读取保持寄存器
00 00 - 起始地址; 2 字节(大端);地址 0
00 06 - 寄存器数量; 2 字节(大端); 6 的长度

这意味着以上是对单元 ID 1 的请求 'Read Holding Registers' (3) 从寄存器 0 开始返回六个寄存器。

要使用 pymodbus 复制它,您可以使用 client.read_holding_registers(0, 6, unit=1)

  1. Why when i do the call 01 03 00 00 00 06 i get all the answers (year to seconds) shouldn't i just get seconds? (thinking that the 30006 in the pdf stands for the call itself 03 00 00 00 06)

如上所述,请求是六个寄存器(所以这包括全时)。

  1. How can i log the DEBUG that i get when doing the call? i am doing this in a raspberry and i am not sure that i would be able to see the call like i do on jupyter

从您的示例来看,您似乎已经在生成调试信息。由于 modbus 是 standard,当使用像样的库为您处理时,您通常不需要查看 sent/received 的字节。