Skip to content

Protocol

Alexander Veselov edited this page Oct 5, 2023 · 1 revision

Протокол обмена сообщениями

ARMStrong, упрощенный Modbus-rtu

// TODO

УДАС-03П, Импульс, Modbus-rtu

УДАС-03П имеет 2 блока детектирования и 4 канала:

  1. 1-Alpha (совмещенный), первый БД, который осуществляет оперативный контроль;
  2. 2-Alpha (размещенный), второй БД, который осуществляет контроль долгоживущих alpha-изотопов;
  3. 1-Beta (совмещенный), первый БД, который осуществляет оперативный контроль;
  4. 2-Beta (размещенный), второй БД, который осуществляет контроль долгоживущих beta-изотопов.

Пакет для запроса значения измерений представляет из себя 8-байтовый пакет с такой структурой:

new byte[] { address, fetchFunction, registerAddressLow, registerAddressHigh, registerCountLow, registerCountHigh, CRC16Low, CRC16High }

Для того, чтобы опросить каждый из каналов УНО с адресом 1, нужно отправить на УНО 8-байтовый пакет:

  • 1-Alpha:

    new byte[] { 0x01, 0x03, 0x40, 0x04, 0x00, 0x02, 0x90, 0x0A }
  • 2-Alpha:

    new byte[] { 0x01, 0x03, 0x40, 0x24, 0x00, 0x02, 0x91, 0xC0 }
  • 1-Beta:

    new byte[] { 0x01, 0x03, 0x40, 0x14, 0x00, 0x02, 0x91, 0xCF }
  • 2-Beta:

    new byte[] { 0x01, 0x03, 0x40, 0x34, 0x00, 0x02, 0x90, 0x05 }

    В ответ на каждый запрос придет 17-байтовый пакет, где первые 8 байтов, это ping-ответ с пакетом, который мы отправляли для запроса и вторые 9 байт сам ответ, например:

  • Запрос:

    new byte[] { 0x01, 0x03, 0x40, 0x04, 0x00, 0x02, 0x90, 0x0A }
  • Ответ:

    new byte[] { 0x01, 0x03, 0x40, 0x04, 0x00, 0x02, 0x90, 0x0A, 0x01, 0x03, 0x04, 0x45, 0xE6, 0xBE, 0x53, 0x3F, 0x55 }

    Здесь:

    • { 0x01, 0x03, 0x40, 0x04, 0x00, 0x02, 0x90, 0x0A } - ping-пакет;

    • { 0x01, 0x03, 0x04, 0x45, 0xE6, 0xBE, 0x53, 0x3F, 0x55 } - пакет с данными. Разберем его подробнее.

      0x01, 0x03 - также как и в предыдущих пакетах адрес УНО и функция запроса, 0x04 - количество байтов данных, 0x45, 0xE6, 0xBE, 0x53 - float значение, которое равно 7383,79052734375; 0x3F, 0x55 - контрольная сумма CRC16.

      Итого пакет, который мы должны получать в ответ имеет вид:

      new byte[] { address, fetchFunction, valuesByteCount, value[3], value[2], value[1], value[0], CRC16Low, CRC16High }

      ВАЖНО! сами данные приходят в инвертированном виде, 4-байта данных нужно сначала инвертировать, а потом уже читать из них значение:

      byte[] data = message[3..7].Reverse().ToArray();
      impulse = BitConverter.ToSingle(data);