pre-release
https://github.com/yegorpetrov/owen-...2016.1.27.1031
Кто организует связь с ПЛК1xx по Модбасу (когда ПЛК — слейв) знают, насколько муторно бывает дублировать регистры в мастере. Например, в вашем ПЛК создано несколько десятков регистиров для передачи данных на какой-нибудь операторский ПК — все эти регистры придётся скорее всего руками вписывать в среде разработки этого верхнего уровня. И в случае изменений придётся всё перепроверять.
Представляю небольшую программу/библиотеку, которая перепишет все регистры из .pro-файла за вас по вашему шаблону.
9f83isB.png
На скриншоте показано, как программа получает на вход файл проекта и по шаблону csharp.stg выдаёт в консоль готовый к применению код для разбора регистров в теги/переменные на стороне мастера. Учитывается выравнивание и поразрядный доступ (модули «8 bit»).
Код сгенерирован из такой конфигурации:
02.png
А для форматирования использовался вот такой шаблон:
Форум съедает шаблоны. См. файлы .stg в исходниках: https://github.com/yegorpetrov/owen-...hell/Templates
Код:
csharp.stg<outs:{out |="" <out.name=""><nregs><slaveaddr><tag, object=""><outs:{out |="" dict[tags.<out.name=""><out.conversionname><out.conversionargs; separator=", "><out.comment>
Не обязательно генерировать код на каком-то языке. Шаблон можно написать и под простое перечисление:
03.png
Код:
simple.stg<outs:{out |="" <out.name=""><out.conversionname><out.conversionargs; separator=", "><out.comment>
Для шаблонизации используется библиотека StringTemplate — оттуда и синтаксис шаблонов.
Параметром -o (--out) вывод можно перенаправить в какой-нибудь файл. А параметры -a, -c и -n позволяют выбирать слейв по адресу, комментарию и номеру, если в проекте их несколько.
Программа специально сделана консольной, чтобы её проще было автоматизировать и интегрировать в свою рабочую среду. А библиотеку ModbusImport можно использовать и отдельно от консольной оболочки. Например, её можно вызывать в шаблонах T4, которые использует Visual Studio. Для этого достаточно положить куда-нибудь файл ModbusImport.dll и сослаться на него в шаблоне. На следующем скриншоте показано, как шаблон генерирует часть класса PLCReader, который отвечает за разбор регистров. Остаётся дописать постоянную часть класса, и можно больше не тратить время на переписывание конфигурации из проекта.
04.png</out.comment></out.conversionargs;></out.conversionname></outs:{out></out.comment></out.conversionargs;></out.conversionname></outs:{out></tag,></slaveaddr></nregs></outs:{out>