Про шилд rs-485

Тема в разделе "Arduino & Shields", создана пользователем ivpo, 5 дек 2021.

  1. ivpo

    ivpo Нуб

    Здравствуйте

    В вики по амперковскому шилду RS-485 рассматривается передача информации сразу символами.
    Подскажите, как работать через этот шилд напрямую с Modbus?
    Может быть есть где-то удобные рабочие примеры, которые стоит рассмотреть?

    Заранее спасибо!
     
  2. b707

    b707 Гуру

    Вопрос неконкретный, показывайте код
     
  3. ivpo

    ivpo Нуб

    Не работает :(
    Нет отклика от прибора.

    Код (C++):
    #include <ModbusRtu.h>
    #include <SoftwareSerial.h>

    #define TXEN  7

    long ts = 0;
    Modbus master(0);
    modbus_t telegram;
    SoftwareSerial mySerial(6, 9); // RX, TX
    uint8_t u8state;
    uint16_t au16data[16];
    unsigned long u32wait;

    void setup() {
      Serial.begin(9600);
      Serial.println("Started");
      mySerial.begin(9600);
      pinMode(TXEN, OUTPUT);
      digitalWrite(TXEN, HIGH);
      u32wait = millis();
      for (int i = 0; i < 16; i++) { au16data[i] = 0; };
    }

    void loop() {
      switch( u8state ) {
        case 0:
          if (millis() > u32wait) u8state++; // wait state    
          break;
        case 1:
          telegram.u8id = 1;                // slave address
          telegram.u8fct = 3;               // function code (this one is registers read)
          telegram.u16RegAdd = 1;           // start address in slave
          telegram.u16CoilsNo = 12;         // number of elements (coils or registers) to read
          telegram.au16reg = au16data;      // pointer to a memory array in the Arduino
          digitalWrite(TXEN, HIGH);
          master.query(telegram);           // send query (only once)
          digitalWrite(TXEN, LOW);
          u8state++;
          break;

        case 2:
          master.poll(); // check incoming messages
          if (master.getState() == COM_IDLE) {
            u8state = 0;
            u32wait = millis() + 500;      

            Serial.println("received:");
            Serial.print("0 = ");
            Serial.println(au16data[0]);
            Serial.print("1 = ");      
            Serial.println(au16data[1]);
            Serial.print("2 = ");
            Serial.println(au16data[2]);
            Serial.print("3 = ");
            Serial.println(au16data[3]);      
            Serial.print("4 = ");
            Serial.println(au16data[4]);      
            Serial.print("5 = ");
            Serial.println(au16data[5]);      
            Serial.print("6 = ");
            Serial.println(au16data[6]);      
                       
          }
          break;
        }
    }
     
  4. b707

    b707 Гуру

    что-то я не вижу, в каком месте вы говорите мастеру работать через mySerial() ?

    В библиотеке разве нет примеров?
     
  5. ivpo

    ivpo Нуб

    Большое спасибо! Поправил.
    Но пока без результата.

    Код (C++):
    #include <ModbusRtu.h>
    #include <SoftwareSerial.h>

    #define TXEN  7

    long ts = 0;
    Modbus master(0);
    modbus_t telegram;
    SoftwareSerial mySerial(6, 9); // RX, TX
    uint8_t u8state;
    uint16_t au16data[16];
    unsigned long u32wait;

    void setup() {
      Serial.begin(9600);
      Serial.println("Started");
      master.begin(&mySerial, 9600);  
      pinMode(TXEN, OUTPUT);
      digitalWrite(TXEN, HIGH);
      u32wait = millis();
      for (int i = 0; i < 16; i++) { au16data[i] = 0; };
    }

    void loop() {
      switch( u8state ) {
        case 0:
          if (millis() > u32wait) u8state++; // wait state  
          break;
        case 1:
          telegram.u8id = 1;                // slave address
          telegram.u8fct = 3;               // function code (this one is registers read)
          telegram.u16RegAdd = 1;           // start address in slave
          telegram.u16CoilsNo = 12;         // number of elements (coils or registers) to read
          telegram.au16reg = au16data;      // pointer to a memory array in the Arduino
          digitalWrite(TXEN, HIGH);
          master.query(telegram);           // send query (only once)
          digitalWrite(TXEN, LOW);
          u8state++;
          break;

        case 2:
          master.poll(); // check incoming messages
          if (master.getState() == COM_IDLE) {
            u8state = 0;
            u32wait = millis() + 500;    

            Serial.println("received:");
            Serial.print("0 = ");
            Serial.println(au16data[0]);
            Serial.print("1 = ");    
            Serial.println(au16data[1]);
            Serial.print("2 = ");
            Serial.println(au16data[2]);
            Serial.print("3 = ");
            Serial.println(au16data[3]);    
            Serial.print("4 = ");
            Serial.println(au16data[4]);    
            Serial.print("5 = ");
            Serial.println(au16data[5]);    
            Serial.print("6 = ");
            Serial.println(au16data[6]);    
                     
          }
          break;
        }
    }
     
  6. b707

    b707 Гуру

    вопрос все тот же - разве в библиотеке нет примеров? Зачем вы что-то выдумываете, сначала возьмите готовый пример, проверьте что он работает, а потом уже меняйте. Модбас вы опять инициализируете неправильно.