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


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



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

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

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

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

4. Справочник FIFO-функций TSMaster
4.1. Включение и выключение приёма
com.tsfifo_enable_receive_fifo — включить приём FIFO (рис. 4-1); com.tsfifo_disable_receive_fifo — выключить (рис. 4-2).


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


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).




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).




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).











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).




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