Как использовать библиотеку Modbus RTU функционального кода 6
Я пытаюсь установить связь с контроллером температуры с помощью Modbus RTU. Я использовал эту библиотеку Arduino.
Мне удалось прочитать PV (текущее значение температуры), используя приведенный ниже код. Он использует код функции 4.
Я хочу установить значение SV (установить значение), используя код функции 6
Я заменил telegram.u8fct = 0x04;
на telegram.u8fct = 0x06;
и telegram.u16RegAdd = 0x03E8;
на соответствующий адрес для СВ. Но мне не удалось добиться успеха.
Как я могу реализовать код функции 6 в этой библиотеке?
Код для чтения PV, как показано ниже. Он работает правильно.
#include <ModbusRtu.h>
// массив данных для общего доступа к сети Modbus
uint16_t au16data[16];
uint8_t u8state;
/**
Modbus object declaration
u8id : node id = 0 for master, = 1..247 for slave
u8serno : serial port (use 0 for Serial)
u8txenpin : 0 for RS-232 and USB-FTDI
or any pin number > 1 for RS-485
*/
//УПРАВЛЕНИЕ ПЕРЕДАЧЕЙ - 8
// hardware serial - 2
Modbus master(0, 2, 8); // это мастер и RS-232 или USB-FTDI
/*
This is an structe which contains a query to an slave device
*/
modbus_t telegram;
unsigned long u32wait;
void setup() {
Serial.begin(9600);
master.begin(9600); // скорость передачи 9600
master.setTimeOut( 2000 ); // если нет ответа в течение 2000 мс, перевернуть
u32wait = millis() + 1000;
u8state = 0;
}
void loop() {
switch ( u8state ) {
case 0:
if (millis() > u32wait) u8state++; // состояние ожидания
break;
case 1:
telegram.u8id = 0x01; // адрес подчиненного устройства
telegram.u8fct = 0x04; // код функции (это чтение регистров)
telegram.u16RegAdd = 0x03E8; // начальный адрес в ведомом устройстве [CHANNEL 1 PV]
telegram.u16CoilsNo = 0x01; // количество элементов (катушек или регистров) для чтения
telegram.au16reg = au16data; // указатель на массив памяти в Arduino
master.query( telegram ); // отправляем запрос (только один раз)
u8state++;
break;
case 2:
master.poll(); // проверяем входящие сообщения
if (master.getState() == COM_IDLE) {
u8state = 0;
u32wait = millis() + 100;
Serial.println(au16data[0]);//ЗНАЧЕНИЕ ТЕМПЕРАТУРЫ ПЕЧАТИ
}
break;
}
}
@user_fs10, 👍-1
1 ответ
Мне удалось изменить значение SV.
Согласно библиотеке, при использовании кода функции 6 она получает данные для отправки (значение температуры) из au16regs[0]
, как показано ниже в фрагменте кода файла библиотеки.
Необходимо установить это значение перед запросом.
(ModbusRtu.h - номер строки 601)
case MB_FC_WRITE_REGISTER: //если код функции 6
au8Buffer[ NB_HI ] = highByte(au16regs[0]);
au8Buffer[ NB_LO ] = lowByte(au16regs[0]);
- Расчет CRC16 для MODBUS RTU
- Проблема со связью по Modbus между двумя Arduino при записи более 27 регистров.
- Как сгенерировать файлы .a и .so для добавления в проект arduino
- Библиотека ESP8266: получено 2 запроса вместо 1
- Проблема с SPI при использовании трансивера RF24 NRF24L01 со светодиодной матрицей MD_MAX72xx
- Как сегментировать программу Arduino, если количество строк настолько велико, что обслуживание кода затруднено?
- Колебания в 4-х полумостовой тензодатчике через комбинатор
- Ошибка компиляции скетча для преобразования класса/библиотеки.
Можно принять ваш собственный ответ как решение проблемы., @VE7JRO
@VE7JRO да. Это ответ на вопрос. Но вам придется столкнуться с проблемой, если вы будете использовать этот код в программе с другими функциями., @user_fs10