Просмотр полной версии : ПЛК 110-30-М. Запрос HTTP. Библиотека SysLibSockets.lib.
Андрей Шатохин
08.11.2014, 19:51
Коллеги, нужен совет.
В общем случае вопрос звучит так:
- Какой механизм использовать для того чтоб реализовать отправку HTTP-GET запроса с ПЛК в Интернет?
Чуть ниже поясню с чем столкнулся, может тут поможете.
Связь через роутер+GSM-модем.
ПЛК110-60 в боевом варианте (тещу на ПЛК100-24)
Поиск по owen.ru ничего путного не показал.
Гугление показало библиотеку oscat network версии 1.21 с жуткой документацией.
Попытка её использовать (казалось бы на тревиальной задаче - отправка DNS запроса) не увенчалась успехом.
Привожу ниже пример программы.
172.1.2.201 это у меня роутер, на нём ДНС.
Ошибку имею 65280 - по таблицам это что-то вроде таймаута.
Что-то тут явно "мимо кассы", но примеры использования этого ФБ, которые мне удалось встретить, принципиально от моей программы не отличаются.
<code>
PROGRAM PLC_PRG
VAR
ip_con:IP_CONTROL;
s_buf:NETWORK_BUFFER;
r_buf:NETWORK_BUFFER;
dns_req: DNS_CLIENT;
dns_activate:BOOL:=FALSE;
ip4_dns: DWORD;
ip_c:IP_C;
END_VAR
IP_CON (
IP_C := IP_C,
S_BUF := S_BUF,
R_BUF := R_BUF,
TIME_OUT := T#15s,
);
DNS_REQ (
activate := dns_activate,
IP_C := IP_C,
S_BUF := S_BUF,
R_BUF := R_BUF,
ip4_dns := IP4_DECODE('172.1.2.201'),
DOMAIN := 'ya.ru'
);
RETURN;
</code>
Андрей Шатохин
14.11.2014, 21:49
Че-то так у меня и не срослось с oscat_network сделал через SysLibSockets.
Прикрепляю проект - может кому-нить пригодится.
Функциональность - простой HTTP клиент GET/POST запросы. CoDeSys 2.3
Avtomatic
15.01.2015, 14:04
Здравствуйте, Андрей.
Я решаю подобную задачу отправке HTTP-GET запроса с ПЛК в Интернет.
Наткнулся на Ваш пример. Только вот в Вашем примере в конфигурации ПЛК отсутствует соединение TCP. Подскажите, пожалуйста, по какому каналу этот запрос передается???
Спасибо.
Avtomatic
20.01.2015, 11:44
Пытаюсь запустить в ethernet HTTP запрос, используя библиотеку SysLibSockets.lib. Бьюсь над этой задачей уже несколько дней. Работаю по TCP. Порядок действий следующий:
1. Создаю соккет. Он создается.
2. Пытаюсь вызвать коннект... Возвращает FALSE;
При этом, кабель ethernet соединяет ОВЕН ПЛК 110-30-М и роутер.
IP роутера 192.168.1.1
IP контроллера 192.168.1.101
Маска подсети контроллера 255.255.255.0
Шлюз контроллера 192.168.1.1
Подключен также к роутеру комп. Его ip 192.168.1.7
И роутер, и контроллер с компа пингуются.
ПОЖАЛУЙСТА ПОМОГИТЕ!!! Почему не проходит коннект???
Также выкладываю свой проект для того, чтобы смогли попробовать запустить у себя.
network_counter:=network_counter+1;
IF network_counter > http_period THEN
network_counter:=0;
IF network_status <> 0 THEN
network_time_out:=network_time_out+1;
END_IF
network_status:=1;
connect_counter:=0;
IF sock>0 THEN SysSockClose(sock); END_IF;
END_IF
CASE network_status OF
1: sock := SysSockCreate(SOCKET_AF_INET, SOCKET_STREAM, SOCKET_IPPROTO_TCP);
IF sock <> -1 THEN
network_status:=2;
END_IF
2: IF connect_counter = 0 THEN
h_adr.sin_addr:=SysSockInetAddr(host);
h_adr.sin_family:=SOCKET_AF_INET;
h_adr.sin_port:=SysSockHtons(80);
h_adr.sin_zero[0] := 0;
h_adr.sin_zero[1] := 0;
h_adr.sin_zero[2] := 0;
h_adr.sin_zero[3] := 0;
h_adr.sin_zero[4] := 0;
h_adr.sin_zero[5] := 0;
h_adr.sin_zero[6] := 0;
h_adr.sin_zero[7] := 0;
ConnectResult := SysSockConnect(sock, ADR(h_adr), SIZEOF(h_adr));
END_IF;
connect_counter:=connect_counter+1;
IF connect_counter > connect_pause THEN
connect_counter:=0;
END_IF;
IF ConnectResult THEN
network_status:=3;
END_IF;
3: diByte_s:=SysSockSend(sock, ADR(http_get), 0, SOCKET_MSG_OOB);
byte_s_amount := byte_s_amount + diByte_s;
IF diByte_s<>-1 THEN
network_status:=4;
END_IF;
4: diByte_r:=SysSockRecv(sock, ADR(mas_otvet), 1500, SOCKET_MSG_OOB);
IF BUFFER_SEARCH(ADR(mas_otvet), 1500, 'END', 0, FALSE ) > 0 THEN
network_status:=0;
SysSockClose(sock);
sock:=0;
byte_r_amount := byte_r_amount + diByte_r;
END_IF;
END_CASE
Перечитал много тем по форуму. Многие сталкиваются с подобными проблемами. Но применяемые ими решения не работают. Напрашиваются 2 варианта: либо данная библиотека не работает, либо я не вижу какой-то мелочи.
Avtomatic
20.01.2015, 13:13
Вчера на форуме нашел Ваши коды. Извините за рекламу, но писать нужно именно так! Правда подробно не разбирался еще...
Теперь по теме. В примере соединяются 2 контроллера. Мне необходимо соединить для начала контроллер с роутером, потом с компом. У роутера есть WEB-интерфейс, который он выдает по HTTP-запросу GET. На компе поднят WEB-сервер. Есть ли разница или может особенность в том, к чему я приконнектюсь? Кроме того, есть ли разница в исполняемой системе, типе контроллера, распределения памяти, настройках платформы для работы с TCP или же все должно работать по умолчанию?
Почему задаю этот вопрос... Просто столкнулся с глупой ситуацией, когда вся связь проходила и даже получал сообщение в ответ, но неадекватное. проблема оказалась в следующем:
В CodeSys 2.3 в параметрах связи была еще ветка, по которой CodeSys связывался по Ethernet. При установке сниффета и наблюдении за http сообщениями выяснилось, что CodeSys периодически опрашивает контроллер, и в этот же порт ПЛК бросал мои команды в перемешку с опросами CodeSys.
Еще раз повторюсь: Есть ли разница или может особенность в том, к чему я приконнектюсь? Кроме того, есть ли разница в исполняемой системе, типе контроллера, распределения памяти, настройках платформы для работы с TCP или же все должно работать по умолчанию?
насколько я понял до вопросов связанных с http запросами дело у Вас не дошло, на видео показано, что соединение на плк можно устанавливать и работать в качестве как сервера, так и клиента, так же в том примере нет второго контроллера, идет связка плк - роутер - ПК - роутер - плк , все объекты в одном экземпляре.
Теперь о разнице, никакой разницы нет кто отправит правильно составленный запрос GET
По поводу мешается ли CoDeSys, установите правило в своем снифере чтоб прослушивал только порт 80 и увидите, что плк с компом общаются в одиночестве, КДС работает по порту 1200
Avtomatic
20.01.2015, 16:57
А есть ли необходимость в конфигурации каналов связи в CodeSys (Пункт меню "Онлайн" -> "Параметры связи...") для работы с TCP???
нет, это только для работы с проектом
Лузин Владимир
02.11.2016, 09:11
Здравствуйте.
Пытаюсь решить подобную проблему. На форуме нашел пример для ПЛК100.
Поставил на ПЛК110-30L, подправил запрос для отправки на свой сервер,
GET запрос проходит нормально, получаю адекватный ответ.
Пытался ставить на ПЛК150 почему-то запрос не проходит.
С данной проблемой пока не разобрался.
Опыт работы с ТСР и библиотекой SysLibSocets нулевой.
Лузин Владимир
02.11.2016, 10:10
Большое спасибо Андрею Шатохину за рабочий пример.
Давно искал решение аналогичной проблемы простыми средствами.
У меня заработал на ПЛК110-30L, но на ПЛК150 не работает, пока разбираюсь.
Опыт работы с ТСР и библиотекой SysLibSockets нулевой.
Лузин Владимир
02.11.2016, 10:15
Пример выложил Андрей Шатохон в теме:
Программное обеспечение/Сетевые технологии/Выполнить запрос HTTP_GET
Что и все. Разобрались все таки?
Powered by vBulletin® Version 4.2.3 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot