Манифест Tmpl.* и $FL
Статья формата ObjectTypeVersion 1.0. В старом формате лист шаблона устроен иначе — см. Листы шаблонов (старый формат).
Строки манифеста
Section titled “Строки манифеста”Манифест Tmpl.<TemplateName> содержит конфиг, списки и подключения:
| Маркер (кол. B) | Назначение | Колонки |
|---|---|---|
| VQ | значение конфига OBJTYPE | C = ключ, D = значение |
| LST | список | C = ключ, D…N = элементы |
| FL | подключить лист (канал / DevStudio / HMI / HMIS) | C = файл, D = лист, E = выключатель, F…N = значения по позиции |
| JSM | подключить jsm — шаблон ST для Unimod | C = файл .jsm, D = файл вывода, E = выключатель, F = алиасы, G…N = значения — подробнее |
Набор объектов задают строки $FL, а не списки: devStudioTemplates, HmiIcons, StaburIconTemplates в этом формате не используются.
Строка $FL
Section titled “Строка $FL”| A | B | C | D | E | F…N |
|---|---|---|---|---|---|
$ | FL | файл или this | полное имя листа с префиксом | выключатель | значения по позиции |
- C — файл. Путь к базовому Excel:
%JSC%\…,%Self%\…(папка текущего файла),[GLOBAL_LIB_PATH]\…и другие общие переменные. Илиthis— лист из этого же OBJTYPE (так подключают локальный канал). - D — лист. Полное имя с префиксом вида (
Ch.CCB,DevSt.DiCC_ССВ). - E — выключатель. Пусто — подключения нет (ниже).
- F…N — значения аргументов, без имён: имя задаёт позиция (ниже).
В C и D допустимы переменные объекта ([TAG], [opt.*], …) и <script/> — такое подключение читается под каждый объект отдельно, см. Подключения, зависящие от объекта.
Префикс листа = вид данных
Section titled “Префикс листа = вид данных”| Префикс | Вид | Во что собирается |
|---|---|---|
| Ch. | канал | строки каналов OBJTYPE |
| DevSt. | объект DevStudio | объект DevStudio: тип / путь / имя из $VQ листа |
| HMI. | иконка Alpha.HMI | иконка: тип из $VQ HmiType, имя вида — имя листа без префикса |
| HMIS. | иконка СТАБУР | иконка: Lib и HmiType из $VQ |
Листы Tmpl.* и Wntk.* через $FL не подключаются: как и лист без известного префикса, они дают предупреждение в логе и пропускаются; остальная модель собирается дальше.
Один лист можно подключать несколько раз с разными значениями — каждое подключение даёт свою сущность (DevSt.DiCC_ССВ подключается и как DiCC_Open, и как DiCC_Close). Для DevSt.* у каждого подключения должен быть свой DevStudioTemplate (первое значение) — это ключ привязки каналов; одинаковые значения дают неоднозначную привязку и предупреждение.
Выключатель (колонка E)
Section titled “Выключатель (колонка E)”| В ячейке после подстановки | Результат |
|---|---|
| пусто или одни пробелы | подключения нет |
| любой непустой текст | подключение работает |
Значение не читается — важно только «пусто / не пусто». Пишите 1, x, да или комментарий. 0, нет, false — тоже не пусто, подключение работает.
Смысл — в переменной: ячейка вычисляется для каждого объекта, поэтому одна строка у одного объекта отработает, а у другого — нет:
$ FL CCB.xlsx Ch.CCB [Repair] Open DiCC_Open
объект с Repair = «x» → канал Open подключён объект с пустым Repair → строки как будто нетВ выключателе работают общие переменные ([…], %…%), аргументы подключения ({argN} — когда строка лежит в базе, а решает манифест) и <script/>. Скрипт выполняется после подстановки переменных; вернул пустое — подключение выключено.
Выключается ровно одна строка. Выключили объект DevStudio — ссылающиеся на него каналы остаются (их теги идут в Modbus и ST), но в DevStudio им ложиться некуда: в логе предупреждение.
У канала выключается всё, что он приносит: теги, место в DevStudio и алиас Unimod, а с ним — строка UnimodFB, то есть блок в программе ПЛК. Исключение — алиас, записанный в $LST TechObject.UnimodAliases: он останется, и блок соберётся без своих тегов.
Выключенные подключения пишутся в лог на уровне Debug — по разу на сочетание условий, а не на каждый объект — и видны в Инспекторе объектов приглушёнными, вместе с содержимым ячейки-выключателя.
Аргументы
Section titled “Аргументы”Значения в F…N получают имена по позиции:
- каждое непустое значение по порядку —
arg1,arg2, …; - первые позиции вида дополнительно получают семантические имена:
| Вид | arg1 (F) | arg2 (G) | arg3 (H) |
|---|---|---|---|
| Ch.* | alias | DsTemplate | — |
| DevSt.* | DevStudioTemplate | DevStudioPath | DevStudioName |
| HMI.* | только {argN} | ||
| HMIS.* | только {argN} |
- значения сверх семантических доступны только как
{argN}; - пустая ячейка не занимает позицию: если F пуста, а в G есть значение, то
arg1— это G. Пропуск в середине сдвигает нумерацию.
Внутри подключённого листа значение доступно как {имя} — по семантическому имени или по номеру, регистр не важен:
Манифест: $ FL DiCC.xlsx DevSt.DiCC_ССВ 1 DiCC_Open [PathDevStudio].[TAG]_ADD [TAG]_Open_CCВ базе: $ VQ TechObject.devStudioPath {DevStudioPath} (= {arg2}) $ VQ TechObject.devStudioName {DevStudioName} (= {arg3}){имя}видно только внутри своего подключения: в соседние подключения того же листа и во вложенные$ATTFLне попадает, с общими[…]не смешивается.- Значение может быть «слоёным»:
[TAG]подставится в лист буквально и позже станет тегом экземпляра.
Переменные и скрипты
Section titled “Переменные и скрипты”| Запись | Группа | Откуда значение |
|---|---|---|
| [имя], %имя% | общие | настройки JSC и экземпляр: [TAG], [PathDevStudio], %JSC%, %Self%, [GLOBAL_LIB_PATH], … |
| {имя} | аргументы подключения | строка $FL / $JSM; видны только в подключённом листе |
<script …/> | скрипт GAP | вычисляется, когда известен объект |
Порядок: сначала {…} (при подключении), затем […] / %…%, затем скрипты. Скрипт можно ставить в значение ячейки, в выключатель, в путь и имя листа $FL, в путь .jsm и имя POU. Подробнее — Внешние переменные.
Подключения, зависящие от объекта
Section titled “Подключения, зависящие от объекта”Обычное подключение читается один раз на OBJTYPE и кэшируется. Если в C или D стоит переменная объекта или <script/>, подключение откладывается и читается при сборке каждого объекта:
$ FL %JSC%\Conf\Lib\DevStudio\apucs\[DsFamily].xlsx DevSt.[DsKind] 1 DiCC_Open …- Цена: лист читается под каждое различимое сочетание данных объекта. Где хватает выбора из нескольких строк
$FLс разными выключателями — используйте его: дешевле и нагляднее. - Порядок сохраняется: отложенное подключение встаёт на своё место среди строк манифеста.
- Выключенное не читается: при пустом условии файл не открывается — и об ошибке в его ссылке в логе ничего не будет.
- Вложенность — не глубже 8 уровней; глубже считается циклом.
- Несостоявшиеся подключения (переменную нечем раскрыть, нет файла или листа) сообщаются в конце парсинга — по записи на объект, с именем объекта и причиной. Если имя раскрылось позже сборки объекта, сообщение скажет «значение появилось позже сборки объекта»: задним числом подключение не выполняется.
- В
$ATTFLтак нельзя — выбор выносите в$FL, см. $ATTFL.
Несостоявшиеся подключения видны в Инспекторе объектов отдельной строкой с причиной.