如何在 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的主要内容,如果未能解决你的问题,请参考以下文章