Skip to content

ObjectTypeVersion 1.0 (маркеры $FL)

Начиная с Uniplant Atomix 1.6.0.0, модель OBJTYPE может описываться в формате ObjectTypeVersion 1.0: общие данные (каналы, объекты DevStudio, иконки HMI) хранятся в базовых Excel библиотеки и подключаются к типовому блоку строками $FL. Сам OBJTYPE содержит манифест — перечень подключений с параметрами.

ХочуПишу
Включить новый форматлист system: $ | VQ | ObjectTypeVersion | 1.0
Подключить лист из базыв манифесте: $ | FL | <файл> | <лист-с-префиксом> | <значения…>
Подключить лист из этого же файлавместо файла — this
Передать параметр в базузначение в колонках E…N; в базе доступно как {arg1}, {arg2}… или по семантическому имени
Связать канал с объектом DevStudioDsTemplate канала (2-е значение) = DevStudioTemplate объекта (1-е значение)
Вынести общие атрибуты/опции внутри базы$ | ATTFL | <файл> | <лист>

Порядок обязательных значений в $FL (колонки E, F, G):

Вид листаE (arg1)F (arg2)G (arg3)
Ch.* каналaliasDsTemplate
DevSt.* объект DevStudioDevStudioTemplateDevStudioPathDevStudioName
HMI.* иконка HMIarg
HMIS.* иконка Staburтолько позиционные {argN}

Раньше модель OBJTYPE была монолитом: один Excel содержал конфиг, все строки параметров и листы DevStudio/HMI внутри файла. При изменении общей сущности (например, типового объекта DevStudio) правку приходилось повторять во всех типовых блоках, где она встречалась.

Новый формат разделяет «общее» и «конкретное»:

  • Общее (строки каналов, атрибуты DevStudio, опции HMI) живёт в базовых Excel — переиспользуемых заготовках библиотеки.
  • Конкретное (какие базы взять и с какими параметрами) описывает манифест — один лист внутри OBJTYPE.

Общая правка делается в одном месте; новый типовой блок — это другой набор подключений; каждое подключение записывается единообразно: «взять лист из файла с такими-то значениями», а вид данных определяется префиксом имени листа.

OBJTYPE ESD_VlvSDV_DS.xlsx
├─ Лист system $VQ ObjectTypeVersion 1.0 (флаг нового формата)
├─ Лист-манифест CC
│ $VQ конфиг (modbusTemplate, devStudioType, …)
│ $LST UnimodAliases (набор объектов задаётся строками $FL, не списками)
│ $FL подключить лист → файл | лист | значения (позиционно)…
│ $FL CCB.xlsx | Ch.CCB | Open DiCC_Open
│ $FL this | Ch.Vlv | base VlvSDV
│ $FL DiCC.xlsx | DevSt.DiCC_ССВ | DiCC_Open [PathDevStudio].[TAG]_ADD [TAG]_Open_CC
│ $FL Hmi-CE_Effect.xlsx | HMI.CE_Effect | VlvSDV
├─ Лист Ch.Vlv локальный канал (подключается как this)
└─ Лист UnimodFB шаблон ST-кода
БИБЛИОТЕКА — БАЗОВЫЕ EXCEL (имя листа начинается с ПРЕФИКСА ВИДА)
Ch.* канал строки каналов + {alias}, {DsTemplate}
DevSt.* объект DevStudio $VQ-конфиг + атрибуты + {DevStudio…}
HMI.* иконка HMI $VQ-конфиг + опции + {arg}
HMIS.* иконка Stabur HMI $VQ-конфиг + опции

Сборка OBJTYPE → конфигурация DevStudio · мнемо HMI · карта Modbus · ST-код Unimod

Модель OBJTYPE — один Excel-файл. В формате ObjectTypeVersion 1.0 в нём есть:

  • Лист system — служебный лист с переменной версии. Его наличие включает новый формат.
  • Лист-манифест — перечисляет, что подключить, без самих данных. Имя листа должно совпадать с TemplateName типового блока — именем, по которому экземпляры выбирают шаблон (по умолчанию main). Файл OBJTYPE экземпляры находят по типу (OBJTYPENAME). В примерах ниже манифест называется CC.
  • Локальные листы — данные, специфичные для этого OBJTYPE: например, канал Ch.Vlv, подключаемый из того же файла (this), или лист UnimodFB для ST-кода.

