Я пытаюсь использовать контроллер ПЛК, работающий с CODESYS, чтобы сделать http-запрос к icanhazip.com и сохранить тело ответа в строковую переменную.Я знаю, что контроллер подключен к Интернету, поскольку на нем работают другие функции, которые его используют.Для этого конкретного сайта ответ содержит только IP-адрес, который я хочу сохранить.Поэтому мне просто нужно преобразовать тело ответа в строку без разбора.
Ниже я включил код CoDeSys, который я использую.
PROGRAM PLC_PRG
VAR
URLVALUE: OSCAT_NETWORK.URL;
HTTP_GETTER : OSCAT_NETWORK.HTTP_GET;
IP_C: OSCAT_NETWORK.IP_C;
S_BUF: OSCAT_NETWORK.NETWORK_BUFFER;
R_BUF: OSCAT_NETWORK.NETWORK_BUFFER;
GETBOOL: BOOL;
res: STRING;
ip: STRING;
Request_TON : TON;
END_VAR
Request_TON(IN := NOT GETBOOL, PT := T#5000MS);
IF Request_TON.Q THEN
GETBOOL := TRUE;
END_IF
URLVALUE := OSCAT_NETWORK.STRING_TO_URL(STR := 'icanhazip.com', DEFAULT_PROTOCOL := 'http', DEFAULT_PATH := '/');
URLVALUE.PORT := 80;
HTTP_GETTER( URL_DATA := URLVALUE,
IP_C := IP_C,
S_BUF := S_BUF,
R_BUF := R_BUF,
IP4 := 0,
GET := GETBOOL,
MODE := 1,
UNLOCK_BUF := FALSE);
IF HTTP_GETTER.DONE THEN
res := OSCAT_BASIC.BUFFER_TO_STRING( PT:=ADR(R_BUF.BUFFER), SIZE:=R_BUF.SIZE, START:=0, STOP:=R_BUF.SIZE - 1);
ip := OSCAT_BASIC.TRIM( str:=res );
GETBOOL := FALSE;
END_IF
Как яПройдя по коду с помощью функции отладки CoDeSys, я вижу, что он застревает в состоянии 30 внутри функционального блока HTTP_GET (HTTP_GETTER).Есть строка, которая сравнивает размер S_BUF с нулем, и если он не равен, он ничего не делает.Поскольку функциональный блок HTTP_GET публикуется как часть библиотеки OSCAT_NETWORK, вероятно, мне нужно что-то изменить в моем вызове, чтобы запрос работал правильно.
Спасибо