Modbus-RTU プロトコルアダプタコネクタ - AWS IoT Greengrass

AWS IoT Greengrass Version 1 は、2023 年 6 月 30 日に延長ライフフェーズに入りました。詳細については、「AWS IoT Greengrass V1 メンテナンスポリシー」を参照してください。この日以降、 AWS IoT Greengrass V1 は機能、機能強化、バグ修正、またはセキュリティパッチを提供する更新をリリースしません。で実行されるデバイスは中断 AWS IoT Greengrass V1 されず、引き続き運用され、クラウドに接続されます。への移行 AWS IoT Greengrass Version 2を強くお勧めします。これにより、重要な新機能が追加され、追加のプラットフォーム がサポートされます

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Modbus-RTU プロトコルアダプタコネクタ

Modbus-RTU プロトコルアダプタコネクタは、AWS IoT Greengrass グループにある Modbus RTU デバイスの情報をポーリングします。

このコネクタは、ユーザー定義の Lambda 関数からの Modbus RTU リクエストのパラメータを受け取ります。その後、対応するリクエストを送信し、MQTT メッセージとしてターゲットデバイスからのレスポンスを発行します。

このコネクタには、次のバージョンがあります。

バージョン

ARN

3

arn:aws:greengrass:region::/connectors/ModbusRTUProtocolAdapter/versions/3

2

arn:aws:greengrass:region::/connectors/ModbusRTUProtocolAdapter/versions/2

1

arn:aws:greengrass:region::/connectors/ModbusRTUProtocolAdapter/versions/1

バージョンの変更については、「Changelog」を参照してください。

要件

このコネクタには以下の要件があります。

Version 3
  • AWS IoT Greengrass Core ソフトウェア v1.9.3 以降。

  • Python バージョン 3.7 または 3.8 が Core デバイスにインストールされ、PATH 環境変数に追加されている。

    注記

    Python 3.8 を使用するには、次のコマンドを実行して、Python 3.7 のデフォルトのインストールフォルダからインストール済みの Python 3.8 バイナリへのシンボリックリンクを作成します。

    sudo ln -s path-to-python-3.8/python3.8 /usr/bin/python3.7

    これにより、AWS IoT Greengrass の Python 要件を満たすようにデバイスが設定されます。

  • AWS IoT Greengrass コアと Modbus デバイスとの物理接続。Core はシリアルポート (USB ポートなど) を介して Modbus RTU ネットワークに物理的に接続する必要があります。

  • 物理 Modbus シリアルポートを参照する、Greengrass グループのローカルデバイスリソース

  • このコネクタに Modbus RTU リクエストパラメータを送信するユーザー定義の Lambda 関数。リクエストパラメータは、想定されるパターンに従い、Modbus RTU ネットワーク上のターゲットデバイスの ID とアドレスを含む必要があります。詳細については、「入力データ」を参照してください。

Versions 1 - 2
  • AWS IoT Greengrass Core ソフトウェア v1.7 以降。

  • Python バージョン 2.7 が Core デバイスにインストールされ、PATH 環境変数に追加されている。

  • AWS IoT Greengrass コアと Modbus デバイスとの物理接続。Core はシリアルポート (USB ポートなど) を介して Modbus RTU ネットワークに物理的に接続する必要があります。

  • 物理 Modbus シリアルポートを参照する、Greengrass グループのローカルデバイスリソース

  • このコネクタに Modbus RTU リクエストパラメータを送信するユーザー定義の Lambda 関数。リクエストパラメータは、想定されるパターンに従い、Modbus RTU ネットワーク上のターゲットデバイスの ID とアドレスを含む必要があります。詳細については、「入力データ」を参照してください。

コネクタパラメータ

このコネクタでは、以下のパラメータがサポートされています。

ModbusSerialPort-ResourceId

物理 Modbus シリアルポートを表すローカルデバイスリソースの ID。

注記

このコネクタには、リソースへの読み取りと書き込みアクセスが付与されています。

AWS IoT コンソールでの表示名: [Modbus serial port resource] (Modbus シリアルポートリソース)

必須: true

タイプ: string

有効なパターン: .+

ModbusSerialPort

デバイス上の物理 Modbus シリアルポートへの絶対パス。これは、Modbus ローカルデバイスリソース用に指定されたソースパスです。

AWS IoT コンソールでの表示名: [Source path of Modbus serial port resource] (Modbus シリアルポートリソースのソースパス)

必須: true

