首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在PYMODBUS (Modicon?)

如何在PYMODBUS (Modicon?)
EN

Stack Overflow用户
提问于 2020-01-30 23:55:37
回答 1查看 53关注 0票数 0

我正在与一个太阳能逆变器的权利知道(IngeTeam3Play)的串行战斗,我是通过TCP / IP连接。

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

我确信01是ID 03意味着持有登记册,那么我如何塑造其余的(00000006)??这是代码:

代码语言:javascript
运行
复制
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 03000000006相匹配?
  2. 为什么当我打电话03030000000006时,我得到了所有的答案(从一年到秒),难道我不应该得到秒吗?(认为pdf中的30006代表呼叫本身03000000006)
  3. 如何记录调用时得到的调试?我正在用树莓做这件事,我不确定我是否能像在朱庇特上一样看到这个电话。

示例

代码语言:javascript
运行
复制
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']

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-31 02:14:31

  1. 如何使我的电话与呼叫01 03000000006相匹配?

解码这个我们得到:

01 -单元ID;1 Byte;01

函数代码;1字节;0x03 =读持有寄存器

00 -起始地址;2位字节(大端);地址0

0006-登记数量;2字节(大端);长度为6

这意味着以上是对单元ID 1的请求,从寄存器0开始,返回6个寄存器。

若要使用pymodbus复制此操作,请使用client.read_holding_registers(0, 6, unit=1)

  1. 为什么当我打电话03030000000006时,我得到了所有的答案(从一年到秒),难道我不应该得到秒吗?(认为pdf中的30006代表呼叫本身03000000006)

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

  1. 如何记录调用时得到的调试?我正在用树莓做这件事,我不确定我是否能像在朱庇特上一样看到这个电话。

从您的示例来看,您似乎已经在生成调试信息了。由于modbus是一个标准,所以在使用一个像样的库为您处理这个问题时,通常不需要查看正在发送/接收的字节。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59996222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档