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


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. Создайте событие запуска программы и добавьте в него функцию включения FIFO (рис. 3).
- Шаг 2. Создайте событие клавиши и добавьте в него функцию чтения FIFO (рис. 4).
- Шаг 3. Создайте событие остановки программы и добавьте в него функцию отключения FIFO (рис. 5).



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

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

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

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

4. Описание FIFO-функций TSMaster
Ниже — справка по всем FIFO-функциям со скриншотами документации.
4.1. Включение и отключение FIFO
4.1.1. com.tsfifo_enable_receive_fifo — включить приёмный FIFO (рис. 10).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

5. Сокращения
| Аббревиатура | Расшифровка |
|---|---|
| BLF | Binary Logging Format |
| CAN | Controller Area Network |
| CAN FD | CAN with Flexible Data-Rate |
| ID | Identifier |
| LIN | Local Interconnect Network |