modbus-RTU 协议适配器 - Amazon IoT Greengrass
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

modbus-RTU 协议适配器

Modbus-RTU 协议适配器组件 (aws.greengrass.Modbus) 轮询来自本地 Modbus RTU 设备的信息。

要使用此组件从本地 Modbus RTU 设备请求信息,请向该组件订阅的主题发布消息。在消息中,指定要发送到设备的 Modbus RTU 请求。然后,该组件发布包含 Modbus RTU 请求结果的响应。

注意

此组件提供与Amazon IoT Greengrass V1 中的 Modbus RTU 协议适配器连接器类似的功能。有关更多信息,请参阅 Amazon IoT GreengrassV1 开发人员指南中的 Modbus RTU 协议适配器连接器

版本

此组件有以下版本:

  • 2.1.x

  • 2.0.x

类型

组件是一个 Lambda 组件 (aws.greengrass.lambda)。 Greengrass 核心使用 Lambda 启动器组件运行该组件的 Lambda 函数。

有关更多信息,请参阅 组件类型

操作系统

此组件只能安装在 Linux 核心设备上。

要求

此组件有以下要求:

  • 您的核心设备必须满足运行 Lambda 函数的要求。如果您希望核心设备运行容器化 Lambda 函数,则该设备必须满足要求才能运行容器化 Lambda 函数。有关更多信息,请参阅 Lambda 函数的要求

  • Python 版本 3.7 已安装在核心设备上并添加到 PATH 环境变量中。

  • Amazon IoT Greengrass核心设备和 Modbus 设备之间的物理连接。核心设备必须通过串行端口(例如 USB 端口)物理连接到 Modbus RTU 网络。

  • 要从此组件接收输出数据,在部署此组件时,必须合并旧版订阅路由器组件 (aws.greengrass.LegacySubscriptionRouter) 的以下配置更新。此配置指定了此组件发布响应的主题。

    Legacy subscription router v2.1.x
    { "subscriptions": { "aws-greengrass-modbus": { "id": "aws-greengrass-modbus", "source": "component:aws.greengrass.Modbus", "subject": "modbus/adapter/response", "target": "cloud" } } }
    Legacy subscription router v2.0.x
    { "subscriptions": { "aws-greengrass-modbus": { "id": "aws-greengrass-modbus", "source": "arn:aws:lambda:region:aws:function:aws-greengrass-modbus:version", "subject": "modbus/adapter/response", "target": "cloud" } } }
    • 用你Amazon Web Services 区域使用的区域替换区域

    • Lambda。要查找 Lambda 函数版本,您必须查看要部署的此组件版本的配方。在Amazon IoT Greengrass控制台中打开此组件的详细信息页面,查找 Lambda 函数的键值对。此键值对包含 Lambda 函数的名称和版本。

    重要

    每次部署此组件时,都必须更新传统订阅路由器上的 Lambda 函数版本。这可确保您为部署的组件版本使用正确的 Lambda 函数版本。

    有关更多信息,请参阅 创建部署

附属物

部署组件时,Amazon IoT Greengrass还会部署其依赖项的兼容版本。这意味着您必须满足组件及其所有依赖项的要求才能成功部署该组件。本节列出了此组件已发布版本的依赖关系以及为每个依赖项定义组件版本的语义版本约束。您还可以在Amazon IoT Greengrass控制台中查看每个版本组件的依赖关系。在组件详细信息页面上,查找 “依赖关系” 列表。

2.1.3

下表列出了此组件版本 2.1.3 的依赖关系。

依赖关系 兼容版本 依赖关系类型
Greengrass 核 achiona 2.0.0 硬性
Lambda 发射器 achi 2.0.0 硬性
Lambda 运行时 achi 2.0.0 软性
代币交换服务 achi 2.0.0 硬性
2.1.2

2.1.0。

依赖关系 兼容版本 依赖关系类型
Greengrass 核 >>>=2.0.0 硬性
Lambda 发射器 achi 2.0.0 硬性
Lambda 运行时 achi 2.0.0 软性
代币交换服务 achi 2.0.0 硬性
2.1.1

2.1.0。

依赖关系 兼容版本 依赖关系类型
Greengrass 核 achiona 2.0.0 硬性
Lambda 发射器 achi 2.0.0 硬性
Lambda 运行时 achi 2.0.0 软性
代币交换服务 achi 2.0.0 硬性
2.0.8 and 2.1.0

下表列出了此组件版本 2.0.8 和 2.1.0 的依赖关系。

依赖关系 兼容版本 依赖关系类型
Greengrass 核 achiona 2.0.0 硬性
Lambda 发射器 achi 2.0.0 硬性
Lambda 运行时 achi 2.0.0 软性
代币交换服务 achi 2.0.0 硬性
2.0.7

下表列出了此组件版本 2.0.7 的依赖关系。

依赖关系 兼容版本 依赖关系类型
Greengrass 核 >>>=2.0.0 硬性
Lambda 发射器 achi 2.0.0 硬性
Lambda 运行时 achi 2.0.0 软性
代币交换服务 achi 2.0.0 硬性
2.0.6

