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

ТИА

, 👍0

Обсуждение

сначала вы должны обновить комментарии и удалить неиспользуемые настройки, такие как количество полей для запроса с одним значением (функция 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


1 ответ


1

Вам следует обновить комментарии и удалить неиспользуемые настройки, такие как количество полей для запроса с одним значением (функция 5 и 6).

au16reg — это данные для отправки. игнорировать двоичный формат из примера.

Чтобы отправить значение катушки или регистра, установите значение в telegram.au16reg[0].

Информацию о протоколе сообщений Modbus см., например, в статье Википедии.

,

Когда я вызываю последний код, который я дал, он работает хорошо, и я получаю правильное сообщение. Когда я вызываю этот код с вызовом «master.query(telegram[0]);//отправить запрос (только один раз)», программа не работает. Что я пропустил? Это хороший способ проверить операторы кнопок и отправить команды modbus rtu на vfd?, @greekouzina

Я не вижу проблемы с отправкой запроса Modbus, вызванного кнопкой, но ваш код все еще беспорядок. вы не можете этого сделать, если не можете понять и написать код., @Juraj

Похоже, у меня конфликт, когда я вызываю эту команду телеграммы. Хотя я протестировал множество библиотек Modbus, но ни одна из них не работает должным образом. Также я не могу добиться хорошей синхронизации с программным обеспечением опроса Modbus, и я получаю отчеты об ошибках времени. Можно ли помочь мне с фрагментом кода, чтобы поймать недостающую точку?, @greekouzina