Arduino Modbus RTU VFD управление
Мне нужна помощь с этим кодом:
/**
* Ведущий Modbus, пример 1:
* Цель этого примера — запросить массив данных
* с внешнего ведомого устройства Modbus.
* Носитель связи может быть USB или RS232.
*
* Рекомендуемое ведомое устройство Modbus:
* diagslave http://www.modbusdriver.com/diagslave.html
*
* В Linux запустите
* "./diagslave /dev/ttyUSB0 -b 19200 -d 8 -s 1 -p нет -m rtu -a 1"
* Это:
* последовательный порт /dev/ttyUSB0 на скорости 19200 бод 8N1
* Режим RTU и адрес @1
*/
#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
*/
Modbus master(0,0,2); // это мастер и RS-232 или USB-FTDI, PIN 9 PARA INDICAR QUE TRASMITO
/**
* This is an structe which contains a query to an slave device
*/
modbus_t telegram;
unsigned long u32wait;
void setup() {
master.begin( 9600 ); // скорость передачи 19200
master.setTimeOut( 2000 ); // если нет ответа в течение 2000 мс, перевернуть
u32wait = millis() + 1000;
u8state = 0;
}
void loop() {
switch( u8state ) {
case 0:
if (millis() > u32wait) u8state++; // состояние ожидания
break;
case 1:
telegram.u8id = 1; // адрес подчиненного устройства
telegram.u8fct = 5; // код функции (это чтение регистров)
telegram.u16RegAdd = 0; // начальный адрес в слейве
telegram.u16CoilsNo = 2; // количество элементов (катушек или регистров) для чтения
//telegram.au16reg = au16data; // указатель на массив памяти в Arduino
// PARA EL VARIADOR OMRON MX1: MODBUS RTU 01 05 00 00 FF 00 -> НАЧИНАТЬ
// 01 -> ПОДЧИНЕННЫЙ (ЧРП OMRON)
// 05 -> НАПИСАТЬ КАТУШКУ
// 00 00 -> АДРЕСНАЯ КАТУШКА
// FF 00 -> ЗНАЧЕНИЯ, КОТОРЫЕ НУЖНО ЗАПИСАТЬ В КАТУШКЕ ДЛЯ РАБОТЫ
telegram.au16reg[0] = 0;
telegram.au16reg[1] = 0;
telegram.au16reg[2] = 0;
telegram.au16reg[3] = 0;
telegram.au16reg[4] = 0;
telegram.au16reg[5] = 0;
telegram.au16reg[6] = 0;
telegram.au16reg[7] = 0;
telegram.au16reg[8] = 1;
telegram.au16reg[9] = 1;
telegram.au16reg[10] = 1;
telegram.au16reg[11] = 1;
telegram.au16reg[12] = 1;
telegram.au16reg[13] = 1;
telegram.au16reg[14] = 1;
telegram.au16reg[15] = 1;
master.query( telegram ); // отправляем запрос (только один раз)
delay(3500);
telegram.u8id = 1; // адрес подчиненного устройства
telegram.u8fct = 6; // код функции (это чтение регистров)
telegram.u16RegAdd = 1; // начальный адрес в слейве
telegram.u16CoilsNo = 4; // количество элементов (катушек или регистров) для чтения
//telegram.au16reg = au16data; // указатель на массив памяти в Arduino
//telegram.au16reg = 0000000111110100;
// PARA EL VARIADOR OMRON MX1: MODBUS RTU 01 06 00 01 01 F4 -> ИЗМЕНИТЬ Часто задаваемые вопросы
// 01 -> ПОДЧИНЕННЫЙ (ЧРП OMRON)
// 06 -> ЗАПИСАТЬСЯ В РЕГИСТР
// 00 01 -> РЕГИСТРАЦИЯ АДРЕС
// 01 F4 -> ЗНАЧЕНИЕ ДЛЯ ЗАПИСИ В РЕГИСТР ДЛЯ ИЗМЕНЕНИЯ ЧАСТОТЫ ДВИГАТЕЛЯ
telegram.au16reg[0] = 0;
telegram.au16reg[1] = 0;
telegram.au16reg[2] = 0;
telegram.au16reg[3] = 0;
telegram.au16reg[4] = 0;
telegram.au16reg[5] = 0;
telegram.au16reg[6] = 0;
telegram.au16reg[7] = 1;
telegram.au16reg[8] = 1;
telegram.au16reg[9] = 1;
telegram.au16reg[10] = 1;
telegram.au16reg[11] = 1;
telegram.au16reg[12] = 0;
telegram.au16reg[13] = 1;
telegram.au16reg[14] = 0;
telegram.au16reg[15] = 0;
master.query( telegram ); // отправляем запрос (только один раз)
delay(3500);
telegram.u8id = 1; // адрес подчиненного устройства
telegram.u8fct = 5; // код функции (это чтение регистров)
telegram.u16RegAdd = 1; // начальный адрес в слейве
telegram.u16CoilsNo = 2; // количество элементов (катушек или регистров) для чтения
//telegram.au16reg = au16data; // указатель на массив памяти в Arduino
// PARA EL VARIADOR OMRON MX1: MODBUS RTU 01 05 00 00 00 00 -> ОСТАНАВЛИВАТЬСЯ
// 01 -> ЭСКЛАВО (ВАРИАДОР OMRON)
// 05 -> НАПИСАТЬ НА КАТУШКЕ
// 00 00 -> НАПРАВЛЕНИЕ КАТУШКИ
// 00 00 -> ЗНАЧЕНИЕ ДЛЯ ЗАПИСИ В КАТУШКУ ДЛЯ СТОП
telegram.au16reg[0] = 0;
telegram.au16reg[1] = 0;
telegram.au16reg[2] = 0;
telegram.au16reg[3] = 0;
telegram.au16reg[4] = 0;
telegram.au16reg[5] = 0;
telegram.au16reg[6] = 0;
telegram.au16reg[7] = 0;
telegram.au16reg[8] = 0;
telegram.au16reg[9] = 0;
telegram.au16reg[10] = 0;
telegram.au16reg[11] = 0;
telegram.au16reg[12] = 0;
telegram.au16reg[13] = 0;
telegram.au16reg[14] = 0;
telegram.au16reg[15] = 0;
master.query( telegram ); // отправляем запрос (только один раз)
delay(3500);
u8state++;
break;
case 2:
master.poll(); // проверяем входящие сообщения
if (master.getState() == COM_IDLE) {
u8state = 0;
u32wait = millis() + 100;
}
break;
}
}
Мне удалось отправить команду RUN на VFD, но я не могу (пока) отправить команду изменения частоты "01 06 00 01 01 F4" + проверка CRC.
Когда я подключаю логический анализатор к декодеру Modbus RTU, он показывает "Идентификатор устройства: "1" Функция Запись одной катушки ('5') Адрес: "0" значение: "65280" Chksum: "14988".
Проблема в том, что он передает только 1 телеграмму (массив пакетов) для команды "RUN", но не передает две другие. Будем признательны за любую помощь.
Это ссылка на ЧРП Omron MX: https://industrial.omron. us/en/media/I570-E2-02B_3G3MX2_UsersManual_tcm849-112721.pdf
ТИА
@greekouzina, 👍0
Обсуждение1 ответ
Вам следует обновить комментарии и удалить неиспользуемые настройки, такие как количество полей для запроса с одним значением (функция 5 и 6).
au16reg — это данные для отправки. игнорировать двоичный формат из примера.
Чтобы отправить значение катушки или регистра, установите значение в telegram.au16reg[0].
Информацию о протоколе сообщений Modbus см., например, в статье Википедии.
Когда я вызываю последний код, который я дал, он работает хорошо, и я получаю правильное сообщение. Когда я вызываю этот код с вызовом «master.query(telegram[0]);//отправить запрос (только один раз)», программа не работает. Что я пропустил? Это хороший способ проверить операторы кнопок и отправить команды modbus rtu на vfd?, @greekouzina
Я не вижу проблемы с отправкой запроса Modbus, вызванного кнопкой, но ваш код все еще беспорядок. вы не можете этого сделать, если не можете понять и написать код., @Juraj
Похоже, у меня конфликт, когда я вызываю эту команду телеграммы. Хотя я протестировал множество библиотек Modbus, но ни одна из них не работает должным образом. Также я не могу добиться хорошей синхронизации с программным обеспечением опроса Modbus, и я получаю отчеты об ошибках времени. Можно ли помочь мне с фрагментом кода, чтобы поймать недостающую точку?, @greekouzina
- Основная связь Arduino ModBus RTU с проблемой измерителя мощности
- Мониторинг контроллера Modbus RTU с помощью Arduino и модуля RS485
- Есть ли хорошая рабочая библиотека MODBUS TCP master для Arduino?
- Ведомая библиотека Modbus RTU
- Modbus IP с Simply Modbus TCP
- Сбой защиты от разрушения стека ESP32 с Modbus RTU
- Связь Arduino Uno и ESP32 с использованием RS485
- Использование сервера Modbus TCP на Arduino
сначала вы должны обновить комментарии и удалить неиспользуемые настройки, такие как количество полей для запроса с одним значением (функция 5 и 6). вы не устанавливаете значение в au16reg, как в комментариях
PARA EL VARIADOR OMRON MX
, @JurajВ этом скетче я не знаю, как сделана эта телеграмма с командами vfd. Например: telegram.u8id = 0x01; // адрес подчиненного устройства телеграмма.u8fct = 0x06; // код функции (это чтение регистров) телеграмма.u16RegAdd = 0x01; // начальный адрес в слейве телеграмма.u16CoilsNo = 0x04; // количество элементов (катушек или регистров) для чтения //telegram.au16reg = au16data; // указатель на массив памяти в Arduino //telegram.au16reg = 0000000111110100; Что делают эти 0 и 1?, @greekouzina
https://en.wikipedia.org/wiki/Modbus#Supported_function_codes, @Juraj
au16reg — это данные для отправки. игнорировать двоичный формат из примера, отправлять данные, требуемые документацией, @Juraj
После очистки телеграммы au16reg, о которой вы сказали, мне удалось передать второй и третий пакеты. Как я могу передать соответствующее значение частоте? Например: Как я могу передать ему значение 40 Гц? В любом случае, вы сэкономили мне много времени на поиск! Спасибо!, @greekouzina
установите значение в telegram.au16reg[0], @Juraj
Как я могу изменить команды с помощью 3 тумблеров. Я написал этот код, но он не работает. https://pastebin.com/UA0WFgQ7, @greekouzina