下表列出了此组件版本 2.0.6 的依赖关系。

依赖关系 兼容版本 依赖关系类型
Greengrass 核 >>>=2.0.0 硬性
Lambda 发射器 achi 2.0.0 硬性
Lambda 运行时 achi 2.0.0 软性
代币交换服务 achi 2.0.0 硬性
2.0.5

下表列出了此组件版本 2.0.5 的依赖关系。

依赖关系 兼容版本 依赖关系类型
Greengrass 核 >>>=2.0.0 硬性
Lambda 发射器 achi 2.0.0 硬性
Lambda 运行时 achi 2.0.0 软性
代币交换服务 achi 2.0.0 硬性
2.0.4

下表列出了此组件 2.0.4 版的依赖关系。

依赖关系 兼容版本 依赖关系类型
Greengrass 核 >>>=2.0.0 硬性
Lambda 发射器 achi 2.0.0 硬性
Lambda 运行时 achi 2.0.0 软性
代币交换服务 achi 2.0.0 硬性
2.0.3

下表列出了此组件版本 2.0.3 的依赖关系。

依赖关系 兼容版本 依赖关系类型
Greengrass 核 >>>=2.0.3 硬性
Lambda 发射器 >>=1.0.0 硬性
Lambda 运行时 >>=1.0.0 软性
代币交换服务 >>=1.0.0 硬性

有关组件依赖关系的更多信息,请参阅组件配方参考

配置

此组件提供以下配置参数,您可以在部署组件时对其进行自定义。

注意

此组件的默认配置包括 Lambda 函数参数。我们建议您仅编辑以下参数以在您的设备上配置此组件。

v2.1.x
lambdaParams

一个包含此组件的 Lambda 函数参数的对象。该对象:

EnvironmentVariables

一个包含 Lambda。该对象:

ModbusLocalPort

指向核心设备上物理 Modbus 串行端口的绝对路径,例如/dev/ttyS2

要在容器中运行此组件,必须将此路径定义为该组件可以访问的系统设备。containerParams.devices默认情况下,此组件在容器中运行。

注意

此组件必须具有对设备的读/写访问权限。

ModbusBaudRate

(可选)一个字符串值,用于指定与本地 Modbus TCP 设备进行串行通信的波特率。

默认值:9600

ModbusByteSize

(可选)一个字符串值,它指定与本地 Modbus TCP 设备的串行通信中字节的大小。选择567、或8位。

默认值:8

ModbusParity

(可选)在与本地 Modbus TCP 设备的串行通信中用于验证数据完整性的奇偶校验模式。

  • E— 使用均匀的奇偶校验数据完整性。

  • O— 使用奇数奇偶校验数据完整性。

  • N— 不要验证数据完整性。

默认值:N

ModbusStopBits

(可选)一个字符串值,用于指定与本地 Modbus TCP 设备的串行通信中表示字节结束的位数。

默认值:1

containerMode

(可选)此组件的容器化模式。从以下选项中进行选择:

  • GreengrassContainer— 该组件在Amazon IoT Greengrass容器内的隔离运行时环境中运行。

    如果指定此选项,则必须指定系统设备(中containerParams.devices),以允许容器访问 Modbus 设备。

  • NoContainer—。

默认值:GreengrassContainer

containerParams

(可选)包含此组件的容器参数的对象。如果您指定GreengrassContainer,则组件将使用这些参数containerMode

该对象:

memorySize

(可选)分配给组件的内存量(以千字节为单位)。

默认为 512 MB (525,312 KB)。

devices

(可选)一个对象,它指定组件可以在容器中访问的系统设备。

重要

要在容器中运行此组件,必须指定在ModbusLocalPort环境变量中配置的系统设备。

该对象:

0— 这是字符串形式的数组索引。

Configurations():

path

核心设备上系统设备的路径。该值必须与您为其配置的值相同ModbusLocalPort

permission

(可选)从容器访问系统设备的权限。此值必须为rw,它指定组件对系统设备具有读/写访问权限。

默认值:rw

addGroupOwner

(可选)。

默认值:true

pubsubTopics

(可选)包含组件订阅以接收消息的主题的对象。您可以指定每个主题,以及该组件是订阅来自Amazon IoT Core还是本地发布/订阅主题的 MQTT 主题。

该对象:

0— 这是字符串形式的数组索引。

Configurations():

type

(可选)此组件用于订阅消息的发布/订阅消息的类型。从以下选项中进行选择:

  • Pubsub – 订阅本地发布/订阅消息。,,。有关在指定此选项时如何从自定义组件发送消息的更多信息,请参阅发布/订阅本地消息

  • IotCore – 订阅 Amazon IoT Core MQTT 消息。如果选择此选项,则主题可以包含 MQTT 通配符。有关在指定此选项时如何从自定义组件发送消息的更多信息,请参阅发布/订阅Amazon IoT CoreMQTT 消息

默认值:Pubsub

topic

(可选)组件订阅以接收消息的主题。如果您指定IotCoretype,则可以在本主题中使用 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" }
v2.0.x
lambdaParams

