С чего все началось. Мне поставили задачу связать панель VPD-130-H2 с 2 частотными преобразователями DC1-344D1NN-A20N. На панели и частотнике встроен интерфейс RS485, поэтому для управления я буду использовать протокол Modbus. В данном случае частотники будут выступать в роли Slave-устройств с адресами 11 и 22, а панель в качестве Master-устройства. В этой статье я сделал акцент на настройке HMI панели и написании модуля на языке С. Работа с частотными преобразователями рассматриваться не будет. HMI Works - это программный инструмент, предназначенный для разработчиков, работающих с контроллерами сенсорного экрана TPD и VPD от ICP DAS USA . Это программное обеспечение основано на HMI, Ladder Logic и языке C. Является основным инструментом для работы с панелькой VPD-130-H2. Особенностью работы с HMI Works является наличие встроенных модулей для управления с внешними устройствами. В модуле прописывается то, какие переменные стоит создать и как они обрабатываются. Также прописывается какой интерфейс и протокол используется для данного устройства, какие адреса регистров нужно прочитать или записать. Поскольку я не нашел модуля для управления своим частотным преобразователем, то мне пришлось разбираться как написать его с нуля. И это стало проблемой, я не нашел документации о том, какие внутренние функции за что отвечают. В официальной документации есть только поверхностные упоминания ориентированные на то, что будут использоваться именно встроенные модули. В следствии чего появилась идея написания данной статьи. Начнем с установки программного обеспечения для работы с HMI панелью. Скачиваем последнюю версию ПО для нашей панели, а также обновление для него. https://www.icpdas.com/en/download/show.php?num=944&model=VPD-130N-H2 После установки ПО и драйвера (устанавливается вместе с ПО) создаем новый проект, указываем нашу панель Перейдем к самой панели. Нужно включить режим "USB Force Update" (в моем случае положение крутилки 9), этот режим позволяет записывать программу в нашу панель.  Важное уточнение, перед тем как загрузить программу необходимо обесточить панель, а затем снова включить и только потом загружать программу, иначе будет возникать ошибка в HMI Works Как уже упоминалось ранее, для связи панели с другими устройствами нужны модули. Для моих задач встроенных по умолчанию модулей не достаточно, поэтому перейдем к его написанию. Для того чтобы добавить свой модуль в список, нужно перейти по пути установки вашей программы в папку bin/Modules, у меня C:\ICPDAS\HMIWorks_Standard\bin\Modules. Рассмотрим файл Modules.ini. В нем указываются серии устройств, а также протокол по которым устройства общаются.  Добавим в этот список название модуля, в моем случае Frequency В этом же файле пропишем протокол по которому наш модуль будет общаться. Frequency - название нашего модуля, MRTUM - протокол Modbus RTU Master Остальные настройки можете настроить по вашему усмотрению В той же папке (где лежит файл Modules.ini) создаем папку куда запишем конфигурацию нашего устройства. Внутри новосозданной папки добавим файл Frequency.ini где пропишем Модель нашего устройства (Frequency_motor), а также его теги (теги по умолчанию имеют тип WORD) Осталось прописать поведение нашей Модели. Создаем папку с именем устройства (Frequency_motor)  Внутри Frequency_motor добавим файл IO.hsf, в нем прописывается поведение модуля (отправка, получение данных, обработка тегов) на языке C. Так как обработка тегов у каждого устройства разная, то я лишь упомяну некоторые важные функции, весь мой проект доступен по ссылке в конце статьи. Перейдем к дереву нашего проекта. Первым что следует сделать, это создать новое соединение (Connection). Нажимаем на Connection правой кнопкой мыши, выбираем New Connection. Здесь можем выбрать нужные параметры протокола и порт на котором будет осуществляться связь, в моем случае все стоит так как нужно. нажимаем окей и переходим дальше. Теперь нужно добавить новое устройство. В дереве проекта нажимаем правой кнопкой мыши по надписи Device и выбираем New Device. Здесь мы можем выбрать наш только что написанный модуль. В TouchPAD is указываем наш интерфейс связи, то есть Modbus RTU Master (когда мы прописывали конфигурацию то указывали Protocol=MRTUM). Если мы сделали все правильно, то в Device Series должен появится наш модуль Frequency. Далее указываем Connection который создали, и в Model Name выбираем модель Frequency_motor. Теперь можем дать произвольное имя и идентификатор slave устройства, у меня устройство с Id 1. Как мы видим, справа список тегов который мы прописывали в Frequency.ini. Загрузка проекта проходит в 3 этапа: Сборка или рендер (Render), здесь компилятор читает файлы IO.hsf, заменяет указатели тегов которые начинаются с знака $ на значение тег + название модуля которые мы присвоили. Т.е компилятор заменит $SPEED_GET в коде на Frequencymotor_1_SPEED_GET. Таким образом мы можем добавлять десятки идентичных модулей, и они не будут конфликтовать. Компиляция (Compile), здесь уже будет проверка на наличие синтаксических ошибок, и если таковых не имеется, то сборка кода в язык, понятный самой панельке Загрузка (Download), здесь загрузка только что скомпилированного кода в саму панель, перед загрузкой необходимо перезагрузить панель обесточив на 1-2 секунды. Я рассказал некоторые подводные камни при работе с программой HMI Works. Мы также разобрались как написать полноценный модуль для работы с Modbus устройствами. Пример готового проекта лежит на gitHub.