Простая функция ModBus Master 15
У меня простая установка с arduino Nano в качестве ведомого устройства и arduino Mega в качестве ведущего. Может ли кто-нибудь объяснить, как работает функция 15 FORCE_MULTIPLE_COILS Работает
Я провел некоторые тесты на этом и не могу понять как пользоваться локальный_начальный_адрес
это данные для чтения или же это указатель на другой файл
modbus_construct(&пакеты[PACKET1], 1, 15, 1, 8, 1021);
dec 8 = (no_of_registers = пакет->данные) // количество катушек
поэтому кадр 6 = 1 (frame[6] = no_of_bytes;) // количество байтов больше
декабрь 1021 = (пакет->local_start_address) швы dec 1021 и 65565 работают???? но для меня нет смысла в двоичном формате?
Вот
часть файла CPP:
enter code here
unsigned char construct_F15()
{
// информация о катушке функции 15 упаковывается сначала LSB, пока не будут заполнены первые 16 бит
// Получается так же..
unsigned char no_of_registers = packet->data / 16;
unsigned char no_of_bytes = no_of_registers * 2;
// если количество точек не помещается даже в 2 байта (один регистр), то используйте другой регистр и блокнот
if (packet->data % 16 > 0)
{
no_of_registers++;
no_of_bytes++;
}
frame[6] = no_of_bytes;
unsigned char bytes_processed = 0;
unsigned char index = 7; // пользовательские данные начинаются с индекса 7
unsigned int temp;
for (unsigned char i = 0; i < no_of_registers; i++)
{
temp = register_array[packet->local_start_address + i]; // получаем данные
frame[index] = temp & 0xFF;
bytes_processed++;
if (bytes_processed < no_of_bytes)
{
frame[index + 1] = temp >> 8;
bytes_processed++;
index += 2;
}
}
unsigned char frameSize = (9 + no_of_bytes); // первые 7 байт массива + 2 байта CRC + noOfBytes
return frameSize;
}
@Eric V, 👍1
Обсуждение1 ответ
я нашел
это
temp = register_array[packet->local_start_address + i]; // получить данные в файле ccp
register_array[packet->local_start_address + i]
указывает на неправильное местоположение... register_array??
Сверхразмерный никто этого не заметил, пока простой мастер modbus для адруино использовался ?
или у меня плохой файл CPP?
я временно исправил это, заменив на
unsigned char construct_F15()
{
// информация о катушке функции 15 упаковывается сначала LSB, пока не будут завершены первые 8 битов
unsigned char frameSize = 10;
unsigned char temp;
frame[6] = 1;
frame[7] = packet->local_start_address ^ 0XFFFF;
return frameSize;
}
работает (0 = выключено / 255 = включено)
modbus_construct(&packets[PACKET1], 1, 15, 1, 8, 0); // от 1 до 8 = выключено
modbus_construct(&packets[PACKET2], 1, 15, 1, 8, 255); // от 1 до 8 = включено
- Основная связь Arduino ModBus RTU с проблемой измерителя мощности
- Как автоматически сбросить модуль NRF24L01
- Сдвиг фазы квадратной волны Arduino на 270 градусов
- ARDUINO MODBUS TCP СОЕДИНЕНИЕ
- Сброс Arduino Uno в коде
- Последовательная связь между ESP8266 и Arduino Uno
- Отправка значения с одного Arduino на другой
- Мониторинг контроллера Modbus RTU с помощью Arduino и модуля RS485
этот вопрос, кажется, не связан с Arduino, @jsotola