Modbus RTU Network Emulation Software

Pendahuluan


Jika Anda hanya memiliki palu sebagai alat, setiap masalah mulai menyerupai paku.

Abraham Maslow

Protokol Modbus terkenal bagi pembaca Habr dan pembaca hicktime. Banyak publikasi telah dikhususkan untuk penerapannya, yang sulit untuk didaftar karena jumlahnya sangat banyak, dan dari waktu ke waktu artikel-artikel baru muncul di sana-sini.



Popularitas protokol ini adalah karena keterbukaan dan kesederhanaannya. Cakupan aplikasinya cukup luas: dari sistem otomasi industri profesional hingga proyek-proyek amatir dari sistem kontrol terdistribusi, rumah "pintar" dan sebagainya. Protokol ini juga dipilih oleh saya ketika tim saya terlibat dalam pembuatan perangkat lunak untuk simulator kereta. Protokol Modbus RTU pada antarmuka fisik RS485 digunakan pada simulator ini untuk memberikan data ke komputer kontrol dari kontrol yang dipasang pada konsol pengemudi (jangan berpikir bahwa Modbus digunakan pada rolling stock nyata!).

Tidak ada gunanya berbicara tentang kesulitan dalam menyiapkan perangkat lunak yang berinteraksi dengan jaringan pengontrol yang mengontrol peralatan. Terutama ketika bagian dari perangkat sudah ada di setrika, dan bagian lainnya sedang dalam proses pengembangan dan pembuatan. Dalam hal ini, perangkat lunak tingkat atas diperlukan untuk ditulis dengan mempertimbangkan interaksinya dengan perangkat keras ini. Dan disarankan untuk menuliskannya sedemikian rupa untuk segera membuat versi sistem yang berfungsi, tanpa menggunakan "kruk" yang selalu sulit dibersihkan dari kode.

"Anda perlu menulis perangkat lunak ketika prototipe yang berfungsi dari semua perangkat keras sudah siap," kata Anda, dan Anda akan benar, tetapi ... ha ha ha, ini jarang terjadi di dunia nyata. Dan di sini emulator perangkat lunak membantu kami.

1. Secara singkat tentang Modbus RTU


Saya tidak akan berbicara secara rinci tentang protokol. Mereka yang tertarik dengan detail dapat menggunakan pencarian - protokol terbuka, spesifikasi resminya dan banyak informasi tersedia di jaringan. Saya hanya bisa mengatakan bahwa dalam Modbus RTU itu menggambarkan format biner dari data yang ditransmisikan dan menggunakan kabel twisted pair standar RS485 sebagai media transmisi. RS232 juga dapat digunakan jika jaringan memiliki satu pemancar dan satu penerima, atau RS422 untuk transmisi data searah.

Kami akan tertarik pada RS485, yang merupakan antarmuka setengah dupleks, yang memungkinkan hanya satu perangkat yang mentransmisikan data pada suatu waktu. Arbitrasi bus di Modbus dilakukan karena daya tahan dari interval keheningan wajib sebesar 3,5 karakter pada kecepatan transmisi yang diberikan. Setiap pesan harus dimulai dan diakhiri dengan interval hening. Ada satu perangkat utama dalam jaringan dan beberapa budak (hingga 31 dalam satu segmen jaringan, tanpa menggunakan repeater). Setiap perangkat budak memiliki ID pengidentifikasi unik (1 hingga 31). Transmisi data oleh budak hanya dilakukan jika master mengirim permintaan untuk menerima data dari perangkat ini.

Permintaan penyihir yang khas terlihat seperti ini

IDKode fungsiAlamat DataJumlah data (2 byte)DataCRC16

CRC16 digunakan untuk mengontrol integritas data yang dikirimkan. Modus menggunakan notasi representasi data Big Endian: untuk nilai 2 byte, byte paling signifikan di dalam pesan datang terlebih dahulu). Protokol menggunakan empat jenis data:

  1. Coils - output diskrit (1 bit) baca / tulis
  2. Input diskrit - input diskret baca-saja (1 bit)
  3. Holding register - register keluaran (2 byte) tersedia untuk membaca / menulis
  4. Input register - register input (2 byte) tersedia untuk dibaca

