Ведомая библиотека Modbus RTU

Я хочу использовать Arduino Genuino Zero в качестве ведомого устройства Modbus. Я попытался выполнить поиск в Google и нашел библиотеку. Когда я пытаюсь использовать библиотеку, я получаю сообщение об ошибке тайм-аута.

Кто-нибудь может сказать мне, как решить эту ошибку? Удалось ли кому-нибудь заставить работать ведомую библиотеку Arduino Modbus RTU?

, 👍1

Обсуждение

Пожалуйста, предоставьте дополнительную информацию. Что такое ведущее устройство? Проверьте, правильно ли установлены скорость передачи данных, бит четности, бит данных. И, если возможно, предоставьте репозиторий git библиотеки, которую вы используете., @goddland_16

http://www.electronhacks.com/2014/04/arduino-modbus-plc-rtu/, @Beginner

я нахожу библиотеку из этого, @Beginner

как мастер, я использую симулятор, а имя симулятора - опрос Modbus., @Beginner


2 ответа


0

Сейчас я не могу смоделировать и увидеть результат; Я надеюсь, что если библиотека работает правильно, это может быть проблемой связи. Я могу добавить одношаговую отладку, чтобы вы могли проверить и посмотреть, что происходит.

Ваше устройство действует как ведомое устройство Modbus RTU. Возьмите другой Arduino, заставьте его действовать как ведущее устройство и посмотрите, какой ответ приходит от ведомого устройства. Вот фрагмент кода, который я использовал, чтобы сделать Arduino мастером, и увидеть ответ, приходящий в серийный терминал.

    #include <SoftwareSerial.h>
    #define rxPin 2
    #define txPin 3

    #define RS485_pin 10
    //SoftwareSerial mySerial(rxPin, txPin);
    #define mySerial Serial1


    byte test_data[8] = {0x01,0x03,0x00,0x64,0x00,0x02,0x85,0xD4};

    int data_count = 5;
    byte rcvdata[15];
    int param_value_int[7];

    void setup() {
      // put your setup code here, to run once:
    //mySerial.begin(19200,SERIAL_8E1);
    mySerial.begin(9600);
    Serial.begin(9600);
    delay(1000);
    pinMode(RS485_pin, OUTPUT);
    digitalWrite(RS485_pin,LOW);
    delay(100);
    }
    int count = 0; 
    void loop() {

      if(count%10 == 0) {
        Serial.println();
        send_data();
      }

      count++;

      while(mySerial.available()>0)
      {
        byte b=mySerial.read();
        delay(1);
        Serial.print(b,HEX);
        Serial.print(" ");
      }
      //Serial.println(count);
      while(Serial.available())
      {
        digitalWrite(RS485_pin,HIGH);
        byte a=Serial.read();
        delay(1);
        mySerial.print(a);
        digitalWrite(RS485_pin,LOW);
       // Serial.print(a);
      }


      delay(1000);
      //while(1);
    }

    void send_data() {
      Serial.println("send data");

      digitalWrite(RS485_pin,HIGH);
      delay(1);
      for(char i=0;i<8;i++){
        mySerial.write(test_data[i]);
        delay(1);
        Serial.print(test_data[i],HEX);
        Serial.print(" ");
      }

      Serial.println();
      digitalWrite(RS485_pin,LOW);
      delay(1);
    }

Здесь вы можете использовать Software Serial или обычный Serial1 или Serial2 на таких устройствах, как Mega. Убедитесь, что если он основан на RS485, вам нужно каждый раз переключать контакт RS485 для чтения и записи, чтобы включать и отключать одну функцию за раз, поскольку RS 485 использует полудуплексную связь.

В этом случае test_data[] использует код функции FC03 Чтение регистра хранения. Вы можете сделать свои пользовательские данные. Я предполагаю, что вы знакомы со всеми доступными типами. Тем не менее, есть отличный сайт [ ссылка ], на котором можно найти, если ты не знаешь основы. Последние два байта являются контрольной суммой. И есть онлайн-калькулятор контрольной суммы, если вам нужно также https://www.lammertbies.nl/comm/info/crc-calculation.html < /p>

Таким образом вы сможете хотя бы отладить и поделиться результатом, чтобы мы могли больше помочь.

,

Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackexchange.com/rooms/56581/discussion-on-answer-by-goddland-16-modbus-rtu-slave-library)., @Nick Gammon

Это не форум. Комментарии к вопросу предназначены для уточнения вопроса, а не для экспериментов с различными способами решения проблемы., @Nick Gammon


1

поэтому я отредактировал ваш код, как показано ниже #define mySerial Serial1

byte test_data[8] = {0x01,0x03,0x00,0x64,0x00,0x02,0x85,0xD4};

int data_count = 5;


void setup() {

mySerial.begin(9600);
Serial.begin(9600);
delay(1000);

}
int count = 0; 
void loop() {

  if(count%10 == 0) {
    Serial.println();
    send_data();
  }

  count++;

  while(mySerial.available()>0)
  {
    byte b=mySerial.read();
    delay(1);
    Serial.print(b,HEX);
    Serial.print(" ");
  }
  //Serial.println(count);
  while(Serial.available())
  {

    byte a=Serial.read();
    delay(1);
    mySerial.print(a);

  }


  delay(1000);

}

void send_data() {
  Serial.println("send data");


  delay(1);
  for(char i=0;i<8;i++){
    mySerial.write(test_data[i]);
    delay(1);
    Serial.print(test_data[i],HEX);
    Serial.print(" ");
  }

  Serial.println();

  delay(1);
,

рядом с подчиненной библиотекой, которую я загрузил. я заменяю «Serial» на «Serial1», так как я использую подлинный ноль., @Beginner

но до сих пор я не получаю никакого ответа, @Beginner

Эй, у вас есть реальное устройство Modbus?, @goddland_16

вы также можете использовать программное обеспечение modscan32 для получения данных с ведомого устройства. Программное обеспечение действует как ведущее устройство, а у вас есть ведомое устройство., @goddland_16

у меня нет реального устройства Modbus, @Beginner

да, я использовал программное обеспечение Modbus Flow, которое работает как master, @Beginner

но я получаю ошибку тайм-аута. поэтому я задал вопрос, чтобы проверить, правильный ли мой подчиненный код ...!, @Beginner

Тогда вы могли бы сделать такой вывод., @goddland_16

у вас есть работающая ведомая библиотека??, @Beginner

нет, я тестировал свое устройство в качестве мастера Modbus., @goddland_16

Вы можете проверить https://github.com/andresarmento/modbus-arduino/blob/master/README.md, @goddland_16

Он использовал его как ведомое устройство Modbus., @goddland_16

связь работает нормально. я не получаю никакой ошибки. я использовал их пример лампы, чтобы прочитать катушку. в этом примере они устанавливают статус катушки 1. но я получаю ответ "ноль", @Beginner