Sakelar sentuh dengan Modbus: mengapa diperlukan dan bagaimana menerapkannya di apartemen pintar


Dalam sistem anggaran rumah pintar, sakelar standar biasanya digunakan - jenis keluarannya juga disebut "kontak kering" . Namun, ini bukan satu-satunya pilihan: mencari sakelar yang indah, saya menemukan perangkat dengan protokol Modbus RTU di dalamnya. Selain penampilan yang indah, mereka memungkinkan Anda untuk mengkonfigurasi mode operasi setiap tombol, mengontrol cahaya latar secara detail, dan menghubungkannya ke pengontrol pusat (saya menggunakan Wiren Board 5 ), empat kabel sudah cukup - daya, ground dan dua jalur untuk RS-485.

Cara menyambungkan sakelar semacam itu dan mengonfigurasi kontrol cahaya dan ventilasi darinya, lihat di bawah. Artikel ini juga akan menjelaskan secara rinci cara bekerja dengan perangkat Modbus secara umum.

Penjelasan dari pemasar Wiren Board: Artikel ini lahir dari topik yang dibuat oleh Kallyanbl4 di forum kami . Setelah permintaan kami, ia menulis artikel lengkap dan diizinkan untuk menerbitkannya di blog kami, yang banyak terima kasih untuknya. Semua teks ditulis oleh penulis, kecuali untuk catatan di bagian akhir.

Deskripsi sakelar


Setelah mempelajari apa yang sekarang ada di pasaran, saya membeli sakelar yang menarik ini dari Cina:



Keuntungan mereka:

  • desain yang bagus;
  • sakelar sentuh, saat ditekan, berkedip, menyala dalam gelap dalam warna putih yang menyenangkan;
  • harga relatif rendah - 2.000 rubel masing-masing. Harga termasuk ukiran laser individu;
  • saklar yang dapat diprogram - Anda dapat mengatur tombol untuk hampir semua tindakan: nyalakan lampu, kontrol LED, naikkan / turunkan tirai, ...

Beralih spesifikasi:

  • tegangan suplai - 12 V;
  • kecepatan transfer data - 19200 bit / s;
  • jumlah bit yang ditransmisikan - 8;
  • jumlah bit stop - 1;
  • kontrol paritas - tidak ada verifikasi.

Ketika bekerja pada Modbus RTU, perangkat yang terhubung memiliki register yang disebut - sel di mana informasi disimpan. Dalam tangkapan layar, deskripsi register untuk sakelar empat tombol:



Ketika Anda mengklik salah satu tombol sentuh, nilai dalam register 0-3 akan berubah dari 0 menjadi 1.

Pemutus sirkuit


Pada pengontrol Wiren Board 5, tergantung pada konfigurasi, ada dua hingga empat port RS-485. Switch (dalam kasus saya ada 27 dari mereka) harus terhubung ke port ini.

Dalam hal ini, semua sakelar dapat beroperasi pada satu bus umum. Sakelar dapat dihubungkan secara seri, memimpin kabel dari satu sakelar ke sakelar lainnya, tetapi saya memutuskan untuk menghubungkan semua kabel dalam satu pelindung.

Menghubungkan kabel - delapan inti UTP Cat 5e. Anda dapat menggunakan empat inti, tetapi saya biasanya melakukan semuanya berdasarkan "berjaga-jaga". Anda dapat mempertimbangkan kabel empat inti lainnya, tetapi poin pentingnya adalah bahwa kabel harus dilindungi, karena meskipun frekuensi sinyal agak rendah, kehilangan dan pickup tidak dikecualikan.

Akibatnya, semua sakelar saling berhubungan seperti yang ditunjukkan pada gambar:



Seperti yang dapat dilihat dari gambar, semua sakelar saling berhubungan menggunakan sakelar UTP pasif. Untuk core 1 dan 2 (oranye dan putih-oranye) data ditransmisikan (garis A dan B), daya 12 V terhubung ke core 7 dan 8 (coklat dan putih-coklat) .Saya menggunakan Mean Well NDR-75-12 sebagai sumber daya .

Saya tidak tahu bagaimana peralihan UTP Cina berperilaku, oleh karena itu, ketika merancang perisai, saya menyediakan tempat untuk pergantian RS-423 yang aktif. Saya perhatikan bahwa rangkaian berfungsi baik melalui sakelar pasif dan aktif. Dan bahkan ketika mereka terhubung bersama.



Kontrol lampu dengan relay


