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

Posted

技术标签:

【中文标题】如何在 PYMODBUS(Modicon?)中塑造一个 CALL【英文标题】:How to shape a CALL in PYMODBUS (Modicon?) 【发布时间】:2020-05-16 16:05:40 【问题描述】:

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

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

我确定 01 是 ID 03 表示持有寄存器,那么我如何塑造其余部分(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?

总结问题:

    如何调整我的通话,使其与通话 01 03 00 00 00 06 匹配? 为什么当我拨打电话 01 03 00 00 00 06 时,我得到了所有答案(从年到秒),我不应该只得到秒吗? (认为​​ pdf 中的 30006 代表调用本身 03 00 00 00 06) 如何记录我在调用时得到的调试信息?我在覆盆子里做这个,我不确定我是否能像在 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】:
    如何调整我的通话,使其与通话 01 03 00 00 00 06 匹配?

解码我们得到:

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

这意味着上面是对单元 ID 1 的请求,以“读取保持寄存器”(3) 从寄存器 0 开始返回六个寄存器。

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

    为什么当我拨打电话 01 03 00 00 00 06 时,我得到了所有答案(从年到秒),我不应该只得到秒吗? (认为 pdf 中的 30006 代表调用本身 03 00 00 00 06)

如上所述,请求是针对六个寄存器的(因此这包括全职)。

    如何记录我在调用时得到的调试信息?我在覆盆子里做这个,我不确定我能不能看到 像我在 jupyter 上一样打电话

从您的示例看来,您已经在生成调试信息。由于 modbus 是 standard,因此在使用体面的库为您处理此问题时,您通常不需要查看发送/接收的字节数。

【讨论】:

谢谢各位!我可以再问你一个问题吗?我解码文档(PDF)的方式可以吗?例如这是输出有功功率: 起始地址:37 | MB Modicon 地址:30038 |显示顺序:16 要从逆变器调用这个值,代码应该是client.read_holding_registers(0, 38, unit=1) 这很奇怪,我今天要测试一下。 它确实记录了 TY 老兄我不需要更多帮助的 38 件事!

以上是关于如何在 PYMODBUS(Modicon?)中塑造一个 CALL的主要内容,如果未能解决你的问题,请参考以下文章

如何停止pymodbus异步ModbusTcpServer?

如何使用 pymodbus TCP 库获取浮点值?

Pymodbus:如何读取该输入寄存器的各个位?

pymodbus“单位”参数是啥意思?

Pymodbus 读取和解码寄存器值

Pymodbus TCP `read_holding_registers` 返回陈旧/旧数据