ModBus Master

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

  1. parovoZZ

    parovoZZ Гуру

    В modbus crc16. Как ее рассчитать - интернет пестрит примерами.
     
    Daniil нравится это.
  2. znamen

    znamen Guest

    Слеуещее предложение,за цитируемый строкой все поясняет. Это я о служебном символе.
     
  3. znamen

    znamen Guest

    Вот. 010300000002C410
    теперь рассписываю 01. Адрес устройства.
    03. Функция чтения
    0000. Начальный адрес регистра
    0002. Количество регистров,которое нужно считать
    Нужно считать 2 регистра, так как формат данных флоат
    С410. Контрольная сумма
    При пересылке учти ,что есть 8 байт данных в 16 ричном виде.
     
  4. DLS74

    DLS74 Нерд

    Функция чтения точно 03? А то изготовители почему-то акцентировали использование 04.
     
  5. znamen

    znamen Guest

    03 чтение аналогового вывода.
    04 чтение аналогового ввода
    Это так трактуется в описании протокола. Я в своей практике применял и ту и другую функцию.
    Разницы не заметил. Что так,что этак регистр вытягивается.
     
  6. DLS74

    DLS74 Нерд

    Порт поднимать как Serial1.begin(57600)?
     
  7. znamen

    znamen Guest

    И ещё. По опыту своему скажу. Все дешёвые адаптеры мне доверия не внушают. В ответственных проектах
    применяю промышленные. Например фирмы Овен АС4. с гальванической развязкой и автоматическим ре
    жимом, где не требуется сигнал приём/передача. Для своих личных нужд сделал его аналог,но без гальванической развязки. Вот его схема.
     

    Вложения:

    • 2.png
      2.png
      Размер файла:
      71,6 КБ
      Просмотров:
      189
  8. znamen

    znamen Guest

    Да. Но ты должен быть убеждён в том,что твой термометр сконфигурирован именно на эту скорость. И ещё обрати внимание на количество контрольных бит. Обычно 1. Но некоторые
    производители делают 2. Потом невнимательные пользователи неделями голову ламают
    Почему прибор не отвечает?
     
    Последнее редактирование модератором: 2 июн 2019
  9. DLS74

    DLS74 Нерд

    Да, в паспорте указана именно скорость 57600.
    А про количество контрольных бит где прописывается в кодовой посылке?
     
  10. DLS74

    DLS74 Нерд

    что-то данные приходят все по 255....
    вот скетч.... посмотрите пожалуйста.... видимо что-то не так делаю...
    Код (C++):
    byte data_in[8],data_out[8];
    byte i;


    void setup() {
    Serial.begin(9600);
    Serial1.begin(57600);
    data_in[0] = 01;
    data_in[1] = 03;
    data_in[2] = 00;
    data_in[3] = 00;
    data_in[4] = 00;
    data_in[5] = 02;
    data_in[6] = 196;
    data_in[7] = 16;


    pinMode(9, OUTPUT);
    }

    void loop() {
     
       digitalWrite(9, HIGH); // Режим передачи данных
     
    for(i=0; i<8; i++)
      {
      Serial1.print(data_in[i]);
      }

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

        delay(500);

    for(i=0; i<8; i++)
      {
      data_out[i] = Serial1.read();
      }

    for(i=0; i<8; i++)
      {
      Serial.print(data_out[i]);
      Serial.print(" ");
      }
    Serial.println();

      delay(10000);
    }
     
  11. znamen

    znamen Guest

     
  12. znamen

    znamen Guest

    Завтра посмотрю. И продолжим.
     
  13. DLS74

    DLS74 Нерд

    Сейчас переговорил с изготовителем.
    Они подтвердили, что обязательно нужен CRC код.
    А так же по поводу контрольного бита : используется стандартно 8N1.
     
  14. parovoZZ

    parovoZZ Гуру

    modbus без crc - это не modbus.
     
    Daniil нравится это.
  15. znamen

    znamen Guest

    1. int incomingByte = 0; // для данных, приходящих через последовательный порт

    2. void setup() {
    3. Serial.begin(9600); // открывает последовательный порт,по умолчанию 8N1
    4. }

    5. void loop() {

    6. // Отправляем данные, только если получили данные:
    7. if (Serial.available() > 0) {
    8. // Считываем входящий байт:
    9. incomingByte = Serial.read();

    10. // Отображаем на Serial Monitor то, что получили:
    11. Serial.print("ОТВЕТ ТЕРМОМЕТРА");
    12. Serial.println(incomingByte, HEX);
    13. }
    14. }
    Команду на термометр посылай так
    byte a[]={0x00,0x00,0x00,0x00}; тут запишешь команду и вставишь куда надо, я же не знаю от кнопки
    Serial.write(a,8); ее будешь запускать или еще как.В сетапе не забудь модуль на прием
    поставить. После переключения на передачу сделай делей 2-3 милисекунды . В конце передачи вкл.прием
    На форууме буду часа через 4. Пробуй
     
  16. DLS74

    DLS74 Нерд

    1) Может все таки Serial1.begin?
    Код (C++):
      // открываем последовательный порт на Serial
      Serial.begin(9600);
      // открываем последовательный порт на пинах 1 и 0
      Serial1.begin(9600);
    И про кнопку я не понял? Просто в цикле разве нельзя?
    Код (C++):
       if (Status == 1)
       {
        digitalWrite(9, HIGH); // Режим передачи данных
        Serial.println(" Передача ");

         for(i=0; i<8; i++)
          {
           Serial1.print(data_in[i]);
          Serial.print(data_in[i],HEX);
          Serial.print(" ");
          }
          Serial.println();
          Status = 0;
       }
      digitalWrite(9, LOW); // Режим чтения данных
     
  17. znamen

    znamen Guest

    На Вашей плате ардуино я вижу лишь один порт. О каком сериале1 Вы говорите? О сериале 1 или 2 говорят
    ,если на плате ардуино несколько портов. В цикле можно. Но я ведь не знаю Ваших задумок.
    От кнопки или ещё от какого то события.
     
  18. DLS74

    DLS74 Нерд

    Iskra Nano Pro
    • Аппаратных интерфейсов UART / Serial: 2
     
  19. znamen

    znamen Guest

    На ардуино можно и без контрольной суммы. Ну прийдет 2 запроса из 10 неправильных с градусника и что?
    В теплице цветы завянут?
     
  20. DLS74

    DLS74 Нерд

    И я плату RS-485 подключаю у Ардуино на 0 и 1 контакт.... А это же Serial1.... или нет?