Мониторинг контроллера Modbus RTU с помощью Arduino и модуля RS485

Я средний пользователь Arduino. Я купил контроллер pHметра с выходом RS485 (протокол MODBUS RTU). Я хочу получить значение pH, считанное контроллером через модуль RS485 и Arduino. По данным производителя контроллера, мы должны действовать следующим образом: Отправлено с компьютера: 00 03 00 00 00 01 85 DB Возврат от контроллера: 00 03 02 02 AE 05 58.


#include SoftwareSerial.h

#define SSerialRX        10  //Пин последовательного приема
#define SSerialTX        11  //Вывод последовательной передачи
#define SSerialTxControl 3   // Управление направлением RS485
#define RS485Transmit    HIGH
#define RS485Receive     LOW
#define Pin13LED         13

SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // прием, Передача
byte byteSend;

void setup()   
{
  // Запускаем встроенный последовательный порт, возможно, в Serial Monitor
  Serial.begin(9600);
  Serial.println("SerialRemote");  // Можно игнорировать

  pinMode(Pin13LED, OUTPUT);   
  pinMode(SSerialTxControl, OUTPUT);  

  digitalWrite(SSerialTxControl, RS485Receive);  // Инициализация трансивера


  RS485Serial.begin(9600);   
  delay(2000);
  digitalWrite(SSerialTxControl, RS485Transmit);  
   RS485Serial.write((byte)0x00);         
   RS485Serial.write((byte)0x03);                 
   RS485Serial.write((byte)0x00);                 
   RS485Serial.write((byte)0x00);                   
   RS485Serial.write((byte)0x00);                 
   RS485Serial.write((byte)0x01);         
   RS485Serial.write((byte)0x85);                
   RS485Serial.write((byte)0xDB); 
   Serial.println(" "); 

   digitalWrite(Pin13LED, LOW);  
   delay(10);
   digitalWrite(SSerialTxControl, RS485Receive);

}
void loop()   
{

  if (RS485Serial.available()) 
  {
    byteSend = RS485Serial.read();   // Читаем байт
    Serial.print(byteSend, HEX);
    Serial.print(" ");
  }
}

Я попробовал следующий скетч, но он не работает. Я хотел бы знать, хороший ли это способ отправить запрос контроллеру?

, 👍4

Обсуждение

добавить к вопросу схему подключения и полный эскиз, @Juraj

Опубликовать обновление с проводкой и полным эскизом, @Teddol

Если вы спросите, есть ли лучший способ отправить запрос, то да, есть. но это не заставит его работать. байтовый запрос [] = {0, 0x03, 0, 0, 0, 0x01, 0x85, 0xDB}; RS485Serial.write(запрос, sizeof(запрос));, @Juraj

Хорошо, всё работает хорошо., @Teddol


1 ответ


Лучший ответ:

3

Чтобы отправить серию байтов через последовательный порт или любую другую реализацию потока (печати), используйте метод «буфер записи» size_t write(const uint8_t *buffer, size_t size)

Для рассматриваемого случая:

byte request[] = {0, 0x03, 0, 0, 0, 0x01, 0x85, 0xDB}; 
RS485Serial.write(request, sizeof(request));

Если кому-то интересны байты запроса Modbus RTU. Это:

  • адрес станции
  • функция — 0x03 Чтение нескольких регистров временного хранения
  • адрес регистрации — 2 байта.
  • количество регистров для чтения — 2 байта.
  • контрольная сумма — 2 байта.

Ответ:

  • возврат адреса станции
  • код функции или ошибки
  • длина данных
  • данные — длина в байтах
  • контрольная сумма — 2 байта.
,