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

Ключевые слова: FIFO, tsfifo, чтение сообщений, C-мини-программа, CAN, LIN, FlexRay.

1. Техническая справка

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

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

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

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

Плюс FIFO: пользователь читает данные из драйвера в своей задаче или потоке по мере необходимости, задержки контролируются самостоятельно. Минус: это асинхронный способ — данные извлекаются на обработку уже после завершения приёма/передачи сообщения.

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

3. Реализация чтения сообщений FIFO-функциями

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

3.1.1. Чтение CAN-сообщений

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

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

Исходный код (рис. 6):

Исходный код чтения CAN
Рис. 6. Исходный код примера чтения CAN

3.1.2. Чтение LIN-сообщений

Перед чтением буферизованных сообщений через FIFO вызовите com.tsfifo_enable_receive_fifo() — см. раздел 3.1.1 о чтении CAN. Исходный код (рис. 7):

Исходный код чтения LIN
Рис. 7. Исходный код примера чтения LIN

3.1.3. Чтение FlexRay-сообщений

Перед чтением буферизованных сообщений через FIFO вызовите com.tsfifo_enable_receive_fifo() — см. раздел 3.1.1. Исходный код (рис. 8):

Исходный код чтения FlexRay
Рис. 8. Исходный код примера чтения FlexRay

3.2. Результат работы

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

Результат работы
Рис. 9. Результат работы примера

4. Описание FIFO-функций TSMaster

Ниже — справка по всем FIFO-функциям со скриншотами документации.

4.1. Включение и отключение FIFO

4.1.1. com.tsfifo_enable_receive_fifo — включить приёмный FIFO (рис. 10).

tsfifo_enable_receive_fifo
Рис. 10. com.tsfifo_enable_receive_fifo

4.1.2. com.tsfifo_disable_receive_fifo — отключить приёмный FIFO (рис. 11).

tsfifo_disable_receive_fifo
Рис. 11. com.tsfifo_disable_receive_fifo

4.1.3. com.tsfifo_enable_receive_error_frames — включить приём кадров ошибок в FIFO (рис. 12).

tsfifo_enable_receive_error_frames
Рис. 12. com.tsfifo_enable_receive_error_frames

4.1.4. com.tsfifo_disable_receive_error_frames — отключить приём кадров ошибок (рис. 13).

tsfifo_disable_receive_error_frames
Рис. 13. com.tsfifo_disable_receive_error_frames

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

4.2.1. com.tsfifo_add_can_canfd_pass_filter — добавить проходной фильтр CAN/CAN FD (рис. 14).

add_can_canfd_pass_filter
Рис. 14. com.tsfifo_add_can_canfd_pass_filter

4.2.2. com.tsfifo_delete_can_canfd_pass_filter — удалить проходной фильтр CAN/CAN FD (рис. 15).

delete_can_canfd_pass_filter
Рис. 15. com.tsfifo_delete_can_canfd_pass_filter

4.2.3. com.tsfifo_add_lin_pass_filter — добавить проходной фильтр LIN (рис. 16).

add_lin_pass_filter
Рис. 16. com.tsfifo_add_lin_pass_filter

4.2.4. com.tsfifo_delete_lin_pass_filter — удалить проходной фильтр LIN (рис. 17).

delete_lin_pass_filter
Рис. 17. com.tsfifo_delete_lin_pass_filter

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

4.3.1. com.tsfifo_clear_can_receive_buffers — очистить приёмные буферы CAN (рис. 18).

clear_can_receive_buffers
Рис. 18. com.tsfifo_clear_can_receive_buffers

4.3.2. com.tsfifo_clear_canfd_receive_buffers — очистить приёмные буферы CAN FD (рис. 19).

clear_canfd_receive_buffers
Рис. 19. com.tsfifo_clear_canfd_receive_buffers

4.3.3. com.tsfifo_clear_lin_receive_buffers — очистить приёмные буферы LIN (рис. 20).

clear_lin_receive_buffers
Рис. 20. com.tsfifo_clear_lin_receive_buffers

