https://www.ozon.ru/product/termopara-dlya-izmeritelnyh-priborov-1-sm-3065392479/

https://ru.bestdealplus.com/product/95073839/AA60-PT100-Platinovyj-termistor-RTD-Termopara-Datchik-temperatury-Peredatchik-RS485-Modul-MODBUS-RTU

https://www.fruugo.qa/pt100-temperature-transmitter-rs485-modbus-module-temperature-sensors-transmitter-for-electronics-accessories/p-365075137-791201952?language=en

Протокол связи Modbus RTU

Настройки по умолчанию

  • Скорость передачи данных: 9600 бод
  • Количество бит данных: 8
  • Равенство: Нет (N)
  • Стоп-биты: 1
  • Формат: 9600, N, 8, 1

 Таблица адресов для регистрации

РегистрацияимяединицаДоступпримечание
0x0000 Значение температуры 0,1°C Читать (03) 255 = 25,5°C
0x0001 Сопротивление PT100 0,1 Ом Читать (03) 1000 = 100,0 Ом
0x0002 Адрес RS485 - Чтение/Запись (03/06) 1-247 (Чтение: 0xFF)
0x0003 Скорость передачи данных - Чтение/Запись (03/06) 0-4 (0:1200, 1:2400, 2:4800, 3:9600, 4:19200, 5:Сброс к заводским настройкам)
0x0004 Коррекция температуры 0,1°C Только для записи (06) Значение температурной коррекции (считывается: 0xFFFF)
0x0005 Коррекция сопротивления 0,1 Ом Только для записи (06) Значение коррекции сопротивления (считывается: 0xFFFF)
0x0006 Интервал автоматической отчетности Второй Чтение/Запись (03/06) 0: Запрос, 1-255: Автоматический отчет (секунды)

 Измерьте температуру.

 Отправить команду

Код функции: 0x03 (Чтение)

Адрес регистрации: 0x0000

Номер чтения: 0x0001

01 03 00 00 00 01 84 0A

Примечание: 01 = адрес RS485, 840A = CRC16

Примеры ответов

Положительная температура: +21,9°C

01 03 02 00 DB F8 1F

Расчет:

  • 00 DB = 219 (в десятичной системе)
  • 219 ÷ 10 = 21,9°C
  • Максимальное значение бита = 0 (положительное)

Температура ниже нуля: -11,2°C

01 03 02 FF 90 F2 3F

Расчет:

  • FF 90 = 65424 (в десятичной системе)
  • (65424 - 65536) ÷ 10 = -11,2°C
  • Максимальное количество битов = 1 (отрицательное значение)

Считайте значение сопротивления PT100.

Отправить команду

Код функции: 0x03

Регистрационный адрес: 0x0001

Номер чтения: 0x0001

01 03 00 01 00 01 D5 CA

Пример ответа

Значение сопротивления: 100,1 Ом

01 03 02 03 E9 79 3A

Расчет:

  • 03 E9 = 1001 (в десятичной системе)
  • 1001 ÷ 10 = 100,1 Ом

Чтение адреса RS485 (режим широковещательной рассылки)

 Внимание: Используйте эту команду только в том случае, если на шине RS485 подключен только 1 модуль!

Отправить команду

Адрес широковещательной рассылки: 0xFF

Регистрационный адрес: 0x0002

FF 03 00 02 00 01 30 14

Пример ответа

FF 03 02 00 01 50 50

Результат: Текущий адрес — 1.

Напишите адрес RS485.

Пример: Измените адрес с 1 на 3.

Код функции: 0x06 (Запись)

Регистрационный адрес: 0x0002

Новый адрес: 3 (0x0003)

01 06 00 02 00 03 68 0B

Ответить (Эхо)

01 06 00 02 00 03 68 0B

Примечание: команда Write вернет тот же ответ, что и отправленная команда.

Скорость передачи данных при чтении

Отправить команду

Регистрационный адрес: 0x0003

01 03 00 03 00 01 74 0A

Ответить

01 03 02 00 03 F8 45

Результат: 03 = 9600 бит/с

Таблица скоростей передачи данных

кодСкорость передачи данных
0 1200
1 2400
2 4800
3 9600 (по умолчанию)
4 19200
5 Сброс к заводским настройкам

Скорость передачи данных при записи

Важно: скорость передачи данных обновится после перезагрузки устройства!

Пример: Измените скорость на 4800 бит/с

01 06 00 03 00 02 F8 0B

Сброс к заводским настройкам

Используйте код 5 для сброса настроек до значений по умолчанию.

01 06 00 03 00 05 B9 C9

Настройка коррекции температуры

Принцип работы: Используется, когда измеренная температура отклоняется от истинного значения.

Единица измерения: 0,1 °C | Формат: 16-битный знаковый (старший бит = знак)

Пример 1: Установите температуру на +25,5°C

Ситуация: фактическая температура 25,5°C, но показания прибора составляют 26,4°C.

Расчет:

  • 25,5 × 10 = 255 (в десятичной системе счисления)
  • 255 = 0x00FF (шестнадцатеричное значение)

01 06 00 04 00 FF 88 4B

Пример 2: Изменение на -12,1°C

Вычисление отрицательных значений:

  • -12,1 × 10 = -121
  • 65536 - 121 = 65415
  • 65415 = 0xFF87 (шестнадцатеричное значение)

01 06 00 04 FF 87 C9 99

Настройка коррекции сопротивления PT100.

Пример: Измените на 100,0 Ом

