Проект

Общее

Профиль

Включение сбора статистики (COMMAND_DEVICE_STAT 0xA)

Сбор статистики по загрузке устройства, утилизации внутренних буферов позволяет определить, что является причиной потери данных при приёме/передачи данных. Для этого выводится загрузка процессора, приблизительный процент утилизации CAN-шин (не учитываются служебные биты), а также утилизация буфера приёма данных по USB, утилизация буферов на отправку в CAN-шины и буфер обработки данных.

Управление включением и выключением сбора статистики происходит с использованием выставления флага команде:

enum DEVICE_STAT {
    DEVICE_STAT_OFF  = 0x00,
    EDVICE_STAT_ON   = 0x01
};

После отправки команды на сбор статистики от устройства с интервалами раз в 1 секунду будет приходить статистика в виде набора структур. Данный набор и его последовательность зависят от используемого устройства. Первая структура будет CommandHeader, у которой в поле command будет значение 0x0A (COMMAND_DEVICE_STAT), sequence порядковый номер посылки, dSize будет содержать длину всех передаваемых данных. Ниже представлены возможные структуры, которые будет передавать устройство:

enum DEVICE_STAT_TYPE {
    DEVICE_STAT_CPU_IDLE          = 0x01,
    DEVICE_STAT_PROCESSING_BUFFER = 0x02,
    DEVICE_STAT_CAN_BUFFER        = 0x04,
    DEVICE_STAT_CAN1_LOAD_N       = 0x11,
    DEVICE_STAT_CAN1_LOAD_D       = 0x21,
    DEVICE_STAT_CAN1_MSG_COUNTER  = 0x51,
    DEVICE_STAT_CAN2_LOAD_N       = 0x12,
    DEVICE_STAT_CAN2_LOAD_D       = 0x22,
    DEVICE_STAT_CAN2_MSG_COUNTER  = 0x52
};

typedef struct {              // Загрузка процессора = (1 - Value / MaxValue) * 100
    uint32_t DataType;        // DEVICE_STAT_CPU_IDLE          
    uint32_t MaxValue;        // Максимальное значение IDLE
    uint32_t Value;           // Текущее значение IDLE
} __attribute__((packed)) StatIdle;

typedef struct {              // Утилизация буферов
    uint32_t DataType;        // DEVICE_STAT_PROCESSING_BUFFER, DEVICE_STAT_CAN_BUFFER
    uint32_t QueueSize;       // Общий размер буфера в записях
    uint32_t Utilization;     // Сколько записей в буфере
    uint32_t Lost;            // Сколько записей не было помещено в буфер из-за его переполнения
} __attribute__((packed)) StatBufferLoad;

typedef struct {              // Сколько бит передано в шину, без учёта служебных битов, с момента последней передачи статистики
    uint32_t DataType;        // DEVICE_STAT_CAN1_LOAD_N, DEVICE_STAT_CAN1_LOAD_D, DEVICE_STAT_CAN2_LOAD_N, DEVICE_STAT_CAN2_LOAD_D
    uint32_t Value;
} __attribute__((packed)) StatChannelLoad;

typedef struct {              // Статистика по количеству принятых, отправленных сообщений. Количеству сообщений, которые так и не попали в шину.
    uint32_t DataType;        // DEVICE_STAT_CAN1_MSG_COUNTER, DEVICE_STAT_CAN2_MSG_COUNTER
    uint32_t Received;        // Количество приняты сообщений
    uint32_t ReceiveLost;     // Количество принятых сообщений но не обработанных из-за переполнения буферов
    uint32_t Transmitted;     // Количество отправленных сообщений
    uint32_t TransmitALS;     // Количество сообщений проигравших арбитраж
    uint32_t TransmitRetry;   // Количество попыток перепослать сообщения
    uint32_t TransmitFailed;  // Количество сообщений, которые не были отправлены
} __attribute__((packed)) StatChannelCounter;

Запрос

Поле Значение
command 0x0A
sequence порядковый номер запроса
flags Значение из DEVICE_STAT
dSize 0x00

Ответ

Поле Значение
command 0x8A
sequence порядковый номер запроса
flags 0x00
dSize 0x00

Пример
Включение сбора статистики

⇒ 0A xx 01 00
⇐ 8A xx 00 00

Пример статистики, отправляемой CH-P.FDL2

⇐ 0A xx 00 6C 01 00 00 00 00 F4 01 00 CA 85 01 00 02 00 00 00 08 00 00 00 01 00 00 00 00 00 00 00 04 00 00 00 80 00 00 00 02 00 00 00 00 00 00 00 11 00 00 00 5E CD 02 00 21 00 00 00 00 00 00 00 12 00 00 00 5E CD 02 00 22 00 00 00 00 00 00 00

Здесь:
  • StatIdle ( DataType = DEVICE_STAT_CPU_IDLE, MaxValue = 0x0001F400, Value = 0x000185CA ) = Load: 22
  • StatBufferLoad ( DataType = DEVICE_STAT_PROCESSING_BUFFER, QueueSize = 8, Utilization = 1, Lost = 0 )
  • StatBufferLoad ( DataType = DEVICE_STAT_CAN_BUFFER, QueueSize = 128, Utilization = 2, Lost = 0 )
  • StatChannelLoad ( DataType = DEVICE_STAT_CAN1_LOAD_N, Value = 0x0002CD5E )
  • StatChannelLoad ( DataType = DEVICE_STAT_CAN1_LOAD_D, Value = 0 )
  • StatChannelLoad ( DataType = DEVICE_STAT_CAN2_LOAD_N, Value = 0x0002CD5E )
  • StatChannelLoad ( DataType = DEVICE_STAT_CAN2_LOAD_D, Value = 0 )