Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Гульфия вопр 13-16 Хузятов.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
237.06 Кб
Скачать

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]); // Обновляем данные

}