本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
modbus-RTU 协议适配器
Modbus-RTU 协议适配器组件 (aws.greengrass.Modbus
) 轮询来自本地 Modbus RTU 设备的信息。
要使用此组件从本地 Modbus RTU 设备请求信息,请向该组件订阅的主题发布一条消息。在消息中,指定要发送到设备的 Modbus RTU 请求。然后,该组件发布一个包含 Modbus RTU 请求结果的响应。
注意
该组件提供的功能与 V1 中的 Modbus RTU 协议适配器 Amazon IoT Greengrass 连接器类似。有关更多信息,请参阅《Amazon IoT Greengrass V1 开发人员指南》中的 Modbus RTU 协议适配器连接器。
版本
此组件有以下版本:
-
2.1.x
-
2.0.x
类型
此组件是一个 Lambda 组件 () aws.greengrass.lambda
。Greengrass 核心使用 Lambda 启动器组件运行此组件的 Lambda 函数。
有关更多信息,请参阅组件类型。
操作系统
此组件只能安装在 Linux 核心设备上。
要求
此组件具有以下要求:
-
您的核心设备必须满足运行 Lambda 函数的要求。如果您希望核心设备运行容器化的 Lambda 函数,则该设备必须满足要求。有关更多信息,请参阅Lambda 函数要求。
-
Python
版本 3.7 已安装在核心设备上,并已添加到 PATH 环境变量中。 -
Amazon IoT Greengrass 核心设备和 Modbus 设备之间的物理连接。核心设备必须通过串行端口(例如 USB 端口)与 Modbus RTU 网络进行物理连接。
-
要接收此组件的输出数据,在部署此组件时,必须合并旧版订阅路由器组件 (
aws.greengrass.LegacySubscriptionRouter
) 的以下配置更新。此配置指定此组件发布响应的主题。有关更多信息,请参阅创建部署。
-
支持 Modbus-RTU 协议适配器在 VPC 中运行。
依赖项
部署组件时, Amazon IoT Greengrass 还会部署其依赖项的兼容版本。这意味着您必须满足组件及其所有依赖项的要求才能成功部署该组件。本节列出了此组件已发布版本的依赖关系以及定义每个依赖项的组件版本的语义版本限制。您还可以在Amazon IoT Greengrass 控制台
有关组件依赖关系的更多信息,请参阅组件配方参考。
配置
此组件提供以下配置参数,您可以在部署该组件时对其进行自定义。
注意
此组件的默认配置包括 Lambda 函数参数。我们建议您仅编辑以下参数,以便在您的设备上配置此组件。
输入数据
该组件接受以下主题上的 Modbus RTU 请求参数,并向设备发送 Modbus RTU 请求。默认情况下,此组件订阅本地发布/订阅消息。有关如何从您的自定义组件向该组件发布消息的更多信息,请参阅发布/订阅本地消息。
默认主题(本地发布/订阅):modbus/adapter/request
该消息接受以下属性。输入消息必须采用 JSON 格式。
request
-
要发送的 Modbus RTU 请求的参数。
请求消息的形状取决于它所代表的 Modbus RTU 请求的类型。所有请求都需要以下属性。
类型:其中
object
包含以下信息:operation
-
要运行的操作的名称。例如,指定在
ReadCoilsRequest
Modbus RTU 设备上读取线圈。有关支持的操作的更多信息,请参阅Modbus RTU 请求和响应。类型:
string
device
-
请求的目标设备。
此值必须是介于
0
和之间的整数247
。类型:
integer
要包含在请求中的其他参数取决于操作。此组件处理循环冗余校验 (CRC)
,以验证您的数据请求。 注意
如果您请求包含
address
属性,则必须将其值指定为整数。例如,"address": 1
。 id
-
请求的任意 ID。使用此属性将输入请求映射到输出响应。指定此属性时,组件会将响应对象中的
id
属性设置为该值。类型:
string
例 示例输入:读取线圈请求
{ "request": { "operation": "ReadCoilsRequest", "device": 1, "address": 1, "count": 1 }, "id": "MyRequest" }
输出数据
默认情况下,此组件将响应作为以下 MQTT 主题的输出数据发布。您必须在传统订阅路由器组件的配置subject
中将此主题指定为。有关如何在自定义组件中订阅有关此主题的消息的更多信息,请参阅发布/订阅 Amazon IoT Core MQTT 消息。
默认主题 (Amazon IoT Core MQTT):modbus/adapter/response
响应消息的形状取决于请求操作和响应状态。有关示例,请参阅示例请求和响应。
每个响应均包括以下属性:
response
-
来自 Modbus RTU 设备的响应。
类型:其中
object
包含以下信息:status
-
请求的状态。状态可以是以下值之一:
operation
-
组件请求的操作。
device
-
组件发送请求的设备。
payload
-
来自 Modbus RTU 设备的响应。如果
status
是No Response
,则此对象仅包含带有错误描述的error
属性(例如[Input/Output] No Response received from the remote unit
)。
id
-
请求的 ID,您可以使用它来识别哪个响应与哪个请求相对应。
注意
写入操作的响应只不过是对请求的回显。尽管写入响应不包含有意义的信息,但最好检查响应的状态以查看请求是成功还是失败。
例 示例输出:成功
{ "response" : { "status" : "success", "device": 1, "operation": "ReadCoilsRequest", "payload": { "function_code": 1, "bits": [1] } }, "id" : "MyRequest" }
例 示例输出:失败
{ "response" : { "status" : "fail", "error_message": "Internal Error", "error": "Exception", "device": 1, "operation": "ReadCoilsRequest", "payload": { "function_code": 129, "exception_code": 2 } }, "id" : "MyRequest" }
有关更多示例,请参阅示例请求和响应。
Modbus RTU 请求和响应
此连接器接受 Modbus RTU 请求参数作为输入数据,并发布响应作为输出数据。
支持以下常见操作。
请求中的操作名称 | 响应中的函数代码 |
---|---|
ReadCoilsRequest | 01 |
ReadDiscreteInputsRequest | 02 |
ReadHoldingRegistersRequest | 03 |
ReadInputRegistersRequest | 04 |
WriteSingleCoilRequest | 05 |
WriteSingleRegisterRequest | 06 |
WriteMultipleCoilsRequest | 15 |
WriteMultipleRegistersRequest | 16 |
MaskWriteRegisterRequest | 22 |
ReadWriteMultipleRegistersRequest | 23 |
以下是受支持操作的示例请求和响应。
- 读取线圈
-
请求示例:
{ "request": { "operation": "ReadCoilsRequest", "device": 1, "address": 1, "count": 1 }, "id": "TestRequest" }
响应示例:
{ "response": { "status": "success", "device": 1, "operation": "ReadCoilsRequest", "payload": { "function_code": 1, "bits": [1] } }, "id" : "TestRequest" }
- 读取离散输入
-
请求示例:
{ "request": { "operation": "ReadDiscreteInputsRequest", "device": 1, "address": 1, "count": 1 }, "id": "TestRequest" }
响应示例:
{ "response": { "status": "success", "device": 1, "operation": "ReadDiscreteInputsRequest", "payload": { "function_code": 2, "bits": [1] } }, "id" : "TestRequest" }
- 读取持仓寄存器
-
请求示例:
{ "request": { "operation": "ReadHoldingRegistersRequest", "device": 1, "address": 1, "count": 1 }, "id": "TestRequest" }
响应示例:
{ "response": { "status": "success", "device": 1, "operation": "ReadHoldingRegistersRequest", "payload": { "function_code": 3, "registers": [20,30] } }, "id" : "TestRequest" }
- 读取输入寄存器
-
请求示例:
{ "request": { "operation": "ReadInputRegistersRequest", "device": 1, "address": 1, "count": 1 }, "id": "TestRequest" }
- 写单线圈
-
请求示例:
{ "request": { "operation": "WriteSingleCoilRequest", "device": 1, "address": 1, "value": 1 }, "id": "TestRequest" }
响应示例:
{ "response": { "status": "success", "device": 1, "operation": "WriteSingleCoilRequest", "payload": { "function_code": 5, "address": 1, "value": true } }, "id" : "TestRequest" }
- 写入单个寄存器
-
请求示例:
{ "request": { "operation": "WriteSingleRegisterRequest", "device": 1, "address": 1, "value": 1 }, "id": "TestRequest" }
- 写入多个线圈
-
请求示例:
{ "request": { "operation": "WriteMultipleCoilsRequest", "device": 1, "address": 1, "values": [1,0,0,1] }, "id": "TestRequest" }
响应示例:
{ "response": { "status": "success", "device": 1, "operation": "WriteMultipleCoilsRequest", "payload": { "function_code": 15, "address": 1, "count": 4 } }, "id" : "TestRequest" }
- 写入多个寄存器
-
请求示例:
{ "request": { "operation": "WriteMultipleRegistersRequest", "device": 1, "address": 1, "values": [20,30,10] }, "id": "TestRequest" }
响应示例:
{ "response": { "status": "success", "device": 1, "operation": "WriteMultipleRegistersRequest", "payload": { "function_code": 23, "address": 1, "count": 3 } }, "id" : "TestRequest" }
- 掩码写入寄存器
-
请求示例:
{ "request": { "operation": "MaskWriteRegisterRequest", "device": 1, "address": 1, "and_mask": 175, "or_mask": 1 }, "id": "TestRequest" }
响应示例:
{ "response": { "status": "success", "device": 1, "operation": "MaskWriteRegisterRequest", "payload": { "function_code": 22, "and_mask": 0, "or_mask": 8 } }, "id" : "TestRequest" }
- 读写多个寄存器
-
请求示例:
{ "request": { "operation": "ReadWriteMultipleRegistersRequest", "device": 1, "read_address": 1, "read_count": 2, "write_address": 3, "write_registers": [20,30,40] }, "id": "TestRequest" }
响应示例:
{ "response": { "status": "success", "device": 1, "operation": "ReadWriteMultipleRegistersRequest", "payload": { "function_code": 23, "registers": [10,20,10,20] } }, "id" : "TestRequest" }
注意
响应包括组件读取的寄存器。
当请求格式有效但请求未成功完成时,可能会发生异常。在此情况下,响应将包含以下信息:
-
status
设置为Exception
。 -
function_code
等于请求的函数代码 + 128。 -
exception_code
包含异常代码。有关更多信息,请参阅 Modbus 异常代码。
示例:
{ "response": { "status": "fail", "error_message": "Internal Error", "error": "Exception", "device": 1, "operation": "ReadCoilsRequest", "payload": { "function_code": 129, "exception_code": 2 } }, "id": "TestRequest" }
该连接器对 Modbus 请求执行验证检查。例如,它会检查无效格式和缺失字段。如果验证失败,则连接器不会发送请求。而是会返回一个包含以下信息的响应:
-
status
设置为No Response
。 -
error
包含错误原因。 -
error_message
包含错误消息。
示例:
{ "response": { "status": "fail", "error_message": "Invalid address field. Expected <type 'int'>, got <type 'str'>", "error": "No Response", "device": 1, "operation": "ReadCoilsRequest", "payload": { "error": "Invalid address field. Expected Expected <type 'int'>, got <type 'str'>" } }, "id": "TestRequest" }
如果请求目标是不存在的设备,或者 Modbus RTU 网络不起作用,您可能会获得采用“无响应”格式的 ModbusIOException
。
{ "response": { "status": "fail", "error_message": "[Input/Output] No Response received from the remote unit", "error": "No Response", "device": 1, "operation": "ReadCoilsRequest", "payload": { "error": "[Input/Output] No Response received from the remote unit" } }, "id": "TestRequest" }
本地日志文件
此组件使用以下日志文件。
/logs/aws.greengrass.Modbus.log
/greengrass/v2
查看此组件的日志
-
在核心设备上运行以下命令以实时查看此组件的日志文件。
替换为 Amazon IoT Greengrass 根文件夹的路径。/greengrass/v2
sudo tail -f
/logs/aws.greengrass.Modbus.log/greengrass/v2
许可证
此组件包括以下第三方软件/许可:
-
pymodbus /B
SD 许可证 -
pyserial
/BSD 许可证
该组件是根据 Greengrass 核心软件许可协议发布的
更改日志
下表描述了该组件的每个版本中的更改。
版本 |
更改 |
---|---|
2.1.8 |
Greengrass nucleus 版本 2.12.0 版本的版本已更新。 |
2.1.7 |
Greengrass nucleus 版本 2.11.0 版本的版本已更新。 |
2.1.6 |
Greengrass nucleus 版本 2.10.0 版本的版本已更新。 |
2.1.5 |
|
2.1.4 |
Greengrass nucleus 版本 2.9.0 版本的版本已更新。 |
2.1.3 |
Greengrass nucleus 版本 2.8.0 版本的版本已更新。 |
2.1.2 |
Greengrass nucleus 版本 2.7.0 版本的版本已更新。 |
2.1.1 |
Greengrass nucleus 版本 2.6.0 版本的版本已更新。 |
2.1.0 |
|
2.0.8 |
Greengrass nucleus 版本 2.5.0 版本的版本已更新。 |
2.0.7 |
Greengrass nucleus 版本 2.4.0 版本的版本已更新。 |
2.0.6 |
Greengrass nucleus 版本 2.3.0 版本的版本已更新。 |
2.0.5 |
Greengrass nucleus 版本 2.2.0 版本的版本已更新。 |
2.0.4 |
Greengrass nucleus 版本 2.1.0 版本的版本已更新。 |
2.0.3 |
初始版本。 |