

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

# Modbus-RTU 协议适配器
<a name="modbus-rtu-protocol-adapter-component"></a>

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

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

**注意**  
该组件提供的功能与 V1 中的 Modbus RTU 协议适配器 AWS IoT Greengrass 连接器类似。有关更多信息，请参阅《AWS IoT Greengrass V1 开发人员指南》**中的 [Modbus RTU 协议适配器连接器](https://docs.aws.amazon.com/greengrass/latest/developerguide/modbus-protocol-adapter-connector.html)。

**Topics**
+ [版本](#modbus-rtu-protocol-adapter-component-versions)
+ [Type](#modbus-rtu-protocol-adapter-component-type)
+ [操作系统](#modbus-rtu-protocol-adapter-component-os-support)
+ [要求](#modbus-rtu-protocol-adapter-component-requirements)
+ [依赖项](#modbus-rtu-protocol-adapter-component-dependencies)
+ [配置](#modbus-rtu-protocol-adapter-component-configuration)
+ [输入数据](#modbus-rtu-protocol-adapter-component-input-data)
+ [输出数据](#modbus-rtu-protocol-adapter-component-output-data)
+ [Modbus RTU 请求和响应](#modbus-rtu-protocol-adapter-component-requests-responses)
+ [本地日志文件](#modbus-rtu-protocol-adapter-component-log-file)
+ [许可证](#modbus-rtu-protocol-adapter-component-licenses)
+ [更改日志](#modbus-rtu-protocol-adapter-component-changelog)

## 版本
<a name="modbus-rtu-protocol-adapter-component-versions"></a>

此组件具有以下版本：
+ 2.1.x
+ 2.0.x

## Type
<a name="modbus-rtu-protocol-adapter-component-type"></a>

<a name="public-component-type-lambda"></a>此<a name="public-component-type-lambda-phrase"></a>组件是一个 Lambda 组件 (`aws.greengrass.lambda`)。[Greengrass Nucleus](greengrass-nucleus-component.md) 使用 [Lambda 启动程序组件](lambda-launcher-component.md)运行此组件的 Lambda 函数。

<a name="public-component-type-more-information"></a>有关更多信息，请参阅 [组件类型](develop-greengrass-components.md#component-types)。

## 操作系统
<a name="modbus-rtu-protocol-adapter-component-os-support"></a>

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

## 要求
<a name="modbus-rtu-protocol-adapter-component-requirements"></a>

此组件具有以下要求：
+ <a name="core-device-lambda-function-requirements"></a>您的核心设备必须满足运行 Lambda 函数的要求。如果您希望核心设备运行容器化 Lambda 函数，则设备必须满足相关要求。有关更多信息，请参阅 [Lambda 函数要求](setting-up.md#greengrass-v2-lambda-requirements)。
+ <a name="public-component-python3-requirement"></a>[Python](https://www.python.org/) 版本 3.7 已安装在核心设备上，并已添加到 PATH 环境变量中。
+  AWS IoT Greengrass 核心设备和 Modbus 设备之间的物理连接。核心设备必须通过串行端口（例如 USB 端口）以物理方式连接到 Modbus RTU 网络。
+ <a name="connector-component-legacy-subscription-router-dependency"></a>要接收此组件的输出数据，在部署此组件时，必须合并[旧版订阅路由器组件](legacy-subscription-router-component.md) (`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"
      }
    }
  }
  ```<a name="connector-component-legacy-subscription-router-dependency-replace"></a>
  + *region*替换为您使用 AWS 区域 的。
  + *version*替换为该组件运行的 Lambda 函数的版本。要查找 Lambda 函数版本，您必须查看要部署的此组件版本配方。在 [AWS IoT Greengrass 控制台](https://console.aws.amazon.com//greengrass)中打开此组件的详细信息页面，然后查找 **Lambda 函数**键值对。此键值对包含 Lambda 函数的名称和版本。

**重要**  <a name="connector-component-legacy-subscription-router-dependency-note"></a>
每次部署此组件时，都必须更新旧版订阅路由器上的 Lambda 函数版本。这样能够确保为部署的组件版本使用正确的 Lambda 函数版本。

------

  <a name="connector-component-create-deployments"></a>有关更多信息，请参阅 [创建部署](create-deployments.md)。
+ 支持 Modbus-RTU 协议适配器在 VPC 中运行。

## 依赖项
<a name="modbus-rtu-protocol-adapter-component-dependencies"></a>

部署组件时， AWS IoT Greengrass 还会部署其依赖项的兼容版本。这意味着您必须满足组件及其所有依赖关系的要求，才能成功部署组件。本部分列出了此组件的[已发布版本](#modbus-rtu-protocol-adapter-component-changelog)的依赖关系，以及定义每个依赖关系的组件版本的语义版本约束。您还可以在 [AWS IoT Greengrass 控制台](https://console.aws.amazon.com//greengrass)中查看每个组件版本的依赖关系。在组件详细信息页面上，查找**依赖关系**列表。

------
#### [ 2.1.11 ]

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


| 依赖关系 | 兼容版本 | 依赖关系类型 | 
| --- | --- | --- | 
| [Greengrass Nucleus](greengrass-nucleus-component.md) | >=2.0.0 <2.16.0  | 硬性 | 
| [Lambda 启动程序](lambda-launcher-component.md) | ^2.0.0  | 硬性 | 
| [Lambda 运行时](lambda-runtimes-component.md) | ^2.0.0  | 软性 | 
| [令牌交换服务](token-exchange-service-component.md) | ^2.0.0  | 硬性 | 

------
#### [ 2.1.10 ]

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


| 依赖关系 | 兼容版本 | 依赖关系类型 | 
| --- | --- | --- | 
| [Greengrass Nucleus](greengrass-nucleus-component.md) | >=2.0.0 <2.15.0  | 硬性 | 
| [Lambda 启动程序](lambda-launcher-component.md) | ^2.0.0  | 硬性 | 
| [Lambda 运行时](lambda-runtimes-component.md) | ^2.0.0  | 软性 | 
| [令牌交换服务](token-exchange-service-component.md) | ^2.0.0  | 硬性 | 

------
#### [ 2.1.9 ]

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


| 依赖关系 | 兼容版本 | 依赖关系类型 | 
| --- | --- | --- | 
| [Greengrass Nucleus](greengrass-nucleus-component.md) | >=2.0.0 <2.14.0  | 硬性 | 
| [Lambda 启动程序](lambda-launcher-component.md) | ^2.0.0  | 硬性 | 
| [Lambda 运行时](lambda-runtimes-component.md) | ^2.0.0  | 软性 | 
| [令牌交换服务](token-exchange-service-component.md) | ^2.0.0  | 硬性 | 

------
#### [ 2.1.8 ]

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


| 依赖关系 | 兼容版本 | 依赖关系类型 | 
| --- | --- | --- | 
| [Greengrass Nucleus](greengrass-nucleus-component.md) | >=2.0.0 <2.13.0  | 硬性 | 
| [Lambda 启动程序](lambda-launcher-component.md) | ^2.0.0  | 硬性 | 
| [Lambda 运行时](lambda-runtimes-component.md) | ^2.0.0  | 软性 | 
| [令牌交换服务](token-exchange-service-component.md) | ^2.0.0  | 硬性 | 

------
#### [ 2.1.7 ]

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


| 依赖关系 | 兼容版本 | 依赖关系类型 | 
| --- | --- | --- | 
| [Greengrass Nucleus](greengrass-nucleus-component.md) | >=2.0.0 <2.12.0  | 硬性 | 
| [Lambda 启动程序](lambda-launcher-component.md) | ^2.0.0  | 硬性 | 
| [Lambda 运行时](lambda-runtimes-component.md) | ^2.0.0  | 软性 | 
| [令牌交换服务](token-exchange-service-component.md) | ^2.0.0  | 硬性 | 

------
#### [ 2.1.6 ]

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


| 依赖关系 | 兼容版本 | 依赖关系类型 | 
| --- | --- | --- | 
| [Greengrass Nucleus](greengrass-nucleus-component.md) | >=2.0.0 <2.11.0  | 硬性 | 
| [Lambda 启动程序](lambda-launcher-component.md) | ^2.0.0  | 硬性 | 
| [Lambda 运行时](lambda-runtimes-component.md) | ^2.0.0  | 软性 | 
| [令牌交换服务](token-exchange-service-component.md) | ^2.0.0  | 硬性 | 

------
#### [ 2.1.4 and 2.1.5 ]

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


| 依赖关系 | 兼容版本 | 依赖关系类型 | 
| --- | --- | --- | 
| [Greengrass Nucleus](greengrass-nucleus-component.md) | >=2.0.0 <2.10.0  | 硬性 | 
| [Lambda 启动程序](lambda-launcher-component.md) | ^2.0.0  | 硬性 | 
| [Lambda 运行时](lambda-runtimes-component.md) | ^2.0.0  | 软性 | 
| [令牌交换服务](token-exchange-service-component.md) | ^2.0.0  | 硬性 | 

------
#### [ 2.1.3 ]

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


| 依赖关系 | 兼容版本 | 依赖关系类型 | 
| --- | --- | --- | 
| [Greengrass Nucleus](greengrass-nucleus-component.md) | >=2.0.0 <2.9.0  | 硬性 | 
| [Lambda 启动程序](lambda-launcher-component.md) | ^2.0.0  | 硬性 | 
| [Lambda 运行时](lambda-runtimes-component.md) | ^2.0.0  | 软性 | 
| [令牌交换服务](token-exchange-service-component.md) | ^2.0.0  | 硬性 | 

------
#### [ 2.1.2 ]

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


| 依赖关系 | 兼容版本 | 依赖关系类型 | 
| --- | --- | --- | 
| [Greengrass Nucleus](greengrass-nucleus-component.md) | >=2.0.0 <2.8.0  | 硬性 | 
| [Lambda 启动程序](lambda-launcher-component.md) | ^2.0.0  | 硬性 | 
| [Lambda 运行时](lambda-runtimes-component.md) | ^2.0.0  | 软性 | 
| [令牌交换服务](token-exchange-service-component.md) | ^2.0.0  | 硬性 | 

------
#### [ 2.1.1 ]

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


| 依赖关系 | 兼容版本 | 依赖关系类型 | 
| --- | --- | --- | 
| [Greengrass Nucleus](greengrass-nucleus-component.md) | >=2.0.0 <2.7.0  | 硬性 | 
| [Lambda 启动程序](lambda-launcher-component.md) | ^2.0.0  | 硬性 | 
| [Lambda 运行时](lambda-runtimes-component.md) | ^2.0.0  | 软性 | 
| [令牌交换服务](token-exchange-service-component.md) | ^2.0.0  | 硬性 | 

------
#### [ 2.0.8 and 2.1.0 ]

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


| 依赖关系 | 兼容版本 | 依赖关系类型 | 
| --- | --- | --- | 
| [Greengrass Nucleus](greengrass-nucleus-component.md) | >=2.0.0 <2.6.0  | 硬性 | 
| [Lambda 启动程序](lambda-launcher-component.md) | ^2.0.0  | 硬性 | 
| [Lambda 运行时](lambda-runtimes-component.md) | ^2.0.0  | 软性 | 
| [令牌交换服务](token-exchange-service-component.md) | ^2.0.0  | 硬性 | 

------
#### [ 2.0.7 ]

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


| 依赖关系 | 兼容版本 | 依赖关系类型 | 
| --- | --- | --- | 
| [Greengrass Nucleus](greengrass-nucleus-component.md) | >=2.0.0 <2.5.0  | 硬性 | 
| [Lambda 启动程序](lambda-launcher-component.md) | ^2.0.0  | 硬性 | 
| [Lambda 运行时](lambda-runtimes-component.md) | ^2.0.0  | 软性 | 
| [令牌交换服务](token-exchange-service-component.md) | ^2.0.0  | 硬性 | 

------
#### [ 2.0.6 ]

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


| 依赖关系 | 兼容版本 | 依赖关系类型 | 
| --- | --- | --- | 
| [Greengrass Nucleus](greengrass-nucleus-component.md) | >=2.0.0 <2.4.0  | 硬性 | 
| [Lambda 启动程序](lambda-launcher-component.md) | ^2.0.0  | 硬性 | 
| [Lambda 运行时](lambda-runtimes-component.md) | ^2.0.0  | 软性 | 
| [令牌交换服务](token-exchange-service-component.md) | ^2.0.0  | 硬性 | 

------
#### [ 2.0.5 ]

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


| 依赖关系 | 兼容版本 | 依赖关系类型 | 
| --- | --- | --- | 
| [Greengrass Nucleus](greengrass-nucleus-component.md) | >=2.0.0 <2.3.0  | 硬性 | 
| [Lambda 启动程序](lambda-launcher-component.md) | ^2.0.0  | 硬性 | 
| [Lambda 运行时](lambda-runtimes-component.md) | ^2.0.0  | 软性 | 
| [令牌交换服务](token-exchange-service-component.md) | ^2.0.0  | 硬性 | 

------
#### [ 2.0.4 ]

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


| 依赖关系 | 兼容版本 | 依赖关系类型 | 
| --- | --- | --- | 
| [Greengrass Nucleus](greengrass-nucleus-component.md) | >=2.0.0 <2.2.0  | 硬性 | 
| [Lambda 启动程序](lambda-launcher-component.md) | ^2.0.0  | 硬性 | 
| [Lambda 运行时](lambda-runtimes-component.md) | ^2.0.0  | 软性 | 
| [令牌交换服务](token-exchange-service-component.md) | ^2.0.0  | 硬性 | 

------
#### [ 2.0.3 ]

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


| 依赖关系 | 兼容版本 | 依赖关系类型 | 
| --- | --- | --- | 
| [Greengrass Nucleus](greengrass-nucleus-component.md) | >=2.0.3 <2.1.0  | 硬性 | 
| [Lambda 启动程序](lambda-launcher-component.md) | >=1.0.0  | 硬性 | 
| [Lambda 运行时](lambda-runtimes-component.md) | >=1.0.0  | 软性 | 
| [令牌交换服务](token-exchange-service-component.md) | >=1.0.0  | 硬性 | 

------

有关组件依赖关系的更多信息，请参阅[组件配方参考](component-recipe-reference.md#recipe-reference-component-dependencies)。

## 配置
<a name="modbus-rtu-protocol-adapter-component-configuration"></a>

此组件提供您可以在部署组件时自定义的以下配置参数。

**注意**  <a name="connector-component-lambda-parameters"></a>
此组件的默认配置包括 Lambda 函数参数。我们建议您只编辑以下参数，以便在您的设备上配置此组件。

------
#### [ v2.1.x ]

`lambdaParams`  
包含此组件的 Lambda 函数参数的对象。该对象包含以下信息：    
`EnvironmentVariables`  
包含 Lambda 函数的参数的对象。该对象包含以下信息：    
`ModbusLocalPort`  <a name="modbus-rtu-protocol-adapter-configuration-modbuslocalport"></a>
核心设备上的物理 Modbus 串行端口的绝对路径，例如 `/dev/ttyS2`。  
要在容器中运行此组件，必须将此路径定义为该组件可以访问的系统设备（在 `containerParams.devices` 中）。默认情况下，此组件在容器中运行。  
此组件必须有权 read/write 访问该设备。  
`ModbusBaudRate`  
（可选）一个字符串值，指定与本地 Modbus TCP 设备进行串行通信的波特率。  
默认值：`9600`  
`ModbusByteSize`  
（可选）一个字符串值，指定与本地 Modbus TCP 设备进行串行通信时的字节大小。选择 `5`、`6`、`7` 或 `8` 位。  
默认值：`8`  
`ModbusParity`  
（可选）奇偶校验模式，用于验证与本地 Modbus TCP 设备进行串行通信时的数据完整性。  
+ `E`– 使用偶校验验证数据完整性。
+ `O`– 使用奇校验验证数据完整性。
+ `N`– 不验证数据完整性。
默认值：`N`  
`ModbusStopBits`  
（可选）一个字符串值，指定在与本地 Modbus TCP 设备进行串行通信时表示字节结束的位数。  
默认值：`1`

`containerMode`  <a name="modbus-rtu-protocol-adapter-configuration-containermode"></a>
（可选）此组件的容器化模式。从以下选项中进行选择：  
+ `GreengrassContainer`— 该组件在 AWS IoT Greengrass 容器内的隔离运行时环境中运行。

  如果指定此选项，则必须指定系统设备（在 `containerParams.devices` 中）以允许容器访问 Modbus 设备。
+ `NoContainer` – 该组件不在隔离的运行时环境中运行。
默认值：`GreengrassContainer`

`containerParams`  <a name="modbus-rtu-protocol-adapter-configuration-containerparams"></a>
<a name="connector-component-container-params-description"></a>（可选）包含此组件的容器参数的对象。如果您为 `containerMode` 指定 `GreengrassContainer`，则该组件使用这些参数。  
该对象包含以下信息：    
`memorySize`  
<a name="connector-component-container-params-memory-size-description"></a>（可选）要分配给组件的内存量（以千字节为单位）。  
默认为 512 MB（525,312 KB）。  
`devices`  
（可选）一个对象，指定组件可以在容器中访问的系统设备。  
要在容器中运行此组件，必须指定在 `ModbusLocalPort` 环境变量中配置的系统设备。
该对象包含以下信息：    
`0` – 这是字符串形式的数组索引。  
包含以下信息的对象：    
`path`  
核心设备上系统设备的路径。此值必须与您为 `ModbusLocalPort` 配置的值相同。  
`permission`  
（可选）从容器访问系统设备的权限。此值必须为`rw`，表示该组件有权 read/write 访问系统设备。  
默认值：`rw`  
`addGroupOwner`  
（可选）是否将运行组件的系统组添加为系统设备的所有者。  
默认值：`true`

`pubsubTopics`  <a name="connector-component-pubsub-topics-parameter"></a>
（可选）包含组件订阅以接收消息的主题的对象。您可以指定每个主题以及该组件是从 AWS IoT Core 还是本地 publish/subscribe 主题订阅 MQTT 主题。  
该对象包含以下信息：    
`0` – 这是字符串形式的数组索引。  
包含以下信息的对象：    
`type`  
（可选）此组件用于订阅 publish/subscribe 消息的消息类型。从以下选项中进行选择：  
+ `PUB_SUB` – 订阅本地发布/订阅消息。如果选择此选项，主题不能包含 MQTT 通配符。有关在指定此选项时如何从自定义组件发送消息的更多信息，请参阅 [发布/订阅本地消息](ipc-publish-subscribe.md)。
+ `IOT_CORE`— 订阅 AWS IoT Core MQTT 消息。如果选择此选项，主题可以包含 MQTT 通配符。有关在指定此选项时如何从自定义组件发送消息的更多信息，请参阅 [发布/订阅 AWS IoT Core MQTT 消息](ipc-iot-core-mqtt.md)。
默认值：`PUB_SUB`  
`topic`  
（可选）组件订阅以接收消息的主题。如果您为 `type` 指定 `IotCore`，则可以在本主题中使用 MQTT 通配符（`+` 和 `#`）。

**Example 示例：配置合并更新（容器模式）**  <a name="modbus-rtu-protocol-adapter-configuration-example-container-mode"></a>

```
{
  "lambdaExecutionParameters": {
    "EnvironmentVariables": {
      "ModbusLocalPort": "/dev/ttyS2"
    }
  },
  "containerMode": "GreengrassContainer",
  "containerParams": {
    "devices": {
      "0": {
        "path": "/dev/ttyS2",
        "permission": "rw",
        "addGroupOwner": true
      }
    }
  }
}
```

**Example 示例：配置合并更新（无容器模式）**  <a name="modbus-rtu-protocol-adapter-configuration-example-no-container-mode"></a>

```
{
  "lambdaExecutionParameters": {
    "EnvironmentVariables": {
      "ModbusLocalPort": "/dev/ttyS2"
    }
  },
  "containerMode": "NoContainer"
}
```

------
#### [ v2.0.x ]

`lambdaParams`  
包含此组件的 Lambda 函数参数的对象。该对象包含以下信息：    
`EnvironmentVariables`  
包含 Lambda 函数的参数的对象。该对象包含以下信息：    
`ModbusLocalPort`  <a name="modbus-rtu-protocol-adapter-configuration-modbuslocalport"></a>
核心设备上的物理 Modbus 串行端口的绝对路径，例如 `/dev/ttyS2`。  
要在容器中运行此组件，必须将此路径定义为该组件可以访问的系统设备（在 `containerParams.devices` 中）。默认情况下，此组件在容器中运行。  
此组件必须有权 read/write 访问该设备。

`containerMode`  <a name="modbus-rtu-protocol-adapter-configuration-containermode"></a>
（可选）此组件的容器化模式。从以下选项中进行选择：  
+ `GreengrassContainer`— 该组件在 AWS IoT Greengrass 容器内的隔离运行时环境中运行。

  如果指定此选项，则必须指定系统设备（在 `containerParams.devices` 中）以允许容器访问 Modbus 设备。
+ `NoContainer` – 该组件不在隔离的运行时环境中运行。
默认值：`GreengrassContainer`

`containerParams`  <a name="modbus-rtu-protocol-adapter-configuration-containerparams"></a>
<a name="connector-component-container-params-description"></a>（可选）包含此组件的容器参数的对象。如果您为 `containerMode` 指定 `GreengrassContainer`，则该组件使用这些参数。  
该对象包含以下信息：    
`memorySize`  
<a name="connector-component-container-params-memory-size-description"></a>（可选）要分配给组件的内存量（以千字节为单位）。  
默认为 512 MB（525,312 KB）。  
`devices`  
（可选）一个对象，指定组件可以在容器中访问的系统设备。  
要在容器中运行此组件，必须指定在 `ModbusLocalPort` 环境变量中配置的系统设备。
该对象包含以下信息：    
`0` – 这是字符串形式的数组索引。  
包含以下信息的对象：    
`path`  
核心设备上系统设备的路径。此值必须与您为 `ModbusLocalPort` 配置的值相同。  
`permission`  
（可选）从容器访问系统设备的权限。此值必须为`rw`，表示该组件有权 read/write 访问系统设备。  
默认值：`rw`  
`addGroupOwner`  
（可选）是否将运行组件的系统组添加为系统设备的所有者。  
默认值：`true`

`pubsubTopics`  <a name="connector-component-pubsub-topics-parameter"></a>
（可选）包含组件订阅以接收消息的主题的对象。您可以指定每个主题以及该组件是从 AWS IoT Core 还是本地 publish/subscribe 主题订阅 MQTT 主题。  
该对象包含以下信息：    
`0` – 这是字符串形式的数组索引。  
包含以下信息的对象：    
`type`  
（可选）此组件用于订阅 publish/subscribe 消息的消息类型。从以下选项中进行选择：  
+ `PUB_SUB` – 订阅本地发布/订阅消息。如果选择此选项，主题不能包含 MQTT 通配符。有关在指定此选项时如何从自定义组件发送消息的更多信息，请参阅 [发布/订阅本地消息](ipc-publish-subscribe.md)。
+ `IOT_CORE`— 订阅 AWS IoT Core MQTT 消息。如果选择此选项，主题可以包含 MQTT 通配符。有关在指定此选项时如何从自定义组件发送消息的更多信息，请参阅 [发布/订阅 AWS IoT Core MQTT 消息](ipc-iot-core-mqtt.md)。
默认值：`PUB_SUB`  
`topic`  
（可选）组件订阅以接收消息的主题。如果您为 `type` 指定 `IotCore`，则可以在本主题中使用 MQTT 通配符（`+` 和 `#`）。

**Example 示例：配置合并更新（容器模式）**  <a name="modbus-rtu-protocol-adapter-configuration-example-container-mode"></a>

```
{
  "lambdaExecutionParameters": {
    "EnvironmentVariables": {
      "ModbusLocalPort": "/dev/ttyS2"
    }
  },
  "containerMode": "GreengrassContainer",
  "containerParams": {
    "devices": {
      "0": {
        "path": "/dev/ttyS2",
        "permission": "rw",
        "addGroupOwner": true
      }
    }
  }
}
```

**Example 示例：配置合并更新（无容器模式）**  <a name="modbus-rtu-protocol-adapter-configuration-example-no-container-mode"></a>

```
{
  "lambdaExecutionParameters": {
    "EnvironmentVariables": {
      "ModbusLocalPort": "/dev/ttyS2"
    }
  },
  "containerMode": "NoContainer"
}
```

------

## 输入数据
<a name="modbus-rtu-protocol-adapter-component-input-data"></a>

此组件接受以下主题中的 Modbus RTU 请求参数，并向设备发送 Modbus RTU 请求。<a name="connector-component-local-publish"></a>默认情况下，此组件订阅本地 publish/subscribe 消息。有关如何从您的自定义组件向此组件发布消息的更多信息，请参阅 [发布/订阅本地消息](ipc-publish-subscribe.md)。

**默认主题（本地发布/订阅）：**`modbus/adapter/request`

<a name="connector-component-input-properties"></a>消息接受以下属性。输入消息必须采用 JSON 格式。

`request`  
要发送的 Modbus RTU 请求的参数。  
请求消息的形状取决于其所表示的 Modbus RTU 请求类型。所有请求都需要具有以下属性。  
类型：包含以下信息的 `object`：    
`operation`  
要运行的操作的名称。例如，指定 `ReadCoilsRequest` 在 Modbus RTU 设备上读取线圈。有关支持的操作的更多信息，请参阅[Modbus RTU 请求和响应](#modbus-rtu-protocol-adapter-component-requests-responses)。  
类型：`string`  
`device`  
请求的目标设备。  
此值必须为介于 `0` 和 `247` 之间的整数。  
类型：`integer`
要包含在请求中的其他参数取决于操作。此组件处理[循环冗余校验（CRC）](https://en.wikipedia.org/wiki/Cyclic_redundancy_check)，以验证您的数据请求。  
如果您的请求包含 `address` 属性，则必须将其值指定为整数。例如 `"address": 1`。

`id`  <a name="connector-component-input-property-id"></a>
请求的任意 ID。使用此属性将输入请求映射到输出响应。指定此属性时，组件会将响应对象中的 `id` 属性设置为该值。  
类型：`string`

**Example 示例输入：读取线圈请求**  

```
{
  "request": {
    "operation": "ReadCoilsRequest",
    "device": 1,
    "address": 1,
    "count": 1
  },
  "id": "MyRequest"
}
```

## 输出数据
<a name="modbus-rtu-protocol-adapter-component-output-data"></a>

 <a name="connector-component-output-data"></a>默认情况下，此组件会将响应作为输出数据发布至以下 MQTT 主题。您必须在[旧版订阅路由器组件](legacy-subscription-router-component.md)的配置中将主题指定为 `subject`。有关如何在自定义组件中订阅此主题消息的更多信息，请参阅 [发布/订阅 AWS IoT Core MQTT 消息](ipc-iot-core-mqtt.md)。

**默认主题 (AWS IoT Core MQTT)：**`modbus/adapter/response`

响应消息的形状取决于请求操作和响应状态。有关示例，请参阅 [示例请求和响应](#modbus-rtu-protocol-adapter-component-examples)。

每个响应均包括以下属性：

`response`  
来自 Modbus RTU 设备的响应。  
类型：包含以下信息的 `object`：    
`status`  
请求的状态。状态可以是以下值之一：  
+ `Success` – 请求有效，组件已将请求发送至 Modbus RTU 网络且 Modbus RTU 网络返回了响应。
+ `Exception` – 请求有效，组件已将请求发送至 Modbus RTU 网络且 Modbus RTU 网络返回了异常。有关更多信息，请参阅 [响应状态：异常](#modbus-rtu-protocol-adapter-component-response-exception)。
+ `No Response` – 请求无效，组件在向 Modbus RTU 网络发送请求之前发现了错误。有关更多信息，请参阅 [响应状态：无响应](#modbus-rtu-protocol-adapter-component-response-noresponse)。  
`operation`  
组件请求的操作。  
`device`  
组件发送请求的设备。  
`payload`  
来自 Modbus RTU 设备的响应。如果 `status` 为 `No Response`，则该对象只包含一个 `error` 属性及错误的描述（例如 `[Input/Output] No Response received from the remote unit`）。

`id`  
请求的 ID，可以使用它来识别哪个响应与哪个请求相对应。

**注意**  
写入操作的响应只不过是对请求的回显。尽管写入响应不包含有意义的信息，但最好还是检查一下响应的状态以查看请求是成功还是失败。

**Example 示例输出：成功**  

```
{
  "response" : {
    "status" : "success",
    "device": 1,
    "operation": "ReadCoilsRequest",
    "payload": {
      "function_code": 1,
      "bits": [1]
    }
  },
  "id" : "MyRequest"
}
```

**Example 示例输出：失败**  

```
{
  "response" : {
    "status" : "fail",
    "error_message": "Internal Error",
    "error": "Exception",
    "device": 1,
    "operation": "ReadCoilsRequest",
    "payload": {
      "function_code": 129,
      "exception_code": 2
    }
  },
  "id" : "MyRequest"
}
```

有关更多示例，请参阅[示例请求和响应](#modbus-rtu-protocol-adapter-component-examples)。

## Modbus RTU 请求和响应
<a name="modbus-rtu-protocol-adapter-component-requests-responses"></a>

此连接器接受 Modbus RTU 请求参数作为[输入数据](#modbus-rtu-protocol-adapter-component-input-data)，并发布响应作为[输出数据](#modbus-rtu-protocol-adapter-component-output-data)。

支持以下常见操作。


| 请求中的操作名称 | 响应中的函数代码 | 
| --- | --- | 
| ReadCoilsRequest | 01 | 
| ReadDiscreteInputsRequest | 02 | 
| ReadHoldingRegistersRequest | 03 | 
| ReadInputRegistersRequest | 04 | 
| WriteSingleCoilRequest | 05 | 
| WriteSingleRegisterRequest | 06 | 
| WriteMultipleCoilsRequest | 15 | 
| WriteMultipleRegistersRequest | 16 | 
| MaskWriteRegisterRequest | 22 | 
| ReadWriteMultipleRegistersRequest | 23 | 

### 示例请求和响应
<a name="modbus-rtu-protocol-adapter-component-examples"></a>

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

读取线圈  
**请求示例：**  

```
{
  "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"
}
```
响应包括组件读取的寄存器。

### 响应状态：异常
<a name="modbus-rtu-protocol-adapter-component-response-exception"></a>

当请求格式有效但请求未成功完成时，可能会发生异常。在此情况下，响应将包含以下信息：
+ `status` 设置为 `Exception`。
+ `function_code` 等于请求的函数代码 \$1 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"
}
```

### 响应状态：无响应
<a name="modbus-rtu-protocol-adapter-component-response-noresponse"></a>

该连接器对 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"
}
```

## 本地日志文件
<a name="modbus-rtu-protocol-adapter-component-log-file"></a>

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

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

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

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

## 许可证
<a name="modbus-rtu-protocol-adapter-component-licenses"></a>

此组件包含以下第三方软件/许可：
+ [pymodbus](https://github.com/riptideio/pymodbus/blob/master/README.rst)/BSD 许可证
+ [pyserial](https://github.com/pyserial/pyserial)/BSD 许可证

<a name="component-core-software-license"></a>此组件在 [Greengrass Core 软件许可协议](https://greengrass-release-license.s3.us-west-2.amazonaws.com/greengrass-license-v1.pdf)下发行。

## 更改日志
<a name="modbus-rtu-protocol-adapter-component-changelog"></a>

下表介绍每个组件版本的更改。


|  **版本**  |  **更改**  | 
| --- | --- | 
|  2.1.11  | Greengrass nucleus 版本 2.15.0 版本的版本已更新。 | 
|  2.1.10  | Greengrass nucleus 版本 2.14.0 版本的版本已更新。 | 
|  2.1.9  | 对 Greengrass Nucleus 版本 2.13.0 发行版进行了版本更新。 | 
|  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  | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/greengrass/v2/developerguide/modbus-rtu-protocol-adapter-component.html) | 
|  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  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/greengrass/v2/developerguide/modbus-rtu-protocol-adapter-component.html)  | 
|  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  |  初始版本。  | 