(CLSID=16#000x – 16#07FF)
Найнижчий рівень модулів керування (канали) забезпечує абстрагування від конкретики пристроїв (ПЛК, розподілена периферія, тощо). Тобто реалізація цього рівня залежить як від вибраної платформи так і способу реалізації. Елементи CM типу «канали» представляють масиви усіх існуючих каналів контролеру, незалежно від їх розташування (локальне шасі, віддалений ввод/вивід) і задіяння (використання) в процесі. Кожен елемент масиву ідентифікується за унікальним номером, а прив’язка до фізичного каналу відбувається жорстко на програмному рівні. CM-ми типу «канал» прив’язують свої значення до фізичного значення конкретного каналу, а також виконують наступні функції:
надають діагностичну інформаціє вищим рівням CM - як мінімум ознаку достовірності, а за можливості і причину відмови/несправності каналу;
передбачають режим форсування значення:
примусова зміна значення вхідного каналу, незалежно від значення входу;
примусова зміна значення вихідного каналу, незалежно від значення, що передається на нього змінною;
показують факт прив’язки до каналу технологічної змінної та номер змінної;
У каркасі канали представлені 5-ма базовими класами:
Додатково за необхідності можна використовувати мережні канали, якщо передбачається зміна зв’язку технологічних змінних з каналами. Мережеві канали обробляються тими ж самими функціями що і базові канали, а на вхід/вихід в якості сирого значення подається змінна отримана в результаті комунікаційного обміну. Даний підхід дає можливість в процесі роботи змінювати мережевий канал на локальний без додаткових змін в технологічній змінній та структурі програми.
Остання цифра уточнює клас. Рекомендація до використання номерів класів наведена в описі конкретного класу.
Мнемосхеми з відображенням стану каналів в каркасі звуться картою ПЛК. На карті ПЛК доступні функції відображення прив’язаного каналу, ознака достовірності, команди форсування. У випадку апаратної помилки канал підсвічується відповідним чином.
Для економії змінних рекомендується:
CH_BUF
на всі каналиДля HMI важливо реалізувати карти ПЛК, тобто стан каналів модулів (значення, використання змінною, помилки каналів), навіть якщо вони не використовуються. Крім того нерідко потрібно форсувати значення якогось виходу, або швидко дізнатися, яка змінна використовує даний канал. Найбільш простий варіант вивести на засоби HMI скорочені змінні структуру типу CH_HMI
. Однак кількість тегів, що потрібна для ПЛК великої канальності надзвичайно велика, тому проміжним варіантом є використання виведення інформації по групам каналів, наприклад по 16, або по модулям. Приклади обох варіантів показані на рис.2.5. Це якраз і реалізується за допомогою класу MODULES
рис.2.5. Приклад відображення карт ПЛК
Структура класу використовується для змінних всіх каналів. Канали з CLSID=16#00x0 призначені для каналів без специфічної діагностики, усі інші залежать від типу модуля і можуть мати свої діагностичні біти.
adr
задається як зміщення в структурі в 16-бітних словах
name | type | adr | bit | descr |
---|---|---|---|---|
ID | UINT | 0 | Унікальний ідентифікатор - номер змінної. Кількість доступних каналів є останнім номером. Нумерація логічна, логіка нумерації вибирається при розробці проекту.ID = 0 зарезервований для помилкових операцій. Реальні канали нумеруються з 1. | |
CLSID | UINT | 1 | - CHDI (CLSID=16#001x) – дискретні вхідні канали, - CHDO (CLSID=16#002x) – дискретні вихідні канали; - CHAI (CLSID=16#003x) – аналогові вхідні канали;- CHAO (CLSID=16#004x) – аналогові вихідні канали. |
|
STA | UINT | 2 | Може бути набір біт типу CH_STA |
|
VRAW | BOOL | 2 | 0 | для дискретного сигналу: - для CHDI значення з дискретного входу; - для CHDO значення на дискретний вихід; - в режимі FRC=1 може змінюватися із-зовні для CHDO ; - для CHAI: RAWINT>0 ; - для CHAO: RAWINT>0 |
VALB | BOOL | 2 | 1 | значення дискретного сигналу для CM верхнього рівня: - для CHDI об’єкт DIVAR зчитує його; - для CHDO об’єкт DOVAR записує в нього; - в режимі FRC=1 може змінюватися із-зовні для CHDI ; - для CHAI: CHCFG.VAL>0 ; - для CHAO: CHCFG.VAL>0 |
BAD | BOOL | 2 | 2 | = 1 – є якась помилка каналу (BRK , SHRT або інша) |
b3 | BOOL | 2 | 3 | резерв |
PNG | BOOL | 2 | 4 | = 1 – прийшов PING-запит від власника, обнуляється каналом (PONG-відповідь) |
ULNK | BOOL | 2 | 5 | = 1 – якщо канал використовується в технологічній змінній (прив’язаний) DIVAR/AIVAR/DOVAR/AOVAR |
MERR | BOOL | 2 | 6 | = 1 – є помилка на всьому модулі (діагностична інформація) |
BRK | BOOL | 2 | 7 | = 1 – помилка обриву каналу |
SHRT | BOOL | 2 | 8 | = 1 – помилка КЗ або перевантаження |
NBD | BOOL | 2 | 9 | = 1 – фізично канал не існує; наприклад, для відображення в буфері модуля MODULS для HMI; якщо зручно використовувати неіснуючі канали для кратності адресації |
b10 | BOOL | 2 | 10 | резерв |
INIOTBUF | BOOL | 2 | 11 | = 1 – змінна CH завантажена в буфер IoT CH_BUF |
INBUF | BOOL | 2 | 12 | = 1 – змінна CH завантажена в буфер CH_BUF |
FRC | BOOL | 2 | 13 | = 1 – значення форсоване |
SML | BOOL | 2 | 14 | = 1 – значення імітується (верхнім рівнем) |
CMDLOAD | BOOL | 2 | 15 | = 1 – запит на зчитування в буфер (тільки з HMI) |
CMD | UINT | 3 | команда: - 16#0001 - записати 1/MAX; - 16#0002 - записати 0/MIN; - 16#0003 - для дискретних змінних: TOGGLE перемикання 0<->1; - 16#0003 - для аналогових змінних: MIDLE виставлення половини з діапазону MIN/MAX; - 16#0100 - прочитати конфігурацію в буфер; - 16#0300 - перемкнути форсування; - 16#0301 - ввімкнути форсування; - 16#0302 - вимкнути форсування; |
|
VAL | INT | 4 | значення: - для CHAI значення з аналогового входу для AIVAR ;- для CHAO значення на аналоговий вихід з AOVAR ;- для CHDI = значенню STA.VAL ;- для CHDO = значенню STA.VAL |
|
VARID | UINT | 5 | ID прив’язаної технологічної змінної, 0 - якщо не прив’язана |
| name | type | adr | bit | descr |
| —- | —- | —- | —- | ——————————————————— |
| STA | INT | 0 | | STA
+CMD
(біт X15
– CMDLOAD
- завантажити в буфер) |
| VAL | INT | 1 | | значення CH_CFG.VAL
|
Тип CH_BUF
за загальною структурою має такі ж поля як CH_CFG
, але при використанні в структурі STA
бітів, поля повинні бути приведені до INT.
STA.CMDLOAD
TRUE
(тільки при форсуванні CHDI/CHDO
)FALSE
(тільки при форсуванні CHDI/CHDO
)TOOGLE
- змінити на інвертоване значення (тільки при форсуванні CHDI/CHDO
)CHCOM
).CLSID
та ID
STA.CMDLOAD=TRUE
CFG.CMD
= 16#0100;CH_BUF.STA = CH_CFG.STA
CH_CFG.CMD = CH_BUF.CMD
якщо той не дорівнює нулю (для можливості команд з іншого джерела)CH_CFG.VAL = CH_BUF.VAL
CH_BUF.VAL = CH_CFG.VAL
VARID
вказує на ідентифікатор змінної, яка прив’язана до каналуFRC
CHDI
, CHAI
: значення на технологічну змінну береться з входу функції RAW
CHDO
, CHAO
: значення на вихід функції RAW
береться з прив’язаної вихідної технологічної змінноїCHDI
, CHAI
: прив’язана вхідна технологічна змінна (AIVAR
, DIVAR
) повинна отримувати форсоване значення зі змінної CH_BUF.VAL
, при умові знаходження в буфері, у протилежному випадку, значення не змінюється з попереднього стануCHDO
, CHAO
: вихід RAW
повинен отримувати форсоване значення зі змінної CH_BUF.VAL
а не з технологічної змінної, при умові знаходження в буфері, у протилежному випадку, значення не змінюється з попереднього стануPLC_CFG.CNTFRC
повинна збільшуватися на 1CHCFG.BAD
повинен оновлюватися відповідно до стану каналу, інші біти реалізовуються за можливості та необхідностіRAW
RAWINT
RAW
RAWINT
(обов’язково з прив’язкою до реальної змінної)CHCFG
CHHMI
PLC_CFG
; альтернативно можна використовувати інші інтерфейси для використання в середині PLC_CFG
PLC_CFG.SCN1
) повинна ініціалізуватися кількість каналів,PLCFN1(PLC_CFG);
IF PLC_CFG.STA.SCN1 THEN
PLC.DICNT := 32;
PLC.DOCNT := 32;
PLC.AICNT := 10;
PLC.AOCNT := 6;
END_IF;
PLC_CFG.SCN1
, при якій
STA.NBD=TRUE
Каркас передбачає гнучку прив’язку технологічних змінних до каналів. Для зручності визначення вільних каналів на карті ПЛК, канал повинен контролювати факт прив’язки (задіяння) та знати яка саме змінна ним користується. Факт задіяння сигналізується в біті ULNK (Uplink). Цей біт переприсвоює значення біту PNG (Ping-запит) на початку функції CH_FN, після чого PNG:= FALSE (Pong-відповідь). Технологічна змінна, що використовує канал (володар) з кожним викликом VAR_FN виставляє CH_CFG.STA.PNG:=TRUE (Ping-запит) та вказує свій ID (CH_CFG.VARID:=VAR_CFG.ID). Таким чином, якщо жодна змінна не заволодіває каналом, значення PNG, а за ним і значення ULNK для цього каналу стає рівним FALSE. Алгоритм отримав робочу назву “Ping-Pong”.
Цей пункт описує методику перевірки функцій характерних для всіх CHDIFN
, CHAIFN
, CHDOFN
, CHAOFN
в ручному та/або автоматизованому режимі.
Номер | Назва | Коли перевіряти | Примітки |
---|---|---|---|
1 | присвоєння ID та CLSID при старті | після реалізації функції | |
2 | команди прив’язування до буферу | після реалізації функції | |
3 | робота в нефорсованому режимі | після реалізації функції | |
4 | робота в режимі форсування | після реалізації функції | |
5 | Ping-Pong | ||
6 | відправка широкомовних команд на форсування і дефорсування | ||
7 | перевірка режиму імітації | ||
8 | |||
Номер кроку | Дія для перевірки | Очікуваний результат | Примітки |
---|---|---|---|
1 | змінити STA.X15=1 для однієї зі змінних CH_HMI | у CHBUF повинно завантажитися весь зміст CH_CFG для CH_HMI повинен STA.X15 = 0 для CH_HMI, CH_CFG та CH_BUF повине STA.12(INBUF)=1 |
|
2 | змінити значення змінної (наприклад для DICH - вхідної RAW) | відповідне значення зміниться у CH_HMI, CH_CFG та CH_BUF | |
3 | змінити STA.X15=1 для іншої змінної CH_HMI | у CHBUF повинно завантажитися весь зміст CH_CFG іншої змінної | |
4 | повторити п.1 командою CH_CFG.CMD=16#100 | у CHBUF повинно завантажитися весь зміст CH_CFG для CH_HMI повинен STA.X15 = 0 для CH_HMI, CH_CFG та CH_BUF повине STA.12(INBUF)=1 змінна CH_CFG.CMD повинна обнулитись |
Перевірка значень повинно проходити як для CH_HMI, CH_CFG так і CH_BUF
Номер кроку | Дія для перевірки | Очікуваний результат | Примітки |
---|---|---|---|
1 | прив’язати тестову змінну до буферу | у CHBUF повинно завантажитися весь зміст CH_CFG | |
2 | змінити значення змінної (наприклад для DICH - вхідної RAW) | для CH_HMI, CH_CFG та CH_BUF повинне змінитися плинне значення змінної і значення сирої змінної (для CHDI і CHDO ) |
див деталі в тестах конкретного класу |
3 | повторити п.2 з іншим значенням |
Перевірка значень повинно проходити як для CH_HMI, CH_CFG так і CH_BUF
Номер кроку | Дія для перевірки | Очікуваний результат | Примітки |
---|---|---|---|
1 | прив’язати тестову змінну до буферу | у CHBUF повинно завантажитися весь зміст CH_CFG | |
2 | змінити значення вхідної величини на 0 | значення повинно змінитися як в тесті 3 | вхідна величина для DICH. AICH - RAW , для DOCH, AOCH - VAL |
3 | відправити команду форсування CHBUF.CMD=16#0301 | біт FRC повинен дорівнювати 1 | |
4 | змінити значення вхідної величини | значення вихідної величини повинно залишитися без змін | вхідна величина для DICH. AICH - RAW , для DOCH, AOCH - VAL |
5 | відправити команду 16#0001 (записати 1/MAX) | значення повинно змінитися на 1/MAX | |
6 | відправити команду 16#0002 (записати 0/MIN) | значення повинно змінитися на 0/MIN | |
7 | відправити команду 16#0003 (TOGGLE/виставлення половини з діапазону) | значення повинно змінитися на протилежне/записатися половина діапазону | |
8 | змінити значення CHBUF.VAL |
значення повинно змінитися на вказане | для дискретних, все що більше 0 дорвінює 1 |
9 | відправити команду дефорсування CHBUF.CMD=16#0302 | біт FRC повинен дорівнювати 0 | |
10 | відправити команду перемикання форсування 16#0300, повторити кілька разів, залишити в режимі форсування | біт FRC повинен перемкнутися на протилежне | |
11 | перевести в режим форсування кілька змінних | біт FRC відповідних змінних повинен дорівнювати 1 | |
12 | перевірити значення змінних PLC.STA_PERM і PLC.CNTFRC_PERM | повинні PLC.STA_PERM.X13=1, PLC.CNTFRC_PERM дорівнювати кількості зафорсованих змінних | |
13 | зняти з режиму форсування усі змінні | повинні PLC.STA_PERM.X13=0, PLC.CNTFRC_PERM=0 |
CHDI
TST_CHDIPNGON
TST_CHDIPNGID
CH_CFG.PNG
IF TST_CHDIPNGON THEN
CHDI[TST_CHDIPNGID].STA.PNG := true;
CHDI[TST_CHDIPNGID].VARID := TST_CHDIPNGID;
END_IF;
Номер кроку | Дія для перевірки | Очікуваний результат | Примітки |
---|---|---|---|
1 | записати якесь значення в CH_CFG.VARID |
повинно обнулитися, так як змінна не прив’язані | |
2 | задати значення TST_CHDIPNGID в межах існуючих каналів, задати TST_CHDIPNGON=TRUE |
для вказаної змінної:CH_CFG.VARID повинен дорівнювати вказаному значенню, повинен CH_CFG.ULNK=TRUE |
|
3 | змінити значення TST_CHDIPNGID в межах існуючих каналів, задати TST_CHDIPNGON=TRUE |
попередній канал повинен обнулити CH_CFG.VARID іCH_CFG.ULNK для вказаного каналу повинен бути результат як в кроці 2 |
|
4 | задати TST_CHDIPNGON=false |
попередній канал повинен обнулити CH_CFG.VARID іCH_CFG.ULNK |
Номер кроку | Дія для перевірки | Очікуваний результат | Примітки |
---|---|---|---|
1 | відправити широкомовну команду на форсування усіх змінних PLC.CMD=16#4301 | біт FRC усіх змінних повинен дорівнювати 1, PLC.CNTFRC_PERM=кількості змінних | |
2 | відправити широкомовну команду на дефорсування усіх змінних PLC.CMD=16#4302 | біт FRC усіх змінних повинен дорівнювати 0, PLC.CNTFRC_PERM=0 |