Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Cara Menggunakan Modbus dengan Arduino

Komponen dan persediaan

Arduino UNO
× 1
Pelindung RS422 / RS485 Profesional untuk Arduino
× 1
Konverter USB-ke-RS485
× 1
Breadboard (generik)
× 1
LED (generik)
× 1
Resistor 10k ohm
× 1
Resistor 221 ohm
× 1
Kabel jumper (generik)
× 1
Sakelar Tombol Tekan SparkFun 12mm
× 1

Aplikasi dan layanan online

Arduino IDE
Modbustester

Tentang proyek ini

Modbus, standar komunikasi serial, telah menjadi protokol komunikasi standar de facto dan sekarang menjadi sarana umum yang tersedia untuk menghubungkan perangkat elektronik industri. Dalam Modbus RTU dan Modbus ASCII, RS485 digunakan sebagai lapisan fisik. Dimungkinkan untuk menggunakan Arduino sebagai budak (dan dengan beberapa batasan juga sebagai master) dalam aplikasi Modbus, tetapi antarmuka RS485 diperlukan. RS422 / RS485 Shield kami adalah pelindung komunikasi serial terisolasi sepenuhnya galvanik yang dirancang untuk digunakan dengan Arduino UNO dan papan lain yang kompatibel seperti Arduino 101, STM Nucleo... Pelindung ini merupakan pilihan sempurna untuk jenis aplikasi semacam itu.

Tujuan dari dokumen ini adalah untuk menunjukkan cara membuat bersama dengan Arduino UNO perangkat budak Modbus sederhana. Kami akan menggunakan PC sebagai master Modbus.

Alat &Bahan

  • Arduino UNO
  • Perisai RS485 untuk Arduino
  • Adaptor RS485-USB apa saja untuk koneksi PC (atau yang lebih murah)

Opsional:

  • Papan tempat memotong roti
  • Tekan tombol
  • LED Merah
  • Resistor 220 Ohm
  • Resistor 10k
  • Kabel jumper

Perangkat Lunak

  • IDE Arduino
  • Pengubah Modbustester

Pengkabelan RS485:

Pengkabelannya sangat sederhana. Anda harus menghubungkan hanya terminal A dan B dari perisai dengan jalur A dan B dari sistem Modbus. Terminal Y dan Z tidak digunakan untuk aplikasi semacam ini. Untuk jarak jauh disarankan untuk menggunakan twisted pair untuk A dan B.

Pengkabelan Arduino (Opsional):

Disarankan untuk menambahkan LED dan tombol ke Arduino untuk melihat beberapa efek dari komunikasi Modbus. Ini opsional dan tidak perlu.

Pengaturan Pengalihan DIP:

RS422/RS485 Shield dilengkapi dengan 3 bank sakelar DIP. Anda harus mengatur sakelar DIP ini untuk Modbus seperti yang ditunjukkan pada gambar di bawah ini.

Sakelar 1:1-MATI 2-AKTIF 3-AKTIF 4-MATI

Sakelar 2:1-MATI 2-MATI 3-AKTIF 4-AKTIF

Sakelar 3:1-MATI atau HIDUP* 2-MATI 3-MATI 4-MATI

*Tergantung pada posisi Perisai RS422/RS485 di jalur Modbus, Anda harus mengaktifkan atau menonaktifkan resistor pemutus. Harap alihkan resistor ke posisi ON hanya jika Perisai berada di salah satu ujung jalur bus. Dalam semua kasus lain, matikan resistor pemutus:

Pengaturan Jumper:

Anda dapat menemukan 3 area jumper yang berbeda pada perisai. Sangat penting adalah Jumper JP1 untuk tegangan catu daya. Arduino UNO bekerja dengan 5V secara internal. Anda harus menyetel Jumper ini ke posisi 5V (untuk papan 3.3V misalnya Arduino 101 ke posisi 3.3V).

Selanjutnya atur jumper untuk port komunikasi di pojok kiri atas seperti pada gambar di atas. UART internal pada port 0 dan 1 akan dihubungkan dalam hal ini ke antarmuka RS485 pelindung.

