Візуалізації технологічних процесів


Малюнок 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 Контроль заповнення цистерни


Стенд, що моделює цистерну, включає в себе:

  1. саму цистерну;

  2. аналогове управління заслінкою подачі рідини (плавне управління

0-10);

  1. цифрове управління заслінкою подачі рідини (відкрита / закрита);

  2. датчик рівня заповнення цистерни (вихідний сигнал 0-10, що відповідає 0-100%);

  3. два цифрових керуючих входу на відкриття зливних заслінок;

  4. датчик швидкості витікання рідини з цистерни (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

Схожі статті