https://www.ozon.ru/product/termopara-dlya-izmeritelnyh-priborov-1-sm-3065392479/
Протокол связи 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); // Режим приема
}


