Если клиент поддерживает только v3 с её продвинутой криптографией - то не будут.
Вид для печати
Все понятно. Спасибо!
Евгений, здравствуйте!
"Напал" на Ваш канал на известном видео хостинге. Это кладезь полезной информации.
Вы "вещаете" в основном на языке ST.
1. Мне интересно Ваше мнение. Всё-таки на ST, как программисту, удобнее писать задачи? Чем, скажем на "релюшках" (LD)?
На ST писать код, вроде как, более полноценный код, Ифы, Циклы, указатели там разные..., все дела...
2. Нубский вопрос. А совместить CFC с ST ? Это делается в CodeSys? Ткните ссылку на пример? Или в двух словах - да, нет. Спасибо.
Добрый день.
1. Мое мнение - каждый разработчик может выбрать для себя тот язык (или набор языков), который считает наболее подходящим для решения конкретной задачи.
2. В проекте CODESYS можно создавать POU на разных языках (например - программа на CFC, в который вызываются экземпляры ФБ, написанных на ST).
Коллеги прошу подсказки.
Дано: СПК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
Добрый день.
Подскажите правильно я реализую пересчет оборотов энкодера в плк MB210-212?