- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个设置,2 个 SDM120 kWh 电能表以菊花链方式连接在同一个串行端口上(将来我想添加一个 SDM630)。我在 MinimalModbus 通信中找到了“Using multiple instruments”。我成功读取了地址 1 上 SDM120 上的寄存器,但在读取地址 2 时出错。错误:minimalmodbus.NoResponseError: No communication with the instrument (no answer)
。
我可以通过添加 time.sleep(0.1)
来解决这个问题,但我认为 RS485 允许在第一个地址完成后立即读取第二个地址的寄存器。我也尝试过较低的值,但是例如。 time.sleep(0.01)
也给出了一个 NoResponseError
。
我个人认为设置 instrument.serial.timeout = 1
已经达到了预期的效果,但显然我真的需要 time.sleep
。 time.sleep(0.1) 是正确的做法吗?如果是这样:我怎么知道最低值,这样我就没有 NoResponseError
?反复试验?我的脚本可以优化吗?特别是当时间很重要时,例如。避免注入(inject)电网(光伏分流器,...)。提前致谢!
脚本:
#!/usr/bin/env python3
import minimalmodbus
import time
instrumentA = minimalmodbus.Instrument('/dev/ttyUSB0', 1, debug = True) # port name, slave address (in decimal)
instrumentA.serial.baudrate = 9600
instrumentA.serial.timeout = 1 # seconds
instrumentA.serial.bytesize = 8
instrumentA.serial.parity = minimalmodbus.serial.PARITY_NONE
instrumentA.serial.stopbits = 1
instrumentA.mode = minimalmodbus.MODE_RTU
instrumentB = minimalmodbus.Instrument('/dev/ttyUSB0', 2, debug = True)
instrumentB.mode = minimalmodbus.MODE_RTU
print ("====== SDM120 instrumentA on addres 1 ======")
print (instrumentA)
P = instrumentA.read_float(12, 4, 2)
print ("Active Power in Watts:", P)
#time.sleep(0.1) #workaround to avoid NoResponseError
print ("====== SDM120 instrumentB on addres 2 ======")
print (instrumentB)
P = instrumentB.read_float(12, 4, 2)
print ("Active Power in Watts:", P)
没有 time.sleep(0.1)
的输出:
MinimalModbus debug mode. Create serial port /dev/ttyUSB0
MinimalModbus debug mode. Serial port /dev/ttyUSB0 already exists
====== SDM120 instrumentA on addres 1 ======
minimalmodbus.Instrument<id=0x7f36e3dc0df0, address=1, mode=rtu, close_port_after_each_call=False, precalculate_read_size=True, clear_buffers_before_each_transaction=True, handle_local_echo=False, debug=True, serial=Serial<id=0x7f36e3dd90d0, open=True>(port='/dev/ttyUSB0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=False, dsrdtr=False)>
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '\x01\x04\x00\x0c\x00\x02±È' (01 04 00 0C 00 02 B1 C8)
MinimalModbus debug mode. Clearing serial buffers for port /dev/ttyUSB0
MinimalModbus debug mode. No sleep required before write. Time since previous read: 190954.73 ms, minimum silent period: 4.01 ms.
MinimalModbus debug mode. Response from instrument: '\x01\x04\x04\x00\x00\x00\x00û\x84' (01 04 04 00 00 00 00 FB 84) (9 bytes), roundtrip time: 53.3 ms. Timeout for reading: 1000.0 ms.
Active Power in Watts: 0.0
====== SDM120 instrumentB on addres 2 ======
minimalmodbus.Instrument<id=0x7f36e3c55940, address=2, mode=rtu, close_port_after_each_call=False, precalculate_read_size=True, clear_buffers_before_each_transaction=True, handle_local_echo=False, debug=True, serial=Serial<id=0x7f36e3dd90d0, open=True>(port='/dev/ttyUSB0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=False, dsrdtr=False)>
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '\x02\x04\x00\x0c\x00\x02±û' (02 04 00 0C 00 02 B1 FB)
MinimalModbus debug mode. Clearing serial buffers for port /dev/ttyUSB0
MinimalModbus debug mode. Sleeping 2.31 ms before sending. Minimum silent period: 4.01 ms, time since read: 1.70 ms.
MinimalModbus debug mode. Response from instrument: '' () (0 bytes), roundtrip time: 1001.3 ms. Timeout for reading: 1000.0 ms.
Traceback (most recent call last):
File "./sdm120-daisychain_v3.py", line 25, in <module>
P = instrumentB.read_float(12, 4, 2)
File "/home/mattias/.local/lib/python3.8/site-packages/minimalmodbus.py", line 662, in read_float
return self._generic_command(
File "/home/mattias/.local/lib/python3.8/site-packages/minimalmodbus.py", line 1170, in _generic_command
payload_from_slave = self._perform_command(functioncode, payload_to_slave)
File "/home/mattias/.local/lib/python3.8/site-packages/minimalmodbus.py", line 1240, in _perform_command
response = self._communicate(request, number_of_bytes_to_read)
File "/home/mattias/.local/lib/python3.8/site-packages/minimalmodbus.py", line 1406, in _communicate
raise NoResponseError("No communication with the instrument (no answer)")
minimalmodbus.NoResponseError: No communication with the instrument (no answer)
time.sleep(0.1)
的输出:
MinimalModbus debug mode. Create serial port /dev/ttyUSB0
MinimalModbus debug mode. Serial port /dev/ttyUSB0 already exists
====== SDM120 instrumentA on addres 1 ======
minimalmodbus.Instrument<id=0x7f91feddcdf0, address=1, mode=rtu, close_port_after_each_call=False, precalculate_read_size=True, clear_buffers_before_each_transaction=True, handle_local_echo=False, debug=True, serial=Serial<id=0x7f91fedf50d0, open=True>(port='/dev/ttyUSB0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=False, dsrdtr=False)>
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '\x01\x04\x00\x0c\x00\x02±È' (01 04 00 0C 00 02 B1 C8)
MinimalModbus debug mode. Clearing serial buffers for port /dev/ttyUSB0
MinimalModbus debug mode. No sleep required before write. Time since previous read: 176619.62 ms, minimum silent period: 4.01 ms.
MinimalModbus debug mode. Response from instrument: '\x01\x04\x04\x00\x00\x00\x00û\x84' (01 04 04 00 00 00 00 FB 84) (9 bytes), roundtrip time: 53.3 ms. Timeout for reading: 1000.0 ms.
Active Power in Watts: 0.0
====== SDM120 instrumentB on addres 2 ======
minimalmodbus.Instrument<id=0x7f91fec70940, address=2, mode=rtu, close_port_after_each_call=False, precalculate_read_size=True, clear_buffers_before_each_transaction=True, handle_local_echo=False, debug=True, serial=Serial<id=0x7f91fedf50d0, open=True>(port='/dev/ttyUSB0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=1, xonxoff=False, rtscts=False, dsrdtr=False)>
MinimalModbus debug mode. Will write to instrument (expecting 9 bytes back): '\x02\x04\x00\x0c\x00\x02±û' (02 04 00 0C 00 02 B1 FB)
MinimalModbus debug mode. Clearing serial buffers for port /dev/ttyUSB0
MinimalModbus debug mode. No sleep required before write. Time since previous read: 102.09 ms, minimum silent period: 4.01 ms.
MinimalModbus debug mode. Response from instrument: '\x02\x04\x04\x00\x00\x00\x00È\x84' (02 04 04 00 00 00 00 C8 84) (9 bytes), roundtrip time: 52.8 ms. Timeout for reading: 1000.0 ms.
Active Power in Watts: 0.0
最佳答案
您的代码或您使用的库(minimalmodbus)似乎没有任何问题。
您可能知道,Modbus 在半双工链路上以查询-响应模式工作。用简单的英语来说:您首先发送一个查询,该查询的设备会根据您所请求的数据进行寻址。
事务的两个部分(查询和响应)通过同一条总线传输。但总线是共享介质,任何时候都只允许一个设备控制总线(通话)。
当你有一个主机和一个或多个从机时,只要你保证在任何设备写入总线后有一个短暂的静默期,这个过程就不会出现问题。 Modbus 规范将该值确定为 3.5 个字符(以您使用的波特率在总线上串行发送 3 个半字符所需的时间)。
不幸的是,有些制造商并不遵守这条规则。因此,其中一些设备仅需要超过 3.5 个字符的时间来释放对总线的控制。
至少您的其中一台设备似乎是这种情况。 This manual可以给你一些线索:
我敢打赌,在您的两台设备中,其中一台释放总线所需的时间明显少于另一台,但您必须通过调试细节来确认这一点。如果您查询 20 或 40 个寄存器而不是 4 或 8 个,设备甚至可能需要更长的时间来释放总线...
你能做什么?好吧,从设备方面来说,不多,就是这样。在您的软件上,您可以做很多不同的事情。正如我在上面的评论中所说,考虑到 minimalmodbus 试图解决总线争用问题的方式,您不应该对使用 time.sleep()
感到难过。
为了使您的代码更健壮,您可以添加 try: ... except:
。 documentation 中解释了这种方法.您可以在循环中多次重试读取,或者向 except
block 添加一个小的延迟。也许是什么 like this .
关于modbus - Minimalmodbus:在同一个串口上读取多个从机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67053317/
将 MODBUS 安装与 Home Assistant 集成 Gavazzi 中的 MODBUS Controller SH2WEB24 Home Assistant Configuration.ya
我正在使用 ModBus RTU,并且我正在尝试弄清楚如何计算 CRC16。 我不需要代码示例。我只是对机制很好奇。 我了解到基本的 CRC 是数据字的多项式除法,根据多项式的长度,用零填充。 下面的
如何通过广播机制获取有效ip范围后判断接入网络的设备是否为modbus设备或如何自动发现接入网关的modbus设备的slave id? 最佳答案 在 Modbus TCP 的上下文中,slaveId
我正在尝试使用 Modbus 协议(protocol)对 Socomec 仪表执行 ping 操作,经过研究,我发现了 NModbus,这是一个 C# 库。我之前从未使用过库或 C#(通常是 Java
我以前从未使用过 modbus。 我有一个 eBox-Wifi Epever 连接到用于太阳能的 MPPT 充电 Controller TRIRON。 我能够让它连接到我的 wifi,现在有了一个可访
我正在开发的设备必须支持 CANopen 和 Modbus(RTU 和 TCP)通信。是否有任何格式的电子数据表(例如 EDS 或 XDD)可用于定义两者? 我尝试使用几种工具(Vector CANe
https://code.google.com/p/stm32modbus/source/browse/#svn%2Ftrunk%2F%20stm32modbus%20--username%20ick
我对 Modbus 通信有点陌生,我已经开始阅读“免费 Modbus”库。现在,我了解了如何使用它来实现 Modbus 通信的从站端,但我似乎无法找到如何在主站端使用该库。例如,我在主机端调用什么函数
我对 Modbus 通信有点陌生,我已经开始阅读“免费 Modbus”库。现在,我了解了如何使用它来实现 Modbus 通信的从站端,但我似乎无法找到如何在主站端使用该库。例如,我在主机端调用什么函数
我们正在构建一个产品,它需要 modbus 通信(rs-485 和 TCP/IP)。代码必须在运行 Linux 的嵌入式设备上运行。我们有以下标准来选择我们将使用的库。 它必须是开源的,因为我们是开源
I am trying to read and write data to modbus via TCP/IP. I can connect to modbus simulator succes
我正在尝试创建一个 modbus 主从模型。我已经使用 pymodbus 编写了 modbus slave,而 modbus master 使用的是 c libmodbus。 Slave 有一堆寄存器
我正在使用 modbus-tk 通过 RS-485 网络通过 Modbus RTU 与设备进行串行通信。 我正在尝试弄清楚如何使用函数 23,READ_WRITE_MULTIPLE_REGISTERS
我有一个支持 ModBus 协议(protocol)的设备,使用“Jamod”尝试连接到该设备并读取寄存器值,收到错误代码 2, 单位配置: 该装置支持通过 RS-485 和以太网接口(interfa
我有一个设置,2 个 SDM120 kWh 电能表以菊花链方式连接在同一个串行端口上(将来我想添加一个 SDM630)。我在 MinimalModbus 通信中找到了“Using multiple i
我正在为一个嵌入式系统玩弄 Modbus(我以前从未处理过这个问题)并且我知道 Modbus 从设备接收到一个范围为 1-247 的地址,但是 Modbus 主设备是否也接收到一个 ID? 如果是这样
我正在寻找一个好的专业 modbus 嗅探器工具来扫描主从通信。请问有人知道吗? 问候 达尼 最佳答案 您可以使用 Wireshark .优秀的工具。支持 Modbus TCP。 关于需要 Modbu
我必须控制带有串行接口(interface)的 modbus 设备。我没有使用 modbus 的经验。但我的简短研究揭示了几个 modbus 库 pymodbus MinimalModbus Modb
要求:通过 Modbus 从 Serial port-1 收集数据,在 Serial port-2 上进行镜像。 我可以在主从之间进行通信,但无法将数据镜像到串行端口 2。请建议我如何实现这一点。 代
我在 MODBUS 项目中工作了 2 个月,现在我发现了一个问题。 我的客户要求我写入一个输入寄存器(地址 30001 到 40000)。 我认为这对我来说不是问题,因为每个 modbus 文档都说
我是一名优秀的程序员,十分优秀!