Базы живут не в OBJTYPE, а в библиотеке, и подключаются манифестом.

Включение формата: лист system

Section titled “Включение формата: лист system”

Новый формат работает только если в OBJTYPE есть лист system с переменной версии:

ABCD
$VQObjectTypeVersion1.0

Значение ObjectTypeVersion — любое непустое. Нет листа system или переменной → OBJTYPE обрабатывается как старый, подключения $FL не применяются. Это явный и безопасный переключатель: существующие модели гарантированно не затрагиваются.

В каждой строке любого листа колонка A задаёт тип строки, колонка B — маркер или действие. Далее идут колонки C, D, E… с данными. Общие правила — в Правилах заполнения Excel-файлов.

Кол. AЧто это
$директива (маркер — в колонке B)
#строка-маркеров колонок
H / hзаголовки колонок
@комментарий (игнорируется)
dстрока данных

Манифест состоит из конфига, списков и подключений:

Маркер (кол. B)НазначениеКолонки
VQодно значение конфига OBJTYPEC = ключ, D = значение
LSTсписокC = ключ, D…N = элементы
FLподключить листC = файл, D = лист, E…N = значения (по позиции)

$FL — основное действие: «добавь к OBJTYPE вот этот лист из вот этого файла». Чем он станет (каналом, объектом DevStudio, иконкой) — определяет префикс имени листа; с какими параметрами — значения-аргументы в колонках E…N.

ABCDEF
$FLфайллистзначение 1значение 2
  • Колонка C — файл. Путь к Excel-базе; раскрывается при сборке из настроек JSC/библиотеки и %Self% (= папка текущего файла). Инстансные переменные ([TAG] и т.п.) в путь не ставятся — им место только в значениях (E…N). Либо литерал this — взять лист из этого же файла OBJTYPE.
  • Колонка D — лист. Полное имя листа с префиксом вида.
  • Колонки E…N — значения аргументов по позиции, без имён.

Префикс листа = вид данных

Section titled “Префикс листа = вид данных”

Имя подключаемого листа начинается с префикса, который определяет, чем считать данные и как их собирать (см. таблицу в Шпаргалке).

Один и тот же лист можно подключать несколько раз с разными значениями — каждое подключение даёт свою сущность. Для DevSt.* каждое подключение обязано иметь свой уникальный DevStudioTemplate (arg1) — это ключ привязки каналов; одинаковые значения дают неоднозначную привязку и предупреждение в логе.

Лист без известного префикса не подключается: в лог пишется предупреждение, остальной OBJTYPE собирается дальше.

В $FL после файла и листа идут только значения — по одному на ячейку E…N, без имён. Имя задаётся позицией:

  • каждое непустое значение по порядку получает имя arg1, arg2, … (E = arg1, F = arg2, …);
  • первые позиции каждого вида дополнительно получают семантические имена — обязательные аргументы (таблица в Шпаргалке);
  • лишние значения (сверх обязательных) доступны только как {argN}.

Внутри подключённого листа значения доступны как {имя} — по семантическому имени или по позиции (эквивалентно).

Пример в манифесте CC (один образец):

ABCDEFG
$FLDiCC.xlsxDevSt.DiCC_ССВDiCC_Open[PathDevStudio].[TAG]_ADD[TAG]_Open_CC

Внутри базы DevSt.DiCC_ССВ:

ABCD
$VQTechObject.devStudioPath{DevStudioPath}
$VQTechObject.devStudioName{DevStudioName}

Здесь {DevStudioPath} = {arg2} (колонка F), {DevStudioName} = {arg3} (колонка G).

ЗаписьГруппаОткуда значение
[имя], %имя%общиенастройки JSC и контекст экземпляра ([TAG], [PathDevStudio], …)
{имя}аргументы подключенияпередаются строкой $FL по позиции, видны только в подключённом листе

Сначала подставляются {…} (при подключении), затем […] / %…% — в общем порядке. Подробнее об общих переменных — Внешние переменные.

Каждая база — одна сущность одного вида; имя её листа несёт префикс. Первые $VQ-строки задают идентичность, дальше идут данные; {имя} стоят там, где конкретику подставит манифест.

Канал — лист Ch.*: сразу строки #/H/@/d каналов; в значениях {alias}, {DsTemplate}.