Menurut proyek saya, 27 perangkat independen (lampu, kipas) direncanakan di apartemen, ditenagai oleh 220 V. Tiga modul relay WBIO-DO-R10A-8 dan satu WBIO-DO-R10R-4 dipilih untuk mengendalikan mereka. Pilihannya adalah karena hampir semua pencahayaan di apartemen adalah LED, yang berbeda dari lampu pijar dengan arus awal yang tinggi. Relai yang dipilih dapat memberikan peralihan saat ini hingga 10 A per saluran, yang dalam kasus saya tidak perlu - tetapi, seperti yang disebutkan sebelumnya, "berjaga-jaga dengan margin."



Relay switching terjadi melalui antarmuka web controller . Prosedurnya intuitif, tidak ada instruksi atau petunjuk yang diperlukan.

Bagian perangkat lunak


File port

Kita belajar dari deskripsi perangkat keras Wiren Board 5 bahwa ia memiliki dua port perangkat / dev / ttyAPP1 dan / dev / ttyAPP4 yang sesuai dengan dua port RS-485. Dalam kasus saya, sakelar terhubung ke port / dev / ttyAPP1 .

Alamat perangkat (switch)

Saat bertukar data menggunakan protokol Modbus RTU, setiap perangkat diidentifikasi dengan nomor uniknya sendiri - alamat Modbus. Sebagai aturan, pabrikan menunjukkan alamat ini dalam bentuk tiga digit pada perangkat itu sendiri, tetapi jika tidak ada nomor pada perangkat, Anda dapat mengulangi alamat dari baris perintah (digunakan bahwa alamat tersebut disimpan dalam register Modbus 0x80):

root@wirenboard:~# service wb-mqtt-serial stop root@wirenboard:~# for i in {1..247}; do modbus_client -mrtu /dev/ttyAPP1 --debug -a$i -t3 -r0x80 -s1 -pnone; done 2>/dev/null | grep Data: 

Hasilnya harus dalam bentuk:

 Data: 0x008e 

Jawaban diterima dalam format heksadesimal dan sesuai dengan 142 dalam desimal.
Perlu dicatat bahwa setiap kali utilitas modbus_client dipanggil , standar driver polling wb-mqtt-serial untuk controller harus dihentikan; jika tidak, utilitas modbus_client tidak akan berfungsi.

Pertukaran Data Antara Switch dan Wiren Board

Di atas, sebuah loop ditulis yang mensurvei semua alamat Modbus yang mungkin dan mengembalikan nilai alamat jika perangkat ditemukan. Loop menggunakan utilitas modbus_client , yang diperlukan untuk debugging perangkat yang terhubung. Pada titik ini, dengan menggunakannya, kami akan memastikan bahwa semuanya terhubung dengan benar, dan saklar berinteraksi dengan pengontrol dengan benar. Untuk melakukan ini, cobalah membaca data di saklar register 0x01:

 root@wirenboard:~# service wb-mqtt-serial stop root@wirenboard:~# modbus_client -mrtu /dev/ttyAPP1 --debug -a142 -s1 -pnone -b19200 -a142 -t0x03 

(deskripsi utilitas dan kuncinya ada di dokumentasi controller).

Hasilnya adalah sebagai berikut:

 Opening /dev/ttyAPP1 at 19200 bauds (N, 8, 1) [8E][03][00][64][00][01][DA][EA] Waiting for a confirmation... <8E><03><02><00><01><2C><5B> SUCCESS: read 1 of elements: Data: 0x0001 

Hasil seperti itu berarti bahwa nilai diskrit 1 ditulis dalam register. Setelah menekan salah satu tombol sakelar, nilai register akan berubah menjadi nilai yang berlawanan:

 SUCCESS: read 1 of elements: Data: 0x0000 

Jika hasilnya diamati, seperti dalam paragraf ini, maka semuanya terhubung dengan benar, sakelar dan pengontrol saling memahami.

Driver asli untuk sakelar

Setelah kami memastikan bahwa pengontrol dan sakelar saling memahami, kini saatnya untuk memberikan deskripsi tombol sakelar di tingkat perangkat lunak. Pengembang menyarankan untuk menambahkan deskripsi perangkat yang terhubung ke file /etc/wb-mqtt-serial.conf atau membuat templat kustom dalam bentuk file /usr/share/wb-mqtt-serial/templates/config-*.json

Saya pergi ke jalan kedua, template saya terlihat seperti ini:

 { "device_type": "4-band-switch", "device": { "name": "4-band-switch", "id": "4bsw", "enabled": true, "channels": [{ "name": "All", "reg_type": "holding", "address": "0x00", "type": "switch" }, { "name": "Window", "reg_type": "holding", "address": "0x01", "type": "switch" }, { "name": "Side", "reg_type": "holding", "address": "0x02", "type": "switch" }, { "name": "Diode", "reg_type": "holding", "address": "0x03", "type": "switch" } ] } } 

