В TSMaster есть два режима чтения сообщений: режим callback-функций и режим FIFO. Функции FIFO появились в TSMaster сравнительно недавно — в этой статье разбирается именно FIFO-модуль. О применении callback-функций см. руководство «Быстрый старт» в модуле помощи.

Ключевые слова: FIFO, чтение сообщений, CAN/CAN FD/LIN/FlexRay, мини-приложения TSMaster.

1. Технический фон

В модуле мини-приложений TSMaster предусмотрены события обратного вызова — событие приёма, событие отправки, событие перед отправкой и т. д. (рис. 1-1). По сравнению с callback-функциями функции FIFO гибче и удобнее: их можно использовать в любом модуле, не привязываясь к событиям приёма и отправки. Функции FIFO находятся в «Проектирование» → «C-мини-приложение» → «Функции» (рис. 1-2).

Callback-модуль мини-приложения
Рис. 1-1. Модуль событий обратного вызова мини-приложения
FIFO-функции
Рис. 1-2. Модуль FIFO-функций мини-приложения

2. Обзор FIFO-функций

FIFO — структура данных или механизм буферизации, работающий по принципу «первым вошёл — первым вышел». В процессе приёма данные, попавшие в FIFO раньше, обрабатываются или считываются первыми. У FIFO есть входной и выходной порты: данные последовательно поступают во входной порт и выстраиваются в буфере в порядке прибытия; при чтении данные извлекаются из выходного порта в том же порядке. Это гарантирует, что порядок приёма и обработки данных совпадает с порядком их поступления, и предотвращает путаницу или потерю данных. Преимущество FIFO — пользователь читает данные из драйвера в собственной задаче или потоке по мере необходимости, сам управляя задержками. Недостаток — асинхронность: данные извлекаются для обработки уже после завершения приёма/передачи сообщений.

Типовое применение: в силовых установках (двигатель, трансмиссия) множество датчиков и исполнительных механизмов общаются по CAN-шине. FIFO служит для приёма CAN-сообщений от датчиков (положения дроссельной заслонки, положения коленвала и др.), содержащих ключевую информацию о состоянии двигателя — оборотах, нагрузке. FIFO сохраняет сообщения в порядке прибытия, а ЭБУ двигателя последовательно считывает их, анализирует и корректирует момент впрыска, угол опережения зажигания и другие параметры, обеспечивая эффективную и стабильную работу двигателя в разных режимах.

3. Чтение сообщений через FIFO: реализация

3.1. Реализация функции

3.1.1. Чтение CAN-сообщений. Перед чтением буферизованных сообщений через FIFO нужно вызвать функцию com.tsfifo_enable_receive_fifo(). Простой пример по шагам:

  1. Шаг 1. Создайте событие запуска программы и добавьте в его функцию вызов включения FIFO (рис. 3-1).
  2. Шаг 2. Создайте событие нажатия клавиши и добавьте в его функцию вызов чтения FIFO (рис. 3-2).
  3. Шаг 3. Создайте событие остановки программы и добавьте в его функцию вызов отключения FIFO (рис. 3-3).
Событие запуска программы
Рис. 3-1. Событие запуска программы
Событие нажатия клавиши
Рис. 3-2. Событие нажатия клавиши
Событие остановки программы
Рис. 3-3. Событие остановки программы

Исходный код примера (рис. 3-4):

Исходный код чтения CAN
Рис. 3-4. Исходный код чтения CAN-сообщений через FIFO

3.1.2. Чтение LIN-сообщений. Перед чтением также вызывается com.tsfifo_enable_receive_fifo(); см. раздел 3.1.1. Исходный код — на рис. 3-5.

Исходный код чтения LIN
Рис. 3-5. Исходный код чтения LIN-сообщений

3.1.3. Чтение сообщений FlexRay. Перед чтением также вызывается com.tsfifo_enable_receive_fifo(); см. раздел 3.1.1. Исходный код — на рис. 3-6.

Исходный код чтения FlexRay
Рис. 3-6. Исходный код чтения сообщений FlexRay

3.2. Результат

Запустите мини-приложение, отправьте сообщения — выводимые сообщения можно посмотреть в «Анализ» → «Системные сообщения» (рис. 3-7).

Результат работы
Рис. 3-7. Результат работы в системных сообщениях

4. Справочник FIFO-функций TSMaster

4.1. Включение и выключение приёма

com.tsfifo_enable_receive_fifo — включить приём FIFO (рис. 4-1); com.tsfifo_disable_receive_fifo — выключить (рис. 4-2).

tsfifo_enable_receive_fifo
Рис. 4-1. com.tsfifo_enable_receive_fifo
tsfifo_disable_receive_fifo
Рис. 4-2. com.tsfifo_disable_receive_fifo

com.tsfifo_enable_receive_error_frames — включить приём кадров ошибок (рис. 4-3); com.tsfifo_disable_receive_error_frames — выключить (рис. 4-4).

tsfifo_enable_receive_error_frames
Рис. 4-3. com.tsfifo_enable_receive_error_frames
tsfifo_disable_receive_error_frames
Рис. 4-4. com.tsfifo_disable_receive_error_frames

