Простая функция 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;
}

, 👍1

Обсуждение

этот вопрос, кажется, не связан с Arduino, @jsotola


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 = включено

,