
- •13. Контроллер I-7188. Разработка системы сбора данных и управления в виде Web-сервера. Пример: Просмотр состояния входов и выходов в виде html-страницы.
- •1. Функция void Web_Init(void)
- •2. Функция void Web_Loop(void)
- •4. Функция GetDataFromForm (void)
- •14. Составные части и архитектура scada-системы Genesis32. Орс-технология для доступа к устройствам ввода-вывода.
- •Обзор технологии орс
- •15. Пользовательский интерфейс GraphWorX32. Создание “картинки” технологического процесса на Genesis32. Взаимодействие GraphWorX32 с тегами модулей ввода-вывода.
- •Динамизация графических объектов
- •1. Изменение положения
- •2. Вращение
- •3. Действие Скрыть/Блокировать
- •8. Аналоговый индикатор
- •10. Анимация
- •11. Параметр
- •12. Время / Data
- •13. Кнопка, Флажок, Переключатель
- •16. Назначение vba-скриптов Genesis32. Классы доступа к элементам экранной формы. Основные этапы создания vba-скрипта.
- •1. Функция ThisDisplay.GetVisibleObjectFromName(“Имя”)
- •2. Функция ThisDisplay.GetVisibleObject From Index(…)
- •3. Функция Имя_Символа.GetVisibleObjectFromIndex ( …)
- •4. Функция Имя_Символа.GetVisibleObjectFromName(“Имя”)
- •2. Функция Имя_символа.GetDynamicObjectFromIndex(1)
- •3. Функция ИмяГрафОбъекта.GetDynamicObjectFromName(“Имя”)
13. Контроллер I-7188. Разработка системы сбора данных и управления в виде Web-сервера. Пример: Просмотр состояния входов и выходов в виде html-страницы.
Фирма ICP DAS предоставляет библиотеку WebL200.lib, который позволяет создать Web-сервер для контроллера I-7188EAD. Эта библиотека содержит основных функций Web-сервера и является базовым Web-сервером.
Для определения дополнительных возможностей сервера следует дописать файл User.c и перекомпилировать проект С++.
1. Функция void Web_Init(void)
Вызывается при загрузке Web-сервера. В этой функции должны быть реализованы настройка СОМ-портов, опрос сети RS-485 и определение включенных в сеть модулей и т.д.
2. Функция void Web_Loop(void)
Вызывается в каждом цикле контроллера. В этой функции следует реализовать опрос модулей и подача управляющих сигналов на модули в зависимости от этапов выполнения технологического процесса.
3. Функция void GetDataFromWeb(unsigned char *return_string)
Является раскодировщиком специальных команд html-страницы. Работа этой функции связано с функциональностью Web-сервера. Ниже приведем работу Web-сервера:
1. Пользователь в Internet Explorer указывает IP-адрес Web-сервера и имя файла в этом сервере.
2. Web-сервер получает этот запрос, находит файл html-страницы и начинает пересылать этот файл обратно в Internet Explorer.
3. В html-странице можно написать команды следующего формата:
~Name0=Str0&Name1 = Str1&. . . Name9 = Str9~
Как видно, строка команды заключена в скобки ~. . . ~, в этой команде может быть до 10-ти команд, разделенные через символ ”&”. Каждая команда имеет имя и его значение.
Встретив, такую команду Web-сервер считывает команды и сохраняет их в специальных массивах:
- имя команды записывается в массив Argu_Name
- значение команды записывается в массив Argu_Str.
4. После этого Web-сервер передает управление на функцию GetDataFromWeb. Эта функция должна раскодировать каждую команду и должна возвращать строку ответа. Таким образом, в html- странице можно отображать состояние входов и выходов в виде текста или рисунка. Например, в виде строки: Лампочка1 включена.
4. Функция GetDataFromForm (void)
Позволяет подавать команду на Web-сервер со стороны браузера.
Как известно, когда мы нажимаем на кнопку Submit html-формы, то параметры формы записываются как параметры URL-адреса и передаются на Web-сервер. Параметры, к-ые передаются с URL и его значения сохраняются в массивах Argu_Name и Argu_Str. После этого управление передается на функцию GetDataFromForm. Эта функция должна анализировать параметры и в зависимости от команды должна выполнить некоторые действия, например, включить дискретный выход, считывать состояние входов и т.д.
Заметим, что во всех трех случаях при вызове html-страниц должен использовать метод /cgi-bin/cgi_get. При простом вызове этих страниц вызов этих двух функций не происходит. Поэтому для вызова страниц следует использовать файл index.html, в котором и определены вызовы других сайтов соответствующем образом.
Пример. Опрос состояния входов и выходов модуля I-7060D
страница show.htm. Здесь показывается состояние входов и выходов модуля I-7060D в виде таблицы:
Как видно, если дискретный вход включен, то лампочка горит, если дискретный вход отключен, то лампочка не горит. Для управления состоянием выходов имеется две кнопки: для включения и отключения. Ниже приведен html-код этого страницы:
<body bgcolor="#FF99FF">
<p align="center"> <font size="5" color="#FF0000" face="Arial">
Входа и выходы модуля I-7060D </font> </p>
<center>
<table border="1" width="350" height="90"> <font face="Arial">
<tr align="center" height="16">
<td width="90" colspan="2" > DI0 </td>
<td width="90" colspan="2" > DI1 </td>
<td width="90" colspan="2" > DI2 </td>
<td width="90" colspan="2" > DI3 </td>
</tr>
<tr>
<td width="90" colspan="2" > ~Light=0~ </td>
<td width="90" colspan="2" > ~Light=1~ </td>
<td width="90" colspan="2" > ~Light=2~ </td>
<td width="90" colspan="2" > ~Light=3~ </td>
</tr>
<tr align="center" height="16">
<td width="90" colspan="2" > RL0 </td>
<td width="90" colspan="2" > RL1 </td>
<td width="90" colspan="2" > RL2 </td>
<td width="90" colspan="2" > RL3 </td>
</tr>
<!-------------- Реле_0 ON --------------------------->
<tr align="center" height="16">
<td>
<form method="Get" action="/cgi-bin/cgi_get">
<input type="hidden" name="Page" value="show.htm">
<input type="hidden" name="State" value="RL0_ON">
<input type="submit" value="ON ">
</form>
</td>
<!--------------- Реле_0 OFF ------------------------------->
<td>
<form method="Get" action="/cgi-bin/cgi_get">
<input type="hidden" name="Page" value="show.htm">
<input type="hidden" name="State" value="RL0_OFF">
<input type="submit" value="OFF"> </font>
</form>
</td>
<!---------------- Реле_1 ON ------------------------------->
<td>
<form method="Get" action="/cgi-bin/cgi_get">
<input type="hidden" name="Page" value="show.htm">
<input type="hidden" name="State" value="RL1_ON">
<input type="submit" value="ON"> </font>
</form>
</td>
<!----------------- Реле_1 OFF --------------------------->
<td>
<form method="Get" action="/cgi-bin/cgi_get">
<input type="hidden" name="Page" value="show.htm">
<input type="hidden" name="State" value="RL1_OFF">
<input type="submit" value="OFF"> </font>
</form>
</td>
<!------------------ Реле_2 ON -------------------------->
<td>
<form method="Get" action="/cgi-bin/cgi_get">
<input type="hidden" name="Page" value="show.htm">
<input type="hidden" name="State" value="RL2_ON">
<input type="submit" value="ON"> </font>
</form>
</td>
<!------------------- Реле_2 OFF -------------------------->
<td>
<form method="Get" action="/cgi-bin/cgi_get">
<input type="hidden" name="Page" value="show.htm">
<input type="hidden" name="State" value="RL2_OFF">
<input type="submit" value="OFF"> </font>
</form>
</td>
<!------------------- Реле_3 ON --------------------------->
<td>
<form method="Get" action="/cgi-bin/cgi_get">
<input type="hidden" name="Page" value="show.htm">
<input type="hidden" name="State" value="RL3_ON">
<input type="submit" value="ON"> </font>
</form>
</td>
<!------------------- Реле_3 OFF -------------------------->
<td>
<form method="Get" action="/cgi-bin/cgi_get">
<input type="hidden" name="Page" value="show.htm">
<input type="hidden" name="State" value="RL3_OFF">
<input type="submit" value="OFF"> </font>
</form>
</td>
<!------------------------------------------------------------>
</table>
<p align="center">
<a href="/index.htm"> На главную страничку </a></font></p>
</body>
Теперь рассмотрим содержимого исходного кода Web-сервера. Код страницы Show.htm содержит параметры заключенных в скобки ~Light=0~ .. ~Light=3~. Для раскодировки этих параметров Web-сервер должен содержать функцию GetDataFromWeb(). В коде этой функции эти параметры должны быть заменены с рисунками лампочек (включенной или не включенной).
Команды включения/отключения на дискретные выходы подается через кнопки формы. Каждая кнопка оформлена в виде отдельной формы, который размещается на ячейке таблицы. Параметры формы оформлены в виде скрытых полей. Первый параметр определяет ссылку на сайт Show.htm, а второй параметр определяет название реле в виде, например, RL2_ON – включение второго выхода. Эти параметры должны быть анализированы с помощью функции GetDataFromForm().
Ниже приведем исходного кода Web-сервера:
void Web_Init(void){InstallCom2(9600L,8,0);}
void GetDataFromWeb(unsigned char *return_string){
int i,DI;
char cStr[10]; //Данные считанные из I-7060D
char buffer[3];
SendCmdTo7000(2,"@02",0); // Команда чтения из адреса 02
WaitTransmitOver2(); // Ответ: >0F09 - 0F -выход; 09 - вход
ReceiveResponseFrom7000(2,cStr,500,0);
buffer[0]=cStr[3]; // Состояние входов
buffer[1]=cStr[4];
buffer[2]=0;
DI=(buffer[0]-48)*16; //Преобраз. входов на десятичное число
if (buffer[1] > '9')
DI=DI+(buffer[1]-55);
else
DI=DI+(buffer[1]-48); // DI = состояние входов
for (i=0; i<7; i++){
Save_Digital_Value[i] = (DI & 0x01) ? 1:0;
DI >>= 1;}
if (Save_Digital_Value[atoi(Argu_Str[0])])
//atoi – преобразует строку на число
strcpy(return_string,"<img src=ledon.gif>");
else
strcpy(return_string,"<img src=ledoff.gif>");
}
void GetDataFromForm(void){
char cStr[20]; //Данные считанные из модуля I-7060D
int val=0; //Сохранение состояния выходов (число)
char buffer[3];
SendCmdTo7000(2,"@02",0); //Чтение по адресу 02
WaitTransmitOver2(); // Ответ: >0F09 - 0F -выход; 09 - вход
ReceiveResponseFrom7000(2,cStr,500,0);
buffer[0]=cStr[1]; // Выделяем выходов
buffer[1]=cStr[2];
buffer[2]=0;
if (buffer[1] > '9') //Преобразуем строку на число
val = buffer[1]-55;
else
val = buffer[1]-48;
//============ RELAY 0 ====================================
if (strcmp(Argu_Str[1],"RL0_ON")==0)
if ((val & 0x01)==0) //Выключить реле 0
val=val+1; //Включиь реле 1
if (strcmp(Argu_Str[1],"RL0_OFF")==0)
if ((val & 0x01) > 0) //Включить реле 0
val=val-1; // Выключить реле 0
//============ RELAY 1 ================================
if (strcmp(Argu_Str[1],"RL1_ON")==0)
if ((val & 0x02)==0)
val=val+2;
if (strcmp(Argu_Str[1],"RL1_OFF")==0)
if ((val & 0x02) > 0)
val=val-2;
//============ RELAY 2 ====================================
if (strcmp(Argu_Str[1],"RL2_ON")==0)
if ((val & 0x04)==0)
val=val+4;
if (strcmp(Argu_Str[1],"RL2_OFF")==0)
if ((val & 0x04) > 0)
val=val-4;
//============ RELAY 3 ===========================
if (strcmp(Argu_Str[1],"RL3_ON")==0)
if ((val & 0x08)==0)
val=val+8;
if (strcmp(Argu_Str[1],"RL3_OFF")==0)
if ((val & 0x08) > 0)
val=val-8;
//Формируем команду записи на выхода в формате: @AA(Data)
sprintf(cStr,"@02%X", val);
SendCmdTo7000(2, cStr, 0);
WaitTransmitOver2();
ReceiveResponseFrom7000(2,cStr,1000,0);
PRINT_PAGE(Argu_Str[0]); // Обновляем данные
}