问题标签 [pymodbus]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Pymodbus TCP `read_holding_registers` 返回陈旧/旧数据
我已经开始使用pymodbus
从 modbus 读取值以存储在异地数据库中。我一直在努力解决一个问题,即响应中收到的值与我在 Jace 上看到的值不同。
我也试过modbus-tk
了,我得到了同样的错误响应,所以它一定是我的 Python 代码中的某些东西导致了这个问题。从我们的遗留系统 (VB.Net) 检索到的读数与我在 Jace 上看到的输出相同。
这是从 modbus 检索数据的简单函数。我们有 2 个寄存器,40160
第40162
一个正在读取366
,这是正确的,第二个正在读取367
(这是我遇到问题的那个)。我也看到了与其他寄存器相同的问题,即使我可以在 Jace 上看到值增加了,读数也不会更新。
Pymodbus 调试日志
更新
在 Sanju 的帮助下,有人向我指出我使用的偏移量可能不正确。情况确实如此,通过将偏移量更改 1 (40162 - 40001 = 161) 我能够从寄存器中检索正确的值,wordorder
需要更改为Endian.Big
.
更新代码
python - 如何通过重新启动应用程序克服 ModbusTcpServer 中的“地址已在使用中”?
描述和代码:
我正在使用带pymodbus
库的同步 ModbusTcpServer 来创建 Modbus 从站/服务器,代码如下:
当客户端应用程序连接到此服务器并且我关闭此代码(使用Ctrl+ C)并再次运行时遇到此错误:
OSError: [Errno 98] Address already in use
我知道在创建套接字时我们可以用它socket.SO_REUSEADDR
来克服这个问题。
另外,我可以.close()
在客户端连接来解决这个问题,但我想要一个稳定的服务器。
问题:
有没有内置的方法来克服这个问题?socket.SO_REUSEADDR
我在异步 ModbusTcpServer (in ) 中找到了这个参数 ( ),async.py
但在 Synchronous ModbusTcpServer ( sync.py
) 中没有。
[注意]:
版本
- 蟒蛇:3.6.5
- 操作系统:Ubuntu 16.04
- Pymodbus:1.5.2
- Modbus 硬件(如果使用):否
Pymodbus 特定的
- 服务器:tcp - 同步
- 客户端:tcp - 同步
python - Python集中信息
我目前正在 Pyhton (Kivy) 做一些机器的开发,将安装在城市的各个地方,我希望机器的所有信息都集中并实时更新。
例子:
用户 X 在机器 1 上注册,5 分钟后他移动到机器 2,并可以使用他在机器 1 上提供的信息进入。
你推荐什么方法来进行这个开发?
python - 当 write_registers() 更通用(pyModbus)时,我应该使用 write_register() 吗?
我开始在 Python 3.7 中使用 pyModbus。在 pyModbus.client.sync.ModbusTcpClient 中有两种写法:
write_register() write_registers()
使用带有 1 个元素的寄存器列表的 write_register() 而不是 write_registers() 有什么好处吗?总是使用后者会简化我的代码,但我想我会检查一下。
python - 测试请求 Modbus TCP
我有一个问题,我通过 Modbus TCP 进行通信测试,每个请求大约需要 200 毫秒,是否可以改善这些时间?
这是我用于测试的代码:
python - 没有互联网连接时停止 python 脚本中止
我有一个在使用 Azure IOT SDK 的 revPi 上运行的 python 脚本。该脚本基本上接受来自 .json 文件的一堆 modbus 寄存器,添加一些属性并将其发送到 Azure IOT 中心进行分析。
该脚本目前过于依赖网络连接,并且由于基础设施限制,连接不可靠,并且经常导致脚本经常死机/中止。如何使脚本在这个糟糕的互联网连接上运行?使用的主要库是 pymodbus 和 iothub_client。
pymodbus3 - pyModBus : 检查线圈是真还是假
我正在尝试学习如何通过 python ModBus 模块向 PLC 引入值我目前正在尝试做的只是读取线圈 1 的值以检查它是真还是假 ,所以我正在使用
我得到这个作为响应ReadBitResponse(8)我怎样才能从读取线圈中获得“真”值
pyserial - 从十六进制 pyModBus 中删除尾随位
我想构建一个函数,将请求从 ModBus 发送到十六进制的串行。我或多或少有一个工作功能,但有两个问题。
第一期
我无法使用.split('\r \n')方法删除这部分 b'\r', b'\n' ,因为它不是字符串。
问题 2 从持有寄存器 40 (33) 获取值时,我尝试使用.to_bytes()方法,我不断得到 b'\x00!', b'\r' 并且我期待 b'\x21'
我的功能是生成我的请求并通过 pyserial 发送。
作为一个额外的问题,这是正确的做事方式吗?
python - pySerial 捕获长响应
大家好,我正在编写一个脚本,该脚本将使用数据通信标准(由视觉委员会的数据通信标准委员会镜头处理部门开发)通过串行端口从主机获取数据,并将数据传递到ModBus协议中设备来执行它的操作。
由于我在财务上无法访问主机,因此我正在尝试开发一个辅助脚本来模拟主机。我目前处于需要从串口读取大量信息的阶段,而我只获得了部分数据。我希望在我的主机模拟器脚本上的send_job()函数上发送整个字符串。
伙计们也可以告诉我这是否是一个好方法吗?机器唯一应该做的就是从主机响应中获取 2 个值并将它们分配给两个 modbus 保持寄存器。
注意:初始化函数是硬编码的,因为它总是相同的,除了状态之外,实际的响应数据无关紧要。此外,作业请求是硬编码的,我只传递从 modbus 保持寄存器获得的作业#,关于主机如何解决这个问题的确切逻辑并不重要,我只需要以这种格式发送从设备扫描的作业编号。
主脚本:
主机仿真脚本:
我在屏幕上看到的内容:主脚本
我在屏幕上看到的内容:主机仿真脚本
python - 使用python在modbus中读取响应消息
我正在尝试在 pymodbus 模块的帮助下使用 python 通过 modbus 发送查询并获取响应消息(数据)。
正在打印的响应是发送的请求消息和进程状态。我有兴趣阅读从从站发送的数据,而不是进程状态。你能帮我解决这个问题吗?