Last but not least kita harus mengatur Jumper untuk port kontrol RX/TX. Kita tidak menggunakan Jumper ini, karena pengalihan RX/TX otomatis sudah dikonfigurasi.

Instal Perangkat Lunak Penguji Modbus di PC:

Kami akan menggunakan dalam contoh ini PC sebagai master Modbus. Anda sudah mendownload Modbustester. Silakan buka arsip zip ke direktori baru di harddisk Anda. Buka perangkat lunak dan ubah bidang yang ditandai seperti pada gambar di bawah ini. Anda harus menghubungkan adaptor USB-RS485 sebelum- Silakan pilih port COM yang tepat untuk adaptor ini di Modbustester.

Perangkat Lunak Arduino:

Silakan muat firmware ke Arduino IDE untuk kompilasi dan pemrograman.

Uji Pekerjaan Anda:

Sekarang saatnya untuk menguji pekerjaan Anda!

Anda dapat menekan tombol Baca di Modbustester. Perintah ini akan membaca 8 byte memori perangkat budak baru kita. Di alamat 400008 Anda dapat menemukan status tombol. Alamat 400001 - 400006 berisi nilai port ADC.

Dengan tombol tulis Anda dapat memanipulasi register di budak. Anda dapat memasukkan alamat 400007 a 0 atau 1 untuk menyalakan atau mematikan LED.

Kode

  • Contoh kode untuk Arduino UNO
