Сообщение от
Николай Суриков
Коллеги прошу подсказки.
Дано: СПК107 подключен по LAN к роутеру в который вставлен USB модем.
Из-за специфики объекта роутер включается на небольшой промежуток времени для передачи архивных данных.
Как из кода программы определить наличие доступа к интернету?
В продолжение моего способа:
Код:
PROGRAM POU_TCP_SERVER
VAR
fbTcpServer: NBS.TCP_Server; //ФБ TCP-сервера
//Массив структур для обработки подключений
astClients: ARRAY [1..usiMaxConnections] OF DUT_TCP_CONNECTION;
usiActiveClientCounter: USINT; //Число подключенных клиентов
i: INT; //Счетчик для цикла
R_TRIG_0: ARRAY [1..usiMaxConnections] OF R_TRIG;
TON_RES_Y: ARRAY [1..usiMaxConnections] OF TON;
TRX_ALM: TON;
ix: INT;
END_VAR
VAR CONSTANT
//Максимальное число подключенных клиентов
usiMaxConnections: USINT := 5;
END_VAR
VAR_INPUT
Com_From_JSON: BOOL;
Com_From_Main: BOOL;
END_VAR
Код:
//создаем сервер на заданном порту
IF usiActiveClientCounter= 5 THEN
//если количество активных клиентов достигло 5, перезапускаем сервер и сбрасываем все подключения
fbTcpServer
(
xEnable:= FALSE
);
usiActiveClientCounter:= 0;
TargetVars.stBuzzer.xSet:= TRUE;
ELSE
fbTcpServer
(
xEnable:= TRUE,
ipAddr := ,
uiPort := 48888
);
END_IF
TRX_ALM(in:= TargetVars.stBuzzer.xSet, PT:=T#3S);
IF TRX_ALM.Q THEN
TargetVars.stBuzzer.xSet:= FALSE;
END_IF
IF fbTcpServer.xError THEN
; //обработка ошибок
END_IF
//создаем обработчики подключений для клиентов
FOR i:= 1 TO usiMaxConnections DO
astClients[i].fbTcpConnection
(
xEnable:=fbTcpServer.xBusy AND NOT astClients[i].fbTcpConnection.xDone,
hServer:=fbTcpServer.hServer
);
IF astClients[i].fbTcpConnection.xError THEN
; //обработка ошибок
END_IF
//отслеживаем подключение клиента
astClients[i].fbAddClient(CLK:=astClients[i].fbTcpConnection.xActive);
//регистрируем подключение нового клиента
IF astClients[i].fbAddClient.Q THEN
usiActiveClientCounter := usiActiveClientCounter + 1;
END_IF
//регистрируем отключение одного из клиентов
IF astClients[i].fbTcpConnection.xDone THEN
usiActiveClientCounter := usiActiveClientCounter - 1;
END_IF
CASE astClients[i].eState OF
DUT_TCP_SERVER_STATE.CREATE: //проверяем, что подключился клиент
IF astClients[i].fbTcpConnection.xActive THEN
astClients[i].eState:=DUT_TCP_SERVER_STATE.LISTEN;
END_IF
DUT_TCP_SERVER_STATE.LISTEN: //получаем данные от клиента
astClients[i].fbTcpRead
(
xEnable := astClients[i].fbTcpConnection.xActive,
hConnection := astClients[i].fbTcpConnection.hConnection,
pData := ADR(astClients[i].sClientString),
szSize := SIZEOF(astClients[i].sClientString)
);
//если получен запрос от клиента - подготавливаем ответ
IF astClients[i].fbTcpRead.xReady THEN
astClients[i].sClientString:= OSU.Between(astClients[i].sClientString, '{', '}');
IF astClients[i].sClientString = '1' THEN
Com_From_JSON := TRUE;
END_IF
Com_From_Main := TRUE;
astClients[i].eState:=DUT_TCP_SERVER_STATE.X_Start;
ELSIF astClients[i].fbTcpRead.xError THEN
; //обработка ошибок
END_IF
DUT_TCP_SERVER_STATE.X_Start:
R_TRIG_0[i](CLK := Com_From_Main);
TON_RES_Y[i](IN := R_TRIG_0[i].CLK, PT := T#50MS);
IF TON_RES_Y[i].Q THEN
MEM.MemFill(ADR(astClients[i].sInverseString), SIZEOF(astClients[i].sInverseString), 16#20);
MEM.MemFill(ADR(astClients[i].sInverseString1000), SIZEOF(astClients[i].sInverseString1000), 16#20);
IF astClients[i].sClientString = '1' THEN
astClients[i].sInverseString:= POU_JSON_CMD1.JSON_STR;
ELSIF astClients[i].sClientString = '2' THEN
astClients[i].sInverseString:= POU_JSON_CMD2.JSON_STR;
ELSIF astClients[i].sClientString = '3' THEN
astClients[i].sInverseString:= POU_JSON_CMD3.JSON_STR;
ELSIF astClients[i].sClientString = '4' THEN
astClients[i].sInverseString:= POU_JSON_CMD4.JSON_STR;
ELSIF astClients[i].sClientString = '5' THEN
astClients[i].sInverseString:= POU_JSON_CMD5.JSON_STR;
ELSIF astClients[i].sClientString = '1000' THEN
astClients[i].sInverseString1000:= POU_Main.STR1000;
ELSE
astClients[i].sInverseString:= '{"Info":"Неизвестный запрос!"}';
END_IF
FOR ix:= 1 TO 25 DO
astClients[i].sInverseString := CONCAT(astClients[i].sInverseString, ' ');
END_FOR;
astClients[i].eState:=DUT_TCP_SERVER_STATE.SEND;
END_IF
DUT_TCP_SERVER_STATE.SEND: //отправляем ответ клиенту
Com_From_Main := FALSE;
R_TRIG_0[i](CLK := FALSE);
TON_RES_Y[i](IN := FALSE);
IF astClients[i].sClientString <> '1000' THEN
astClients[i].fbTcpWrite
(
xExecute := TRUE,
hConnection := astClients[i].fbTcpConnection.hConnection,
pData := ADR(astClients[i].sInverseString),
szSize := SIZEOF(astClients[i].sInverseString)
);
ELSIF astClients[i].sClientString = '1000' THEN
astClients[i].fbTcpWrite
(
xExecute := TRUE,
hConnection := astClients[i].fbTcpConnection.hConnection,
pData := ADR(astClients[i].sInverseString1000),
szSize := SIZEOF(astClients[i].sInverseString1000)
);
END_IF
//если ответ успешно отправлен - продолжаем слушать порт, ожидая следующего запроса
IF astClients[i].fbTcpWrite.xDone THEN
astClients[i].fbTcpWrite(xExecute:=FALSE);
astClients[i].eState:=DUT_TCP_SERVER_STATE.LISTEN;
ELSIF astClients[i].fbTcpWrite.xError THEN
; //обработка ошибок
END_IF
END_CASE
END_FOR