Третья часть серии про Toolbox IDE в TSMaster: как из Python-скрипта вызывать собственные API-функции — установка мини-программы как библиотеки, вызов из модуля автоматизации и из формы Toolbox. Первая часть серии — «Toolbox IDE, часть 1: проектирование и разработка окон на Python».

Ключевые слова: TSMaster, Toolbox IDE, библиотека мини-программ, Python, RBS, автоматизация.

1. Установка библиотеки мини-программ

Откройте TSMaster и перетащите в него DBC-файл — подойдёт любой из папки Demo-Databases установочного каталога, например CAN_FD_Powertrain. После перетаскивания окно базы данных можно закрыть (рис. 1-1).

Загрузка DBC
Рис. 1-1. Загрузка DBC-файла CAN_FD_Powertrain

Далее выберите аппаратный канал — 1 канал CAN. Откройте окно симуляции шины (RBS) и двойным щелчком активируйте узел Engine: после запуска остаточной симуляции узел Engine начнёт отправлять свои циклические сообщения (рис. 1-2).

Активация узла Engine
Рис. 1-2. Активация узла Engine в RBS

Перейдите к группе пользовательских функций и правой кнопкой добавьте функцию с именем control_rbs. Параметры можно сделать чуть сложнее: первый — флаг активации const bool AEnable, второй — дополнительная информация const pchar AInfo. Интерфейс функции определён — дальше реализация (рис. 1-3).

Функция control_rbs
Рис. 1-3. Определение пользовательской функции control_rbs

Сначала выведем информацию для пользователя — log(AInfo); затем проверяем флаг: if (AEnable) — вызываем com.can_rbs_start, иначе — stop. API готов. Чтобы функцией могли пользоваться другие программы, установите мини-программу controller в TSMaster как библиотеку: на странице свойств включите переключатель «Библиотека мини-программ», сначала скомпилируйте, затем установите. После этого API доступен из любого места TSMaster (рис. 1-4).

Установка библиотеки
Рис. 1-4. Установка мини-программы controller как библиотеки

2. Автоматизированное тестирование

Как проверить API-функцию библиотеки мини-программ controller? Откройте модуль автоматизации, выберите точку входа, нажмите Enter, дважды щёлкните NOP и справа измените тип на «Вызов API», а тип вызываемой функции — на «Функция библиотеки мини-программ»: откроется селектор функций, где первая — только что созданная control_rbs. Выберите её двойным щелчком и справа заполните параметры: первый — флаг активации (подойдёт true или 1), второй — строка для вывода, например «start from automation module». Нажмите F9 для запуска — появится подсказка (рис. 2-1).

Вызов API в автоматизации
Рис. 2-1. Вызов функции библиотеки из модуля автоматизации

В сообщении сначала выводится строка «start from automation module», затем ошибка: перед активацией движка симуляции нужно подключить приложение — кнопка запуска в левом верхнем углу. Подключите приложение, как указано, — тогда движок симуляции готов к работе (рис. 2-2).

Подключение приложения
Рис. 2-2. Подключение приложения перед запуском

Вернитесь в модуль автоматизации и снова нажмите F9 — программа выполняется успешно. В окне Trace видны сообщения узла Engine. Скопируйте вызов control_rbs и вставьте идентичный, изменив параметры на запрет RBS: первый параметр — false, сообщение — «stop from automation module». Нажмите F9 ещё раз: поскольку последний выполненный шаг — запрет, сообщения в окне Trace перестают обновляться — узел Engine остановлен. Симуляция шины остановлена, тестовая работа модуля автоматизации завершена (рис. 2-3).

Остановка RBS
Рис. 2-3. Запуск и остановка RBS из модуля автоматизации

3. Проектирование формы запуска

