Стандарт программирования проектов MetaPlatform / MetaLib
1. Глобальные области проекта
| Область | Назначение | Пример |
|---|---|---|
| Conf | Конфигурационные переменные проекта | Conf.Pump1_Engine_diStartDelayTime |
| View | Параметры ФБ и опубликованные сигналы IO | View.Pump1_Engine_Inst_out_bState := Pump1_Engine_Inst.out_bState |
2. Обозначения
| Обозначение | Смысл | Пример |
|---|---|---|
ID |
Идентификатор объекта, механизма, группы, датчика или общего блока | **<ID>**_Engine_Inst → Pump1_Engine_Inst |
Class |
Тип функционального блока без префикса C |
<ID>_**<Class>**_Inst → Pump1_Engine_Inst |
Access |
Область параметра блока: in, out, inout |
<ID>_<Class>_Inst_**<Access>**_bState → Pump1_Engine_Inst_out_bState |
Signal |
Имя сигнала | DI_<ID>_<ТипДанных>**<Signal>** → DI_YA1_bStateOpen |
Parameter |
Имя параметра | <ID>_<Class>_<ТипДанных>**<Parameter>** → Pump1_Engine_diStartDelayTime |
ТипДанных |
Префикс типа данных | <ID>_<Class>_**<ТипДанных>**StartDelayTime → Pump1_Engine_diStartDelayTime |
3. Именование
3.1. Префиксы типов данных
| Тип данных | Префикс | Пример |
|---|---|---|
| Bool | b |
bStart |
| Byte | by |
byState |
| Word | w |
wAlarmTag0 |
| DWord | dw |
dwFlags |
| Int | i |
iMode |
| UInt | ui |
uiCount |
| DInt | di |
diDelay |
| UDInt | udi |
udiTimeout |
| Real | f |
fSP |
3.2. Общие правила
| Правило | Требование | Пример |
|---|---|---|
Символ . |
Не использовать в программном ID | Pump1_Engine_Inst_out_bState, не Pump1.Engine.Inst.out_bState |
| Спецсимволы | Не использовать | Допускается только _ |
| Начало имени | Не начинать с цифры | Pump1_Engine_Inst, не 1Pump_Engine_Inst |
| Массивы | Использовать p + префикс типа |
pwAlarm |
| Таймеры | Использовать тип DInt |
diDelay, diTime |
| Константы | Писать заглавными буквами без префикса типа | STATESTOPPED, ADC_MAX_VALUE |
| Функции | Писать со строчной буквы | getWorkingCount(), makeView() |
| Функциональные блоки и экземпляры | Писать с заглавной буквы | General, Sens, Pump1_Engine_Inst() |
3.3. Сигналы IO
Правила этого подраздела являются общими для целевых платформ. Особенности физической адресации платформ не изменяют имена тегов.
В итоговом проекте ПЛК различаются Raw-теги физических каналов и логические теги технологических сигналов. Оба вида являются глобальными тегами. Место их объявления определяется пользователем в целевой среде разработки ПЛК.
MetaPlatform работает только с логическими тегами. Raw-теги не входят в канонический проект MetaPlatform, не публикуются и не используются таблицами MetaGen.
3.3.1. Raw-теги
Raw-тег однозначно идентифицирует физический канал ПЛК и не содержит технологического назначения сигнала. Raw-теги объявляются непосредственно в целевой среде разработки ПЛК.
Шаблон:
<PLC>_<Module>_<Channel>
Примеры:
K_SHAU_A1_DI0K_SHAU_A5_AI3K_SHAU_A9_AQ2
Требования:
PLCсовпадает с обозначением ПЛК в проекте;Moduleсовпадает с позиционным обозначением модуля;Channelсостоит из типа каналаDI,DQ,AIилиAQи его номера;- префикс типа данных в имя Raw-тега не добавляется;
- назначение, KKS и имя исполнительного механизма в Raw-тег не включаются;
- изменение назначения физического канала не изменяет правило построения его Raw-имени.
3.3.2. Логические теги
Логический тег описывает технологическое назначение сигнала и не зависит от номера физического модуля или канала. MetaPlatform подключает логические теги как внешние глобальные теги и не определяет место их объявления в проекте ПЛК.
Шаблон:
(DI|DQ|AI|AQ)_[<ID>_]<ТипДанных><Signal>
Примеры:
DI_YA1_bStateOpenDQ_K61_bStartAI_fP2101AQ_Pump1_fFrequencySP
Требования:
- использовать обозначения
DI,DQ,AIиAQ; вариантыDOиAOне применяются; - префикс типа данных должен соответствовать объявленному типу логического тега;
- для сигнала исполнительного механизма использовать его ID;
- для измерительного сигнала использовать KKS, если он задан;
- если ID или KKS отсутствует, необязательную часть
<ID>_не добавлять; - имя должно описывать назначение, состояние или команду сигнала;
- номер модуля и физического канала в логическое имя не включать.
Для одинаковых сигналов однотипных исполнительных механизмов используется один и тот же суффикс. Имена отличаются только префиксом направления сигнала и нормализованным ID исполнительного механизма.
Стандартные суффиксы:
- команда пуска двигателя —
bStart; - подтверждение работы двигателя —
bState; - команда открытия и сигнал открытого положения клапана —
bOpen; - команда закрытия и сигнал закрытого положения клапана —
bClose; - отдельная команда останова двигателя —
bStop.
Примеры:
DQ_V11_bStart,DQ_V12_bStart;DI_V11_bState,DI_V12_bState;DI_YA1_k1_bClose,DQ_YA1_k1_bClose;DI_YG1_bOpen,DQ_YG1_bOpen.
Обозначения на схеме «Пуск/стоп» и «Открыть/закрыть» не переносятся в
логический тег как составные суффиксы. Для удерживаемого выхода пуска
используется bStart, для выхода открытия — bOpen. Суффиксы bStartStop,
bOpenClose и bClosed для этих стандартных сигналов не применяются.
3.3.3. Нормализация ID и KKS
В программном имени использовать латинские буквы, цифры и символ _.
Точки внутри числовой части удаляются. Структурные дефисы и пробелы
заменяются символом _. Повторяющиеся _ сводятся к одному, символы _ в
начале и конце имени удаляются.
Примеры:
V1.1→V11;YA1-k1→YA1_k1;PUC-001-173T1→PUC_001_173T1;PT-0101→PT_0101.
Исходное обозначение без нормализации сохраняется в KKS, наименовании сигнала и инженерном комментарии.
3.3.4. Маппинг
Связь Raw-тегов физических каналов с логическими тегами выполняется функцией маппинга, создаваемой в целевой среде разработки ПЛК вне канонического проекта MetaPlatform:
- Raw-теги физических входов записываются в логические входные теги;
- логические выходные теги записываются в Raw-теги физических выходов.
Raw-теги и функция маппинга являются частью итогового проекта ПЛК, но не являются исходными или генерируемыми сущностями MetaPlatform.
3.3.5. Единственная точка подключения IO
В прикладной логике каждый логический аналоговый или дискретный вход подключается к обрабатывающему компоненту один раз. Дальнейшие потребители используют выход этого компонента. Для измерения используется обработанное значение Sensor/SensFilter; для аварийного или предупредительного сигнала — выход соответствующего канала SignalsFilter.
Каждый логический выход записывается одним компонентом. Требования нескольких потребителей объединяются до формирования этого выхода.
Например, сигнал пожара поступает в один канал SignalsFilter. Все блокировки по пожару используют выход этого канала, включая предусмотренную фиксацию до сброса оператором.
3.4. Библиотечные блоки, проектные блоки и экземпляры
Библиотечные многократно используемые блоки имеют префикс C.
Примеры:
- CEngine
- CValve
- CControlValve
- CPID
- CPIDD
- CCascade
- CCascadeUnit
- CCabinetController
Проектные блоки префикс C не имеют.
Примеры:
- General
- Sens
- Heating
- Feed
- Boilers
Шаблон имени экземпляра: <ID>_<Class>_Inst
Примеры:
- Overheat_TwoStep_Inst
- PumpSwitch_Delay_Inst
Исключение:
- CabinetController_Inst — один на ПЛК, используется фиксированное имя.
3.5. Параметры функций и ФБ
Параметры функций и функциональных блоков имеют префиксы:
- in_
- out_
- inout_
Параметры inout_* используются только для управления с HMI.
Примеры:
- in_bEnable
- out_bState
- inout_bStart
- inout_iRemoteMode
3.6. Сокращения Class
В одном проекте сокращения должны использоваться однотипно.
| Class | Сокращение |
|---|---|
| SensorFilter | SensFilter |
| SignalsFilter | SgnlsFltr |
| ControlValve | CtrlValve |
| CabinetController | CabinetController |
| CascadeUnit | CascadeUnit |
3.7. Именование переменных в Conf
Шаблон: <ID>_<Class>_<ТипДанных><Parameter>
Примеры:
- Pump1_Engine_diStartDelayTime
- Pump1_Engine_diStopDelayTime
- YA5_Valve_bNO
- Boilers_Cascade_diConnectionDelay
- Outdoor_T_SensFilter_iCount
- General_Flts_SgnlsFltr_bCO_L2_Bypass
- CabinetController_diPowerControlFilter
Если параметр относится к конкретному сигналу внутри блока, имя сигнала входит в Parameter.
Примеры:
- General_Flts_SgnlsFltr_bCO_L2_Bypass
- General_Flts_SgnlsFltr_diCO_L2_Delay
- General_Wrns_SgnlsFltr_bSensorError_Bypass
3.8. Именование переменных в View
Шаблон: <ID>_<Class>_Inst_<Access>_<ТипДанных><Parameter>
Примеры:
- Pump1_Engine_Inst_out_bState
- Pump1_Engine_Inst_out_diWorktime
- Pump1_Engine_Inst_inout_bStart
- Boiler_CascadeUnit_Inst_out_fPower
- YA1_Valve_Inst_out_iMode
- YA1_Valve_Inst_inout_bOpen
Для сигналов IO имя не изменяется.
Примеры:
- View.DI_GasJet_bMode := DI_GasJet_bMode
- View.DQ_MSV_bOpen := DQ_MSV_bOpen
Для параметров ФБ во View сохраняется полное имя экземпляра и параметра.
Пример:
- View.Pump1_Engine_Inst_out_bState := Pump1_Engine_Inst.out_bState
3.9. Пользовательские комментарии
Исходный KKS сохраняется в пользовательском комментарии без нормализации.
Основной Comment является полным пользовательским названием и строится по
шаблону:
<исходный KKS> <функциональное наименование>
Примеры:
K4.1 Циркуляционный насос котла;K5.1 Подпиточный насос;YA1-k1 Трёхходовой клапан котла;Y1 Регулирующий клапан отопления;PT3 Давление в обратном трубопроводе отопления.
В функциональном наименовании не повторяются KKS и уже заданный им порядковый
номер. В основной Comment не добавляются названия шаблонов и библиотечных
классов.
MetaKit может добавлять названия отдельных внутренних функций, например
. ПИД, . Фильтр, . Элемент каскада, . Аварии и . Предупреждения.
Название основного механизма или датчика повторно не добавляется.
Примеры итоговых комментариев:
K4.1 Циркуляционный насос котла. Работа;K4.1 Циркуляционный насос котла. Элемент каскада. Работа;Y1 Регулирующий клапан отопления. ПИД. Kp;PT3 Давление в обратном трубопроводе отопления. Фильтр. Период.
Не допускаются комментарии вида K4.1 Насос K4.1,
Клапан отопления. Клапан или Давление. Датчик аналоговый.
3.10. Семантика аварийных и предупредительных сигналов
На входы аварий и предупреждений стандартных компонентов передаётся TRUE
при наличии соответствующего события.
Raw-тег сохраняет фактическое электрическое состояние входа ПЛК. Если физический аварийный или предупредительный сигнал выполнен нормально замкнутым контактом, он инвертируется в точке подключения к компоненту.
Пример:
FltIn := NOT DI_VFD_bFault
Инверсия выполняется в выражении таблицы параметров или в предусмотренной точке подключения сигнала. Логика компонента и физический Raw-тег ради этого не изменяются. Тип контакта определяется по принятой IO-таблице и рабочей документации, а не предполагается по имени сигнала.
4. Стандарт временных параметров ФБ
Если функциональному блоку требуется параметр времени, задержки, таймаута, периода, длительности импульса или другой временной настройки, такой параметр должен задаваться через тип DInt.
Сам параметр во входном интерфейсе ФБ также должен иметь тип DInt.
Time не используется как тип внешнего параметра проектных и библиотечных ФБ.
4.1. Правило именования временных параметров
Временные параметры именуются с префиксом типа данных di.
Примеры:
in_diStartDelayTimein_diStopDelayTimein_diOpenDelayTimein_diCloseDelayTimein_diTimeoutin_diPulseTimein_diPeriodTime
4.2. Источник временных параметров
Настройки времени и задержек проекта должны храниться в Conf как DInt.
Примеры:
Pump1_Engine_diStartDelayTime : DInt;
Pump1_Engine_diStopDelayTime : DInt;
YA1_Valve_diOpenDelayTime : DInt;
YA1_Valve_diCloseDelayTime : DInt;
4.3. Передача временных параметров в ФБ
Если ФБ требует временную настройку, в его параметр передаётся значение типа DInt.
Правильно:
Pump1_Engine_Inst(
in_diStartDelayTime := Conf.Pump1_Engine_diStartDelayTime,
in_diStopDelayTime := Conf.Pump1_Engine_diStopDelayTime
);
Неправильно:
Pump1_Engine_Inst(
in_tStartDelayTime := T#5s,
in_tStopDelayTime := T#3s
);
Неправильно:
Pump1_Engine_Inst(
in_tStartDelayTime := DINT_TO_TIME(Conf.Pump1_Engine_diStartDelayTime)
);
4.4. Применение _DIntToTimeSafe
_DIntToTimeSafe используется только в том месте, где значение DInt фактически передаётся в таймер или системный параметр типа Time.
То есть внешний интерфейс ФБ остаётся DInt, а преобразование в Time выполняется внутри реализации ФБ.
Правильно внутри реализации ФБ:
StartDelay_Timer_Inst(
IN := in_bStart,
PT := _DIntToTimeSafe(in_diStartDelayTime)
);
Неправильно выносить Time наружу в интерфейс ФБ:
VAR_INPUT
in_tStartDelayTime : Time;
END_VAR
Правильно:
VAR_INPUT
in_diStartDelayTime : DInt;
END_VAR
4.5. Что не допускается
Не допускается:
- создавать входные параметры ФБ типа
Timeдля проектных временных настроек; - передавать в интерфейс ФБ литералы времени вида
T#5s; - использовать
DINT_TO_TIME(...)вместо_DIntToTimeSafe(...); - выполнять преобразование времени снаружи ФБ, если сам ФБ может принимать параметр как
DInt; - хранить проектные настройки времени в типе
Time.