Третья часть серии про 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).

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

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

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

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

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

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

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

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

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

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

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

Для удобства можно использовать 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).

Свяжите события: 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).

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