ObjectTypeVersion 1.0 (маркеры $FL)
Начиная с Uniplant Atomix 1.6.0.0, модель OBJTYPE может описываться в формате ObjectTypeVersion 1.0: общие данные (каналы, объекты DevStudio, иконки HMI) хранятся в базовых Excel библиотеки и подключаются к типовому блоку строками $FL. Сам OBJTYPE содержит манифест — перечень подключений с параметрами.
Шпаргалка
Section titled “Шпаргалка”| Хочу | Пишу |
|---|---|
| Включить новый формат | лист system: $ | VQ | ObjectTypeVersion | 1.0 |
| Подключить лист из базы | в манифесте: $ | FL | <файл> | <лист-с-префиксом> | <значения…> |
| Подключить лист из этого же файла | вместо файла — this |
| Передать параметр в базу | значение в колонках E…N; в базе доступно как {arg1}, {arg2}… или по семантическому имени |
| Связать канал с объектом DevStudio | DsTemplate канала (2-е значение) = DevStudioTemplate объекта (1-е значение) |
| Вынести общие атрибуты/опции внутри базы | $ | ATTFL | <файл> | <лист> |
Порядок обязательных значений в $FL (колонки E, F, G):
| Вид листа | E (arg1) | F (arg2) | G (arg3) |
|---|---|---|---|
| Ch.* канал | alias | DsTemplate | — |
| DevSt.* объект DevStudio | DevStudioTemplate | DevStudioPath | DevStudioName |
| HMI.* иконка HMI | arg | — | — |
| HMIS.* иконка Stabur | только позиционные {argN} |
Идея формата
Section titled “Идея формата”Раньше модель OBJTYPE была монолитом: один Excel содержал конфиг, все строки параметров и листы DevStudio/HMI внутри файла. При изменении общей сущности (например, типового объекта DevStudio) правку приходилось повторять во всех типовых блоках, где она встречалась.
Новый формат разделяет «общее» и «конкретное»:
- Общее (строки каналов, атрибуты DevStudio, опции HMI) живёт в базовых Excel — переиспользуемых заготовках библиотеки.
- Конкретное (какие базы взять и с какими параметрами) описывает манифест — один лист внутри OBJTYPE.
Общая правка делается в одном месте; новый типовой блок — это другой набор подключений; каждое подключение записывается единообразно: «взять лист из файла с такими-то значениями», а вид данных определяется префиксом имени листа.
Картина целиком
Section titled “Картина целиком”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
Section titled “Из чего состоит OBJTYPE”Модель OBJTYPE — один Excel-файл. В формате ObjectTypeVersion 1.0 в нём есть:
- Лист
system— служебный лист с переменной версии. Его наличие включает новый формат. - Лист-манифест — перечисляет, что подключить, без самих данных. Имя листа должно совпадать с TemplateName типового блока — именем, по которому экземпляры выбирают шаблон (по умолчанию
main). Файл OBJTYPE экземпляры находят по типу (OBJTYPENAME). В примерах ниже манифест называетсяCC. - Локальные листы — данные, специфичные для этого OBJTYPE: например, канал
Ch.Vlv, подключаемый из того же файла (this), или лист UnimodFB для ST-кода.
Базы живут не в OBJTYPE, а в библиотеке, и подключаются манифестом.
Включение формата: лист system
Section titled “Включение формата: лист system”Новый формат работает только если в OBJTYPE есть лист system с переменной версии:
| A | B | C | D |
|---|---|---|---|
$ | VQ | ObjectTypeVersion | 1.0 |
Значение ObjectTypeVersion — любое непустое. Нет листа system или переменной → OBJTYPE обрабатывается как старый, подключения $FL не применяются. Это явный и безопасный переключатель: существующие модели гарантированно не затрагиваются.
Разметка строк листа
Section titled “Разметка строк листа”В каждой строке любого листа колонка A задаёт тип строки, колонка B — маркер или действие. Далее идут колонки C, D, E… с данными. Общие правила — в Правилах заполнения Excel-файлов.
| Кол. A | Что это |
|---|---|
| $ | директива (маркер — в колонке B) |
| # | строка-маркеров колонок |
H / h | заголовки колонок |
| @ | комментарий (игнорируется) |
| d | строка данных |
Манифест
Section titled “Манифест”Манифест состоит из конфига, списков и подключений:
| Маркер (кол. B) | Назначение | Колонки |
|---|---|---|
| VQ | одно значение конфига OBJTYPE | C = ключ, D = значение |
| LST | список | C = ключ, D…N = элементы |
| FL | подключить лист | C = файл, D = лист, E…N = значения (по позиции) |
$FL — основное действие: «добавь к OBJTYPE вот этот лист из вот этого файла». Чем он станет (каналом, объектом DevStudio, иконкой) — определяет префикс имени листа; с какими параметрами — значения-аргументы в колонках E…N.
Строка $FL
Section titled “Строка $FL”| A | B | C | D | E | F | … |
|---|---|---|---|---|---|---|
$ | FL | файл | лист | значение 1 | значение 2 | … |
- Колонка C — файл. Путь к Excel-базе; раскрывается при сборке из настроек JSC/библиотеки и %Self% (= папка текущего файла). Инстансные переменные (
[TAG]и т.п.) в путь не ставятся — им место только в значениях (E…N). Либо литералthis— взять лист из этого же файла OBJTYPE. - Колонка D — лист. Полное имя листа с префиксом вида.
- Колонки E…N — значения аргументов по позиции, без имён.
Префикс листа = вид данных
Section titled “Префикс листа = вид данных”Имя подключаемого листа начинается с префикса, который определяет, чем считать данные и как их собирать (см. таблицу в Шпаргалке).
Один и тот же лист можно подключать несколько раз с разными значениями — каждое подключение даёт свою сущность. Для DevSt.* каждое подключение обязано иметь свой уникальный DevStudioTemplate (arg1) — это ключ привязки каналов; одинаковые значения дают неоднозначную привязку и предупреждение в логе.
Лист без известного префикса не подключается: в лог пишется предупреждение, остальной OBJTYPE собирается дальше.
Аргументы подключения
Section titled “Аргументы подключения”В $FL после файла и листа идут только значения — по одному на ячейку E…N, без имён. Имя задаётся позицией:
- каждое непустое значение по порядку получает имя
arg1,arg2, … (E =arg1, F =arg2, …); - первые позиции каждого вида дополнительно получают семантические имена — обязательные аргументы (таблица в Шпаргалке);
- лишние значения (сверх обязательных) доступны только как
{argN}.
Внутри подключённого листа значения доступны как {имя} — по семантическому имени или по позиции (эквивалентно).
Пример в манифесте CC (один образец):
| A | B | C | D | E | F | G |
|---|---|---|---|---|---|---|
$ | FL | DiCC.xlsx | DevSt.DiCC_ССВ | DiCC_Open | [PathDevStudio].[TAG]_ADD | [TAG]_Open_CC |
Внутри базы DevSt.DiCC_ССВ:
| A | B | C | D |
|---|---|---|---|
$ | VQ | TechObject.devStudioPath | {DevStudioPath} |
$ | VQ | TechObject.devStudioName | {DevStudioName} |
Здесь {DevStudioPath} = {arg2} (колонка F), {DevStudioName} = {arg3} (колонка G).
Две группы переменных
Section titled “Две группы переменных”| Запись | Группа | Откуда значение |
|---|---|---|
| [имя], %имя% | общие | настройки JSC и контекст экземпляра ([TAG], [PathDevStudio], …) |
| {имя} | аргументы подключения | передаются строкой $FL по позиции, видны только в подключённом листе |
Сначала подставляются {…} (при подключении), затем […] / %…% — в общем порядке. Подробнее об общих переменных — Внешние переменные.
Базовые Excel
Section titled “Базовые Excel”Каждая база — одна сущность одного вида; имя её листа несёт префикс. Первые $VQ-строки задают идентичность, дальше идут данные; {имя} стоят там, где конкретику подставит манифест.
Канал — лист Ch.*: сразу строки #/H/@/d каналов; в значениях {alias}, {DsTemplate}.
Объект DevStudio — лист DevSt.*:
| A | B | C | D |
|---|---|---|---|
$ | VQ | TechObject.devStudioType | DiCC |
$ | VQ | TechObject.devStudioPath | {DevStudioPath} |
$ | VQ | TechObject.devStudioName | {DevStudioName} |
$ | ATTFL | %Self%\attibutes\BasePlcObjAttr.xlsx | base-plc-attr |
#/H/d | … | attrName | attrValue |
Подробнее об атрибутах 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: пошагово”- Создайте Excel OBJTYPE в нужной папке
Models\ObjTypes\…. - Лист
system: строка$ | VQ | ObjectTypeVersion | 1.0— включает новый формат. - Лист-манифест — имя листа =
TemplateName(по умолчаниюmain; в примере —CC):$VQ-строки конфига (TechObject.modbusTemplate,TechObject.devStudioType, …);$LST-строки списков (если нужны); на каждое подключение — строка$FL: файл (C), лист с префиксом (D), значения (E…N) по позиции. - Локальные листы (если есть свои каналы) — лист
Ch.<имя>, подключается из манифеста какthis. - Проверьте порядок значений в
$FL(таблица в Шпаргалке) и совпадениеDsTemplateканала сDevStudioTemplateобъекта. - Сохраняйте только через Excel — правка сторонними средствами может сделать файл нечитаемым для парсера.
Базы (Ch.*, DevSt.*, HMI.*) обычно уже есть в библиотеке; новый OBJTYPE — это другой набор $FL-строк, без правки баз.
Полный пример: ESD_VlvSDV
Section titled “Полный пример: ESD_VlvSDV”Лист system:
| A | B | C | D |
|---|---|---|---|
$ | VQ | ObjectTypeVersion | 1.0 |
Манифест CC:
| A | B | C | D | E | F | G |
|---|---|---|---|---|---|---|
$ | VQ | TechObject.modbusTemplate | ESD_VlvSDV | |||
$ | LST | TechObject.UnimodAliases | base | Close | Open | MV |
$ | FL | CCB.xlsx | Ch.CCB | Open | DiCC_Open | |
$ | FL | CCB.xlsx | Ch.CCB | Close | DiCC_Close | |
$ | FL | DoCCM_x2.xlsx | Ch.DoCCM_x2 | MV | MV_CC | |
$ | FL | this | Ch.Vlv | base | VlvSDV | |
$ | FL | DiCC.xlsx | DevSt.DiCC_ССВ | DiCC_Open | [PathDevStudio].[TAG]_ADD | [TAG]_Open_CC |
$ | FL | DiCC.xlsx | DevSt.DiCC_ССВ | DiCC_Close | [PathDevStudio].[TAG]_ADD | [TAG]_Close_CC |
$ | FL | CC_M2.xlsx | DevSt.MV_CC | MV_CC | [PathDevStudio].[TAG]_ADD | [TAG]_MV_CC |
$ | FL | VlvSDV.xlsx | DevSt.VlvSDV | VlvSDV | ||
$ | FL | Hmi-VlvSDV.xlsx | HMI.Icon_VlvSDV | |||
$ | FL | Hmi-Trip.xlsx | HMI.Trip | |||
$ | FL | Hmi-CE_Effect.xlsx | HMI.CE_Effect | VlvSDV |
Результат сборки:
- четыре канала (
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_Open↔DevStudioTemplate=DiCC_Open) и так далее.
Частые вопросы
Section titled “Частые вопросы”Подключение «пропало», в выходе нет объекта. Проверьте: (1) на листе system есть ObjectTypeVersion; (2) у листа в колонке D правильный префикс; (3) файл и лист существуют по указанному пути; (4) лист базы назван тем же полным именем, что в манифесте.
В выходе осталась {переменная}. Забыли передать значение или перепутали порядок в $FL. Сверьтесь с таблицей позиций в Шпаргалке.
Канал не привязался к объекту DevStudio. DsTemplate канала (2-е значение) не совпадает с DevStudioTemplate объекта (1-е значение).
OBJTYPE пошёл по старой обработке. Нет листа system или пуст ObjectTypeVersion.
Редактируйте OBJTYPE только в Excel. Файлы сохраняются в формате, который ожидает сборка.
Как расширять
Section titled “Как расширять”| Что нужно | Что делает инженер |
|---|---|
| Новый OBJTYPE | новый манифест со своим набором строк $FL |
| Новый аргумент для базы | дописать значение в $FL (станет {argN}) и поставить {argN} в базе |
| Общая правка сущности | поправить базовый Excel — изменение подхватят все OBJTYPE, что его подключают |
| Новая общая «вставка» (атрибуты/опции) | вынести в отдельный лист и подтянуть в базе через $ATTFL |
Глоссарий
Section titled “Глоссарий”| Термин | Значение |
|---|---|
| манифест | лист, перечисляющий что подключить; имя листа = TemplateName |
TemplateName | имя манифест-листа; по нему экземпляры выбирают шаблон (по умолчанию main) |
| база | переиспользуемый лист-заготовка в библиотеке (канал / DevStudio / HMI) |
подключение ($FL) | строка манифеста: взять лист из файла с переданными значениями |
| префикс вида | начало имени листа (Ch. / DevSt. / HMI. / HMIS.) |
| аргумент | значение, переданное в подключаемый лист; внутри — {argN} или {семантическое имя} |
alias | 1-е значение канала, связывает канал с кодом Unimod |
DsTemplate / DevStudioTemplate | ключ связи «канал ↔ объект DevStudio» |
$ATTFL | подключение общего блока атрибутов/опций внутри базы |
ObjectTypeVersion | переменная на листе system; её наличие включает новый формат |