Skip to content

Манифест Tmpl.* и $FL

Статья формата ObjectTypeVersion 1.0. В старом формате лист шаблона устроен иначе — см. Листы шаблонов (старый формат).

Манифест Tmpl.<TemplateName> содержит конфиг, списки и подключения:

Маркер (кол. B)НазначениеКолонки
VQзначение конфига OBJTYPEC = ключ, D = значение
LSTсписокC = ключ, D…N = элементы
FLподключить лист (канал / DevStudio / HMI / HMIS)C = файл, D = лист, E = выключатель, F…N = значения по позиции
JSMподключить jsm — шаблон ST для UnimodC = файл .jsm, D = файл вывода, E = выключатель, F = алиасы, G…N = значения — подробнее

Набор объектов задают строки $FL, а не списки: devStudioTemplates, HmiIcons, StaburIconTemplates в этом формате не используются.

ABCDEF…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 (первое значение) — это ключ привязки каналов; одинаковые значения дают неоднозначную привязку и предупреждение.

В ячейке после подстановкиРезультат
пусто или одни пробелыподключения нет
любой непустой текстподключение работает

Значение не читается — важно только «пусто / не пусто». Пишите 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 — по разу на сочетание условий, а не на каждый объект — и видны в Инспекторе объектов приглушёнными, вместе с содержимым ячейки-выключателя.

Значения в F…N получают имена по позиции:

  • каждое непустое значение по порядку — arg1, arg2, …;
  • первые позиции вида дополнительно получают семантические имена:
Видarg1 (F)arg2 (G)arg3 (H)
Ch.*aliasDsTemplate—
DevSt.*DevStudioTemplateDevStudioPathDevStudioName
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] подставится в лист буквально и позже станет тегом экземпляра.
ЗаписьГруппаОткуда значение
[имя], %имя%общиенастройки 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.

Несостоявшиеся подключения видны в Инспекторе объектов отдельной строкой с причиной.