Konektor Adaptor Protokol Modbus-RTU - AWS IoT Greengrass

AWS IoT Greengrass Version 1 memasuki fase umur panjang pada 30 Juni 2023. Untuk informasi selengkapnya, lihat kebijakan AWS IoT Greengrass V1 pemeliharaan. Setelah tanggal ini, tidak AWS IoT Greengrass V1 akan merilis pembaruan yang menyediakan fitur, penyempurnaan, perbaikan bug, atau patch keamanan. Perangkat yang berjalan AWS IoT Greengrass V1 tidak akan terganggu dan akan terus beroperasi dan terhubung ke cloud. Kami sangat menyarankan Anda bermigrasi ke AWS IoT Greengrass Version 2, yang menambahkan fitur baru yang signifikan dan dukungan untuk platform tambahan.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Konektor Adaptor Protokol Modbus-RTU

Adaptor Protokol Modbus-RTU konektor polling informasi dari perangkat RTU Modbus yang ada dalam grup AWS IoT Greengrass ini.

Konektor ini menerima parameter untuk permintaan Modbus RTU dari fungsi Lambda yang ditetapkan pengguna. Ini mengirimkan permintaan yang sesuai, dan kemudian menerbitkan respon dari perangkat target sebagai pesan MQTT.

Konektor ini memiliki versi berikut.

Versi

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

Untuk informasi tentang perubahan versi, lihat Changelog.

Persyaratan

Konektor ini memiliki persyaratan sebagai berikut:

Version 3
  • AWS IoT Greengrass perangkat lunak Core v1.9.3 atau yang lebih baru.

  • Python versi 3.7 atau 3.8 diinstal pada perangkat core dan ditambahkan ke variabel lingkungan PATH.

    catatan

    Untuk menggunakan Python 3.8, jalankan perintah berikut untuk membuat link simbolik dari folder instalasi default Python 3.7 ke binari Python 3.8 yang diinstal.

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

    Ini mengonfigurasi perangkat Anda untuk memenuhi persyaratan Python untuk AWS IoT Greengrass.

  • Sebuah hubungan fisik antara core AWS IoT Greengrass dan perangkat Modbus. Core harus terhubung secara fisik ke jaringan Modbus RTU melalui port serial; sebagai contoh port USB.

  • Sebuah sumber daya perangkat lokal dalam grup Greengrass yang menunjuk ke port serial Modbus fisik.

  • Sebuah fungsi Lambda yang ditetapkan pengguna yang mengirimkan Modbus RTU permintaan parameter untuk konektor ini. Parameter permintaan harus sesuai dengan pola yang diharapkan dan termasuk ID dan alamat perangkat target pada jaringan Modbus RTU. Untuk informasi selengkapnya, lihat Data input.

Versions 1 - 2
  • AWS IoT Greengrass perangkat lunak Core v1.7 atau yang lebih baru.

  • Python versi 2.7 diinstal pada perangkat core dan ditambahkan ke variabel lingkungan PATH.

  • Sebuah hubungan fisik antara core AWS IoT Greengrass dan perangkat Modbus. Core harus terhubung secara fisik ke jaringan Modbus RTU melalui port serial; sebagai contoh port USB.

  • Sebuah sumber daya perangkat lokal dalam grup Greengrass yang menunjuk ke port serial Modbus fisik.

  • Sebuah fungsi Lambda yang ditetapkan pengguna yang mengirimkan Modbus RTU permintaan parameter untuk konektor ini. Parameter permintaan harus sesuai dengan pola yang diharapkan dan termasuk ID dan alamat perangkat target pada jaringan Modbus RTU. Untuk informasi selengkapnya, lihat Data input.

Parameter Konektor

Konektor ini mendukung parameter berikut:

ModbusSerialPort-ResourceId

ID sumber daya perangkat lokal yang mewakili fisik Modbus serial port.

catatan

Konektor ini diberikan akses baca-tulis ke sumber daya.

Nama tampilan padaAWS IoTkonsol: Sumber daya port serial Modbus

Wajib: true

Jenis: string

Pola yang valid: .+

ModbusSerialPort