タイプ: string

有効なパターン: .+

サンプルコネクタを作成する (AWS CLI)

以下の CLI コマンドは、Modbus-RTU プロトコルアダプタコネクタを含む初期バージョンで ConnectorDefinition を作成します。

aws greengrass create-connector-definition --name MyGreengrassConnectors --initial-version '{ "Connectors": [ { "Id": "MyModbusRTUProtocolAdapterConnector", "ConnectorArn": "arn:aws:greengrass:region::/connectors/ModbusRTUProtocolAdapter/versions/3", "Parameters": { "ModbusSerialPort-ResourceId": "MyLocalModbusSerialPort", "ModbusSerialPort": "/path-to-port" } } ] }'
注記

このコネクタの Lambda 関数には存続期間の長いライフサイクルがあります。

AWS IoT Greengrass コンソールでは、グループの [Connectors] (コネクタ) ページからコネクタを追加できます。詳細については、「Greengrass コネクタの開始方法 (コンソール)」を参照してください。

注記

Modbus-RTU プロトコルアダプタコネクタをデプロイした後、AWS IoT Things Graph を使用して、グループ内のデバイス間のやり取りを調整できます。詳細については、「AWS IoT Things Graph ユーザーガイド」の「Modbus」を参照してください。

入力データ

このコネクタは、ユーザー定義の Lambda 関数から MQTT トピックに対する Modbus RTU リクエストのパラメータを受け取ります。入力メッセージは JSON 形式である必要があります。

サブスクリプションのトピックフィルター

modbus/adapter/request

メッセージのプロパティ

リクエストメッセージは、Modbus RTU リクエストのタイプによって異なります。以下のプロパティはすべてのリクエストに必須です。

  • request オブジェクト:

    • operation。実行するオペレーションの名前。例えば、コイルを読み取るには "operation": "ReadCoilsRequest" を指定します。この値は Unicode 文字列であることが必要です。サポートされているオペレーションについては、「Modbus RTU のリクエストとレスポンス」を参照してください。

    • device。リクエストのターゲットデバイス。これは 0 - 247 のいずれかの値であることが必要です。

  • id プロパティ。リクエストの ID。この値は、データ重複除外に使用され、エラーレスポンスを含むすべてのレスポンスの id プロパティでそのまま返されます。この値は Unicode 文字列であることが必要です。

注記

リクエストにアドレスフィールドが含まれている場合は、値を整数で指定する必要があります。例えば、"address": 1 です。

リクエストに含まれるその他のパラメータはオペレーションによって異なります。個別に処理される CRC を除くすべてのリクエストパラメータは必須です。例については、「リクエストとレスポンスの例」を参照してください。

入力例: コイルの読み取りリクエスト
{ "request": { "operation": "ReadCoilsRequest", "device": 1, "address": 1, "count": 1 }, "id": "TestRequest" }

出力データ

このコネクタは、受信 Modbus RTU リクエストへのレスポンスを発行します。

サブスクリプションのトピックフィルター

modbus/adapter/response

メッセージのプロパティ

レスポンスメッセージの形式は、対応するリクエストとレスポンスステータスによって異なります。例については、「リクエストとレスポンスの例」を参照してください。

注記

書き込みオペレーションのレスポンスはリクエストのエコーのみです。書き込みレスポンスで意味のある情報は返されませんが、レスポンスのステータスを確認することをお勧めします。

レスポンスごとに、以下のプロパティが含まれます。

  • response オブジェクト:

    • status。リクエストのステータス。ステータスは、次のいずれかの値になります。

      • Success。リクエストは有効で、Modbus RTU ネットワークに送信され、レスポンスが返されました。

      • Exception。リクエストは有効で、Modbus RTU ネットワークに送信され、例外レスポンスが返されました。詳細については、「レスポンスステータス: 例外」を参照してください。

      • No Response。リクエストは無効で、リクエストが Modbus RTU ネットワークを介して送信される前にコネクタがエラーを検出しました。詳細については、「レスポンスステータス: No Response」を参照してください。

    • device。リクエストが送信されたデバイス。

    • operation。送信されたリクエストのタイプ。

    • payload。返されたレスポンスの内容。statusNo Response の場合、このオブジェクトには error プロパティがエラーの説明 ("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" : "TestRequest" }
出力例: 失敗
{ "response" : { "status" : "fail", "error_message": "Internal Error", "error": "Exception", "device": 1, "operation": "ReadCoilsRequest", "payload": { "function_code": 129, "exception_code": 2 } }, "id" : "TestRequest" }

