Мониторинг контроллера 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(" ");
}
}
Я попробовал следующий скетч, но он не работает. Я хотел бы знать, хороший ли это способ отправить запрос контроллеру?
@Teddol, 👍4
Обсуждение1 ответ
Лучший ответ:
Чтобы отправить серию байтов через последовательный порт или любую другую реализацию потока (печати), используйте метод «буфер записи» 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 байта.
- Основная связь Arduino ModBus RTU с проблемой измерителя мощности
- Связь Arduino Uno и ESP32 с использованием RS485
- Управление VFD с помощью ModBus RTU через RS485 и Arduino
- Использование Modbus-RTU с Arduino и контроллером температуры
- считывание данных с контроллера через RS485 Modbus rtu Arduino
- Подключить датчик постоянного тока 12 В к Arduino UNO с помощью TTL RS485
- Controllino Mega и ЧМИ Fatek
- Связь Arduino master/slave с использованием RS485
добавить к вопросу схему подключения и полный эскиз, @Juraj
Опубликовать обновление с проводкой и полным эскизом, @Teddol
Если вы спросите, есть ли лучший способ отправить запрос, то да, есть. но это не заставит его работать.
байтовый запрос [] = {0, 0x03, 0, 0, 0, 0x01, 0x85, 0xDB}; RS485Serial.write(запрос, sizeof(запрос));
, @JurajХорошо, всё работает хорошо., @Teddol