4.3.4. com.tsfifo_clear_flexray_receive_buffers — очистить приёмные буферы FlexRay (рис. 21).

clear_flexray_receive_buffers
Рис. 21. com.tsfifo_clear_flexray_receive_buffers

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

4.4.1. com.tsfifo_read_can_buffer_frame_count — число кадров в буфере CAN (рис. 22).

read_can_buffer_frame_count
Рис. 22. com.tsfifo_read_can_buffer_frame_count

4.4.2. com.tsfifo_read_can_rx_buffer_frame_count — число кадров в RX-буфере CAN (рис. 23).

read_can_rx_buffer_frame_count
Рис. 23. com.tsfifo_read_can_rx_buffer_frame_count

4.4.3. com.tsfifo_read_can_tx_buffer_frame_count — число кадров в TX-буфере CAN (рис. 24).

read_can_tx_buffer_frame_count
Рис. 24. com.tsfifo_read_can_tx_buffer_frame_count

4.4.4. com.tsfifo_read_canfd_buffer_frame_count — число кадров в буфере CAN FD (рис. 25).

read_canfd_buffer_frame_count
Рис. 25. com.tsfifo_read_canfd_buffer_frame_count

4.4.5. com.tsfifo_read_canfd_rx_buffer_frame_count — число кадров в RX-буфере CAN FD (рис. 26).

read_canfd_rx_buffer_frame_count
Рис. 26. com.tsfifo_read_canfd_rx_buffer_frame_count

4.4.6. com.tsfifo_read_canfd_tx_buffer_frame_count — число кадров в TX-буфере CAN FD (рис. 27).

read_canfd_tx_buffer_frame_count
Рис. 27. com.tsfifo_read_canfd_tx_buffer_frame_count

4.4.7. com.tsfifo_read_lin_buffer_frame_count — число кадров в буфере LIN (рис. 28).

read_lin_buffer_frame_count
Рис. 28. com.tsfifo_read_lin_buffer_frame_count

4.4.8. com.tsfifo_read_lin_rx_buffer_frame_count — число кадров в RX-буфере LIN (рис. 29).

read_lin_rx_buffer_frame_count
Рис. 29. com.tsfifo_read_lin_rx_buffer_frame_count

4.4.9. com.tsfifo_read_lin_tx_buffer_frame_count — число кадров в TX-буфере LIN (рис. 30).

read_lin_tx_buffer_frame_count
Рис. 30. com.tsfifo_read_lin_tx_buffer_frame_count

4.4.10. com.tsfifo_read_flexray_buffer_frame_count — число кадров в буфере FlexRay (рис. 31).

read_flexray_buffer_frame_count
Рис. 31. com.tsfifo_read_flexray_buffer_frame_count

4.4.11. com.tsfifo_read_flexray_rx_buffer_frame_count — число кадров в RX-буфере FlexRay (рис. 32).

read_flexray_rx_buffer_frame_count
Рис. 32. com.tsfifo_read_flexray_rx_buffer_frame_count

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

4.5.1. com.tsfifo_receive_can_msgs — приём сообщений CAN из FIFO (рис. 34).

receive_can_msgs
Рис. 34. com.tsfifo_receive_can_msgs

4.5.2. com.tsfifo_receive_canfd_msgs — приём сообщений CAN FD из FIFO (рис. 35).

receive_canfd_msgs
Рис. 35. com.tsfifo_receive_canfd_msgs

4.5.3. com.tsfifo_receive_lin_msgs — приём сообщений LIN из FIFO (рис. 36).

receive_lin_msgs
Рис. 36. com.tsfifo_receive_lin_msgs

4.5.4. com.tsfifo_receive_flexray_msgs — приём сообщений FlexRay из FIFO (рис. 37).

receive_flexray_msgs
Рис. 37. com.tsfifo_receive_flexray_msgs

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

АббревиатураРасшифровка
BLFBinary Logging Format
CANController Area Network
CAN FDCAN with Flexible Data-Rate
IDIdentifier
LINLocal Interconnect Network