その他の例については、「リクエストとレスポンスの例」を参照してください。

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" }
書き込みレジスタのマスク

リクエストの例:

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

このレスポンスで返されるレジスタは読み取り元のレジスタです。

リクエスト書式が有効で、リクエストが正常に完了していない場合、例外が発生している可能性があります。この場合、レスポンスには以下の情報が含まれています。

  • statusException に設定されています。

  • 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 リクエストの検証チェックを実行します。例えば、無効な書式や不足しているフィールドがないかどうかを確認します。検証に失敗すると、コネクタはリクエストを送信しません。代わりに、以下の情報を含むレスポンスを返します。

  • statusNo 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 <type 'int'>, got <type 'str'>" } }, "id" : "TestRequest" }

リクエストのターゲットデバイスが存在しない場合、または Modbus RTU ネットワークが機能していない場合、No Response 形式を使用する 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" }

使用例

コネクタの試用に利用できる Python 3.7 Lambda 関数の例を設定するには、次のステップ (概要) を使用します。

注記
  1. コネクタの要件を満たしていることを確認します。

  2. 入力データをコネクタに送信する Lambda 関数を作成して発行します。

    サンプルコードを PY ファイルとして保存します。AWS IoT Greengrass Core SDK for Python をダウンロードして解凍します。次に、PY ファイルとルートレベルの greengrasssdk フォルダを含む zip パッケージを作成します。この zip パッケージは、AWS Lambda にアップロードするデプロイパッケージです。

    Python 3.7 Lambda 関数を作成したら、関数バージョンを公開し、エイリアスを作成します。

  3. Greengrass グループを設定します。

    1. エイリアスで Lambda 関数を追加します (推奨)。Lambda ライフサイクルを長期間有効に (または CLI で "Pinned": true に) 設定します。

    2. 必要なローカルデバイスリソースを追加し、Lambda 関数への読み取り/書き込みアクセスを許可します。

    3. コネクタを追加し、そのパラメータを設定します。

    4. コネクタが入力データを受信し、サポートされているトピックフィルターで出力データを送信できるようにするサブスクリプションを追加します。

      • Lambda 関数をソースに、コネクタをターゲットに設定し、サポートされている入力トピックフィルターを使用します。

      • コネクタをソースとして、AWS IoT Core をターゲットとして設定し、サポートされている出力トピックフィルターを使用します。このサブスクリプションを使用して、AWS IoT コンソールでステータスメッセージを表示します。

  4. グループをデプロイします。

  5. AWS IoT コンソールの [Test] (テスト) ページで、出力データトピックをサブスクライブして、コネクタからのステータスメッセージを表示します。この例の Lambda 関数は長期間有効であり、グループがデプロイされた直後にメッセージの送信を開始します。

    テストが終了したら、Lambda ライフサイクルをオンデマンドに (または CLI で "Pinned": false に) 設定して、グループをデプロイできます。これにより、関数がメッセージの送信を停止します。

次の例では、Lambda 関数で入力メッセージをコネクタに送信します。

import greengrasssdk import json TOPIC_REQUEST = 'modbus/adapter/request' # Creating a greengrass core sdk client iot_client = greengrasssdk.client('iot-data') def create_read_coils_request(): request = { "request": { "operation": "ReadCoilsRequest", "device": 1, "address": 1, "count": 1 }, "id": "TestRequest" } return request def publish_basic_request(): iot_client.publish(payload=json.dumps(create_read_coils_request()), topic=TOPIC_REQUEST) publish_basic_request() def lambda_handler(event, context): return

ライセンス

Modbus-RTU プロトコルアダプタコネクタには、以下のサードパーティーのソフトウェアおよびライセンスが含まれています。

このコネクタは、Greengrass Core ソフトウェアライセンス契約に従ってリリースされます。

変更ログ

次の表に、コネクタの各バージョンにおける変更点を示します。

バージョン

変更

3

Lambda ランタイムを Python 3.7 にアップグレードしたことで、ランタイム要件が変更。

2

AWS リージョン のサポートを目的にコネクタ ARN を更新。

エラーログ記録を改良しました。

1

初回リリース。

Greengrass グループには、一度に 1 つのバージョンのコネクタしか含めることができません。コネクタのバージョンのアップグレードについては、「コネクタのバージョンのアップグレード」を参照してください。

以下も参照してください。