4.2. Проходные фильтры

com.tsfifo_add_can_canfd_pass_filter — добавить проходной фильтр CAN/CAN FD (рис. 4-5); com.tsfifo_delete_can_canfd_pass_filter — удалить его (рис. 4-6); com.tsfifo_add_lin_pass_filter — добавить проходной фильтр LIN (рис. 4-7); com.tsfifo_delete_lin_pass_filter — удалить его (рис. 4-8).

add_can_canfd_pass_filter
Рис. 4-5. com.tsfifo_add_can_canfd_pass_filter
delete_can_canfd_pass_filter
Рис. 4-6. com.tsfifo_delete_can_canfd_pass_filter
add_lin_pass_filter
Рис. 4-7. com.tsfifo_add_lin_pass_filter
delete_lin_pass_filter
Рис. 4-8. com.tsfifo_delete_lin_pass_filter

4.3. Очистка буферов приёма

com.tsfifo_clear_can_receive_buffers (рис. 4-9), com.tsfifo_clear_canfd_receive_buffers (рис. 4-10), com.tsfifo_clear_lin_receive_buffers (рис. 4-11), com.tsfifo_clear_flexray_receive_buffers (рис. 4-12).

clear_can_receive_buffers
Рис. 4-9. com.tsfifo_clear_can_receive_buffers
clear_canfd_receive_buffers
Рис. 4-10. com.tsfifo_clear_canfd_receive_buffers
clear_lin_receive_buffers
Рис. 4-11. com.tsfifo_clear_lin_receive_buffers
clear_flexray_receive_buffers
Рис. 4-12. com.tsfifo_clear_flexray_receive_buffers

4.4. Чтение числа кадров в буфере

Для каждой шины доступны функции чтения общего числа кадров, числа кадров RX и числа кадров TX: CAN — com.tsfifo_read_can_buffer_frame_count (рис. 4-13), com.tsfifo_read_can_rx_buffer_frame_count (рис. 4-14), com.tsfifo_read_can_tx_buffer_frame_count (рис. 4-15); CAN FD — com.tsfifo_read_canfd_buffer_frame_count (рис. 4-16), com.tsfifo_read_canfd_rx_buffer_frame_count (рис. 4-17), com.tsfifo_read_canfd_tx_buffer_frame_count (рис. 4-18); LIN — com.tsfifo_read_lin_buffer_frame_count (рис. 4-19), com.tsfifo_read_lin_rx_buffer_frame_count (рис. 4-20), com.tsfifo_read_lin_tx_buffer_frame_count (рис. 4-21); FlexRay — com.tsfifo_read_flexray_buffer_frame_count (рис. 4-22), com.tsfifo_read_flexray_rx_buffer_frame_count (рис. 4-23).

read_can_buffer_frame_count
Рис. 4-13. com.tsfifo_read_can_buffer_frame_count
read_can_rx_buffer_frame_count
Рис. 4-14. com.tsfifo_read_can_rx_buffer_frame_count
read_can_tx_buffer_frame_count
Рис. 4-15. com.tsfifo_read_can_tx_buffer_frame_count
read_canfd_buffer_frame_count
Рис. 4-16. com.tsfifo_read_canfd_buffer_frame_count
read_canfd_rx_buffer_frame_count
Рис. 4-17. com.tsfifo_read_canfd_rx_buffer_frame_count
read_canfd_tx_buffer_frame_count
Рис. 4-18. com.tsfifo_read_canfd_tx_buffer_frame_count
read_lin_buffer_frame_count
Рис. 4-19. com.tsfifo_read_lin_buffer_frame_count
read_lin_rx_buffer_frame_count
Рис. 4-20. com.tsfifo_read_lin_rx_buffer_frame_count
read_lin_tx_buffer_frame_count
Рис. 4-21. com.tsfifo_read_lin_tx_buffer_frame_count
read_flexray_buffer_frame_count
Рис. 4-22. com.tsfifo_read_flexray_buffer_frame_count
read_flexray_rx_buffer_frame_count
Рис. 4-23. com.tsfifo_read_flexray_rx_buffer_frame_count

4.5. Приём сообщений

com.tsfifo_receive_can_msgs (рис. 4-24), com.tsfifo_receive_canfd_msgs (рис. 4-25), com.tsfifo_receive_lin_msgs (рис. 4-26), com.tsfifo_receive_flexray_msgs (рис. 4-27).

receive_can_msgs
Рис. 4-24. com.tsfifo_receive_can_msgs
receive_canfd_msgs
Рис. 4-25. com.tsfifo_receive_canfd_msgs
receive_lin_msgs
Рис. 4-26. com.tsfifo_receive_lin_msgs
receive_flexray_msgs
Рис. 4-27. com.tsfifo_receive_flexray_msgs

5. Сокращения

СокращениеРасшифровка
BLFBinary Logging Format
CANController Area Network
CAN FDCAN with Flexible Data-Rate
IDIdentifier
LINLocal Interconnect Network