Объект DevStudio — лист DevSt.*:

ABCD
$VQTechObject.devStudioTypeDiCC
$VQTechObject.devStudioPath{DevStudioPath}
$VQTechObject.devStudioName{DevStudioName}
$ATTFL%Self%\attibutes\BasePlcObjAttr.xlsxbase-plc-attr
#/H/dattrNameattrValue

Подробнее об атрибутах DevStudio — Листы DevSt.*.

Иконка HMI — лист HMI.*: $VQ HmiType$ATTFL (общие опции) → строки #/H/@/d опций. См. Листы HMI.*.

Иконка Stabur HMI — лист HMIS.*: $VQ Lib и $VQ HmiType → ($ATTFL) → строки опций. Семантических аргументов у HMIS.* нет — только позиционные {argN}. См. Листы HMIS.*.

$ATTFL — общая часть на уровень глубже

Section titled “$ATTFL — общая часть на уровень глубже”

У баз одного вида часто есть одинаковая часть: типовые атрибуты у объектов DevStudio, типовые опции у иконок. Её выносят в отдельный общий лист и подтягивают маркером $ATTFL (C = файл, D = лист). Результат листа = общие строки из $ATTFL + локальные строки базы. Тот же приём «общее в одном месте», но на шаг ниже: не OBJTYPE подключает базу, а база подключает общий блок.

Связи между сущностями

Section titled “Связи между сущностями”

Канал ↔ объект DevStudio. У канала второе значение (arg2 = DsTemplate) и у объекта DevStudio первое (arg1 = DevStudioTemplate) должны совпадать — это ключ их связи.

Канал ↔ Unimod. Первое значение канала (arg1 = alias: base / Open / Close / MV) связывает канал с кодом Unimod. Список алиасов — в $LST TechObject.UnimodAliases; см. UnimodFB и template.

DevStudioTemplate — ключ привязки; при нескольких подключениях одного листа DevSt.* он должен быть уникальным для каждого, иначе каналы привяжутся неоднозначно.

Соглашения по именованию и путям

Section titled “Соглашения по именованию и путям”
  • Лист базы обязан называться с префиксом вида (Ch.* / DevSt.* / HMI.* / HMIS.*); в манифесте (колонка D) пишется полное имя с префиксом.
  • Ключи конфига в базах фиксированы конвенцией: TechObject.devStudioType / …Path / …Name у DevStudio, HmiType у иконок, Lib у Stabur.
  • Путь %JSC%\Conf\Lib\… — проектная ссылка на библиотеку %JSC%\Automiq\Lib\…, раскрывается при сборке.
  • Локальный канал внутри OBJTYPE подключается как this, лист — Ch.<имя>.

Ошибки и обратная совместимость

Section titled “Ошибки и обратная совместимость”

Парс OBJTYPE не падает из-за ошибки в одном подключении — сообщает и идёт дальше:

СитуацияПоведение
Лист назван без известного префиксаподключение пропущено + предупреждение (Warn)
Файл или лист не найденподключение пропущено + ошибка (Error)
В листе осталась неподставленная {переменная}остаётся как есть, молча
Два объекта DevStudio с одинаковым DevStudioTemplateпредупреждение; привязка каналов неоднозначна
Лист подключает сам себя по кругузащита от цикла + предупреждение (Warn)

Новый путь включается только при наличии листа system с ObjectTypeVersion. Без него OBJTYPE считается старым: подключения $FL не применяются, идёт прежняя обработка по листам шаблонов.

Создание нового OBJTYPE: пошагово

Section titled “Создание нового OBJTYPE: пошагово”
  1. Создайте Excel OBJTYPE в нужной папке Models\ObjTypes\….
  2. Лист system: строка $ | VQ | ObjectTypeVersion | 1.0 — включает новый формат.
  3. Лист-манифест — имя листа = TemplateName (по умолчанию main; в примере — CC): $VQ-строки конфига (TechObject.modbusTemplate, TechObject.devStudioType, …); $LST-строки списков (если нужны); на каждое подключение — строка $FL: файл (C), лист с префиксом (D), значения (E…N) по позиции.
  4. Локальные листы (если есть свои каналы) — лист Ch.<имя>, подключается из манифеста как this.
  5. Проверьте порядок значений в $FL (таблица в Шпаргалке) и совпадение DsTemplate канала с DevStudioTemplate объекта.
  6. Сохраняйте только через Excel — правка сторонними средствами может сделать файл нечитаемым для парсера.

