Малюнок 2.1 - Вид таблиці символів в Simbol Editor
Наведемо текст програми на мові STL
ORGANIZATION_BLOCK OB 1
OB1_EV_CLASS. BYTE; // Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
OB1_SCAN_1. BYTE; // 1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
OB1_PRIORITY. BYTE; // 1 (Priority of 1 is lowest)
OB1_OB_NUMBR. BYTE; // 1 (Organization block 1, OB1)
OB1_RESERVED_1. BYTE; // Reserved for system
OB1_RESERVED_2. BYTE; // Reserved for system
OB1_PREV_CYCLE. INT; // Cycle time of previous OB1 scan (milliseconds)
OB1_MIN_CYCLE. INT; // Minimum cycle time of OB1 (milliseconds)
OB1_MAX_CYCLE. INT; // Maximum cycle time of OB1 (milliseconds)
OB1_DATE_TIME. DATE_AND_TIME; // Date and time OB1 started
TITLE = INITIALIZE, PHASE 1
Організаційний блок OB100 встановлює початкові значення тимчасових інтервалів, він виконується тільки один раз при перекладі контролера в режим Run. Наведена програма може виконувати функції управління світлофором для встановлених значень часу фаз. Для зміни часу кожної фази і візуалізації роботи світлофора нами був створений проект в WinCC. Як було сказано вище, наш проект включає в себе кілька завдань, тому після запуску з'являється основне вікно програми, представлене на малюнку 2.2.
Малюнок 2.2 - Стартове вікно програми
Після натискання на кнопку Start програма перемикається на вікно в якому можна вибрати з яким контролером працювати і яке завдання вирішувати. Вибравши в вікні вибору ліву нижню кнопку "Traffic Light Control" ми потрапляємо у вікно, де здійснюється візуалізація і управління світлофором, вид вікна представлений на малюнку 2.4. Ми можемо змінювати значення тимчасових інтервалів або за допомогою кнопок вгору / вниз або в поле введення / виводу (див. Рис. 2.5). Запит від пішоходів можна задавати або з WinCC за допомогою кнопки, або перемикачем підключеним до входу I 0.0 мікроконтролера.
Малюнок 2.3 - Вікно вибору розв'язуваної задачі
Малюнок 2.4 - Вікно управління світлофором
Малюнок 2.5 - Установка часу фаз роботи світлофора
Для візуалізації роботи світлофора використовувалися одинадцять технологічних змінних, наведених у таблиці 2.3. Для візуалізації з геометричних примітивів (коло, квадрат) був створений об'єкт з обумовленими користувачем полями. В якості нових полів було додано одне поле COLOURS. У це поле були додані властивості кіл Background Color (3 властивості, по одному на кожен світло). Світлофор для пішоходів був створений на основі світлофора для машин видаленням з об'єкта одного кола для жовтого світла. До властивостей Background Color допомогою Dynamic Dialog була додана динаміка (див. Рис. 2.6)
Таблиця 2.3 Змінні використовувані для візуалізації світлофора
SetTagByte ( "segvalue", value); // Return - Type: BOOL
if (formask) SetPropDouble (lpszPictureName, "Customized object1", property [i], green);
else SetPropDouble (lpszPictureName, "Customized object1", property [i], gray);
Програма для мікроконтролера, написана на мові STL, в даному випадку займається просто пересиланням байт з внутрішньої області пам'яті на цифрові виходи. Наведемо текст програми
ORGANIZATION_BLOCK OB 1
OB1_EV_CLASS. BYTE; // Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
OB1_SCAN_1. BYTE; // 1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
OB1_PRIORITY. BYTE; // 1 (Priority of 1 is lowest)
OB1_OB_NUMBR. BYTE; // 1 (Organization block 1, OB1)
OB1_RESERVED_1. BYTE; // Reserved for system
OB1_RESERVED_2. BYTE; // Reserved for system
OB1_PREV_CYCLE. INT; // Cycle time of previous OB1 scan (milliseconds)
OB1_MIN_CYCLE. INT; // Minimum cycle time of OB1 (milliseconds)
OB1_MAX_CYCLE. INT; // Maximum cycle time of OB1 (milliseconds)
OB1_DATE_TIME. DATE_AND_TIME; // Date and time OB1 started
2.3 Контроль заповнення цистерни
Стенд, що моделює цистерну, включає в себе:
саму цистерну;
аналогове управління заслінкою подачі рідини (плавне управління
0-10);
цифрове управління заслінкою подачі рідини (відкрита / закрита);
датчик рівня заповнення цистерни (вихідний сигнал 0-10, що відповідає 0-100%);
два цифрових керуючих входу на відкриття зливних заслінок;
датчик швидкості витікання рідини з цистерни (0-10, що відповідає
0-100%).
Вікно програми управління цистерною виглядає так, як представлено на малюнку 2.10. Верхня частина вікна є керуючу частину, нижня частина - візуалізація стану справ в цистерні. Принцип роботи в наступному: у верхній частині вікна ми задаємо напругу яким відкривається заслінка подачі рідини, причому завдання можна проводити як за допомогою slider-а, так і за допомогою цифрового введення в I / O Field.
Малюнок 2.10 Вікно програми управління рівнем
На зміну якості Process Driver Connection об'єкта Slider призначена наступна З-акція
void OnPropertyChanged (char * lpszPictureName, char * lpszObjectName, char * lpszPropertyName, long value)
SetTagWord ( "Analogvalve", neuval); // Return-Type: BOOL
SetPropDouble (lpszPictureName, "I / O Field3", "OutputValue", value / 10.0); // Return-Type: BOOL
Значенням +10 відповідає значення 27520, але так як Slider маніпулює відсотками, то ділячи на 10 отримуємо 275,2. У цьому випадку крок з яким можна змінювати значення напруги становить 0,1. Тому у другому рядку коду нове значення множиться на 275,2 з урахуванням масштабування та подання чисел в ЦАП мікроконтролера.
Для точного відображення подається на заслінку напруги, а також для здійснення можливості точного ручного введення передбачений I / O Field. Для пов'язання вводятьсязначень в I / O Field c елементному slider і навпаки для I / O Field написана З-акція на зміну якості Input Value. Наведемо текст С-акції
void OnPropertyChanged (char * lpszPictureName, char * lpszObjectName, char * lpszPropertyName, char * value)
val = GetTagDouble ( "temp1"); // Return-Type: double
SetPropWord (lpszPictureName, "Slider Object1", "Process", outval); // Return-Type: BOOL
Дана С-акція зчитує таг пов'язаний з I / O Field, примножує це значення на 10, так як об'єкт slider маніпулює відсотками, і записує отримане значення в властивість Process об'єкта slider. Таким чином після заповнення I / O Field і натискання на кнопку Enter напруга на виході ЦАП встановлюється відповідним чином змінити значення і бігунок slider-а також позиціонується відповідним чином.
Для управління цифровими входами відкриття / закриття заслінки подачі рідини і відкриттям / закриттям зливних заслінок передбачені 3 кнопки. За натиснень на ці кнопки викликаються наступні C-акції.
void OnLButtonDown (char * lpszPictureName, char * lpszObjectName, char * lpszPropertyName, UINT nFlags, int x, int y)
short int valves, mask;
mask = 1; // 1-st bit represent digital input valve
valves = GetTagByte ( "controlvalves"); // Return-Type: BYTE
SetPropChar (lpszPictureName, "Static Text8", "Text", "Close"); // Return-Type: BOOL
SetPropChar (lpszPictureName, "Static Text8", "Text", "Open"); // Return-Type: BOOL
SetTagByte ( "controlvalves", valves); // Return-Type: BOOL
void OnLButtonDown (char * lpszPictureName, char * lpszObjectName, char * lpszPropertyName, UINT nFlags, int x, int y)
short int valves, mask;
mask = 2; // 1-st bit represent digital input valve
valves = GetTagByte ( "controlvalves"); // Return-Type: BYTE
SetPropChar (lpszPictureName, "Static Text8", "Text", "Close"); // Return-Type: BOOL
SetPropChar (lpszPictureName, "Static Text8", "Text", "Open"); // Return-Type: BOOL
SetTagByte ( "controlvalves", valves); // Return-Type: BOOL
void OnLButtonDown (char * lpszPictureName, char * lpszObjectName, char * lpszPropertyName, UINT nFlags, int x, int y)
short int valves, mask;
mask = 4; // 3 bit represent digital input valve
valves = GetTagByte ( "controlvalves"); // Return-Type: BYTE
SetPropChar (lpszPictureName, "Static Text8", "Text", "Close"); // Return-Type: BOOL
SetPropChar (lpszPictureName, "Static Text8", "Text", "Open"); // Return-Type: BOOL
SetTagByte ( "controlvalves", valves); // Return-Type: BOOL
Три наведені акції працюють таким чином. У проекті створено технологічний таг controlvalves, який пов'язаний з байтом пам'яті мікроконтролера 18 (MB 18). Для управління відкриттям / закриттям заслінок використовуються перші три біта цього байта, 0-й біт - відкрити / закрити заслінку подачі рідини, 1-й біт - відкрити закрити першу зливну заслінку, 2-й біт - відкрити / закрити другу зливну заслінку. З-акція при натисканні на кнопку зчитує поточне значення тега controlvalves, потім маскує отримане значення, зрушує до 0-й позиції і перевіряє 1 або 0.
Якщо 1, значить заслінка до даного моменту була відкрита і її необхідно закрити, за допомогою операції (Логічне множення) необхідний біт виставляється в нуль.
Якщо 0, значить заслінка в до даного моменту була закрита і її необхідно відкрити, за допомогою операції | (Логічне додавання) необхідний біт виставляється в одиницю.
Для контролю рівня заповнення цистерни і відкриття зливних заслінок в разі заповнення до необхідного рівня застосована глобальна С-акція. Глобальна С-акція відрізняється від локальної тим, що вона не прив'язана до
будь-якого об'єкта на формі, глобальна акція прив'язується тільки до зміни будь-якого тега (або просто до одного зі стандартних циклів) і виконується при зміні цього тега. Наведемо текст С-акції керуючої відкриттям / закриттям зливних заслінок.
int gscAction (void)
short int preflevel, curlevper, contr;
currentlevel = GetTagSWord ( "fill_level"); // in raw format, i.e. 10V = 27520
preflevel = GetTagByte ( "preffilllevel"); // in per cents
curlevper = (currentlevel / 27520) * 100; // current level in per cents