- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从Modbus TCP读取字符串
(Usecase-1)和一个请求中的多种类型的数据
(Usecase-2)数据 em> 设备,但是无法正确解码。
系统配置:
Python 3.6.5
Pymodbus: 2.1.0
Platform: Windows 10 64-bit
Modbus TCP 服务器:
import logging
from pymodbus.constants import Endian
from pymodbus.datastore import ModbusSequentialDataBlock
from pymodbus.datastore import ModbusSlaveContext, ModbusServerContext
from pymodbus.device import ModbusDeviceIdentification
from pymodbus.payload import BinaryPayloadBuilder
from pymodbus.server.sync import StartTcpServer
class ModbusTCPServer(object):
# initialize your data store:
hrBuilder = BinaryPayloadBuilder(byteorder=Endian.Big, wordorder=Endian.Big)
# Usecase-1
hrBuilder.add_string("abcdefghij")
#Uncomment below three lines for usecase-2
# hrBuilder.add_32bit_float(20.5)
# hrBuilder.add_32bit_int(45)
# hrBuilder.add_bits([1, 0, 0, 0, 0, 0, 0, 0])
hrBlock = ModbusSequentialDataBlock(0, hrBuilder.to_registers() * 100)
store = ModbusSlaveContext(hr=hrBlock, ir=hrBlock, di=hrBlock, co=hrBlock)
slaves = {
1: store,
}
context = ModbusServerContext(slaves=slaves, single=False)
# initialize the server information
identity = ModbusDeviceIdentification()
modbusDeviceAddress = "127.0.0.1"
modbusDevicePort = 501
# run the TCP server
# TCP:
print("Modbus TCP Server started.")
StartTcpServer(context, identity=identity, address=(modbusDeviceAddress, modbusDevicePort))
if __name__ == "__main__":
print("Reading application configurations...")
ModbusTCPServer();
Modbus TCP 客户端:
from pymodbus.client.sync import ModbusTcpClient as ModbusClient
from pymodbus.payload import BinaryPayloadDecoder
from pymodbus.constants import Endian
from pymodbus.compat import iteritems
if __name__ == '__main__':
client = ModbusClient('127.0.0.1', port=501)
client.connect()
result = client.read_holding_registers(0, 5, unit=1)
print("Result : ",result)
decoder = BinaryPayloadDecoder.fromRegisters(result.registers, byteorder=Endian.Big, wordorder=Endian.Big)
# Usecase-1
decoded = {
'name': decoder.decode_string(10).decode(),
}
# Usecase-2
# decoded = {
# 'temp': decoder.decode_32bit_float(),
# 'rpm': decoder.decode_32bit_int(),
# 'status': decoder.decode_bits()
#}
for name, value in iteritems(decoded):
print ("%s\t" % name, value)
client.close()
输出用例 1:
Result : ReadRegisterResponse (5)
name cdefghijab
Modbus 客户端应将字符串解码为 abcdefghij
,但是,它会将其解码为 cdefghijab
。
输出用例2:
Result : ReadRegisterResponse (5)
temp 0.0
rpm 2949376
status [True, False, False, False, False, False, True, False]
查看上面读取多个寄存器的输出,输出值与 BinaryPayloadBuilder
输入中给出的值不匹配。
我已经尝试了byteorder
和wordorder
的所有组合,但是,它不适用于任何情况。
请帮助我理解为什么数据会这样解码?我在编码或解码此数据时是否遗漏了一些要添加的内容?
仅供引用:此解决方案在 Pymodbus 1.5.1
版本上运行良好。最近我升级了版本,但未能按预期工作。
如有任何帮助,我们将不胜感激。
最佳答案
Tl;博士。在 ModbusSlaveContext
中使用 zero_mode=True
。
如果您想将客户端读取的寄存器[0..n]
映射到服务器中的[0..n]
。默认情况下,pymodbus 服务器将地址 [0..n]
的寄存器读取映射到其内部存储中的寄存器 [1..n]
。这是为了遵守 modbus 规范。引用自pymodbus源码。
#The slave context can also be initialized in zero_mode which means that a
# request to address(0-7) will map to the address (0-7). The default is
# False which is based on section 4.4 of the specification, so address(0-7)
# will map to (1-8)::
因此,在您的情况下,您可以将 ModbusSequentialDataBlock
的起始地址设置为 1
或使用 zero_mode=True 初始化
.ModbusSlaveContext
hrBlock = ModbusSequentialDataBlock(1, hrBuilder.to_registers() * 100)
# Or
store = ModbusSlaveContext(hr=hrBlock, ir=hrBlock, di=hrBlock, co=hrBlock, zero_mode=True)
关于python - pymodbus:从 Modbus 设备读取字符串和多种类型的数据时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54709624/
我遇到以下问题。我想读取一个包含数百万行和数百列的大型 csv。我想向下转换列的数据类型。我的方法是读取 csv,然后使用 pd.to_numeric() 对其进行向下转换。我不知道列数及其类型。在读
目前,我从 SQL server (2008) 数据库获取数据。 cyurrent的方法是使用DataTable,然后将其传递并使用。 if (parameters != null)
我有以下问题。我有一个巨大的 csv 文件,想用多处理加载它。对于一个包含 500000 行和 130 列不同数据类型的示例文件,Pandas 需要 19 秒。我试过 dask 因为我想多处理阅读。但
是否有关于用于序列化各种 MFC 数据结构的二进制格式的明确文档?我已经能够在十六进制编辑器中查看我自己的一些类,并使用 Java 的 ByteBuffer 类读取它们(使用自动字节顺序转换等)。 但
我正在使用 Selenium 进行测试,我们用 HTML 文件编写测试用例,并用它们制作测试套件,我们的要求是编写足够健壮的测试用例,以根据测试环境改变自身。 为此,我不希望在 HTML 脚本本身中包
我需要一个 JavaScript 代码来读取存储为 .txt 文件的字典(或者也可以保存为任何其他类型的文件。它也可以在线获得)并将其内容存储在一个变量中。我不能找到一种让 JavaScript 像
我正在尝试遍历包含 SSH 登录和其他日志的日志文本文件。 程序正在返回 SSH 登录的总数。 我的解决方案确实有效,但似乎有点慢(在 200mo 文件上大约需要 3.5 秒)。我想知道是否有任何方法
我正在将大量数据从一个电子表格复制到工作簿中的其他 160 个电子表格。目前,Excel (2013) 遇到错误,因为它没有足够的资源来完成操作。 我的目标是将工作表 4 中 V13:XI1150 范
我正在尝试读取一个有 1147 行的文本文件。下面的代码仅读取第 1050-1147 行。我的目标是读取整个文件并提取位于不同行的特定值以在脚本中使用。一个示例是包含“BlockList: 2”的行中
我正在为游戏编写解释器。用户将其移动输入解释器,程序执行该移动。 现在我想为每个决定实现一个时间限制。玩家不应该能够思考超过 30 秒来写一个移动并按下回车。 call_with_time_limit
以this file例如,我正在尝试读取 data.frame 中的数据。来自 the doc (pdf 文件,表 1),它遵循一些 fortran 约定。我尝试了以下但收效甚微: dir 0' 将
我正在使用 R 阅读 Outlook 附件。我的引用在这里:Download attachment from an outlook email using R 这是我的电子邮件的截图: 这每天都会发送
我不会从表格中读取行来将主题放在列表中 php脚本 $url_obj='http://'.$host.':8069/xmlrpc/object'; $sock=new xmlrpc_client($u
我有一个这样的 csv 文件: id,name,value 1,peter,5 2,peter\,paul,3 我如何读取此文件并告诉 R "\," 不表示新列,仅表示 ","。 我必须添加该文件
我正在尝试读取 ~/Library/Preferences/com.apple.mail.plist (在 Snow Leopard 上)以获取电子邮件地址和其他信息以进入“关于”对话框。我使用以下代
This question already has answers here: How do I use floating-point division in bash? (19个回答) 5个月前关闭
本练习的目标是读取输入文件并将其存储到表中,然后验证输入中的某些字段并输出任何错误记录。我需要读取并存储每个策略组,以便表中一次仅存储 5 条记录,而不是整个文件。 所以我需要读取一个包含 5 条记录
据我了解,LWT 插入始终以 SERIAL 一致性级别完成。如果为 true,这是否意味着读取作为 LWT 插入的行可以安全地以 ANY 的一致性级别读取? 换句话说,我假设 LWT 插入是完全一致的
我看到很多很多通过java脚本读取cookie的函数,但我只想在变量中使用它一次,我是JS新手。 这是我的代码 var TheNumber = (Math.random() + '') * 10000
我正在使用 asp.net 和 C#。我在服务器上部署了一个应用程序[已发布],现在我想查看该网站的代码,据我所知,我可以阅读程序集来查看代码。 请告诉我如何实现它。 提前致谢。 最佳答案 您可以使用
我是一名优秀的程序员,十分优秀!