ModBus Master

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

  1. parovoZZ

    parovoZZ Гуру

    Я не понимаю. Напиши кодом.
     
  2. parovoZZ

    parovoZZ Гуру

    А бы какой не подойдёт. Нужен CRC16 по полиному A01h(могу запамятовать).
     
    Daniil нравится это.
  3. Daniil

    Daniil Гуру

    вот, 2 моих сообщения проигнорированы, поэтому отвечу так:
    могу.
    10 раз можно было всё вычитать из книжек/сайтов - стандарт то открытый и пережеван всеми, а не ждать готовое.
     
  4. znamen

    znamen Guest

    Кодом вот так Serial1.begin(9600); Единица возле сериала говорит всем функциям записи чтения
    что выводить или вводить через порт 1
     
  5. DLS74

    DLS74 Гик

    Может все таки что-то с CRC....надеюсь..... так как уже все возможное проверил... осталось невозможное...
    Завтра отзвонюсь производителю... узнаю их версию CRC
    а так пока вот такой скетч получился:
    Может кто-нибудь увидит что-то необычное....
    Код (C++):
    int incomingByte = 0;
    byte i,Status;
    byte data_out = (0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x10);

    void setup() {
    Serial.begin(9600);
    Serial1.begin(57600);

    pinMode(9, OUTPUT);
    digitalWrite(9, LOW);
    Status = 1;
    }

    void loop() {
        digitalWrite(9, HIGH); // Режим передачи данных
        delay(3);
        Serial.println(" Передача ");

        Serial1.write(data_out);

         digitalWrite(9, LOW); // Режим чтения данных

       delay(5);
      if (Serial1.available() > 0)
       {
         Serial.println(" Прием ");
         delay(5);

          incomingByte = Serial1.read();
          Serial.print("ОТВЕТ ТЕРМОМЕТРА  ");
          Serial.println(incomingByte,HEX);

       }
    }
     
  6. ИгорьК

    ИгорьК Гуру

  7. znamen

    znamen Guest

    Единственное,что мне не нравится в твоей программе-это то,что после команды передачи команды
    Ты сразу же переключаешь приемо передатчик на приём. Я не знаю,что там в библиотеке. По грамотному
    должно быть,что пока не освободится буфер передатчика ,следующая команда не должна выполняться.
    На всякий случай после команды передачи поставь детей 5 мс. Чтоб данные успели перебраться
    Посмотрел программу ИгоряК на Lua. В ней полином А001. По такому же полиному и я вычислил тебе
    контрольную сумму. Но ещё хочу повторить,что у твоего девайса может быть другой полином. Это ты
    можешь узнать только у производителя. Так,что пока не узнаешь-тормозим..
     
  8. znamen

    znamen Guest

    Обычно производитель даёт нормальный букварь на своё изделие, где расписана адресация всех
    регистров. Чёткое описание протокола и туториалы .
     
  9. SergeiL

    SergeiL Оракул Модератор

    У Вас CRC неправильно посчитана:
    Попробуйте так:
    Код (C++):
    byte data_out[] = {0x01,0x03,0x00,0x00,0x00,0x02,0xC4,0x0B};
     
    UPD. Скобки не те и массив неправильно определен, исправил выше.
     
    Последнее редактирование: 3 июн 2019
    Daniil нравится это.
  10. SergeiL

    SergeiL Оракул Модератор

    И Вы уверены, что Вам нужна функция 03, а не 04?
     
  11. SergeiL

    SergeiL Оракул Модератор

    При передаче нужно указывать длину буфера:
    Код (C++):
    Serial1.write(data_out,8);
     
  12. SergeiL

    SergeiL Оракул Модератор

    По хорошему, переключение на прием должно выполняться в прерывании, по окончанию передачи.
    Сделайте задержку на 2 мс после передачи:
    Код (C++):
    Serial1.write(data_out,8);
    delay(2);
     
  13. parovoZZ

    parovoZZ Гуру

    ПРЕКРАСНО! Но ТС ХОЧЕТ выводить данные и на цомпкутер в терминалку. КУ?
     
  14. znamen

    znamen Guest

    SergeiL написал, что контрольная сумма C410 вычислена не правильно, а правильная C40B. Скорее всего
    он прав. Дело в том,что эти две контрольные суммы,что та,что та вычислены правильньно,но моя контрольная сумма это чистый CRC-16, а другая сумма-это CRC-16(modbus). Где разница в алгоритме я
    честно говоря не знаю,да и не задавался целью.
     
  15. DLS74

    DLS74 Гик

    Все так исправил.... но то же не работает
     
  16. DLS74

    DLS74 Гик

    Созвонился сегодня с производителем, тот прислал картинку, где он через программу работает с регистрами... так вот там при комбинации 01 04 00 00 00 02 CRC = 71CB У них с таким значением все работает.... у меня нет....
    Но они подали идею... а где говорят гарантия, что все 8 значений ушли из буфера... а например последнее задержалось.... что-то типа прерывание или функция завершения передачи есть интересно в Ардуино?
    На днях(как получится, скорее всего на выходных) буду смотреть на осцилографе... как ходят данные.
     
  17. znamen

    znamen Guest

    Сейчас проверю по какой контрольной сумме они это просчитывали. И отпишусь. Не сомневайтесь -решим Вашу проблему.
     
  18. parovoZZ

    parovoZZ Гуру

    Для таких дел ЛА надо иметь. Очень сильно выручает.
     
  19. DLS74

    DLS74 Гик

    Ага.... они тоже его посоветовали.... но у меня в наличии только осцилограф
     
  20. DLS74

    DLS74 Гик

    Самое интересное, что данное значение CRC полностью совпадает с online калькуляторами CRC, но только байты поменены местами.... т.е. калькулятор мне показал на комбинацию 0104000002 CRC=CB71, у них же используется 71CB..... я тогда специально перепроверил с интернета с описания ModBus.... везде также получается одно... потом меняют местами старший с младшим....