Розділ 4. Опис програмної реалізації
4.1. Опис програми контролера C200HG
Відповідно до концепції розподілених SCADA систем, програма на рівні контролера повинна забезпечити максимально можливу автономність роботи пристрою. Для цього програму розіб’ємо на функціонально завершені блоки.
4.1.1. Блокова структура програми
В таблиці 4.1 подано структуру блоків програми контролера.
Структура блоків програми контролера
Таблиця 4.1
Як видно з таблиці структура блоків програми побудована на принципах об’єктно-орієнтованих програмування. Наприклад, блок LAUNDRY PROGRAM викликає функціональні блоки WATER_IN, SWATER_IN, WARM TO, LAUNDRY_ROT, CENTRIFUGY, COMMANDS та інші, котрі в свою чергу можуть звертатись до інших блоків. Загальна блок-схема роботи програми представлена на рис. 4.1.
EMBED Visio.Drawing.11
Рис. 4.1. Загальна блок-схема роботи програми контролера
Отже, після включення контролера блок SetCommPC_PLC встановлює параметри зв’язку з ПК і через логічну змінну ALWAYS_1 передає готовність до роботи іншим блокам. Розглянемо структуру блоків задіяних в одній з основних типових функцій програми – виконання циклу прання LAUNDRY PROGRAM (рис.4.2).
EMBED Visio.Drawing.11
Рис. 4.2. Блок-схема роботи програми LAUNDRY PROGRAM
4.1.2. Список змінних програми
Змінні в програмі поділяються на фізичні змінні – теги та логічні змінні. Фізичні змінні є вхідні та вихідні, бітові та аналогові. Приклад застосованих у програмі фізичних змінних та прив’язка їх до пристроїв вводу-виводу подано в таблиці 4.2.
Таблиця фізичних змінних
Таблиця 4.2
Приклад застосованих у програмі фізичних змінних та прив’язка їх до пристроїв вводу-виводу подано в таблиці 4.3.
Таблиця прикладу логічних змінних програми
Таблиця 4.3
Список всіх змінних вхідних та вихідних пристроїв, точок входів-виходів та логічних змінних, які застосовуються в програмі подано в додатку А.
4.1.3. Інструментарій розробки програми на мові LD
Для створення релейно-контактної схеми контролера, завантаження, від лагодження, використано інструментарій розробки SYSWIN version 3.4 OMRON Europe B.V., графічна форма якого представлена на рис. 4.3. Код програми приведений в додатку B.
Рис. 4.3. Графічна форма TOOLS SYSWIN 3.4 для розробки програми на мові LD
4.2. Опис програми WASHER.EXE
4.2.1. Характеристика функціональності програми
За допомогою програми Washer користувач може виконувати наступні дії:
1. Створення, видалення та модифікацію інформації про пральні машини. Кожна пральна машина характеризується іменем, текстом коментарю та циклами роботи.
2. Створення, видалення та модифікація циклів роботи пральної машини. Існують два різновиди циклів роботи машини: цикл прання та цикл миття машини. Цикл прання має такі характеристики: кількість води, кількості добавок, тривалість прання, температура прання, кількість обертів, тривалість паузи, тривалість роботи центрифуги. Цикл миття машини має параметри: кількість води для промивання машини та тривалість цієї процедури.
3. Зміна мови, використовуваної у програмі.
4. Відправлення команди на виконання.
5. Ознайомлення з причинами помилки, якщо вони стануться з якихось причин.
При запуску програми Washer.exe відкривається її головне вікно, показане на рис. 4.4.
EMBED PBrush
Рис. 4.4. Вигляд головного вікна програми Washer.exe
Для створення нової пральної машини слід виконати пункт “Нова пралька” меню “Програма”. Появиться діалог “Властивості пральки”, показаний на рис. 4.5а. У цьому діалозі слід задати ім’я пральної машини та коментар до неї. Якщо натиснути кнопку “Настройка”, появиться діалог для настройки зв’язку з машиною (рис. 4.5.b). Якщо не викликати цей діалог, то спрацюють настройки, задані за замовчанням.
EMBED PBrush
Рис. 4.5. Вигляд діалогу настройки властивостей пральної машини
Інформацію про активну пральну машину можна редагувати. Для цього слід натиснути піктограму “Settings”. Буде викликаний вже розглянутий діалог “Властивості пральки”.
EMBED PBrush
Для активної пральної машини користувач створює програму прання. Програма прання складається із циклів. Для створення програми слід натиснути кнопку “Нова” у вікні списку циклів пральної машини. Появиться діалог “Тип програми”, вигляд якого показаний на рис. 4.6.
Рис. 4.6. Діалог для вибору типу програми
У діалозі присутні дві закладки. Закладка “Нові” дозволяє вибрати тип нової програми: програма прання чи програма миття машини. Якщо вибрати прання, то появиться діалогове вікно “Програма прання” введення змінних параметрів першого циклу прання, показане на рис. 4.7.
EMBED PBrush
Рис. 4.7. Діалог настройки характеристик циклу прання
EMBED PBrush
Якщо ж вибрати програми миття машини, то відкриється діалогове вікно “Програма миття пральки” (рис. 4.8).
Рис. 4.8. Діалог настройки характеристик програми миття машини
Створену програму чи цикл пізніше можна змінити. Для цього слід виділити потрібну програму чи цикл та натиснути кнопку “Змінити”. Для видалення програми (або циклу), слід виділити її та натиснути кнопку “Знищити”. Натискання кнопки “Зберегти” призводить до появи діалогу “Зберегти програму”, вигляд якого зображений на рис. 4.9.
EMBED PBrush
Рис. 4.9. Діалог збереження програми
У діалозі збереження програми слід вказати ім’я програми та обрати піктограму для неї (поки ці необхідні дані не будуть задані, кнопка “ОК” є неактивною).
При натисненні кнопки “Ручне управління” замість списку програм та циклів користувач побачить набір інструментів для відправлення команди (рис. 4.10).
EMBED PBrush
Рис. 4.10. Частина вікна для відправлення команди
У текстовому полі користувач вводить команду і натискає кнопку “Send”. В багаторядковому текстовому полі записується результат відправлення команди.
Якщо трапляється помилка (наприклад, немає зв’язку з контролером), то дізнатися детальну інформацію про неї можна, натиснувши піктограму із зображенням знаку оклику. При цьому на місці списку програм (циклів) прання відобразиться багаторядкове текстове поле з описом причини помилки.
За допомогою меню Мова користувач обирає найзручнішу для нього мову з набору запропонованих мов. При виборі мови вікно програми “перерисовується” – тексти у програмі підлягають перекладу.
4.3. Проектування бази даних
EMBED PBrush
База даних містить три таблиці (рис. 4.11). Таблиці сплановані з урахуванням рекомендацій щодо проектування даних. Кожна таблиця описує один предмет, при цьому зберігає всі необхідні дані про нього.
Рис. 4.11. Таблиці бази даних та зв’язки між ними
Таблиця Lavaggi призначена для зберігання інформації про пральні машини. Поля nome_lavaggio та nota мають тип Text. Поле nome_lavaggio містить імена пральних машин, а поле nota – тексти коментарів. Поле id_lavaggio містить унікальні ідентифікатори кожної пральної машини. Поле id_lavaggio має тип AutoNumber.
Таблиця Cicli зберігає всю необхідну інформацію про цикли (кожен запис таблиці повністю описує один цикл). Поля acqua , sapone1, sapone2, sapone3, sapone4, sapone5, temperatura, tempo_lavaggio, tempo_pausa, tempo_rotazione і tempo_centrifuga описують власне характеристики прання, а саме: кількість води, кількості кожного з шести видів миючих засобів, температуру прання, тривалість прання, тривалість паузи, кількість обертів на хвилину та тривалість роботи центрифуги. Для всіх цих полів встановлено тип Number, а властивість FieldSize рівна Integer, оскільки саме 2 байти є мінімальним розміром пам’яті, достатнім для представлення характеристик прання. Поле nome_ciclo (типу Text) містить імена циклів. Поле id_ciclo (первинний ключ) має тип AutoNumber. Це поле містить унікальні ідентифікатори всіх циклів. Поле id_lavaggio містить унікальні ідентифікатори пральних машин. З метою збереження цілісності даних створено зв’язок між таблицями Lavaggi та Cicli: поле id_lavaggio таблиці Cicli (зовнішній ключ) посилається на поле id_lavaggio таблиці Lavaggi (батьківський ключ).
Таблиця Settings служить для збереження настройок зв’язку з пристроєм.
4.3.1. Клас для роботи з базою даних
EMBED Visio.Drawing.6
Типовим підходом при організації взаємодії між програмою та базою даних є відокремлення коду, що відповідає за встановлення та завершення з’єднання з базою даних, від коду, в якому формується запит до бази даних. У даному програмному продукті весь “допоміжний” програмний код для взаємодії з базою даних прихований у методах окремого класу Class1. На рис. 4.12. представлена схема названого класу.
Рис. 4.12. Схема класу для роботи з базою даних
Метод getConnection використовується для встановлення з’єднання з базою даних. Даний метод не приймає параметрів (повне ім’я бази “жорстко задане” в коді методу). Метод getConnection повертає змінну, що зберігає встановлене з’єднання. Метод releaseConnection призначений для закриття з’єднання з базою даних, він приймає один параметр – змінну, яка зберігає встановлене з’єднання. Метод executeQuery приймає два параметри - змінну, що зберігає з’єднання з базою даних та текстовий рядок, який містить SQL-запит. Метод executeQuery повертає результат виконання SQL-запиту у вигляді об’єкта ADODB.Recordset. Реалізація методу executeQuery є наступна:
Повний код класу Class1 наведений у додатку С. Отже, щоб виконати SQL-запит, слід тільки передати його текст в якості параметра методу executeQuery, не вдаючись у подробиці роботи з об’єктом ADODB.Command.
Приклад використання класу Class1:
Складання SQL-запитів для реалізації базової функціональності програми Washer.exe.
Як вже говорилося, вся інформація про пральні машини та цикли зберігається у таблицях бази даних, а створення, видалення та модифікація цих даних здійснюється SQL-запитами, сформованими у тілі програми.
Нижче подано фрагменти Visual Basic-коду, який формує необхідні SQL-запити.
При запуску програми користувач одразу бачить список доступних пральних машин. При запуску програми спрацьовує функція, у коді якої присутній запит:
Даним запитом вибираються імена усіх пральних машин, посортовані в алфавітному порядку.
Серед списку пральних машин одна машина є активною – для неї відображаються всі її існуючі цикли прання. Дані про цикли прання для активної пральної машини видобуваються наступним запитом у тілі функції caricaLavaggio(nome_lavaggion As String):
Цей запит вибирає повну інформацію про пральну машину та всі її цикли за іменем пральної машини.
При створенні нової пральної машини (функцією inserisciLavaggio) виконується SQL-запит:
Оскільки поле id_lavaggio таблиці Lavaggi має тип AutoNumber, то в це поле забороняється вставляти будь-які значення – воно заповнюється автоматично. Одразу ж після створення в таблиці Lavaggi запису про нову пральну машину, слід дізнатися згенерований унікальний ідентифікатор цієї машини за допомогою наступного запиту:
Такий запит працюватиме коректно тільки за умови, що імена пральних машин унікальні. Знаючи значення поля id_lavaggio для новоствореної пральної машини, заповнюємо таблицю Cicli даними про всі її цикли прання.
Даний запит виконується в циклі, де характеристики прання щоразу міняються.
Зміна інформації про пральну машину виконується за допомогою чотирьох запитів:
1. Запит:
служить для того, щоб дізнатися унікальний ідентифікатор пральної машини (значення поля id_lavaggio) за її старим іменем.
2. Запит
поновлює ім’я пральної машини та коментар до неї за унікальним ідентифікатором пральної машини. На відміну від імені та тексту коментарю, унікальний ідентифікатор пральної машини завжди лишається сталим від моменту його створення.
Запит
виконує видалення всіх циклів даної пральної машини з таблиці циклів.
Вже розглянутий раніше запит вставляє нові записи в таблицю Cicli для пральної машини із заданим значенням id_lavaggio.
Як бачимо, модифікуються одразу всі дані про пральну машину, навіть якщо деякі з них не мінялися. Ефективніше виконати послідовно названі чотири запити, ніж перевіряти, чи був змінений той чи інший вид інформації.
Видалення даних про пральну машину виконується трьома запитами:
З таблиці Lavaggi вибирається значення id_lavaggio для пральної машини із заданим іменем.
З таблиці Cicli видаляються усі цикли, які належать пральній машині із заданим значенням id_lavaggio.
Запитом
з таблиці Lavaggi видаляється запис про пральну машину. Порядок видалення даних (спочатку знищуються дані у таблиці Cicli і лише тоді – у таблиці Lavaggi) продиктований тим, що поле id_lavaggio таблиці Cicli посилається на поле id_lavaggio таблиці Lavaggi. Зворотний порядок привів би до помилки через порушення обмеження цілісності.