Откройте главный интерфейс Toolbox и добавьте новый Toolbox кнопкой «+» на панели инструментов: введите имя test и нажмите Enter — Toolbox создан. Обратите внимание: по умолчанию он расположен в папке текущего проекта и следует за ним — в таблице флажок в колонке «Глобальный» снят. Кнопка папки справа покажет, что Toolbox действительно лежит в пути текущего проекта: при создании нового или загрузке другого проекта этот Toolbox не будет найден (рис. 3-1).

Создание Toolbox test
Рис. 3-1. Toolbox test в папке текущего проекта

Чтобы Toolbox был постоянным и доступным каждому проекту, включите режим глобального Toolbox: нажмите кнопку-шестерёнку в левом верхнем углу — подсказка предложит активировать режим проекта или глобальный режим; по умолчанию активен режим проекта, повторное нажатие активирует глобальный. Созданный в этом режиме Toolbox размещается в установочном каталоге TSMaster и не следует за проектом (рис. 3-2).

Глобальный Toolbox
Рис. 3-2. Создание глобального Toolbox global1

Проверим: нажмите «Создать», введите global1, Enter — новый Toolbox появился в конце таблицы, флажок «Глобальный» установлен. Откройте папку и поднимитесь на уровень выше: рядом — два встроенных примера Toolbox (руководство по элементам управления и исходное окно отправки CAN-сообщений). Теперь перейдём к дизайну интерфейса: выберите Toolbox test, двойной щелчок открывает страницу дизайна кода; нажмите кнопку «Форма» на панели инструментов, чтобы запустить дизайнер форм (рис. 3-3).

Дизайнер форм
Рис. 3-3. Запуск дизайнера форм

Добавьте на форму две кнопки: запуск RBS и запрет RBS. Выберите Button1, нажмите F11 для перехода на страницу свойств, в фильтре введите name и измените имя на btnStart, caption — на Start; для Button2 измените caption на Stop и name на btnStop. Дизайн формы завершён (рис. 3-4).

Кнопки формы
Рис. 3-4. Форма с кнопками Start и Stop

4. Код событий кнопок

Добавьте import. Перед этим перейдите на страницу модуля мини-программ, правой кнопкой на пустом месте добавьте модуль и выберите библиотеку мини-программ controller — этот шаг делает API мини-программы controller видимым для Python. Вернитесь в интерфейс дизайна кода Toolbox, на второй строке кода нажмите правую кнопку, выберите «Вставить import модуля» и укажите controller — модуль импортирован (рис. 4-1).

Импорт controller
Рис. 4-1. Импорт библиотеки controller в код Toolbox

Для удобства можно использовать VS Code: нажмите кнопку редактирования на панели инструментов — откроется VS Code. Перейдите в конец создания UI — нижнюю часть функции init — и добавьте обработчики нажатий двух кнопок: после четырёх пробелов введите def on_start_click, внутри вызовите API controller — введите «controller.», первая строка выпадающего списка — наше API, нажмите Enter. После открывающей скобки появятся подсказки двух параметров: первый — True, второй — произвольная строка, например «start from Python». Аналогично добавьте def on_stop_click с вызовом controller.control_rbs и запретом: False и строка «stop from Python» (рис. 4-2).

Обработчики кнопок
Рис. 4-2. Обработчики кнопок в VS Code

Свяжите события: self.btnStart.OnClick = on_start_click и self.btnStop.OnClick = on_stop_click. Сохраните код (Ctrl+S), вернитесь в TSMaster и щёлкните по пустому месту в коде — код обновится до последней версии. Нажмите F9 для запуска, подключите приложение и нажмите Start: появятся сообщения узла Engine; нажмите Stop — отправка сообщений узла Engine прекратится. В системных сообщениях видны выведенные строки «start from Python» и «stop from Python» (рис. 4-3).

Запуск формы
Рис. 4-3. Работа формы: запуск и остановка RBS кнопками

Итог: API существующих мини-программ легко вызываются из Python-программ — это значительно расширяет доступную из Python библиотеку функций.