Contoh kode untuk Arduino UNOArduino
/* * Program uji untuk Arduino RS422/RS485 Shield * Versi 1.0 * Hak Cipta (C) 2018 Hartmut Wendt www.zihatec.de * * (berdasarkan sumber https://github.com/angeloc/simplemodbusng) * * * Program ini adalah perangkat lunak bebas:Anda dapat mendistribusikannya kembali dan/atau memodifikasinya * di bawah ketentuan Lisensi Publik Umum GNU yang diterbitkan oleh * Free Software Foundation, baik versi 3 dari Lisensi, atau * (sesuai pilihan Anda) versi yang lebih baru. * * Program ini disebarluaskan dengan harapan dapat bermanfaat, * tapi TANPA JAMINAN APAPUN; bahkan tanpa jaminan tersirat dari * DAGANG atau KESESUAIAN UNTUK TUJUAN TERTENTU. Lihat * Lisensi Publik Umum GNU untuk lebih jelasnya. * * Anda seharusnya telah menerima salinan GNU General Public License * bersama dengan program ini. Jika tidak, lihat .*/ #include #define ledPin 12 // onboard led #define buttonPin 7 // push button/* Kode contoh ini memiliki 9 memegang register. 6 input analog, 1 tombol, 1 output digital, dan 1 register untuk menunjukkan kesalahan yang ditemukan sejak dimulai. Fungsi 5 (menulis koil tunggal) tidak diimplementasikan jadi saya menggunakan seluruh register dan fungsi 16 untuk mengatur Led onboard pada Atmega328P. Metode modbus_update() memperbarui array register holdingRegs dan memeriksa komunikasi. Catatan:Buffer cincin serial Arduino adalah 128 byte atau 64 register. Sebagian besar waktu Anda akan menghubungkan arduino ke master melalui serial menggunakan MAX485 atau serupa. Dalam permintaan fungsi 3, master akan mencoba membaca dari budak Anda dan karena 5 byte sudah digunakan untuk ID, FUNGSI, NO OF BYTE, dan dua BYTE CRC, master hanya dapat meminta 122 byte atau 61 register. Dalam permintaan fungsi 16 master akan mencoba menulis ke budak Anda dan karena 9 byte sudah digunakan untuk ID, FUNGSI, ALAMAT, NO OF REGISTER, NO OF BYTES dan dua BYTE CRC master hanya dapat menulis 118 byte atau 59 register . Menggunakan FTDI USB to Serial converter, byte maksimum yang dapat Anda kirim terbatas pada buffer internalnya yaitu 60 byte atau 30 register int yang tidak ditandatangani. Jadi:Dalam permintaan fungsi 3 master akan mencoba membaca dari budak Anda dan karena 5 byte sudah digunakan untuk ID, FUNCTION, NO OF BYTES dan dua BYTE CRC master hanya dapat meminta 54 byte atau 27 register. Dalam permintaan fungsi 16 master akan mencoba menulis ke budak Anda dan karena 9 byte sudah digunakan untuk ID, FUNGSI, ALAMAT, NO OF REGISTER, NO OF BYTES dan dua BYTE CRC master hanya dapat menulis 50 byte atau 25 register . Karena diasumsikan bahwa Anda sebagian besar akan menggunakan Arduino untuk terhubung ke master tanpa menggunakan konverter USB ke Serial, buffer internal disetel sama dengan buffer cincin Arduino Serial yaitu 128 byte.*/ // Menggunakan instruksi enum memungkinkan untuk metode mudah menambah dan // menghapus register. Melakukannya dengan cara ini menghemat #mendefinisikan ukuran // dari array register slave Anda setiap kali Anda ingin menambahkan lebih banyak register// dan sekilas memberi tahu Anda tentang tata letak register slave Anda./////////// ///// register budak Anda ///////////////////enum { // cukup tambahkan atau hapus register dan Anda siap... // Register pertama dimulai dari alamat 0 ADC0, ADC1, ADC2, ADC3, ADC4, ADC5, LED_STATE, BUTTON_STATE, TOTAL_ERRORS, // tinggalkan yang ini TOTAL_REGS_SIZE // jumlah total register untuk fungsi 3 dan 16 berbagi array register yang sama};unsigned int holdingRegs[ TOTAL_REGS_SIZE]; // fungsi 3 dan 16 register array ////////////////////////////////////////////////////////// //////////////////void setup(){ /* parameter (baudrate panjang, unsigned char ID, unsigned char transmit enable pin, unsigned int holding ukuran register, unsigned char low latency ) Pin aktifkan transmisi digunakan dalam komunikasi setengah dupleks untuk mengaktifkan MAX485 atau serupa untuk menonaktifkan mode ini gunakan nilai apa pun <2 karena 0 &1 dicadangkan untuk Rx &Tx. Penundaan latency rendah membuat implementasi menjadi non-standar tetapi secara praktis bekerja dengan semua implementasi master modbus utama. */ modbus_configure(9600, 1, 6, TOTAL_REGS_SIZE, 0); pinMode(ledPin, OUTPUT); pinMode(tombolPin, INPUT); }void loop(){ // modbus_update() adalah satu-satunya metode yang digunakan dalam loop(). Ini mengembalikan total error // count sejak slave dimulai. Anda tidak harus menggunakannya tetapi ini berguna // untuk menemukan kesalahan oleh master modbus. holdingRegs[TOTAL_ERRORS] =modbus_update(holdingRegs); for (byte i =0; i <6; i++) { holdingRegs[i] =analogRead(i); delayMicroseconds(50); } byte buttonState =digitalRead(buttonPin); // membaca status tombol // menetapkan nilai status tombol ke register holding holdingRegs[BUTTON_STATE] =buttonState; // membaca nilai register LED_STATE dan mengatur LED onboard tinggi atau rendah dengan fungsi 16 byte ledState =holdingRegs[LED_STATE]; if (ledState) // set led { digitalWrite(ledPin, HIGH); } else if (ledState ==0) // reset led { //digitalWrite(ledPin, LOW); holdingRegs[LED_STATE] =0; } }

Skema

Pengkabelan beberapa komponen uji ke Arduino

Proses manufaktur

  1. C# Queue dengan Contoh:Apa itu C# Queue dan Bagaimana Cara Menggunakannya?
  2. Peredupan Lampu dengan PWM menggunakan Tombol Tekan
  3. Game Arduino Gyroscope dengan MPU-6050
  4. Unopad - Pengontrol MIDI Arduino dengan Ableton
  5. Sensor Kendala Sederhana dengan Arduino
  6. Temukan Saya
  7. Arduino Joystick
  8. Seberapa Mudah Menggunakan Termistor?!
  9. Cara membuat musik dengan Arduino
  10. Cara Menggunakan NMEA-0183 dengan Arduino