本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
MODBS-RTU 协议适配器
MODBUS-RTU 协议适配器组件 (aws.greengrass.Modbus
)从本地 Modbus RTU 设备轮询信息。
要从具有此组件的本地 Modbus RTU 设备请求信息,请向此组件订阅的主题发布消息。在消息中,指定要发送到设备的 Modbus RTU 请求。然后,此组件发布一个响应,其中包含 Modbus RTU 请求的结果。
此组件提供的功能与Amazon IoT GreengrassV1。有关更多信息,请参阅 。Modbus RTU 协议适配器连接器中的Amazon IoT GreengrassV1 开发人员指南.
Versions
此组件具有以下版本:
-
2.0.x
Type
此组件是一个 Lambda 组件(aws.greengrass.lambda
)。这些区域有:Greengrass 核心使用运行此组件的 Lambda 函数Lambda 启动器组件.
有关更多信息,请参阅组件类型。
Requirements
此组件有以下要求:
-
您的核心设备必须满足运行 Lambda 功能的要求。如果您希望核心设备运行容器化 Lambda 功能,设备必须满足要求才能执行此操作。有关更多信息,请参阅运行 Lambda 函数的要求。
-
Python
安装在核心设备上的 PATH 环境变量中。 -
与Amazon IoT Greengrass核心设备和 Modbus 设备。核心设备必须通过串行端口(如 USB 端口)以物理方式连接到 Modbus RTU 网络。
-
若要从此组件接收输出数据,您必须合并旧版订阅路由器组件当您部署此组件时。旧版订阅路由器组件 (
aws.greengrass.LegacySubscriptionRouter
)是此组件的依赖关系。此配置指定此组件发布响应的主题。有关更多信息,请参阅创建部署。
Dependencies
部署组件时,Amazon IoT Greengrass还部署其依赖关系的兼容版本。这意味着您必须满足组件及其所有依赖关系的要求才能成功部署组件。此部分列出了发布版本以及定义每个依赖关系的组件版本的语义版本约束。您也可以在中查看每一版的组件的依赖关系。Amazon IoT Greengrass控制台
有关组件依赖项的更多信息,请参阅。组件配方参考.
Configuration
此组件提供了以下配置参数,您可以在部署组件时自定义这些参数。
此组件的默认配置包括 Lambda 函数参数。我们建议您仅编辑以下参数,以便在设备上配置此组件。
lambdaParams
-
一个对象,其中包含此组件的 Lambda 函数的参数。此对象包含以下信息:
EnvironmentVariables
-
包含 Lambda 函数的参数的对象。此对象包含以下信息:
ModbusLocalPort
-
设备上的物理 Modbus 串行端口的绝对路径,例如
/dev/ttyS2
.要在容器中运行此组件,必须将此路径定义为系统设备该组件可以访问的。默认情况下,此组件在容器中运行。
注意 此组件对设备具有读/写访问权限。
containerMode
-
(可选) 此组件的容器化模式。从以下选项中进行选择:
-
GreengrassContainer
— 组件在隔离运行时环境中运行Amazon IoT Greengrass容器。如果指定此选项,则指定系统设备允许容器访问 Modbus 设备。
-
NoContainer
— 组件不在隔离的运行时环境中运行。
默认值:
GreengrassContainer
-
containerParams
-
(可选)包含此组件的容器参数的对象。组件将使用这些参数,如果您指定
GreengrassContainer
对于 来说为containerMode
.此对象包含以下信息:
memorySize
-
(可选)要分配给组件的内存量(以千字节为单位)。
默认值为 512 MB(525,312 KB)。
-
devices
-
(可选)一个对象,它指定组件可以在容器中访问的系统设备。
重要 若要在容器中运行此组件,必须在
ModbusLocalPort
环境变量。此对象包含以下信息:
0
— 这是一个字符串形式的数组索引。-
包含以下信息的对象:
path
-
核心设备上系统设备的路径。该值必须与您为
ModbusLocalPort
. permission
-
(可选)从容器访问系统设备的权限。此值必须是
rw
,它指定组件对系统设备具有读/写访问权限。默认值:
rw
addGroupOwner
-
(可选)是否将运行组件的系统组添加为系统设备的所有者。
默认值:
true
pubsubTopics
-
(可选)包含组件预订接收消息的主题的对象。您可以指定每个主题,以及该组件是否订阅Amazon IoT Core或本地发布/订阅主题。
此对象包含以下信息:
0
— 这是一个字符串形式的数组索引。-
包含以下信息的对象:
type
-
(可选)此组件用于订阅消息的发布/订阅消息的类型。从以下选项中进行选择:
-
Pubsub
– 订阅本地发布/订阅消息。如果选择此选项,则主题不能包含 MQTT 通配符。有关如何在指定此选项时从自定义组件发送消息的更多信息,请参阅。发布/订阅本地消息. -
IotCore
— 订阅Amazon IoT CoreMQTT 消息。如果选择此选项,则主题可以包含 MQTT 通配符。有关如何在指定此选项时从自定义组件发送消息的更多信息,请参阅发布/订阅Amazon IoT CoreMQTT 消息.
默认值:
Pubsub
-
topic
-
(可选)组件订阅以接收消息的主题。如果您指定
IotCore
对于 来说为type
,您可以使用 MQTT 通配符(+
和#
)。
例如:配置合并更新(容器模式)
{ "lambdaExecutionParameters": { "EnvironmentVariables": { "ModbusLocalPort": "/dev/ttyS2" } }, "containerMode": "GreengrassContainer", "containerParams": { "devices": { "0": { "path": "/dev/ttyS2", "permission": "rw", "addGroupOwner": true } } } }
例如:配置合并更新(无容器模式)
{ "lambdaExecutionParameters": { "EnvironmentVariables": { "ModbusLocalPort": "/dev/ttyS2" } }, "containerMode": "NoContainer" }
输入数据
此组件接受有关以下主题的 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 CoreMQTT 消息.
默认主题 (Amazon IoT CoreMQTT): 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, "value": 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" }
- Mask (写入)
-
请求示例:
{ "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" }
Licenses
此组件包含以下第三方软件/许可:
此组件在Greengrass 核心软件许可协议
Changelog
下表介绍每一版的中的更改。
Version |
更改 |
---|---|
2.0.7 |
已更新适用于 Greengrass 原核 2.4.0 版发行。 |
2.0.6 |
已更新适用于 Greengrass 原核 2.3.0 版发行。 |
2.0.5 |
已更新适用于 Greengrass 原核 2.2.0 版发行。 |
2.0.4 |
已更新适用于 Greengrass 原核 2.1.0 版发行。 |
2.0.3 |
初始版本。 |