Menanggapi permintaan tersebut, budak mengirim data dalam format berikut

IDKode fungsiJumlah data dalam byteDataCRC16

Pesan yang diterima dari master memasuki buffer penerimaan semua perangkat. Namun, jika byte pertama dari buffer yang diterima tidak cocok dengan ID perangkat, itu mengabaikan data yang diterima, membersihkan buffer yang menerima. Jika pesan ditujukan untuk perangkat ini, maka ia membentuk respons dan, setelah mempertahankan interval kesunyian, mengirimkannya ke master.

Seperti yang mereka katakan, sederhana, tetapi dengan rasa. Anda dapat membaca lebih lanjut tentang semua ini dalam spesifikasi protokol resmi . Baca tentang metode untuk mengimplementasikan protokol pada antarmuka serial di sini . Kami tidak berkumpul di sini untuk ini.

Ketika mengembangkan perangkat lunak tingkat atas (master diimplementasikan berdasarkan PC, misalnya) untuk jaringan seperti itu, akan menyenangkan untuk memiliki seperangkat alat perangkat lunak yang memungkinkan penerapan konsep seperti itu.

gambar

Arti dari skema ini adalah sebagai berikut. Misalkan kita memiliki bagian dari perangkat yang termasuk dalam jaringan masa depan. Atau sejauh ini tidak ada perangkat seperti itu. Tetapi ada keinginan yang membara untuk menulis perangkat lunak untuk manajemen tingkat atas, untuk debug itu, sehingga ketika jaringan masih diimplementasikan dalam perangkat keras kita tidak perlu menulis ulang apa pun. Untuk melakukan ini, Anda harus menggunakan media transmisi fisik, yang kami gunakan untuk perangkat yang mirip ini



Salah satu adapter digunakan untuk menghubungkan perangkat lunak wizard yang dikembangkan. Lain untuk menghubungkan emulator dari jaringan budak di masa depan. Ke cabang dengan konektor putih, kami menghubungkan bagian jaringan yang sudah diimplementasikan dalam perangkat keras. Dengan demikian, kami mendapat kesempatan untuk bekerja dengan tenang dengan protokol komunikasi standar, secara bertahap memperkenalkan peralatan nyata ke dalam operasi. Selain itu, memberikan objek kepada pelanggan, kami tidak kehilangan kesempatan untuk memodifikasi perangkat lunaknya di lingkungan laboratorium yang nyaman tanpa akses ke objek. QSlave dalam diagram hanyalah bagian yang sama dari jaringan yang ditiru oleh perangkat lunak. Secara alami, Anda harus menulis perangkat lunak yang sesuai, yang dilakukan oleh penulis.

2. QSlave - emulasi jaringan slave


QSlave adalah emulator jaringan RTU modbus lintas-platform terbuka. Anda bisa mendapatkannya di bawah lisensi GPL v2.0 di Github di tautan di atas.



Aplikasi ini dikembangkan di C ++ menggunakan framework Qt. Qt, secara umum, memiliki perpustakaan untuk bekerja dengan Modbus , tetapi spesifik tugas - mensimulasikan jaringan budak daripada budak tunggal, mengarah pada fakta bahwa perpustakaan built-in Qt untuk Modbus tidak digunakan di sini. Untuk memproses data yang diterima dari port serial virtual, perpustakaan modbus yang ditulis sendiri dibuat. Kode perpustakaan ini diimplementasikan sebagai proyek yang terpisah, sepenuhnya independen dari antarmuka pengguna dan dapat digunakan untuk kesadaran simulasi perangkat lunak dengan fungsi yang lebih maju. Karena fakta bahwa emulasi Modbus terlepas dari UI, jaringan dikonfigurasi menggunakan file konfigurasi. Format XML dipilih (kami sering menggunakannya dalam proyek kami). Konfigurasi sampel tersedia dalam kode proyek . Satu set konfigurasi terdiri dari file utama dengan ekstensi * .net, yang terlihat seperti ini

