Εμφάνιση αποτελεσμάτων : 1 έως 8 από 8

Θέμα: Arduino modbus RTU RS485 VFD control MX2 Omron inverter

  1. #1
    Μέλος
    Όνομα
    Γιάννης
    Εγγραφή
    Jul 2012
    Περιοχή
    Κοζάνη
    Μηνύματα
    372

    Red Face Arduino modbus RTU RS485 VFD control MX2 Omron inverter

    Κώδικας:
    /*** Modbus master example 1:
    * The purpose of this example is to query an array of data
    * from an external Modbus slave device. 
    * The link media can be USB or RS232.
    *
    * Recommended Modbus slave: 
    * diagslave http://www.modbusdriver.com/diagslave.html
    *
    * In a Linux box, run 
    * "./diagslave /dev/ttyUSB0 -b 19200 -d 8 -s 1 -p none -m rtu -a 1"
    * This is:
    * serial port /dev/ttyUSB0 at 19200 baud 8N1
    * RTU mode and address @1
    */
    
    #include <ModbusRtu.h>
    
    // data array for modbus network sharing
    uint16_t au16data[16];
    uint8_t u8state;
    
    /**
    * Modbus object declaration
    * u8id : node id = 0 for master, = 1..247 for slave
    * u8serno : serial port (use 0 for Serial)
    * u8txenpin : 0 for RS-232 and USB-FTDI 
    * or any pin number > 1 for RS-485
    */
    Modbus master(0,0,9); // this is master and RS-232 or USB-FTDI, PIN 9 PARA INDICAR QUE TRASMITO
    
    /**
    * This is an structe which contains a query to an slave device
    */
    modbus_t telegram;
    
    unsigned long u32wait;
    
    void setup() {
    master.begin( 9600 ); // baud-rate at 19200
    master.setTimeOut( 2000 ); // if there is no answer in 2000 ms, roll over
    u32wait = millis() + 1000;
    u8state = 0; 
    }
    
    void loop() {
    switch( u8state ) {
    case 0: 
    if (millis() > u32wait) u8state++; // wait state
    break;
    case 1: 
    telegram.u8id = 1; // slave address
    telegram.u8fct = 5; // function code (this one is registers read)
    telegram.u16RegAdd = 0; // start address in slave
    telegram.u16CoilsNo = 2; // number of elements (coils or registers) to read
    //telegram.au16reg = au16data; // pointer to a memory array in the Arduino
    
    // PARA EL VARIADOR OMRON MX1: MODBUS RTU 01 05 00 00 FF 00 -> START
    // 01 -> SLAVE (VFD OMRON)
    // 05 -> WRITE COIL
    // 00 00 -> ADDRESS COIL
    // FF 00 -> VALUES TO WRITE IN the COIL FOR RUN
    
    
    telegram.au16reg[0] = 0; 
    telegram.au16reg[1] = 0;
    telegram.au16reg[2] = 0;
    telegram.au16reg[3] = 0;
    telegram.au16reg[4] = 0;
    telegram.au16reg[5] = 0;
    telegram.au16reg[6] = 0;
    telegram.au16reg[7] = 0;
    
    telegram.au16reg[8] = 1;
    telegram.au16reg[9] = 1;
    telegram.au16reg[10] = 1;
    telegram.au16reg[11] = 1;
    telegram.au16reg[12] = 1;
    telegram.au16reg[13] = 1;
    telegram.au16reg[14] = 1;
    telegram.au16reg[15] = 1;
    
    
    master.query( telegram ); // send query (only once)
    delay(3500);
    
    telegram.u8id = 1; // slave address
    telegram.u8fct = 6; // function code (this one is registers read)
    telegram.u16RegAdd = 1; // start address in slave
    telegram.u16CoilsNo = 4; // number of elements (coils or registers) to read
    //telegram.au16reg = au16data; // pointer to a memory array in the Arduino
    //telegram.au16reg = 0000000111110100;
    
    // PARA EL VARIADOR OMRON MX1: MODBUS RTU 01 06 00 01 01 F4 -> CHANGE FQ
    // 01 -> SLAVE (VFD OMRON)
    // 06 -> WRITE IN REGISTE
    // 00 01 -> REGISTER ADDRESS
    // 01 F4 -> VALUE TO WRITE IN THE REGISTER TO CHANGE THE MOTOR FREQUENCY
    
    telegram.au16reg[0] = 0;
    telegram.au16reg[1] = 0;
    telegram.au16reg[2] = 0;
    telegram.au16reg[3] = 0;
    telegram.au16reg[4] = 0;
    telegram.au16reg[5] = 0;
    telegram.au16reg[6] = 0;
    telegram.au16reg[7] = 1;
    
    telegram.au16reg[8] = 1;
    telegram.au16reg[9] = 1;
    telegram.au16reg[10] = 1;
    telegram.au16reg[11] = 1;
    telegram.au16reg[12] = 0;
    telegram.au16reg[13] = 1;
    telegram.au16reg[14] = 0;
    telegram.au16reg[15] = 0;
    
    master.query( telegram ); // send query (only once)
    delay(3500);
    telegram.u8id = 1; // slave address
    telegram.u8fct = 5; // function code (this one is registers read)
    telegram.u16RegAdd = 1; // start address in slave
    telegram.u16CoilsNo = 2; // number of elements (coils or registers) to read
    //telegram.au16reg = au16data; // pointer to a memory array in the Arduino
    
    // PARA EL VARIADOR OMRON MX1: MODBUS RTU 01 05 00 00 00 00 -> STOP
    // 01 -> SLAVE (VFD OMRON)
    // 05 -> WRITE COIL
    // 00 00 -> COIL'S ADDRESS
    // 00 00 -> VALUE TO WRITE FOR STOP
    
    telegram.au16reg[0] = 0;
    telegram.au16reg[1] = 0;
    telegram.au16reg[2] = 0;
    telegram.au16reg[3] = 0;
    telegram.au16reg[4] = 0;
    telegram.au16reg[5] = 0;
    telegram.au16reg[6] = 0;
    telegram.au16reg[7] = 0;
    telegram.au16reg[8] = 0;
    telegram.au16reg[9] = 0;
    telegram.au16reg[10] = 0;
    telegram.au16reg[11] = 0;
    telegram.au16reg[12] = 0;
    telegram.au16reg[13] = 0;
    telegram.au16reg[14] = 0;
    telegram.au16reg[15] = 0;
    master.query( telegram ); // send query (only once)
    delay(3500);
    u8state++;
    break;
    case 2:
    master.poll(); // check incoming messages
    if (master.getState() == COM_IDLE) {
    u8state = 0;
    u32wait = millis() + 100; 
    }
    break;
    } }
    Γεια και πάλι,
    έκανα ένα νέο θέμα στην εννότητα μικροελεγκτών μήπως και μπορέσει κάποιος να βοηθήσει.
    Θέλω να ελέγχω σε επίπεδο START, STOP, REVERSE και FREQUENCY, έναν inverter MX2 Omron με την βοήθεια
    ενός arduino mega. Διάβασα πάρα πολύ και έψαξα για πληροφορίες αλλά οι περισσότερες ήταν ελιπέστατες ή ακόμα
    χειρότερα με αποπροσανατόλιζαν.
    Χρησιμοποιώ την βιβλιοθήκη Modbus RTU που βρήκα ΕΔΩ
    και το εχειρίδιο του ΜΧ2 ΕΔΩ
    Όσο και αν προσπάθησα δεν μπόρεσα να περάσω εντολές από τον μΕ προς το inverter.
    Το καλό είναι ότι κατόρθωσα να ελέγχω το inverter από πρόγραμμα στο PC αλλά δεν
    λειτουργεί σε επίπεδο arduino.
    Όποια βοήθεια ευπρόσδεκτη (ακόμη και με το αζημείωτο. Στείλτε μου ΠΜ)

    0 Not allowed! Not allowed!

  2. #2
    Μέλος
    Όνομα
    Γιάννης
    Εγγραφή
    Jul 2012
    Περιοχή
    Κοζάνη
    Μηνύματα
    372

    Προεπιλογή

    Καλημέρα. Τελικά βρήκα άκρη από μόνος μου αφού "εφαγα" όλο το internet να ψάχνω.
    Πέτυχα να στέλνω το 1ο πακέτο εντολών για το RUN αλλά δεν κατόρθωσα να περάσω τα άλλα 2 πακέτα
    για το "change frequency" και το ΣΤΟΠ. Αν μπορεί να βοηθήσει κάποιος γνώστης θα το εκτιμήσω.
    Ευχαριστώ.

    1 Not allowed! Not allowed!

  3. #3
    Μέλος
    Όνομα
    Χρήστος
    Εγγραφή
    Sep 2012
    Περιοχή
    Χολαργός
    Μηνύματα
    1.907

    Προεπιλογή

    Αφού ελέγχεις το inverter μέσω 485 από το pc , "κρυφάκουσε" την επικοινωνία pc - inverter και στείλε αυτο που άκουσες με το arduino

    0 Not allowed! Not allowed!

  4. #4
    Μέλος
    Όνομα
    Βασίλης
    Εγγραφή
    Sep 2011
    Περιοχή
    Κερατσίνι
    Μηνύματα
    8.778

    Προεπιλογή

    Παράθεση Αρχικό μήνυμα από aktis Εμφάνιση μηνυμάτων
    Αφού ελέγχεις το inverter μέσω 485 από το pc , "κρυφάκουσε" την επικοινωνία pc - inverter και στείλε αυτο που άκουσες με το arduino
    Χρηστο δεν νομιζω οτι γινεται αυτο ευκολα.Ειναι εκατονταδες οι εντολες που υπαρχουν και οι περισσοτερες θελει 'ερωτηση' ο slave για να τις στειλει ωστε να μην 'φορτωνει' το δικτυο.
    Εφοσον βρηκε την εντολη start νομιζω ειναι σε καλο δρομο παντως.Αν δινει σωστα τις εντολες ισως θελει μικροτερη ταχυτητα λογω ftdi..

    0 Not allowed! Not allowed!
    Δυο πράγματα είναι άπειρα, το σύμπαν και η ανθρώπινη βλακεία, αλλά για το σύμπαν δεν είμαι εντελώς σίγουρος

  5. #5
    Μέλος
    Όνομα
    Γιάννης
    Εγγραφή
    Jul 2012
    Περιοχή
    Κοζάνη
    Μηνύματα
    372

    Προεπιλογή

    Τελικά τα 10 ευρώ που πλήρωσα για την αγορά ενός μικρού λογικού αναλυτή, έπιασαν τόπο. Συνδέεοντας τον στην έξοδο ΤX του arduino, διάβασα
    την επικοινωνία με τον ενσωματωμένο αποκωδικοποιητή modbus rtu που έχει ο λογικός αναλυτής.
    Είδα έτσι ότι περνάει το πακέτο "Device ID:'1' Function Write single coil ('5') Addr: '0' value: '65280' Chksum: '14988'. που είναι η εντολή
    01 05 00 00 FF 00 εντολή RUN. Μετά από ερωτήσεις σε διάφορα ξένα φόρα, κάποιος μου είπε να σβύσω τα περιττά "telegram.au16reg[1] = 0;"
    Έπειτα από ένα συμμάζεμα εντολών και αλλαγή στην μορφή του κώδικα, κατόρθωσα να περάσω και την 3η εντολή αλλά όχι την 2η.
    Άλλο ένα πράγμα που δεν κατάλαβα είναι το πως δίνω την επιθυμητή τιμή στον αντίστοιχο καταχωρητή. Π.χ για να δώσω 30Hz τι εντολή δίνω;
    (βλ. εγχειρίδιο PDF που έδωσα link παραπάνω)
    Παραθέτω εδώ τον κώδικα μπας και βγάλω και την 2η εντολή αλλαγής συχνότητας.
    Κώδικας:
    /**
     *  Modbus master example 2:
     *  The purpose of this example is to query several sets of data
     *  from an external Modbus slave device. 
     *  The link media can be USB or RS232.
     *
     *  Recommended Modbus slave: 
     *  diagslave http://www.modbusdriver.com/diagslave.html
     *
     *  In a Linux box, run 
     *  "./diagslave /dev/ttyUSB0 -b 19200 -d 8 -s 1 -p none -m rtu -a 1"
     *   This is:
     *    serial port /dev/ttyUSB0 at 19200 baud 8N1
     *    RTU mode and address @1
     */
    
    
    #include <ModbusRtu.h>
    #include <SoftwareSerial.h>
    #define ID   0
    //#define Led 3
    
    
    uint16_t au16data[32]; //!< data array for modbus network sharing
    
    
    uint8_t u8state; //!< machine state
    uint8_t u8query; //!< pointer to message query
    
    
    
    
    /**
     *  Modbus object declaration
     *  u8id : node id = 0 for master, = 1..247 for slave
     *  u8serno : serial port (use 0 for Serial)
     *  u8txenpin : 0 for RS-232 and USB-FTDI 
     *               or any pin number > 1 for RS-485
     */
    Modbus master(0,0,2); // this is master and RS-232 or USB-FTDI
    
    
    /**
     * This is an structe which contains a query to an slave device
     */
    modbus_t telegram[2];
    
    
    unsigned long u32wait;
    
    
    SoftwareSerial mySerial(0, 1);
    
    
    void setup() {
    
    
    ioset_up();
      // telegram 0: read registers
      telegram[0].u8id = 1; // slave address
      telegram[0].u8fct = 5; // function code (this one is registers read)
      telegram[0].u16RegAdd = 0; // start address in slave
      telegram[0].u16CoilsNo = 2; // number of elements (coils or registers) to read
      telegram[0].au16reg = au16data[0]; // pointer to a memory array in the Arduino
     
    
    
      telegram 1: write a single register
      telegram[1].u8id = 1; // slave address
      telegram[1].u8fct = 6; // function code (this one is write a single register)
      telegram[1].u16RegAdd =1; // start address in slave
      telegram[1].u16CoilsNo = 4; // number of elements (coils or registers) to read
      telegram[1].au16reg = au16data[0]; // pointer to a memory array in the Arduino
    
    
    
    
      // telegram 2: read registers
      telegram[2].u8id = 1; // slave address
      telegram[2].u8fct = 5; // function code (this one is registers read)
      telegram[2].u16RegAdd = 1; // start address in slave
      telegram[2].u16CoilsNo = 2; // number of elements (coils or registers) to read
      telegram[2].au16reg = au16data[0]; // pointer to a memory array in the Arduino
    
    
    
    
      Serial.begin( 9600);
      master.begin( 9600 ); // baud-rate at 19200
      master.begin( &mySerial, 9600 ); 
      master.setTimeOut( 3000 ); // if there is no answer in 3000 ms, roll over
      u32wait = millis() + 1000;
      u8state = u8query = 0; 
    
    
      pinMode(6, OUTPUT);
      pinMode(7, OUTPUT);
      pinMode(8, OUTPUT);
      pinMode(9, OUTPUT);
    
    
    }
    void loop() {
      io_poll();
    
    
      switch( u8state ) {
      case 0: 
        if (millis() > u32wait) u8state++; // wait state
        break;
      case 1: 
        master.query( telegram[u8query] ); // send query (only once)
        u8state++;
      u8query++;
      if (u8query > 2) u8query = 0;
        break;
      case 2:
        master.poll(); // check incoming messages
        if (master.getState() == COM_IDLE) {
          u8state = 0;
          u32wait = millis() + 1000; 
      
       Serial.print(au16data[0]);
    
    
        }
        break;
    
    
      // set digital outputs -> au16data[0]
      digitalWrite( 6, bitRead( au16data[0], 0 ));
      digitalWrite( 7, bitRead( au16data[0], 1 ));
      digitalWrite( 8, bitRead( au16data[0], 2 ));
      digitalWrite( 9, bitRead( au16data[0], 3 ));
     
      }
      }

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη misterno : 05-06-18 στις 10:01

  6. #6
    Μέλος
    Όνομα
    Βασίλης
    Εγγραφή
    Sep 2011
    Περιοχή
    Κερατσίνι
    Μηνύματα
    8.778

    Προεπιλογή

    σελ.305 εχει τον κωδικα για να κανεις να τρεχει στα 50hz.υποψην τα 1388h(δεκαεξαδικος) ειναι 5000(50,00hz)

    0 Not allowed! Not allowed!
    Δυο πράγματα είναι άπειρα, το σύμπαν και η ανθρώπινη βλακεία, αλλά για το σύμπαν δεν είμαι εντελώς σίγουρος

  7. #7
    Μέλος
    Όνομα
    Χρήστος
    Εγγραφή
    Sep 2012
    Περιοχή
    Χολαργός
    Μηνύματα
    1.907

    Προεπιλογή

    Γιάννη , δεν χρειάζεται να κρυφακούσεις τι στελνει ο arduino , to pc να κρυφακούσεις . Ο arduino τρέχει οτι του πεις , τα βλεπεις στο προγραμμα τι στελνει , δεν χρειάζεσαι sniffing εκει
    ( εκτός αν δεν καταλαβαίνεις το πρόγραμμα του arduino τι κάνει )

    Εναλλακτικά, βαλε τον arduino να ακουει τι στελνει το pc στον ινβερτερ , και κοίτα τι ακούει


    Βασίλη , αφου το pc είναι master και ο Γιάννης πeτάει από τον master στο inverter την εντολή , κατα βούληση , που ειναι η δυσκολία ;

    Θα στείλει 3 εντολές ( start , τοσες στροφές , stop ) και θα παρατηρησει τι θα βγει απο το PC

    0 Not allowed! Not allowed!
    Τελευταία επεξεργασία από το χρήστη aktis : 05-06-18 στις 21:58

  8. #8
    Μέλος
    Όνομα
    Βασίλης
    Εγγραφή
    Sep 2011
    Περιοχή
    Κερατσίνι
    Μηνύματα
    8.778

    Προεπιλογή

    Μπορει να κανω και λαθος(η να εχω καταλαβει λαθος).Νομιζα να διαβασει τις εντολες που στελνει ο inverter που ειναι δεκαδες.

    0 Not allowed! Not allowed!
    Δυο πράγματα είναι άπειρα, το σύμπαν και η ανθρώπινη βλακεία, αλλά για το σύμπαν δεν είμαι εντελώς σίγουρος

