Код Arduino Modbus Master для считывания данных с помощью Arduino Uno из счетчика EB
Я использую счетчик энергии постоянного тока в качестве подчиненного устройства. Когда я тестирую счетчик энергии постоянного тока с помощью тестера Modbus, он показывает значение от 1 до 24 регистров. Я использую свой собственный Atmega328P со встроенным RS485 в качестве главного устройства. Я подключил A, B от подчиненного устройства к главной плате. Теперь я хочу считывать выходы подчиненного устройства с помощью своего главного устройства. Для этого я написал приведенный ниже код. Когда я последовательно печатаю массив, он показывает 000000000000000000000000000000000000769. Я не получаю полных данных на своем главном устройстве.
#include <ModbusRtu.h>
// массив данных для общего доступа к сети Modbus
uint16_t au16data[64];
uint8_t u8state;
int i;
/**
* 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,1); // это мастер и RS-232 или USB-FTDI
/**
* 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 = 3; // код функции (это чтение регистров)
telegram.u16RegAdd = 1; // начальный адрес в подчиненном устройстве
telegram.u16CoilsNo = 24; // количество элементов (катушек или регистров) для чтения
telegram.au16reg = au16data; // указатель на массив памяти в Arduino
master.query( telegram ); // отправить запрос (только один раз)
u8state++;
break;
case 2:
master.poll(); // проверка входящих сообщений
if (master.getState() == COM_IDLE) {
u8state = 0;
u32wait = millis() + 100;
}
break;
}
//au16data[4] = analogRead( 0 );
for(i=0;i<=64;i++)
{
Serial.print(au16data[i]);
}
Serial.println("\n");
Serial.println("\n");
delay(1000);
}
@user1811790, 👍0
1 ответ
Лучший ответ:
Ответ принимается, когда объект библиотеки ModbusRtu снова находится в состоянии IDLE
после отправки запроса. В вашем коде на основе примера из библиотеки ответ готов в состоянии 2
, которое следует за состоянием 1
, в котором был отправлен запрос. Если в состоянии 2
, когда состояние объекта master
меняется на IDLE, вы можете использовать ответ в массиве au16data
.
- Основная связь Arduino ModBus RTU с проблемой измерителя мощности
- Мониторинг контроллера Modbus RTU с помощью Arduino и модуля RS485
- Связь Arduino Uno и ESP32 с использованием RS485
- Использование сервера Modbus TCP на Arduino
- Управление VFD с помощью ModBus RTU через RS485 и Arduino
- Использование Modbus-RTU с Arduino и контроллером температуры
- считывание данных с контроллера через RS485 Modbus rtu Arduino
- Взаимодействие с контроллером температуры Eurotherm 2416 через Modbus RS232