ModBus Master

Тема в разделе "Arduino & Shields", создана пользователем DLS74, 2 июн 2019.

  1. DLS74

    DLS74 Нерд

    Добрый день!

    Пытаюсь уже несколько дней подключить температурный датчик к Ардуино. Но результат нулевой... на выходе...
    Датчик работает по стандарту RS-485, протокол ModBus. Считывание происходит через Input Registers.
    Адрес устройства - 01, Скорость передачи данных - 57600, Тип данных - float, длина - 2, адрес 0х0000.
    Библиотеку использую вот эту: https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino
    Скетч взял из примера:
    Код (C++):
    /**
    *  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;
    byte i;

    /**
    *  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

    /**
    * This is an structe which contains a query to an slave device
    */

    modbus_t telegram;

    unsigned long u32wait;

    void setup() {
      master.begin( 57600 ); // baud-rate at 19200
      master.setTimeOut( 5000 ); // if there is no answer in 2000 ms, roll over
      u32wait = millis() + 1000;
      u8state = 0;

      Serial.begin (9600);
      pinMode(9, OUTPUT);
      digitalWrite(9, LOW);
    }

    void loop() {
      switch( u8state ) {
      case 0:
        if (millis() > u32wait) u8state++; // wait state
        break;
      case 1:
        telegram.u8id = 1; // slave address
        telegram.u8fct = 4; // 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

        master.query( telegram ); // send query (only once)
        u8state++;
        break;
      case 2:
        master.poll(); // check incoming messages
        if (master.getState() == COM_IDLE) {
          u8state = 0;
          u32wait = millis() + 100;
        }
        for(int i=0; i<16; i++)
         {
          Serial.println(au16data[i]);
         }
    Serial.println();
    delay(1000);
        break;
      }
    }
    Помогите кто уже работал с такой задачей и протоколом.
    В интернете очень много разновидностей такой библиотеки... может мне нужно другую использовать.
    Возможно что-то с типами данных... так как au16data тип целый, а у мне нужно считать тип float.


    С уважением Дмитрий.
     
    Последнее редактирование: 2 июн 2019
  2. parovoZZ

    parovoZZ Гуру

    Нет такого протокола. Сможешь рассказать, что делает каждая строчка твоего кода? Если нет, то и обсуждать нечего.
    Почему сперва на уарте скорость выставляется 57600, а потом скидывается до 9600?
     
  3. Daniil

    Daniil Гуру

    А схема какая?
     
  4. znamen

    znamen Guest

    Вот мои начальные рекомендации,как и обещал. Дальше будем посмотреть.
     

    Вложения:

  5. DetSimen

    DetSimen Спамовредитель Модератор

    С такими рекомендациями тебя даже не банить, а на кол сажать нужно. При большом стечении народа.
     
    sslobodyan и parovoZZ нравится это.
  6. znamen

    znamen Guest

    Готов выслушать аргументы
     
  7. DLS74

    DLS74 Нерд

    Спасибо за опечатку про RS-485.... исправил....
    В первом случае это скорость передачи для ModBus
    Во втором случае это для вывода данных в порт монитора (поверьте если ее не использовать, то данные в виде чепухи выводятся все в одну строку)

    Какая строчка вас конкретно интересует?
     
  8. parovoZZ

    parovoZZ Гуру

    Это два разных интерфейса или один?
     
  9. DLS74

    DLS74 Нерд

    Конечно два разных....
     
  10. znamen

    znamen Guest

    Паровозу нравится подкалывать. Модбас-это протокол,а не интерфейс. Не ведись.
     
  11. parovoZZ

    parovoZZ Гуру

    Модбас на каком висит?
     
  12. DLS74

    DLS74 Нерд

    На счет CRC суммы не могу точно сказать... так как в паспорте ничего нет, а у производителя только завтра можно узнать.
    А может быть поэкспериментировать с ней и без нее...?
    Если можно пришлите пожалуйста конкретно тестовую строку, какую нужно отправить в датчик.
     
  13. DLS74

    DLS74 Нерд

    Вот что есть в паспорте на датчик.
     

    Вложения:

    • IMG_4086_02.JPG
      IMG_4086_02.JPG
      Размер файла:
      780,9 КБ
      Просмотров:
      194
  14. znamen

    znamen Guest

    Для того,чтобы написать конкретную строку мне необходим даташит на твой термометр, откуда я узнаю
    номер регистра где хранится температура, формат данных этой температуры и адрес устройства. На базе
    этих данных сформирую строку сCRC или без него. А формат мне нужен для того,чтобы знать чем строка
    заканчивается. Обычно символом возврата каретки,а может каким другим символом специфичным для
    производителя.
     
  15. DLS74

    DLS74 Нерд

    Адрес устройства - 01, Скорость передачи данных - 57600, Тип данных - float, длина - 2, адрес 0х0000.
     
  16. znamen

    znamen Guest

    Подожди немного. Я сейчас тебе сформирую эти строки с пояснением.
     
  17. parovoZZ

    parovoZZ Гуру

    Что это такое?
     
  18. parovoZZ

    parovoZZ Гуру

    Модбас изучил прежде, чем лезть в него? Ты точно уверен, что библиотека задаёт правильное смещение адресам регистров? И про интерфейс не услышал ответ.
     
    Последнее редактирование: 2 июн 2019
  19. parovoZZ

    parovoZZ Гуру

    Паузой
     
    sslobodyan и Daniil нравится это.
  20. Daniil

    Daniil Гуру

    Вы используте 1 интерфейс с разными параметрами на 2 протокола?
    Схему бы