Выполнить запрос HTTP_GET
Коллеги, нужен совет.
В общем случае вопрос звучит так:
- Какой механизм использовать для того чтоб реализовать отправку 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>
Вложений: 1
ПЛК 110-30-М. Запрос HTTP. Библиотека SysLibSockets.lib.
Пытаюсь запустить в 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 варианта: либо данная библиотека не работает, либо я не вижу какой-то мелочи.