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 |
|
2 |
|
1 |
|
バージョンの変更については、「Changelog」を参照してください。
要件
このコネクタには以下の要件があります。
コネクタパラメータ
このコネクタでは、以下のパラメータがサポートされています。
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
。返されたレスポンスの内容。status
がNo 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" }
注記
このレスポンスで返されるレジスタは読み取り元のレジスタです。
リクエスト書式が有効で、リクエストが正常に完了していない場合、例外が発生している可能性があります。この場合、レスポンスには以下の情報が含まれています。
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 <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 関数の例を設定するには、次のステップ (概要) を使用します。
注記
-
他の Python ランタイムを使用する場合は、Python 3.x から Python 3.7 へのシンボリックリンクを作成します。
-
「コネクタの使用を開始する (コンソール)」および「コネクタの使用を開始する (CLI)」トピックには、Twilio 通知コネクタの例を設定およびデプロイする方法を示す詳細なステップが含まれています。
コネクタの要件を満たしていることを確認します。
-
入力データをコネクタに送信する Lambda 関数を作成して発行します。
サンプルコードを PY ファイルとして保存します。AWS IoT Greengrass Core SDK for Python をダウンロードして解凍します。次に、PY ファイルとルートレベルの
greengrasssdk
フォルダを含む zip パッケージを作成します。この zip パッケージは、AWS Lambda にアップロードするデプロイパッケージです。Python 3.7 Lambda 関数を作成したら、関数バージョンを公開し、エイリアスを作成します。
-
Greengrass グループを設定します。
-
エイリアスで Lambda 関数を追加します (推奨)。Lambda ライフサイクルを長期間有効に (または CLI で
"Pinned": true
に) 設定します。 -
必要なローカルデバイスリソースを追加し、Lambda 関数への読み取り/書き込みアクセスを許可します。
-
コネクタを追加し、そのパラメータを設定します。
-
コネクタが入力データを受信し、サポートされているトピックフィルターで出力データを送信できるようにするサブスクリプションを追加します。
Lambda 関数をソースに、コネクタをターゲットに設定し、サポートされている入力トピックフィルターを使用します。
コネクタをソースとして、AWS IoT Core をターゲットとして設定し、サポートされている出力トピックフィルターを使用します。このサブスクリプションを使用して、AWS IoT コンソールでステータスメッセージを表示します。
-
-
グループをデプロイします。
-
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 つのバージョンのコネクタしか含めることができません。コネクタのバージョンのアップグレードについては、「コネクタのバージョンのアップグレード」を参照してください。