Παρόμοια Θέματα

  1. Έλεγχος MX2 omron inverter με RS485 modbus rtu
    By misterno in forum Αυτοματισμοί
    Απαντήσεις: 13
    Τελευταίο Μήνυμα: 29-05-18, 16:02
  2. Απαντήσεις: 20
    Τελευταίο Μήνυμα: 08-05-18, 13:48
  3. VFD Motor Control - Βιβλίο
    By SProg in forum Ηλεκτρονικά
    Απαντήσεις: 4
    Τελευταίο Μήνυμα: 24-09-16, 10:54
  4. μονοφασικό μοτέρ και VFD inverter
    By axel in forum Ηλεκτρολογικά
    Απαντήσεις: 3
    Τελευταίο Μήνυμα: 09-12-11, 12:38

Tags for this Thread

Δικαιώματα - Επιλογές

  • Δημιουργία θεμάτων: Όχι
  • Υποβολή μηνυμάτων: Όχι
  • Σύναψη αρχείων: Όχι
  • Επεξεργασία μηνυμάτων: Όχι
  •  
  • BB code: σε λειτουργία
  • Smilies: σε λειτουργία
  • [IMG]: σε λειτουργία
  • [VIDEO] code is σε λειτουργία
  • HTML: εκτός λειτουργίας