Jalur absolut ke port serial Modbus fisik pada perangkat. Ini adalah jalur sumber daya yang ditentukan untuk sumber daya perangkat lokal Modbus.

Nama tampilan padaAWS IoTkonsol: Jalur sumber dari sumber daya port serial Modbus

Wajib: true

Jenis: string

Pola yang valid: .+

Buat Contoh Konektor (AWS CLI)

Perintah CLI berikut membuat ConnectorDefinition dengan versi awal yang berisi konektor Adaptor Protokol 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" } } ] }'
catatan

Fungsi Lambda dalam konektor mempunyai siklus hidup yang berumur panjang ini.

Di konsol AWS IoT Greengrass tersebut, Anda dapat menambahkan konektor dari halaman grup Konektor ini. Untuk informasi selengkapnya, lihat Memulai dengan konektor Greengrass (konsol).

catatan

Setelah Anda menerapkan konektor Adaptor Protokol Modbus-RTU, Anda dapat menggunakan AWS IoT Things Graph untuk mengatur interaksi antar perangkat dalam grup Anda. Untuk informasi lebih lanjut, lihat Modbus dalam AWS IoT Things Graph Panduan Pengguna.

Data input

Konektor ini menerima permintaan parameter Modbus RTU dari fungsi Lambda yang ditetapkan pengguna pada topik MQTT. Pesan input harus dalam format JSON.

Filter topik dalam langganan

modbus/adapter/request

Properti pesan

Pesan permintaan bervariasi berdasarkan jenis permintaan Modbus RTU yang diwakilinya. Properti berikut diperlukan untuk semua permintaan:

  • Di request objek:

    • operation. Nama operasi untuk mengeksekusi. Sebagai contoh, tentukan "operation": "ReadCoilsRequest" untuk membaca koil. Nilai ini harus string Unicode. Untuk operasi yang didukung, lihat Permintaan dan tanggapan Modbus RTU.

    • device. Perangkat target permintaan. Nilai ini harus berada dalam antara 0 - 247.

  • Properti id ini. ID untuk permintaan. Nilai ini digunakan untuk deduplikasi data dan dikembalikan seperti dalam properti id dari semua respon, termasuk respon kesalahan. Nilai ini harus string Unicode.

catatan

Jika permintaan Anda mencakup bidang alamat, Anda harus menentukan nilai sebagai bilangan bulat. Sebagai contoh, "address": 1.

Parameter lain untuk memasukkan dalam permintaan tergantung pada operasi. Semua parameter permintaan diperlukan kecuali CRC, yang ditangani secara terpisah. Sebagai contoh, lihat Contoh permintaan dan respons.

Contoh input: Baca kumparan
{ "request": { "operation": "ReadCoilsRequest", "device": 1, "address": 1, "count": 1 }, "id": "TestRequest" }

Data output

Konektor ini menerbitkan tanggapan atas permintaan Modbus RTU yang masuk.

Filter topik dalam langganan

modbus/adapter/response

Properti pesan

Format pesan respon bervariasi berdasarkan permintaan yang sesuai dan status respon. Sebagai contoh, lihat Contoh permintaan dan respons.

catatan

Sebuah respon untuk operasi menulis hanyalah gema dari permintaan. Meskipun tidak ada informasi yang berarti dikembalikan untuk menulis tanggapan, itu adalah praktik yang baik untuk memeriksa status respon.

Setiap respon mencakup properti berikut:

  • Di response objek:

    • status. Status permintaan. Status dapat menjadi salah satu dari nilai-nilai yang berikut:

      • Success. Permintaan itu valid, dikirim ke jaringan Modbus RTU, dan tanggapan dikembalikan.

      • Exception. Permintaan itu valid, dikirim ke jaringan Modbus RTU, dan respon pengecualian dikembalikan. Untuk informasi selengkapnya, lihat Status respon: Pengecualian.

      • No Response. Permintaan tidak valid, dan konektor menangkap kesalahan sebelum permintaan dikirim melalui jaringan Modbus RTU. Untuk informasi selengkapnya, lihat Status respon: Tidak ada respon.

    • device. Perangkat yang permintaan dikirim ke.

    • operation. Jenis permintaan yang dikirim.

    • payload. Isi respon yang dikembalikan. Jika status adalah No Response, objek ini hanya berisi sebuah error properti dengan deskripsi kesalahan (sebagai contoh, "error": "[Input/Output] No Response received from the remote unit").

  • Properti id ini. ID permintaan, digunakan untuk deduplikasi data.

