Connettore Modbus-RTU - AWS IoT Greengrass

AWS IoT Greengrass Version 1 è entrato nella fase di estensione della vita utile il 30 giugno 2023. Per ulteriori informazioni, consulta la politica AWS IoT Greengrass V1 di manutenzione. Dopo questa data, AWS IoT Greengrass V1 non rilascerà aggiornamenti che forniscano funzionalità, miglioramenti, correzioni di bug o patch di sicurezza. I dispositivi che funzionano AWS IoT Greengrass V1 non subiranno interruzioni e continueranno a funzionare e a connettersi al cloud. Ti consigliamo vivamente di eseguire la migrazione a AWS IoT Greengrass Version 2, che aggiunge nuove importanti funzionalità e supporto per piattaforme aggiuntive.

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Connettore Modbus-RTU

Il convertitore di protocollo Modbus-RTUconnettoreesegue il polling dei dispositivi RTU Modbus che si trovano nellaAWS IoT GreengrassGruppo.

Questo connettore riceve i parametri per una richiesta RTU Modbus da da una funzione Lambda definita dall'utente. Invia la richiesta corrispondente e quindi pubblica la risposta dal dispositivo di destinazione come messaggio MQTT.

Questo connettore dispone delle versioni seguenti.

Versione

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

Per informazioni sulle modifiche di ogni versione, consulta Changelog.

Requisiti

Questo connettore presenta i seguenti requisiti:

Version 3
  • Software AWS IoT Greengrass Core v1.9.3 o versioni successive.

  • Pitoneversione 3.7 o 3.8 installata sul dispositivo core e aggiunta alla variabile di ambiente PATH.

    Nota

    Per utilizzare Python 3.8, eseguire il seguente comando per creare un collegamento simbolico dalla cartella di installazione predefinita di Python 3.7 ai binari Python 3.8 installati.

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

    Questo configura il dispositivo in modo che soddisfi il requisito Python per AWS IoT Greengrass.

  • Una connessione fisica fraAWS IoT Greengrasscore e i dispositivi Modbus. Il core deve essere fisicamente connesso alla rete RTU Modbus attraverso una porta seriale (ad esempio, una porta USB).

  • UNresource (Risorsa perifericanel gruppo Greengrass che punti alla porta seriale Modbus fisica.

  • Una funzione Lambda definita dall'utente che invia i parametri per una richiesta RTU Modbus a questo connettore. I parametri della richiesta devono essere conformi agli schemi previsti e devono includere gli ID e gli indirizzi dei dispositivi di destinazione nella rete RTU Modbus. Per ulteriori informazioni, consulta la pagina Dati di input .

Versions 1 - 2
  • AWS IoT GreengrassSoftware Core v1.7 o versioni successive.

  • Pitoneversione 2.7 installata sul dispositivo core e aggiunta alla variabile di ambiente PATH.

  • Una connessione fisica fraAWS IoT Greengrasscore e i dispositivi Modbus. Il core deve essere fisicamente connesso alla rete RTU Modbus attraverso una porta seriale (ad esempio, una porta USB).

  • UNresource (Risorsa perifericanel gruppo Greengrass che punti alla porta seriale Modbus fisica.

  • Una funzione Lambda definita dall'utente che invia i parametri per una richiesta RTU Modbus a questo connettore. I parametri della richiesta devono essere conformi agli schemi previsti e devono includere gli ID e gli indirizzi dei dispositivi di destinazione nella rete RTU Modbus. Per ulteriori informazioni, consulta la pagina Dati di input .

Parametri del connettore

Questo connettore supporta i seguenti parametri:

ModbusSerialPort-ResourceId

L'ID della risorsa del dispositivo locale fisico che rappresenta la porta seriale Modbus fisica.

Nota

Al connettore è concesso l'accesso in lettura e scrittura alla risorsa.

Nome visualizzato nellaAWS IoTConsole : Risorsa porta seriale Modbus

Campo obbligatoriotrue

Tipo: string

Modello valido:.+

ModbusSerialPort

Il percorso assoluto della porta seriale Modbus fisica sul dispositivo. Si tratta del percorso di origine specificato per la risorsa del dispositivo locale Modbus.

Nome visualizzato nellaAWS IoTConsole : Percorso di origine della risorsa porta seriale Modbus

Campo obbligatoriotrue

Tipo: string

Modello valido:.+

Esempio di creazione di un connettore (AWS CLI)

Il seguente comando dell'interfaccia a riga di comando creaConnectorDefinitioncon una versione iniziale che contiene il connettore Modbus-RTU.

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" } } ] }'
Nota

La funzione Lambda in questo connettore ha undi lunga durataciclo di vita.

NellaAWS IoT Greengrassconsole, è possibile aggiungere un connettore dal gruppoConnettori(Certificato creato). Per ulteriori informazioni, consulta la pagina Nozioni di base sui connettori Greengrass (console) .

Nota

Dopo aver distribuito il connettore Modbus-RTU diAWS IoT Things Graphper orchestrare le interazioni fra i dispositivi del tuo gruppo. Per ulteriori informazioni, consulta Modbus nella AWS IoT Things GraphGuida per l'utente.

Dati di input

Questo connettore accetta i parametri per una richiesta RTU Modbus da una funzione Lambda definita dall'utente in un argomento MQTT. I messaggi di input devono essere in formato JSON.

Filtro argomento in sottoscrizione

modbus/adapter/request

Proprietà dei messaggi

Il messaggio di richiesta varia in base al tipo di richiesta RTU Modbus che rappresenta. Le seguenti proprietà sono necessarie per tutte le richieste:

  • Nell'oggetto request:

    • operation. Nome dell'operazione da eseguire. Ad esempio, specificare "operation": "ReadCoilsRequest" per leggere i nastri. Questo valore deve essere una stringa Unicode. Per le operazioni supportate, consulta Richieste e risposte RTU Modbus.

    • device. Il dispositivo di destinazione della richiesta. Questo valore deve essere compreso tra 0 - 247.

  • La proprietà id. L'ID della richiesta. Tale valore viene utilizzato per la deduplicazione dei dati e viene restituito come è nella proprietà id di tutte le risposte, incluse quelle di errore. Questo valore deve essere una stringa Unicode.

Nota

Se la richiesta include un campo indirizzo, è necessario specificare il valore come numero intero. Ad esempio, "address": 1.

Gli altri parametri di includere nella richiesta variano a seconda dell'operazione. Tutti i parametri della richiesta sono necessari tranne il CRC, che viene gestito separatamente. Per alcuni esempi, consulta Richieste e risposte di esempio.

Input di esempio: Richiesta lettura
{ "request": { "operation": "ReadCoilsRequest", "device": 1, "address": 1, "count": 1 }, "id": "TestRequest" }

Dati di output

Questo connettore pubblica le risposte nelle richieste RTU Modbus in entrata.

Filtro argomento in sottoscrizione

modbus/adapter/response

Proprietà dei messaggi

Il formato del messaggio di risposta varia in base alla richiesta corrispondente e allo stato della risposta. Per alcuni esempi, consulta Richieste e risposte di esempio.

Nota

Una risposta a un'operazione di scrittura è semplicemente un eco della richiesta. Benché non vengano restituite informazioni rilevanti per le risposte in scrittura, è buona prassi controllare lo stato della risposta.

Ogni risposta include le seguenti proprietà:

  • Nell'oggetto response:

    • status. Stato della richiesta. Lo stato può avere uno dei seguenti valori:

      • Success. La richiesta era valida, è stata inviata alla rete RTU Modbus ed è stata restituita una risposta.

      • Exception. La richiesta era valida, è stata inviata alla rete RTU Modbus ed è stata restituita una risposta di eccezione. Per ulteriori informazioni, consulta la pagina Stato risposta: Eccezione .

      • No Response. La richiesta non era valida e il connettore ha rilevato l'errore prima che la richiesta fosse inviata sulla rete RTU Modbus. Per ulteriori informazioni, consulta la pagina Stato risposta: nessuna risposta .

    • device. Il dispositivo a cui è stata inviata la richiesta.

    • operation. Il tipo di richiesta inviata.

    • payload. Il contenuto della risposta restituito. Se lo status è No Response, questo oggetto contiene solo una proprietà error con la descrizione dell'errore (ad esempio, "error": "[Input/Output] No Response received from the remote unit").

  • La proprietà id. L'ID della richiesta, utilizzato per la deduplicazione dei dati.

Output di esempio: Riuscito
{ "response" : { "status" : "success", "device": 1, "operation": "ReadCoilsRequest", "payload": { "function_code": 1, "bits": [1] } }, "id" : "TestRequest" }
Output di esempio: Errore
{ "response" : { "status" : "fail", "error_message": "Internal Error", "error": "Exception", "device": 1, "operation": "ReadCoilsRequest", "payload": { "function_code": 129, "exception_code": 2 } }, "id" : "TestRequest" }

Per ulteriori esempi, consulta Richieste e risposte di esempio.

Richieste e risposte RTU Modbus

Questo connettore accetta i parametri della richiesta RTU Modbus come dati di input e pubblica le risposte come dati di output.

Sono supportate le seguenti operazioni comuni.

Nome dell'operazione nella richiesta Codice della funzione in risposta
ReadCoilsRequest 01
ReadDiscreteInputsRequest 02
ReadHoldingRegistersRequest 03
ReadInputRegistersRequest 04
WriteSingleCoilRequest 05
WriteSingleRegisterRequest 06
WriteMultipleCoilsRequest 15
WriteMultipleRegistersRequest 16
MaskWriteRegisterRequest 22
ReadWriteMultipleRegistersRequest 23

Di seguito sono riportate alcune richieste e risposte di esempio per le operazioni supportate.

Lettura nastri

Esempio di richiesta:

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

Esempio di risposta:

{ "response": { "status": "success", "device": 1, "operation": "ReadCoilsRequest", "payload": { "function_code": 1, "bits": [1] } }, "id" : "TestRequest" }
Lettura di input discreti

Esempio di richiesta:

{ "request": { "operation": "ReadDiscreteInputsRequest", "device": 1, "address": 1, "count": 1 }, "id": "TestRequest" }

Esempio di risposta:

{ "response": { "status": "success", "device": 1, "operation": "ReadDiscreteInputsRequest", "payload": { "function_code": 2, "bits": [1] } }, "id" : "TestRequest" }
Lettura registri di sospensione

Esempio di richiesta:

{ "request": { "operation": "ReadHoldingRegistersRequest", "device": 1, "address": 1, "count": 1 }, "id": "TestRequest" }

Esempio di risposta:

{ "response": { "status": "success", "device": 1, "operation": "ReadHoldingRegistersRequest", "payload": { "function_code": 3, "registers": [20,30] } }, "id" : "TestRequest" }
Lettura registri di input

Esempio di richiesta:

{ "request": { "operation": "ReadInputRegistersRequest", "device": 1, "address": 1, "value": 1 }, "id": "TestRequest" }
Scrittura nastro singolo

Esempio di richiesta:

{ "request": { "operation": "WriteSingleCoilRequest", "device": 1, "address": 1, "value": 1 }, "id": "TestRequest" }

Esempio di risposta:

{ "response": { "status": "success", "device": 1, "operation": "WriteSingleCoilRequest", "payload": { "function_code": 5, "address": 1, "value": true } }, "id" : "TestRequest"
Scrittura registro singolo

Esempio di richiesta:

{ "request": { "operation": "WriteSingleRegisterRequest", "device": 1, "address": 1, "value": 1 }, "id": "TestRequest" }
Scrittura di più nastri

Esempio di richiesta:

{ "request": { "operation": "WriteMultipleCoilsRequest", "device": 1, "address": 1, "values": [1,0,0,1] }, "id": "TestRequest" }

Esempio di risposta:

{ "response": { "status": "success", "device": 1, "operation": "WriteMultipleCoilsRequest", "payload": { "function_code": 15, "address": 1, "count": 4 } }, "id" : "TestRequest" }
Scrittura di più registri

Esempio di richiesta:

{ "request": { "operation": "WriteMultipleRegistersRequest", "device": 1, "address": 1, "values": [20,30,10] }, "id": "TestRequest" }

Esempio di risposta:

{ "response": { "status": "success", "device": 1, "operation": "WriteMultipleRegistersRequest", "payload": { "function_code": 23, "address": 1, "count": 3 } }, "id" : "TestRequest" }
Mascheramento dei registri di scrittura

Esempio di richiesta:

{ "request": { "operation": "MaskWriteRegisterRequest", "device": 1, "address": 1, "and_mask": 175, "or_mask": 1 }, "id": "TestRequest" }

Esempio di risposta:

{ "response": { "status": "success", "device": 1, "operation": "MaskWriteRegisterRequest", "payload": { "function_code": 22, "and_mask": 0, "or_mask": 8 } }, "id" : "TestRequest" }
Scrittura/lettura di più registri

Esempio di richiesta:

{ "request": { "operation": "ReadWriteMultipleRegistersRequest", "device": 1, "read_address": 1, "read_count": 2, "write_address": 3, "write_registers": [20,30,40] }, "id": "TestRequest" }

Esempio di risposta:

{ "response": { "status": "success", "device": 1, "operation": "ReadWriteMultipleRegistersRequest", "payload": { "function_code": 23, "registers": [10,20,10,20] } }, "id" : "TestRequest" }
Nota

I registri restituiti in questa risposta sono quelli che vengono letti.

Le eccezioni possono verificarsi se il formato della richiesta è valido, ma la richiesta non è stata completata. In questo caso, la risposta contiene le seguenti informazioni:

  • Lo status è impostato su Exception.

  • function_code è pari al codice della funzione della richiesta + 128.

  • exception_code contiene il codice dell'eccezione. Per ulteriori informazioni sull'eccezione , consulta Codici delle eccezioni Modbus.

Esempio:

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

Questo connettore esegue controlli di convalida sulla richiesta Modbus. Ad esempio, verifica l'eventuale presenza di formati non validi e campi non compilati. Se la convalida ha esito negativo, il connettore non invia la richiesta. Al contrario, restituirà una risposta contenente le seguenti informazioni:

  • Lo status è impostato su No Response.

  • Laerrorcontiene il motivo dell'errore.

  • error_message contiene il messaggio dell'errore.

Esempi:

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

Se la richiesta è destinata a un dispositivo inesistente o se la rete RTU Modbus non funziona, potrebbe venire restituito ModbusIOException, che utilizza il formato Nessuna risposta.

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

Esempio di utilizzo

Utilizza i seguenti passaggi di alto livello per impostare un esempio di funzione Lambda che puoi utilizzare per provare il connettore.

Nota
  1. Assicurarsi di soddisfare i requisiti per il connettore.

  2. Creare e pubblicare una funzione Lambda che invia i dati di input al connettore.

    Salvare il codice di esempio come file PY. Scarica e decomprimi ilAWS IoT GreengrassSDK for Python. Quindi, crea un pacchetto zip che contiene il file PY e la cartella greengrasssdk a livello root. Questo pacchetto zip è il pacchetto di distribuzione caricato suAWS Lambda.

    Dopo aver creato la funzione Lambda di Python 3.7, pubblica una versione della funzione e crea un alias.

  3. Configurare il gruppo Greengrass.

    1. Aggiungi la funzione Lambda con il suo alias (scelta consigliata). Configura il ciclo di vita di Lambda su"Pinned": truenella CLI).

    2. Aggiungi la risorsa periferica richiesta e concedi l'accesso in lettura/scrittura alla funzione Lambda.

    3. Aggiungere il connettore e configurarne i relativi parametri.

    4. Aggiungere sottoscrizioni che consentono al connettore di ricevere i dati di input e inviare i dati di output nei filtri degli argomenti supportati.

      • Imposta la funzione Lambda come origine, il connettore come destinazione e utilizza un filtro per l'argomento di input supportato.

      • Imposta il connettore come origine, AWS IoT Core come destinazione e utilizza un filtro per l’argomento di output supportato. Utilizza questa sottoscrizione per visualizzare i messaggi di stato nellaAWS IoTconsole.

  4. Distribuisci il gruppo.

  5. NellaAWS IoT,Test, sottoscrivi l'argomento dei dati di output per visualizzare i messaggi di stato dal connettore. La funzione Lambda di esempio ha una lunga durata e inizia a inviare messaggi immediatamente dopo la distribuzione del gruppo.

    Al termine del test, puoi impostare il ciclo di vita di Lambda su «on demand» (o"Pinned": falsenella CLI) e distribuire il gruppo. Ciò impedisce alla funzione di inviare messaggi.

Esempio

La funzione Lambda di esempio seguente invia un messaggio di input al connettore.

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

Licenze

Il connettore per il protocollo Modbus-RTU include il software e le licenze di terze parti indicati di seguito:

Questo connettore viene rilasciato sottoAccordo di licenza del software Greengrass Core.

Changelog

La tabella seguente descrive le modifiche apportate a ogni versione del connettore.

Versione

Modifiche

3

Aggiornato il runtime di Lambda a Python 3.7, che modifica il requisito di runtime.

2

ARN del connettore aggiornato perRegione AWSSupporto.

Registrazione degli errori migliorata.

1

Versione iniziale.

Un gruppo Greengrass può contenere una sola versione del connettore alla volta. Per informazioni sull'aggiornamento di una versione del connettore, consulta Aggiornamento delle versioni dei connettori.

Consulta anche