contoh.net
<?xml version="1.0" encoding="UTF-8" ?> <Config> <Slave> <!--  ,     --> <Description>Traffic light</Description> <!--   --> <id>1</id> <!--  XML-  (  *.xml) --> <config>traffic-light</config> </Slave> </Config> 

dan file konfigurasi XML untuk masing-masing budak

traffic-light.xml
 <?xml version="1.0" encoding="UTF-8" ?> <Config> <!--   --> <Coil> <address>16</address> <description>Red signal</description> <value>0</value> </Coil> <Coil> <address>17</address> <description>Yellow signal</description> <value>0</value> </Coil> <Coil> <address>18</address> <description>Green signal</description> <value>0</value> </Coil> <!--   --> <DiscreteInput> <address>0</address> <description>Ready</description> <value>1</value> </DiscreteInput> <!--   --> <HoldingRegister> <address>5</address> <description>Signal activity time</description> <value>15</value> </HoldingRegister> <!--   --> <InputRegister> <address>2</address> <description>Signals count</description> <value>3</value> </InputRegister> </Config> 

File terakhir berisi deskripsi semua data yang tersedia di perangkat. Untuk mengunduh konfigurasi, Anda perlu membuka file * .net dari menu program QSlave (File → Open config). Semua file konfigurasi harus berada di direktori yang sama. Contoh konfigurasi menggambarkan jaringan dari satu perangkat slave, lampu lalu lintas virtual, output diskrit yang menggambarkan sinyal, input digital menunjukkan sedikit perangkat siap untuk operasi (Siap), register input melaporkan jumlah lampu lalu lintas, dan register output menetapkan waktu selama itu menyala masing-masing sinyal.

gambar

Secara alami, simulator ini tidak mensimulasikan logika internal perangkat. Ini hanya memungkinkan Anda untuk mengatur nilai sel memori yang tersedia untuk master. Nilai apa pun dapat disetel menurut kebijaksanaan Anda dengan mengedit sel yang sesuai dalam tabel.

Untuk semua kesederhanaannya, perangkat lunak ini membantu kami bekerja pada perangkat lunak simulator (yang telah ditugaskan) tanpa meninggalkan laboratorium.



Tetapi tidak ada yang mengatakan bahwa Anda tidak dapat membuat emulator yang lebih maju yang mensimulasikan operasi perangkat jaringan virtual. Untuk membuatnya, Anda dapat menggunakan kode perpustakaan modbus yang tersedia di paket QSlave.

3. QMaster - emulasi perangkat master


Untuk membuat budak, debug firmware mereka, Anda memerlukan simulasi wizard. Ada sejumlah emulator terbuka, seperti, misalnya, QModbus . Kami menggunakannya dalam pekerjaan kami, sampai kami memutuskan untuk meningkatkan kecepatan transfer data menjadi 250 kBit / s. QModbus tidak mengizinkan ini. Dimungkinkan untuk membangunnya kembali dari sumber untuk Linux, tetapi teknisi elektronik kami duduk di Windows, dan di mana perakitan tidak pergi karena sejumlah alasan. Ternyata aplikasi ini ditulis dalam Qt 4, menggunakan perpustakaan libmodbus pihak ketiga. Saya ingin memiliki solusi lintas platform pada Qt5, terutama karena Qt5 sudah bekerja dengan Modbus di luar kotak. Oleh karena itu, analognya ditulis menggunakan tumpukan perpustakaan Qt Modbus - QMaster . Ini juga tersedia di Github dalam kondisi yang sama.

gambar

Kesimpulan


Sebagai kesimpulan, saya akan mengatakan bahwa saya bekerja (di tempat kerja) terutama pada proyek tertutup. Namun, alat yang dijelaskan dikembangkan oleh saya secara pribadi atas inisiatif saya sendiri di waktu luang saya. Selain itu, mereka, dalam versi Windows, secara statis terhubung dengan kode Qt GPL, jadi saya harus meneruskannya ke komunitas dengan persyaratan yang sama seperti yang diterima Qt. Selain itu, alat-alat ini mungkin bermanfaat bagi pembaca.

Terima kasih atas perhatian anda!

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


All Articles