J1939 — набор стандартов, определённых обществом автомобильных инженеров США (SAE), применяемый в грузовиках, автобусах и мобильной гидравлике. Большинство ЭБУ общаются по CAN, но CAN — лишь основа связи (как телефонная линия); «языком» сложного диалога в тяжёлой технике служит стандарт J1939. В статье — приём и передача многофреймовых сообщений J1939 в TSMaster: работа с демо-базой, узлы симуляции и серия API-функций J1939.

Ключевые слова: J1939, многофреймовые сообщения, PGN, RBS, API TSMaster, signal server.

1. Использование функций J1939

Функции J1939 — продвинутый уровень, требующий лицензии. Предположим, что аппаратура с лицензией уже есть — например TC1005: выберите аппаратный канал, подключите приложение и откройте окно About — там виден список доступных лицензий, среди которых есть опция J1939 (рис. 1-1).

Лицензия J1939 в окне About
Рис. 1-1. Опция J1939 в списке лицензий

Сначала откройте каталог установки TSMaster, перейдите в папку demo и найдите файл примера базы данных J1939ILDemo. Перетащите его в TSMaster — это делается при отключённом соединении. В базе четыре кадра сообщений с PGN EF00, EF00, FF02 и FF01 (рис. 1-2).

Демо-база J1939ILDemo
Рис. 1-2. Демонстрационная база данных J1939ILDemo

Первые два кадра — многофреймовые точка-точка (узел 2 → узлу 1 и узел 1 → узлу 2), два последних — широковещательные (адреса 2 и 1). У первого кадра DLC = 35 байт: сигнал может располагаться в любой из 280 позиций (35 × 8); сигналы sgn1~4 как раз моделируют такой случай. Для отправки этих сообщений откройте окно CAN Transmit, нажмите кнопку «из базы данных» в левом верхнем углу, выберите четыре кадра и переключите представление на J1939 — вся протокольная информация будет на виду (рис. 1-3).

Окно CAN Transmit в представлении J1939
Рис. 1-3. Окно CAN Transmit в представлении J1939

Первые два сообщения — точка-точка, два последних — широковещательные, что видно по адресу назначения. Широковещательные сообщения узел просто отправляет, а для точка-точка требуется ответ принимающего узла в процессе передачи — поэтому нужно активировать встроенные J1939-узлы симуляции TSMaster. Откройте диалог конфигурации симуляции J1939: там видны узлы Node1 и Node2; у всех узлов отмечена симуляция отправки, а симуляция приёма по умолчанию не отмечена. Приём можно активировать автоматически через RBS либо вручную — отметим вручную и закроем диалог кнопкой «Применить» (рис. 1-4).

Конфигурация симуляции J1939
Рис. 1-4. Узлы Node1/Node2 в конфигурации симуляции J1939

Теперь можно запускать симуляцию: нажмите F5, откройте окно Trace и активируйте отправку четырёх сообщений, нажимая «отправить» по очереди. В окне Trace виден приём четырёх многофреймовых сообщений: их DLC — 35, 36, 13 и 33, по умолчанию поля данных заполнены нулями (рис. 1-5).

Многофреймовые сообщения в Trace
Рис. 1-5. Приём многофреймовых сообщений в окне Trace

Байты данных можно изменять произвольно (рис. 1-6) или через генератор сигналов: выберите первый кадр, для сигнала sgn1_a2 задайте тип «синус», откройте конфигурацию, увеличьте амплитуду, нажмите «Применить» и «Запустить» — значение sgn1_a2 начнёт изменяться.

Генератор сигналов
Рис. 1-6. Изменение сигнала генератором (синус)

Откройте окно графиков и перетащите туда сигнал — увидите синусоиду (рис. 1-7). Частота невысокая, потому что сообщение многофреймовое: одна посылка занимает 200 мс, то есть всего 5 точек в секунду. Наблюдать сигнал можно и в других окнах, например в числовом отображении.

Синусоида в окне графиков
Рис. 1-7. Сигнал в окне графиков

Наконец, откройте окно числового отображения, нажмите кнопку добавления и выберите сигнал (или перетащите его мышью), затем подгоните размер окна. Сигнал можно добавить и на панель — панель нужно проектировать, поэтому сначала остановите симуляцию, перетащите сигнал на панель, снова запустите симуляцию и отправку сообщений: сигналы будут корректно отображаться в измерительном окне.

2. Серия API-функций J1939