Penjelasan terperinci dari template yang ditulis di atas adalah dalam deskripsi driver wb-mqtt-serial . Secara singkat berurusan dengan bidang:

  • "Nama": "Semua" adalah nama tombol. Jika template dieja dengan benar, tombol ini akan muncul di tab Pengaturan dengan alamat / perangkat / 4bsw_142 / kontrol / Semua
  • "Reg_type": "holding" - jenis dan ukuran register. Switch menggunakan "holding" - register 16-bit yang tersedia untuk membaca dan menulis.
  • "Address": "0x00" - alamat register sakelar dari mana pengontrol akan membaca data.
  • "Type": "switch" - bagaimana switch akan ditampilkan di antarmuka web. Dalam kasus "switch" - dalam bentuk switch diskrit.

Simpan template ke controller. Setelah itu, di bagian antarmuka web (Configs -> /etc/wb-mqtt-serial.conf), Anda dapat menambahkan perangkat baru dengan templat ini (4-band-switch). Tambahkan sakelar pertama kami dan klik Simpan.

Aturan yang mengaktifkan relai saat tombol sakelar ditekan


Di dalam pengontrol keadaan, semua perangkat yang terhubung dijelaskan oleh pesan MQTT . Perangkat juga dikendalikan dengan mengirim pesan MQTT. Klien dari antrian pesan MQTT (broker) keduanya adalah antarmuka web dan mesin aturan .

Untuk lebih jelasnya, kita akan melihat bagaimana antarmuka web menangani pesan yang masuk. Kami membuka tab Pengaturan pada antarmuka web dan melihat apa yang terjadi ketika tombol Semua ditekan pada sakelar: di dalam sakelar, nilai register Modbus berubah, driver wb-mqtt-serial menyurvei sakelar, dan, sesuai dengan templat perangkat, sakelar 4-band mengirimkan pesan MQTT dalam topik / perangkat / 4bsw_142 / kontrol / Semua - dan pada halaman Pengaturan, nilai dalam topik / perangkat / 4bsw_142 / kontrol / Semua akan langsung berubah dari 0 ke 1.

Pertimbangkan klien kedua - mesin aturan. Mesin, seperti antarmuka web, bekerja dengan antrian pesan, dan dapat menanggapi perubahan nilai - fungsi whenChanged digunakan untuk ini. Dalam kasus saya, aturannya terlihat seperti ini:

 //   defineRule("switch_all", { whenChanged: "4bsw_142/All", then: function(newValue, devName, cellName) { dev["wb-gpio"]["EXT3_R3A2"] = newValue; dev["wb-gpio"]["EXT3_R3A5"] = newValue; dev["wb-gpio"]["EXT1_R3A1"] = newValue; dev["wb-gpio"]["EXT1_R3A2"] = newValue; dev["wb-gpio"]["EXT1_R3A5"] = newValue; dev["wb-gpio"]["EXT2_R3A8"] = newValue; dev["wb-gpio"]["EXT3_R3A7"] = newValue; } }); //  defineRule("switch_window", { whenChanged: "4bsw_142/Window", then: function(newValue, devName, cellName) { dev["wb-gpio"]["EXT4_ON4"] = newValue; // dev["wb-gpio"]["EXT3_R3A6"] = newValue; // dev["wb-gpio"]["EXT3_R3A7"] = newValue; } }); // defineRule("switch_side", { whenChanged: "4bsw_142/Side", then: function(newValue, devName, cellName) { dev["wb-gpio"]["EXT1_R3A3"] = newValue; dev["wb-gpio"]["EXT1_R3A4"] = newValue; dev["wb-gpio"]["EXT2_R3A1"] = newValue; } }); // defineRule("switch_diode", { whenChanged: "4bsw_142/Diode", then: function(newValue, devName, cellName) { dev["wb-gpio"]["EXT2_R3A2"] = newValue; dev["wb-gpio"]["EXT2_R3A3"] = newValue; dev["wb-gpio"]["EXT3_R3A3"] = newValue; } }); 

Saya akan dengan senang hati menjawab semua pertanyaan di komentar.

Catatan pemasar


  1. Lebih baik meletakkan garis RS-485 dengan kabel KSPEVG 2x2x0.35 (harganya hanya 30 rubel per meter), dan bukan dengan bintang, tetapi dengan bus.
  2. Kami menyarankan Anda untuk berhati-hati dengan lampu LED - arus awal mereka dapat melebihi yang diberi nilai 150 (!) Kali (ini akan menjadi artikel terpisah) - lihat modul relai yang kuat WB-MR6 : arus 16 A per saluran, termasuk arus masuk hingga 800 (!) Amp dalam modifikasi S.

Source: https://habr.com/ru/post/id417093/


All Articles