При пользовательской разработке в TSMaster часто требуется вызывать внешние бинарные библиотеки — DLL/LIB, написанные самим пользователем или предоставленные сторонними поставщиками. TSMaster поддерживает подключение внешних библиотек, но их необходимо обернуть специальным способом. В статье на примере библиотеки записи TDMS-файлов от NI показан процесс упаковки DLL, использование LIB аналогично — те же операции выполняются в проекте Visual Studio.

Ключевые слова: TSMaster, DLL, LIB, внешние библиотеки, TDMS, Mini Program SDK.

1. Получение внешней библиотеки

Библиотеку TDMS от NI можно скачать по ссылке из оригинальной статьи. При использовании внешних библиотек учитывайте следующие ограничения:

1. Скачивая внешнюю библиотеку, обратите внимание на лицензионное соглашение её издателя: TOSUN предоставляет только среду для использования внешних библиотек и не несёт ответственности за нарушение условий их лицензий.

2. После загрузки в TSMaster внешняя библиотека становится частью основной программы. Если во внешней библиотеке произойдёт сбой или переполнение памяти, это приведёт к нестабильности или падению TSMaster — потребуется перезапустить программу и выгрузить проблемную библиотеку.

3. TSMaster поддерживает внешние библиотеки только версии 32bit-msvc — используйте DLL/LIB-файлы подходящей версии, иначе компиляция завершится с ошибкой.

(Распакованные файлы внешней библиотеки TDMS находятся в каталоге «tdms_example\TDM C DLL» приложенного примера.)

2. Подготовка шаблона вызова внешней библиотеки

Шаблон копируется из состава TSMaster: «Помощь» → «API-примеры» → каталог Mini Program SDK — проект с именем VC++. Скопируйте этот проект в собственное рабочее расположение. Готовый проект для функций TDMS — в каталоге «tdms_example\tdms_sdk» приложения (рис. 2-1).

Шаблон Mini Program SDK
Рис. 2-1. Шаблонный проект Mini Program SDK

3. Редактирование шаблона и генерация DLL

Независимо от того, что у вас есть — DLL, LIB или обе, — их можно вызывать из шаблонного проекта. Важный момент: чтобы TSMaster корректно распознал функции, помимо собственной логики в шаблоне нужно указать комментарии к функциям, описания параметров и т. п. Откройте шаблонный файл и выполните глобальный поиск по ключевому слову fun1 — это пример функции: везде, где она встречается, пользователю нужно добавить собственное содержимое (рис. 3-1).

Пример fun1 в шаблоне
Рис. 3-1. Примерная функция fun1 в шаблоне

Как видно на рисунке, в файле MPLibCode.cpp объявлена и реализована функция fun1; в файле MPLibCodeExtern.cpp функция fun1 зарегистрирована в шаблоне управления DLL; в файле TSMasterBaseSource.cpp зарегистрирована информация о параметрах fun1.

При интеграции TDMS сначала скопируйте в каталог проекта h-файлы и lib-файлы, необходимые для компиляции, и добавьте LIB-файл как входной в компоновщик проекта. Внешние функции, например DDC_CreateFile из состава TDMS, оборачиваются в шаблоне новой функцией — назовём её tdms_CreateFile. Хотя функции LIB-файла можно экспортировать напрямую, обычно рекомендуется создавать для них обёртку: во-первых, это унифицирует имена функций и облегчает их различение; во-вторых, все API-функции должны возвращать тип int — если исходная внешняя библиотека возвращает другой тип, результат придётся получать через передачу указателя, что возможно только через обёртку (рис. 3-2).

Обёртка функций TDMS
Рис. 3-2. Обёртка функций TDMS в шаблоне

Упаковка остальных функций TDMS выполняется по образцу примера-проекта. Обязательно следите за соответствием кода функций-обёрток и кода регистрации функций — только тогда всё будет работать корректно. На основе этого шаблона в конфигурации Debug/Release-x86 генерируется нужная tdms_sdk.dll.

4. Вызов шаблонной DLL в TSMaster

Чтобы вызвать tdms_sdk.dll в TSMaster, можно перетащить файл мышью или загрузить его через «Симуляция» → «Библиотека мини-приложений» → «Загрузить» (Simulation → Mini Program Library → Load). Как показано на рис. 4-1, прямая загрузка завершится неудачей: шаблонная DLL зависит от runtime-библиотек TDMS. Файлы зависимостей, предоставленные NI, находятся в каталоге «tdms_example\TDM C DLL\dev\bin\32-bit». Скопируйте все эти файлы в каталог TSMaster-проект\Plugins\Dependencies (этот каталог нужно создать вручную — по умолчанию TSMaster его не создаёт), после чего шаблонная DLL загрузится корректно.

Загрузка DLL в TSMaster
Рис. 4-1. Загрузка шаблонной DLL в TSMaster

Откройте пример-проект «tdms_example\tdms_example»: первый тестовый случай в тестовой системе генерирует тестовый код для TDMS-файла. Можно и создать новое мини-приложение — по операциям различий нет: в обоих случаях сначала в окне свойств отметьте нужную внешнюю библиотеку, затем вызовите нужные функции в скрипте. Как показано на рис. 4-2, после выполнения скрипта в корне диска D будет создан пример TDMS-файла.

Вызов функций TDMS из скрипта
Рис. 4-2. Вызов функций TDMS в скрипте мини-приложения

Если запустить скрипт напрямую, программа отработает, но TDMS-файл не будет создан. В журнале выполнения видно сообщение об ошибке — не удалось открыть устройство хранения. Эта проблема специфична для библиотеки TDMS: среди её зависимостей, помимо DLL, есть папка DataModels. TSMaster, используя зависимости из каталога «tdms_example\Plugins\Dependencies», не связывает папки автоматически, поэтому эту папку нужно вручную скопировать в каталог установки TSMaster, например C:\Program Files (x86)\TOSUN\TSMaster\bin. Если внешняя библиотека зависит только от DLL, ручное копирование не требуется (рис. 4-3).

Ошибка открытия устройства хранения
Рис. 4-3. Сообщение об ошибке в журнале выполнения

После разрешения зависимости с папкой TDMS-файл генерируется корректно. По этому образцу можно реализовать собственную логику. Процесс требует некоторого знакомства со средой Visual Studio — при затруднениях обращайтесь к примеру-проекту.

5. Отладка шаблонной DLL в TSMaster

При работе с шаблонной DLL отладка неизбежна. В Visual Studio измените свойства проекта: «Свойства проекта» → «Общие» → «Каталог вывода» — направьте вывод DLL в каталог MPLibrary отлаживаемого проекта. Например, для примера «tdms_example» DLL генерируется в «tdms_example\tdms_example\MPLibrary». Затем сначала запустите проект TSMaster, а после — отладку в Visual Studio. Процесс отладки совпадает с отладкой мини-приложений.