Для J1939 существует набор API-функций: чтение и запись сигналов, отправка сообщений и многое другое. Откройте модуль автоматизации, выберите точку входа и добавьте действия клавишей Enter. Первому действию назначьте тип «вызов API-функции» и введите в фильтре «1939» — отобразится вся серия API J1939: методы get/set идентификатора 1939 и методы отправки многофреймовых сообщений (рис. 2-1). Get/set идентификатора подробно описаны в справке мини-приложений в редакторе C-кода, там же есть примеры; здесь сосредоточимся на API многофреймовой отправки.

API J1939 в модуле автоматизации
Рис. 2-1. Серия API J1939 в модуле автоматизации

Выберите API асинхронной отправки 1939. Отправка бывает синхронной (программа продолжается только после завершения отправки) и асинхронной (данные помещаются в буфер отправки, и программа идёт дальше). Каждая из них имеет два варианта: без строки и на основе строки, где данные разделены запятыми; модуль автоматизации поддерживает оба, так как массивы в нём выражаются строками с разделителями-запятыми. У выбранной функции асинхронной отправки 7 входных параметров (рис. 2-2).

Параметры асинхронной отправки
Рис. 2-2. Параметры функции асинхронной отправки J1939

Первый параметр — номер канала, выберите константу, например channel1; затем PGN — например широковещательный 0xFF01; приоритет 6, исходный адрес 2, адрес назначения 1; далее данные PDU — можно вписать любые, например 0x11, и размножить копированием: строка может быть длинной, реальную длину ограничивает последний параметр. Оставим его согласованным с DBC, то есть 35, и запустим отправку клавишей F9 или кнопкой отправки (рис. 2-3). Если данных не хватает, они дополняются нулями; добавив данные, получаем ровно нужную длину. В окне Trace отправленное содержимое совпадает с настройками (рис. 2-4).

Отправка сообщения
Рис. 2-3. Запуск отправки многофреймового сообщения
Результат в Trace
Рис. 2-4. Отправленное сообщение в окне Trace

Это был способ отправки «сырых» сообщений. Чтобы изменять значения сигналов внутри сообщения, нужен движок симуляции RBS: откройте окно симуляции CAN-шины, активируйте оба узла и установите автозапуск симуляции шины — RBS начнёт работать с тем же результатом, что и окно отправки. При этом окно отправки запускать не нужно. Вернитесь в модуль автоматизации, удалите действие отправки сырого сообщения и добавьте новое действие — вызов функции; найдите set Signal by address: эта функция позволяет произвольно менять сигналы в RBS. У неё два параметра — адрес сигнала и значение. Адрес сигнала — это адрес в базе данных, например A_Node1 signal 1_a1: нажмите «копировать адрес базы данных» и вставьте; значение задайте любое. После запуска сигнал A_Node1 примет установленное значение 1111 — это и есть отправка сигнала (рис. 2-5).

set Signal by address
Рис. 2-5. Изменение сигнала через set Signal by address

Как прочитать значение сигнала? Используйте методы signal server: в вызове функции удалите предыдущую отправку и добавьте несколько действий; переключите действие на вызов функции и введите «SGN SRV» — серия функций signal server. Порядок такой: сначала зарегистрируйте интересующий сигнал функцией register_can_signal_by_message (по ID или по имени) — выберем message ID. Скопируйте ID сообщения из RBS, удалив суффикс «x», чтобы строка стала корректным шестнадцатеричным значением; канал — тот же channel1; имя сигнала — например sgn1_a1 (рис. 2-6).

Регистрация сигнала
Рис. 2-6. Регистрация сигнала через register_can_signal_by_message

Client ID — это handle, который функция возвращает программе после успешной регистрации: создайте для него переменную, например ID, и свяжите локальную переменную с ней. Затем можно подождать перед чтением — вызовите функцию wait, например на 3 секунды. Далее чтение: функция signal server sgnsrv get_can_signal возвращает физическое значение сигнала. Параметры: channel1, client ID — наша переменная ID; выходное значение тоже поместите в переменную типа double, например v. Также возвращается последняя метка времени — если она не нужна, оставьте 0 или пусто (рис. 2-7).

Чтение значения сигнала
Рис. 2-7. Чтение физического значения сигнала

Прочитанное значение можно вывести через функцию log: передайте значение переменной v как строку, выберите цвет уровня лога, например зелёный, и нажмите «Запустить». Программа получит ID, подождёт и завершит чтение; результаты каждого шага отображаются с фактическими параметрами. Выведенное значение — 111, как было задано ранее. Изменим его, например на 2047 (максимум), запустим снова и откроем log — полученное значение совпадает с установленным (рис. 2-8). Таково использование серии API J1939.

Вывод значения в log
Рис. 2-8. Вывод прочитанного значения в журнал