Contoh output: Sukses
{ "response" : { "status" : "success", "device": 1, "operation": "ReadCoilsRequest", "payload": { "function_code": 1, "bits": [1] } }, "id" : "TestRequest" }
Contoh output: Gagal
{ "response" : { "status" : "fail", "error_message": "Internal Error", "error": "Exception", "device": 1, "operation": "ReadCoilsRequest", "payload": { "function_code": 129, "exception_code": 2 } }, "id" : "TestRequest" }

Untuk contoh lainnya, lihat Contoh permintaan dan respons.

Permintaan dan tanggapan Modbus RTU

Konektor ini menerima parameter permintaan Modbus RTU sebagai data input dan menerbitkan tanggapan sebagai data output.

Operasi umum berikut ini didukung.

Nama operasi dalam permintaan Kode fungsi dalam respons
ReadCoilsRequest 01
ReadDiscreteInputsRequest 02
ReadHoldingRegistersRequest 03
ReadInputRegistersRequest 04
WriteSingleCoilRequest 05
WriteSingleRegisterRequest 06
WriteMultipleCoilsRequest 15
WriteMultipleRegistersRequest 16
MaskWriteRegisterRequest 22
ReadWriteMultipleRegistersRequest 23

Berikut ini adalah contoh permintaan dan tanggapan untuk operasi yang didukung.

Baca Koil

Contoh permintaan:

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

Contoh respons:

{ "response": { "status": "success", "device": 1, "operation": "ReadCoilsRequest", "payload": { "function_code": 1, "bits": [1] } }, "id" : "TestRequest" }
Baca Input Diskrit

Contoh permintaan:

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

Contoh respons:

{ "response": { "status": "success", "device": 1, "operation": "ReadDiscreteInputsRequest", "payload": { "function_code": 2, "bits": [1] } }, "id" : "TestRequest" }
Baca Register Holding

Contoh permintaan:

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

Contoh respons:

{ "response": { "status": "success", "device": 1, "operation": "ReadHoldingRegistersRequest", "payload": { "function_code": 3, "registers": [20,30] } }, "id" : "TestRequest" }
Baca Register Input

Contoh permintaan:

{ "request": { "operation": "ReadInputRegistersRequest", "device": 1, "address": 1, "value": 1 }, "id": "TestRequest" }
Tulis Kumparan Tunggal

Contoh permintaan:

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

Contoh respons:

{ "response": { "status": "success", "device": 1, "operation": "WriteSingleCoilRequest", "payload": { "function_code": 5, "address": 1, "value": true } }, "id" : "TestRequest"
Menulis Register Tunggal

Contoh permintaan:

{ "request": { "operation": "WriteSingleRegisterRequest", "device": 1, "address": 1, "value": 1 }, "id": "TestRequest" }
Tulis Banyak Koil

Contoh permintaan:

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

Contoh respons:

{ "response": { "status": "success", "device": 1, "operation": "WriteMultipleCoilsRequest", "payload": { "function_code": 15, "address": 1, "count": 4 } }, "id" : "TestRequest" }
Tulis Banyak Register

Contoh permintaan:

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

Contoh respons:

{ "response": { "status": "success", "device": 1, "operation": "WriteMultipleRegistersRequest", "payload": { "function_code": 23, "address": 1, "count": 3 } }, "id" : "TestRequest" }
Topeng Register Menulis

Contoh permintaan:

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

Contoh respons:

{ "response": { "status": "success", "device": 1, "operation": "MaskWriteRegisterRequest", "payload": { "function_code": 22, "and_mask": 0, "or_mask": 8 } }, "id" : "TestRequest" }
Baca Tulis Banyak Register

Contoh permintaan:

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

Contoh respons:

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

Register kembali dalam respon ini adalah register yang dibaca dari.

Pengecualian dapat terjadi bila format permintaan valid, tetapi permintaan tersebut tidak berhasil diselesaikan. Dalam kasus ini, respons berisi informasi berikut:

  • status ditetapkan ke Exception.

  • function_code sama dengan kode fungsi permintaan + 128.

  • exception_code berisi kode pengecualian. Untuk informasi selengkapnya, lihat kode pengecualian Modbus.

Contoh:

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

Konektor ini melakukan pemeriksaan validasi pada permintaan Modbus. Sebagai contoh, ia memeriksa format yang tidak sah dan kolom yang hilang. Jika validasi gagal, konektor tidak akan mengirim permintaan. Sebaliknya, ia mengembalikan respon yang berisi informasi berikut:

  • Ini status diatur ke No Response.

  • Ini error berisi alasan untuk kesalahan.

  • Ini error_message berisi pesan kesalahan.

Contoh:

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

Jika permintaan menargetkan perangkat yang tidak ada atau jika jaringan Modbus RTU tidak berfungsi, Anda mungkin mendapatkan ModbusIOException, yang menggunakan format No Response.

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

Contoh Penggunaan

Gunakan langkah-langkah tingkat tinggi berikut untuk mengatur contoh fungsi Lambda Python 3.7 yang dapat Anda gunakan untuk mencoba konektor.

catatan
  1. Pastikan Anda memenuhi persyaratan untuk konektor.

  2. Buat dan terbitkan fungsi Lambda yang mengirimkan data input ke konektor.

    Simpan kode contoh sebagai file PY. Unduh dan unzip AWS IoT Greengrass Core SDK for Python. Kemudian, buat paket zip yang berisi file PY dan folder greengrasssdk dalam tingkat root. Paket zip ini adalah paket deployment yang Anda unggah ke AWS Lambda.

    Setelah Anda membuat fungsi Lambda Python 3.7, terbitkankan versi fungsi dan buat alias.

  3. Konfigurasikan grup Greengrass Anda.

    1. Tambahkan fungsi Lambda dengan aliasnya (direkomendasikan). Konfigurasikan siklus hidup Lambda sebagai berumur panjang (atau "Pinned": true dalam CLI).

    2. Tambahkan sumber daya perangkat lokal yang diperlukan dan berikan akses baca/tulis ke fungsi Lambda.

    3. Tambahkan konektor dan konfigurasikan parameter.

    4. Tambahkan langganan yang mengizinkan konektor untuk menerima data input dan mengirim data output pada filter topik yang didukung.

      • Atur fungsi Lambda sebagai sumber, konektor sebagai target, dan gunakan filter topik input yang mendukung.

      • Atur konektor sebagai sumber, AWS IoT Core sebagai target, dan gunakan filter topik input yang mendukung. Anda menggunakan langganan ini untuk melihat pesan status dalam konsol AWS IoT tersebut.

  4. Men-deploy grup.

  5. Di konsol AWS IoT tersebut, pada halaman Tes ini, berlangganan ke topik data output untuk melihat pesan status dari konektor. Contoh fungsi Lambda yang berumur panjang dan mulai mengirim pesan segera setelah grup dalam-deploy.

    Setelah selesai pengujian, Anda dapat mengatur siklus hidup Lambda ke sesuai permintaan (atau "Pinned": false dalam CLI) dan men-deploy grup. Ini menghentikan fungsi dari mengirim pesan.

Contoh

Contoh fungsi Lambda berikut mengirimkan pesan input ke konektor.

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

Lisensi

Konektor Adaptor Protokol Modbus-RTU mencakup perangkat lunak/lisensi pihak ketiga berikut:

Konektor ini dirilis di bawah Perjanjian Lisensi Perangkat lunak core Greengrass.

Changelog

Tabel berikut menjelaskan perubahan dalam setiap versi konektor.

Versi

Perubahan

3

Memperbarui waktu aktif Lambda untuk Python 3.7, yang mengubah persyaratan waktu aktif.

2

Tingkatkan konektor ARN untuk Wilayah AWS dukungan.

Pencatatan kesalahan yang ditingkatkan.

1

Pelepasan .

Sebuah grup Greengrass dapat berisi hanya satu versi konektor pada suatu waktu. Untuk informasi lebih lanjut tentang pembaruan versi konektor, lihat Versi upgrade konektor.

Lihat juga