本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
通訊協定介面卡
Modbus-RTU 通訊協定介面卡元件 (aws.greengrass.Modbus
) 會輪詢來自本地 Modbus RTU 裝置的資訊。
若要從具有此元件的本機 Modbus RTU 裝置要求資訊,請將訊息發佈至此元件訂閱的主題。在訊息中,指定要傳送至裝置的 Modbus RTU 要求。然後,此元件會發佈包含 Modbus RTU 要求結果的回應。
注意
此元件提供與 V1 中AWS IoT Greengrass的 Modbus RTU 通訊協定介面卡連接器類似的功能。如需詳細資訊,請參閱 AWS IoT GreengrassV1 開發人員指南中的 Modbus RTU 通訊協定介面卡連接器。
版本
此元件具有下列版本:
-
2.1.x
-
2.0.x
類型
這個組件是一個 Lambda 組件(aws.greengrass.lambda
)。Greengrass 核使用 Lambda 啟動器組件運行此組件的 Lambda 函數。
如需詳細資訊,請參閱元件類型。
作業系統
此元件只能安裝在 Linux 核心裝置上。
請求
此元件具有下列需求:
-
您的核心裝置必須符合執行 Lambda 函數的需求。如果您希望核心裝置執行容器化 Lambda 函數,裝置必須符合要求才能執行。如需詳細資訊,請參閱拉姆達函數要求。
-
Python
版本 3.7 安裝在核心設備上,並添加到 PATH 環境變量中。 -
AWS IoT Greengrass核心裝置與 Modbus 裝置之間的實體連線。核心設備必須通過串口(例如 USB 端口)實際連接到 Modbus RTU 網絡。
-
若要從此元件接收輸出資料,您必須在部署此元件時,合併舊版訂閱路由器元件的下列組態更新 (
aws.greengrass.LegacySubscriptionRouter
)。此配置指定此組件發布響應的主題。如需詳細資訊,請參閱建立部署。
相依性
部署元件時,AWS IoT Greengrass也會部署其相依性的相容版本。這表示您必須符合元件及其所有相依性的需求,才能成功部署元件。本節列出此元件之已發行版本的相依性,以及定義每個相依性之元件版本的語意版本條件約束。您也可以在AWS IoT Greengrass主控台
如需有關元件相依性的詳細資訊,請參閱元件方案參考。
組態
此元件提供下列組態參數,您可以在部署元件時自訂這些參數。
注意
此元件的預設組態包括 Lambda 函數參數。建議您只編輯下列參數,以便在裝置上設定此元件。
輸入資料
此元件接受下列主題的 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
中的。如需如何在自訂元件中訂閱有關此主題之訊息的詳細資訊,請參閱發布/訂閱AWS IoT CoreMQTT 訊息。
預設主題 (AWS 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, "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" }
注意
響應包括組件讀取的寄存器。
當請求格式有效但請求未順利完成時會發生例外。在此情況下,回應包含下列資訊:
-
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
取代為AWS IoT Greengrass根資料夾的路徑。sudo tail -f
/greengrass/v2
/logs/aws.greengrass.Modbus.log
许可证
此元件包括下列協力廠商軟體/授權:
-
道總線/BSD許
可證
此元件根據 Greengrass 核心軟體
Changelog
下表說明元件每個版本中的變更。
版本 |
變更 |
---|---|
2.1.7 |
版本更新了 Greengrass 核 2.11.0 版本釋放。 |
2.1.6 |
版本更新了 Greengrass 2.10.0 版本。 |
2.1.5 |
|
2.1.4 |
版本更新 Greengrass 2.9.0 版本釋放。 |
2.1.3 |
版本更新 Greengrass 2.8.0 版本的版本。 |
2.1.2 |
版本更新了 Greengrass 核 2.7.0 版本釋放。 |
2.1.1 |
版本更新 Greengrass 2.6.0 版本的版本。 |
2.1.0 |
|
2.0.8 |
版本更新了 Greengrass 核 2.5.0 版本。 |
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 |
初始版本。 |