Ситуация: фактическое значение составляет 100,0 Ом, но показание прибора равно 102,0 Ом.

Расчет:

  • 100,0 × 10 = 1000 (в десятичной системе счисления)
  • 1000 = 0x03E8 (шестнадцатеричное значение)

01 06 00 05 03 E8 99 75

Ответить

01 06 00 05 03 E8 99 75

Прочитайте значения автоматического отчета.

Отправить команду

Адрес регистрации: 0x0006

01 03 00 06 00 01 64 0B

Ответить

01 03 02 00 00 B8 44

Результат: 00 = Режим запроса (без автоматического отчета)

Настройте автоматическое создание отчетов.

Пояснение: Настройте модуль на автоматическую отправку данных о температуре каждые N секунд (1-255 секунд).

Режим запроса (0): Отправка команды при желании прочитать значения.

Режим автоматической отправки отчетов (1-255): Автоматически отправляет данные каждые N секунд.

Пример команды

Отчеты каждые 1 секунду.

01 06 00 06 00 01 A8 0B

Отчеты каждые 2 секунды.

01 06 00 06 00 02 E8 0A

Сообщайте каждые 5 секунд.

01 06 00 06 00 05 A9 C8

Сообщайте каждые 10 секунд.

01 06 00 06 00 0A E9 CC

 Отключите автоматическое создание отчетов (вернитесь в режим запросов)

01 06 00 06 00 00 69 CB

Контрольная сумма CRC16

Примечание: Modbus RTU использует CRC16 для проверки данных.

  • Контрольная сумма CRC16 вычисляется на основе всех данных, за исключением последних двух байтов самой контрольной суммы.
  • Последовательность байтов: младший байт — первый, старший байт — второй.
  • Для автоматического вычисления контрольной суммы CRC можно использовать такие программы, как Modbus Poll .
  • В качестве альтернативы, вы можете использовать HyperTerminal для ручного вычисления контрольной суммы CRC.

Код для Arduino Uno: PTA9B01 (RS485 Modbus)Скопировать и вставить


/*
* PTA9B01 PT100 Код датчика RS485
*
* Применение:
* 1. Настройка: Отправьте команду для остановки автоматической отправки (Регистр 0x0006 = 0)
* 2. Цикл: Отправка команды на считывание температуры (регистр 0x0000) и отображение результата.
*
* Подключение оборудования (MAX485 -> Arduino Uno):
* VCC -> 5V
* GND -> GND
* RO -> Контакт 10 (RX)
* DI -> Контакт 11 (TX)
* DE/RE -> Контакт 3 (Управление)
*/

#include  

// Определяем назначение выводов для MAX485 
const  int PIN_RX = 10;
 const  int PIN_TX = 11;
 const  int PIN_CTRL = 3;

SoftwareSerial rs485(PIN_RX, PIN_TX);

// --- Набор инструкций в соответствии с техническим описанием ---

// 1. Отключаем функцию автоматической отправки 
// Шестнадцатеричное значение: 01 06 00 06 00 00 69 CB 
const  byte cmdStopAuto[] = {0x01, 0x06, 0x00, 0x06, 0x00, 0x00, 0x69, 0xCB};

// 2. Команда чтения температуры 
// Шестнадцатеричное значение: 01 03 00 00 00 01 84 0A 
const  byte cmdReadTemp[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01, 0x84, 0x0A};

void  setup () {
Serial. begin (115200);
rs485.begin ( 9600 ); // Скорость передачи данных по умолчанию PTA9B01 = 9600

pinMode (PIN_CTRL, OUTPUT);
 digitalWrite (PIN_CTRL, LOW);

Serial.println ( "--- PTA9B01 Система запускается ---" );

// Сначала остановим автоматическую отправку (отправим 3 раза для подтверждения) 
Serial.print ( " Отправка команды остановки..." );
 for ( int i = 0; i < 3; i++) {
 sendModbusCommand (cmdStopAuto, sizeof (cmdStopAuto));
 delay (100);
 while ( rs485.available ()) rs485.read ( ); // Очистка буфера
}
Serial.println ( "Готово." ) ;
 delay (1000);
}

void  loop () {
 // 1. Очистить буфер 
while (rs485.available ()) rs485.read ( ) ;

// 2. Отправляем команду для чтения значения: 
sendModbusCommand (cmdReadTemp, sizeof (cmdReadTemp));

// 3. Ожидание данных (тайм-аут 1 секунда) 
unsigned  long startTime = millis ();
 while (rs485.available ( ) < 7 && millis () - startTime < 1000);

// 4. Чтение и обработка, 
если (rs485.available () >= 7) {
 буфер байтов [9];
rs485.readBytes ( buffer , 8);

// Проверка заголовка: Адрес=01, Функция=03 
if (buffer[0] == 0x01 && buffer[1] == 0x03) {
 uint16_t rawData = (buffer[3] << 8) | buffer[4];
 int16_t signedVal = ( int16_t )rawData; // Поддержка отрицательных значений 
​​float temperature = signedVal / 10.0;

Serial.print ( "Температура: " ) ;
Serial. print (temperature);
Serial.println ( " C" );
}
}

задержка (1000);
}

void  sendModbusCommand ( const  byte * cmd, int length) {
 digitalWrite (PIN_CTRL, HIGH); // Задержка режима передачи
 (10);
rs485.write (cmd, length) ;
rs485.flush ();
 digitalWrite ( PIN_CTRL, LOW); // Режим приема
}