Базы (Ch.*, DevSt.*, HMI.*) обычно уже есть в библиотеке; новый OBJTYPE — это другой набор $FL-строк, без правки баз.

Лист system:

ABCD
$VQObjectTypeVersion1.0

Манифест CC:

ABCDEFG
$VQTechObject.modbusTemplateESD_VlvSDV
$LSTTechObject.UnimodAliasesbaseCloseOpenMV
$FLCCB.xlsxCh.CCBOpenDiCC_Open
$FLCCB.xlsxCh.CCBCloseDiCC_Close
$FLDoCCM_x2.xlsxCh.DoCCM_x2MVMV_CC
$FLthisCh.VlvbaseVlvSDV
$FLDiCC.xlsxDevSt.DiCC_ССВDiCC_Open[PathDevStudio].[TAG]_ADD[TAG]_Open_CC
$FLDiCC.xlsxDevSt.DiCC_ССВDiCC_Close[PathDevStudio].[TAG]_ADD[TAG]_Close_CC
$FLCC_M2.xlsxDevSt.MV_CCMV_CC[PathDevStudio].[TAG]_ADD[TAG]_MV_CC
$FLVlvSDV.xlsxDevSt.VlvSDVVlvSDV
$FLHmi-VlvSDV.xlsxHMI.Icon_VlvSDV
$FLHmi-Trip.xlsxHMI.Trip
$FLHmi-CE_Effect.xlsxHMI.CE_EffectVlvSDV

Результат сборки:

  • четыре канала (base / Open / Close / MV) из подключённых листов Ch.*;
  • объекты DevStudio (DiCC_Open / DiCC_Close / MV_CC / VlvSDV) — тип/путь/имя из $VQ базы после подстановки переданных значений, атрибуты из базы вместе с общими из $ATTFL;
  • иконки HMI (Icon_VlvSDV / Trip / CE_Effect) с типом из $VQ HmiType и опциями из базы;
  • связи: канал Open ↔ объект DiCC_Open (по DsTemplate=DiCC_OpenDevStudioTemplate=DiCC_Open) и так далее.

Подключение «пропало», в выходе нет объекта. Проверьте: (1) на листе system есть ObjectTypeVersion; (2) у листа в колонке D правильный префикс; (3) файл и лист существуют по указанному пути; (4) лист базы назван тем же полным именем, что в манифесте.

В выходе осталась {переменная}. Забыли передать значение или перепутали порядок в $FL. Сверьтесь с таблицей позиций в Шпаргалке.

Канал не привязался к объекту DevStudio. DsTemplate канала (2-е значение) не совпадает с DevStudioTemplate объекта (1-е значение).

OBJTYPE пошёл по старой обработке. Нет листа system или пуст ObjectTypeVersion.

Редактируйте OBJTYPE только в Excel. Файлы сохраняются в формате, который ожидает сборка.

Что нужноЧто делает инженер
Новый OBJTYPEновый манифест со своим набором строк $FL
Новый аргумент для базыдописать значение в $FL (станет {argN}) и поставить {argN} в базе
Общая правка сущностипоправить базовый Excel — изменение подхватят все OBJTYPE, что его подключают
Новая общая «вставка» (атрибуты/опции)вынести в отдельный лист и подтянуть в базе через $ATTFL
ТерминЗначение
манифестлист, перечисляющий что подключить; имя листа = TemplateName
TemplateNameимя манифест-листа; по нему экземпляры выбирают шаблон (по умолчанию main)
базапереиспользуемый лист-заготовка в библиотеке (канал / DevStudio / HMI)
подключение ($FL)строка манифеста: взять лист из файла с переданными значениями
префикс виданачало имени листа (Ch. / DevSt. / HMI. / HMIS.)
аргументзначение, переданное в подключаемый лист; внутри — {argN} или {семантическое имя}
alias1-е значение канала, связывает канал с кодом Unimod
DsTemplate / DevStudioTemplateключ связи «канал ↔ объект DevStudio»
$ATTFLподключение общего блока атрибутов/опций внутри базы
ObjectTypeVersionпеременная на листе system; её наличие включает новый формат