一个无I/O的Python实现,用于Highway Addressable Remote Transducer Protocol(高速公路可寻址远程传感器协议)。
项目描述
hart-protocol
这是一个无I/O的Python实现,用于Highway Adressable Remote Transducer Protocol。
介绍
这个Python包包含用于与HART外围设备通信的编码和解码字节串的工具。HART已通过多种传输层实现,如Bell 202、RS485、以太网等。为了追求简单性和可重用性,此包不包含任何接口功能。使用类似于pySerial的传输。阅读sans I/O宣言以获取更多关于此设计模式的相关动机。
简要来说,HART是一种由多个设备制造商支持的开放式工业自动化协议。HART有“地址”的概念,这样许多外围设备可以共享相同的通信通道。HART对多个控制器的支持有限,存在通用的手持式控制器。HART外围设备响应编号命令,可以将其视为原始的远程过程调用。标准指定了应由任何外围设备支持的多个通用命令,还有所谓的“通用”命令,许多外围设备都实现了这些命令。强烈建议您检查您自己的外围设备文档——实现可能不一致。除了通用和通用命令外,您的外围设备可能还实现了许多特定于设备的命令。
本包旨在提供对所有通用和通用命令的完整和准确支持。此外,本包还提供打包和提取特定于设备命令的通用命令数据的工具。本包故意设计得简单且范围狭窄。除README之外,没有其他文档。如果您发现任何错误或缺失的功能,请向GitHub仓库提交问题或PR。
发送命令
以下函数返回字节数组,可以将其馈送到您的传输层。
通用命令
command | function |
---|---|
0 | read_unique_identifier(address) |
1 | read_primary_variable(address) |
2 | read_loop_current_and_percent(address) |
3 | read_dynamic_variables_and_loop_current(address) |
6 | write_polling_address(address, new_short_address) |
11 | read_unique_identifier_associated_with_tag(tag) |
12 | read_message(address) |
13 | read_tag_descriptor_date(address) |
14 | read_primary_variable_information(address) |
15 | read_output_information(address) |
16 | read_final_assembly_number(address) |
17 | write_message(address, message) |
18 | write_tag_descriptor_date(address, tag, descriptor, date) |
19 | write_final_assembly_number(address, number) |
常用实践命令
command | function |
---|---|
37 | set_primary_variable_lower_range_value(address, value) |
38 | reset_configuration_changed_flag(address) |
42 | perform_master_reset(address) |
48 | read_additional_transmitter_status(address) |
50 | read_dynamic_variable_assignments(address) |
59 | write_number_of_response_preambles(address, number) |
66 | toggle_analog_output_mode(address) |
67 | trim_analog_output_zero(address) |
68 | trim_analog_output_span(address) |
123 | select_baud_rate(address, rate) |
以下方式可以生成任意的附加命令字节数组。这是一个针对Brooks GF40质量流量计的特定于设备的命令,它接受一个IEEE-754浮点数以及一个唯一代码。
import struct
import hart_protocol
code = 0
value = 32.1
data = struct.pack(">Bf", code, value)
command = hart_protocol.pack_command(address=123, command_id=236, data=data)
解析响应
所有响应都解析为命名元组。每个单独的响应都将具有以下键。
通用响应
key | value |
---|---|
address |
<int> |
bytecount |
<int> |
command |
<int> |
command_name |
<str> |
data |
<bytes> |
full_response |
<bytes> |
device_status |
<bytes> |
response_code |
<bytes> |
您可以根据外围设备的具体情况解析原始的data
。某些标准响应的解析如下所示。
响应 0
key | value |
---|---|
command_name |
"read_unique_identifier" |
command |
0 |
device_id |
<bytes> |
hardware_revision_level |
<int> |
manufacturer_device_type |
<bytes> |
manufacturer_id |
<int> |
number_response_preamble_charachters |
<int> |
software_revision_level |
<int> |
transmitter_specific_command_revision_level |
<int> |
universal_command_revision_level |
<int> |
响应 1
key | value |
---|---|
command_name |
"read_primary_variable" |
command |
1 |
primary_variable |
<float> |
响应 11
key | value |
---|---|
command_name |
"read_unique_identifier" |
command |
11 |
device_id |
<bytes> |
hardware_revision_level |
<int> |
manufacturer_device_type |
<bytes> |
manufacturer_id |
<int> |
number_response_preamble_charachters |
<int> |
software_revision_level |
<int> |
transmitter_specific_command_revision_level |
<int> |
universal_command_revision_level |
<int> |
许多其他通用和常用响应也进行了解析..., 尝试一下吧!
集成示例
>>> import hart_protocol
>>> import serial
>>>
>>> port = serial.Serial("/dev/ttyUSB0", 19200, timeout=0.1)
>>> port.parity = "O"
>>> port.stopbits = 1
>>> tag = hart_protocol.tools.pack_ascii("06C22300517"[-8:])
>>> port.write(hart_protocol.universal.read_unique_identifier_associated_with_tag(tag))
>>>
>>> unpacker = hart_protocol.Unpacker(port)
>>> for msg in unpacker:
... print(msg)
...
>>>
维护者
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。