Добрый день.
Установите в менеджере визуализации галочку Поддержка клиентских анимаций и наложение исходных элементов.
Альтернативный вариант - использовать диалог LoginOwen2 из библиотеки OwenVisuDialogs.
Вид для печати
Про паттерн "Фабрика" (и другие паттерны из книги "Банды четырех") множество информации в интернете и литературе (начать можно как раз с упомянутой книги).
То же самое касается алгоритмов - про них много написано и в книгах, и в сети.
Паттерны и алгоритмы не привязаны к языкам и средам разработки - поэтому не очень понятно, зачем нам описывать то, что уже множество раз хорошо описали до нас.
Да вы правы это все разжовано в интернете. Я просто не пойму в какую сторону двигатся для развития.
Спасибо большое, с галочкой всё заработало!
Добрый день! Подскажите пожалуйста, какая версия SNMP у контроллера ПЛК210?
А если клиент 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?
Добрый день.
Много искал, но не нашёл.
CODESYS 3 периодически выдает сообщение "Безопасности" об отсутствии некоторых сертификатов
Вложение 73013
Подскажите, если в настройках узла модем выбран 3 порт, нужно ли удалять выделенное на скрине с лева ?Вложение 73025
Добрый день.
Подскажите где поискать системные биты для ПЛК200(210) - в частности интересует бит старта контроллера?
Не получается.
Вернее получается, но возникла другая проблема.
После перезагрузки все работает, но своеобразно.
Сперва везде 0, если поставил значение в параметре инициализации, то загружено значение инициализации.
При старте ПЛК загружаются нули. Если сделал код по подсказке, то сперва загружаются нужные значения, затем снова нули.
Выбор типа переменной:RETAIN, PERSISTENT,RETAIN PERSISTENT - ни как не влияет.
Контроллер работает в режиме Slave по ModBUS TCP. Мастер панель. Как бы так то работает, но
Создавал PERSISTENT переменные - тоже не помогает. При перезагрузке значения обнуляются.
Так же если просто контроллер обесточить и снова запитать - значения обнуляются.
Подскажите, что можно сделать?
Доброго времени коллеги, недавно начал изучать по работе кодесис, и вот такая ситуация возникла, необходимо подсчитывать время сведенного пресса те цикл программы 1000мс, и при этом необходимо отслеживать нажатие кнопки начала работы установки заливки в пресс пены, там нажатие кнопки доли секунды, и плк не успевает опросить входа, на сименсе запись раз в секунду делается через циклические прерывания, тут я так понимаю это далается через конфигуратор задач, но я не могу понять как правильно это реализовать, мб кто-то подскажет документацию, где про такие моменты можно почитать. Или мб есть какой то другой путь решения данного вопроса?
Через диспетчер задач - создаёте две задачи, указываете для каждой из них свои параметры выполнения (например фиксированный цикл и свободное выполнение).
Создаёте два программных модуля (PRG) и добавляете их каждый в свою задачу.
Но вообще, скорее всего, есть более правильные методы решения вашей задачи, чем установка цикла программы в 1 сек
Думал об этом, но вот да, мб есть более правильное решение.
Здравствуйте, имеется модуль МВ110-8А и я считываю с него значения типа REAL, но далее мне нужно их передать через TCP Slave Device другому контроллеру. В самом Slave Device мне доступно адресное пространство только под тип WORD, не подскажете как мне правильнее конвертировать REAL в два WORD (AB CD)?
Codesys 3.5 SP16 Patch 4.
Огромное спасибо, я воспользуюсь библиотечной функцией.
Добрый день.
Подскажите с помощью чего можно уловить изменение переменной rValue т.е. как только он больше 0 нужно сформировать бит для записи другого алгоритма и так же когда он = 0 тоже сформировать, пробую с помощь тригера переднего и заднего фронта и он никак не реагирует.