一个包含此组件的 Lambda 函数参数的对象。该对象:

EnvironmentVariables

一个包含 Lambda。该对象:

ModbusLocalPort

指向核心设备上物理 Modbus 串行端口的绝对路径,例如/dev/ttyS2

要在容器中运行此组件,必须将此路径定义为该组件可以访问的系统设备。containerParams.devices默认情况下,此组件在容器中运行。

注意

此组件必须具有对设备的读/写访问权限。

containerMode

(可选)此组件的容器化模式。从以下选项中进行选择:

  • GreengrassContainer— 该组件在Amazon IoT Greengrass容器内的隔离运行时环境中运行。

    如果指定此选项,则必须指定系统设备(中containerParams.devices),以允许容器访问 Modbus 设备。

  • NoContainer—。

默认值:GreengrassContainer

containerParams

(可选)包含此组件的容器参数的对象。如果您指定GreengrassContainer,则组件将使用这些参数containerMode

该对象:

memorySize

(可选)分配给组件的内存量(以千字节为单位)。

默认为 512 MB (525,312 KB)。

devices

(可选)一个对象,它指定组件可以在容器中访问的系统设备。

重要

要在容器中运行此组件,必须指定在ModbusLocalPort环境变量中配置的系统设备。

该对象:

0— 这是字符串形式的数组索引。

Configurations():

path

核心设备上系统设备的路径。该值必须与您为其配置的值相同ModbusLocalPort

permission

(可选)从容器访问系统设备的权限。此值必须为rw,它指定组件对系统设备具有读/写访问权限。

默认值:rw

addGroupOwner

(可选)。

默认值:true

pubsubTopics

(可选)包含组件订阅以接收消息的主题的对象。您可以指定每个主题,以及该组件是订阅来自Amazon IoT Core还是本地发布/订阅主题的 MQTT 主题。

该对象:

0— 这是字符串形式的数组索引。

Configurations():

type

(可选)此组件用于订阅消息的发布/订阅消息的类型。从以下选项中进行选择:

  • Pubsub – 订阅本地发布/订阅消息。,,。有关在指定此选项时如何从自定义组件发送消息的更多信息,请参阅发布/订阅本地消息

  • IotCore – 订阅 Amazon IoT Core MQTT 消息。如果选择此选项,则主题可以包含 MQTT 通配符。有关在指定此选项时如何从自定义组件发送消息的更多信息,请参阅发布/订阅Amazon IoT CoreMQTT 消息

默认值:Pubsub

topic

(可选)组件订阅以接收消息的主题。如果您指定IotCoretype,则可以在本主题中使用 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

该消息接受以下属性。Configurations()。

request

要发送的 Modbus RTU 请求的参数。

请求消息的形状取决于它所代表的 Modbus RTU 请求的类型。所有请求都需要以下属性。

类型:object包含以下信息:

operation

要运行的操作的名称。例如,指定在ReadCoilsRequest Modbus RTU 设备上读取线圈。,Modbus RTU 请求和响应

类型:string

device

请求的目标设备。

2470

类型: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

Modigurations:

类型:object包含以下信息:

status

请求的状态。状态可以是以下值之一:

  • Success— 请求有效,组件向 Modbus RTU 网络发送了请求,Modbus RTU 网络返回了响应。

  • Exception— 请求有效,组件向 Modbus RTU 网络发送了请求,Modbus RTU 网络返回了一个异常。有关更多信息,请参阅 响应状态:例外

  • No Response— 请求无效,组件在向 Modbus RTU 网络发送请求之前发现了错误。有关更多信息,请参阅 响应状态:没有回应

operation

组件请求的操作。

device

组件发送请求的设备。

payload

Modigurations:如果statusNo 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

以下是受支持操作的示例请求和响应。

Read()

请求示例:

{ "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" }
Configurati

请求示例:

{ "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" }
Write()

请求示例:

{ "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" }
Wigurations()

请求示例:

{ "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" }

本地

此组件使用以下日志文件。

/greengrass/v2/logs/aws.greengrass.Modbus.log

查看此组件的日志

  • 在核心设备上运行以下命令以实时查看此组件的日志文件。将 /greengrass/v2 替换为Amazon IoT Greengrass根文件夹的路径。

    sudo tail -f /greengrass/v2/logs/aws.greengrass.Modbus.log

许可证

此组件包括以下第三方软件/许可:

此组件根据 Greengrass 核心软件许可协议发布。

更改日志

Version

变更

2.1.3

Greengrass 0。

2.1.2

Greengrass 0。

2.1.1

Greengrass 0。

2.1.0

新功能
  • 添加ModbusBaudRateModbusByteSizeModbusParity、和ModbusStopBits选项,您可以指定这些选项来配置与 Modbus RTU 设备的串行通信。

2.0.8

Greengrass 0。

2.0.7

Greengrass 0。

2.0.6

Greengrass 0。

2.0.5

Greengrass 0。

2.0.4

Greengrass 0。

2.0.3

初始版本。