разобрался....
Вид для печати
Доброго дня,продолжу задавать глупые вопросы ...Код PLC_PRG:
IF GVL.Read THEN //кнопка для чтения ,устанавливается в визуализации в TRUE
MB_Fan_Read_1 (
Ip_DataConv:='192.168.0.7',
Start_Adress:=StartAdresRead);
GVL.Read:=FALSE; //сброс кнопки после чтения...
Смысл кода: при нажатии на кнопку выполнить MB_Fan_Read_1 и после чтения сбросить кнопку в FALSE....почемуто данные не читаются....
если сделать вот так :
MB_Fan_Read_1 (
Ip_DataConv:='192.168.0.7',
Start_Adress:=128);
без каких либо условий ,то все работает прекрасно...
понимаю что что то делаю не правильно но не могу понять что....Прошу помощи знатоков..
Да пока писал сам об этом и подумал....тоесть стоит перенести все это PLC_PRG...? или как можно вынести куски кода которые будут вызываться часто в отдельные файлы?
где бы про это почитать подробнее ...или можете пример привести как это оформить?
FUNCTION_BLOCK INTERNAL MB_Fan_Read
VAR_INPUT
Ip_DataConv: STRING;
Start_Adress: UINT;
END_VAR
VAR_OUTPUT
TcpClientError: BOOL ;
END_VAR
VAR
fbTcpClient: OCL.TCP_Client;
fbReadRequest: OCL.MB_TcpRequest;
awReadData: ARRAY [0..32] OF WORD;
eState: STATE_MB;
fbTon: TON;
xWriteToSlave: BOOL;
END_VAR
CASE eState OF
STATE_MB.CONNECTING:
fbTon (IN :=TRUE, PT := T#5S);
fbTcpClient
(
xEnable := TRUE ,
tTimeout := T#5S,
sIpAddr := Ip_DataConv,
uiPort :=502
);
IF fbTcpClient.xActive THEN
eState := STATE_MB.READ;
END_IF
IF fbTcpClient.xError OR fbTon.q THEN
fbTcpClient(xEnable :=FALSE);
fbTon(IN :=FALSE);
TcpClientError :=TRUE;
END_IF
STATE_MB.READ:
fbReadRequest
(
xExecute :=TRUE,
tTimeout :=T#50MS,
usiRetry :=3,
hConnection := fbTcpClient.hConnection,
xIsRtuOverTcpMode :=FALSE,
usiUnitId :=1,
eFuncCode :=OCL.MB_FC.READ_INPUT_REGISTERS,
uiDataAddr:=Start_Adress, // Начальный регистр
uiDataCount:=32,// колво регистров в запросе
pData:=ADR (awReadData),
szSize:=SIZEOF (awReadData)
);
IF fbReadRequest.xDone OR fbReadRequest.xError THEN
fbReadRequest(xExecute := FALSE);
ELSE
eState := STATE_MB.CONNECTING;
END_IF
END_CASE
GVL.Read:=FALSE;
Добрый день.
Не могу победить переменную TOD...
ПЛК200, весь софт актуализирован.
Код (эмуляция часов, для отладки перехода в следующие сутки). Это один из кусков эмулятора.
VAR
dtime_FD: BOOL;
t_w_on_FD: TOD := TOD#22:00:00;
c_time_TOD: TOD := TOD#00:00:00;
Timer_FD: TON;
cnt: WORD:=0;
END_VAR
Timer_FD(IN:=TRUE,PT:=T#200MS);
IF Timer_FD.Q THEN
c_time_TOD:=c_time_TOD +T#10M;
Timer_FD(IN:=FALSE);
END_IF
IF t_w_on_FD <= c_time_TOD THEN
dtime_FD := TRUE;
cnt := cnt+1;
END_IF
Вроде как TOD не может быть больше 23:59:59, следовательно - должны получить кольцо 00:00:00 / 23:59:59.
НО, условие: t_w_on_FD <= c_time_TOD выполняется только один раз. После первого перехода через ноль часов c_time_TOD всегда больше t_w_on_FD.
Если добавить:
IF c_time_TOD >= TOD#23:59:59 THEN
c_time_TOD := (c_time_TOD - T#23H59M59S);
END_IF
то все начинает работать.
Это проявляется (естественно) и при добавлении к TOD#22:00:00 допустим T#4H00M.
Полученные TOD#02:00:00 всегда больше (при сравнении) исходных TOD#22:00:00
Такое ощущение, что существует признак переполнения, и он учитывается компилятором....
Если использовать TIME, добавленный день виден и убирается, когда надо. Но везде в коде использовал TOD.
Когда понадобилось в алгоритмы добавить работу оборудования по таймеру с переходом через сутки, ничего не заработало...
Чего скажете, это косяк софта или я чего-то недопонимаю?
Можно как-то сбросить это суточное переполнение в TOD (без всяких сравнений) или проще перелопатить свой код под TIME?
Вложение 55385
Когда TOD в вашем случае равен 1h то внутри там на самом деле уже 25h. На самом деле если код немного по другому написать то компилятор будет отчаянно ругаться на операции сложения TOD и TOD например если сумма больше 24h.
Это давно известное поведение (на мой взгляд - некорректное), которое по каким-то причинам разработчики решили не исправлять (won't fix).Цитата:
Чего скажете, это косяк софта или я чего-то недопонимаю?
Вложение 55386
Думаю, сделать это вообще без сравнений не получится.Цитата:
Можно как-то сбросить это суточное переполнение в TOD (без всяких сравнений)
Доброе утро!
CODESYS V3.5 SP14 Patch 3 + (32bit)
после компиляции выдает такое:
Вложение 55443
И как это понимать??
Добрый день, помогите разобраться с отображением тренда.
Имеется тренд с 24 переменными: TEMP_1-12, PRES_1-12. На главном окне визуализации есть 12 прямоугольников в которых выводятся переменные TEMP_1-12.
Необходимо чтобы при нажатии на прямоугольник 1 выводились переменные TEMP_1 и PRES_1, при нажатии на прямоугольник 2 выводились переменные TEMP_2 и PRES_2 и т.д.
Я так понял что это можно реализовать через "Опции динамического отображения", но не могу сообразить что надо указать в графе "Переменная или выражение для видимости".
Даже не представляю как реализовать переменную нажатия на объект визуализации.
Будьте добры, расскажите подробней.
См. настройки кнопок в примере (вкладка Конфигурация ввода).
https://dropmefiles.com/W8n1G
Как запустить проект на виртуальном контроллере:
https://owen.ru/forum/showthread.php...l=1#post296706
Спасибо огромное! Всё заработало.:):):)
Приветствую!
Подскажите, пожалуйста, как правильно масштабировать функциональность на одном ПЛК?
Т.е. я реализовал некий процесс для одного объекта автоматизации но мне нужно сделать тоже самое для еще нескольких объектов и чтобы это все работало независимо на одном ПЛК.
Я вижу два пути:
1. В главной программе обрабатывать процессы для всех объектов последовательно, что увеличит время цикла таски
2. Вероятно можно создать отдельные таски для каждого объекта с аналогичнами программами но разными переменными
Может есть еще какие то аврианты?
Как обычно подобные задачи реализуются на этой платформе?
Спасибо за ранее за ответ.
День добрый, форумчане.
Задаю для окна в качестве фона изображение в формате jpg. В режиме проектирования картинка отображается.
При подключении через CoDeSys - картинка отображается. Но на самой панели картинки нет. При доступе на панель через браузер - картинки нет.
В чем дело?
CoDeSys V3.5 SP14 Patch 3. Панель СПК110 [M01]. Таргет 3.5.14.34.
Добрый день! Подскажите плз. Я был уверен, что функция TIME() возвращает реальное время. По факту - время с момента включения ПЛК. А какой функццией тогда можно узнать реальное время, как на наручных часах?
Добрый день.
См. в дереве проекта узел OwenRTC - там доступно время в любом удобном формате:
Вложение 55686
еще одна проблемка...пытаюсь добавить в проект OPR.STD_PID..при компиляции ошибка..чтобы это могло значить?Вложение 55984
библиотека CmpOwenPidRegs ---3.5.14.33
таргет-файл 3.5.11.50
Версия библиотеки не соответствует версии таргета.
Можете использовать эту версию:
https://ftp.owen.ru/CoDeSys3/04_Libr...mpiled-library
Но она была тестовой - с ней были проблемы.
Лучше обновить прошивку, таргет и проект до версий для SP14 Patch 3.
Вопрос по поводу использования пользовательской библиотеки, я создал библиотеку codesys формата .lybrary, содержащую divice со всеми подкаталогами. Создаю новый проект устанавливаю и подключаю созданную библиотеку, как теперь перенести устройство из библиотеки в проект?
Здравствуйте. Как выключить предкомпиляцию в codesys sp16 ?
Скрытый текст:
Достаточно в проект добавить просто элемент ,сразу начинает проверять, и показывает ошибки, компьютер при этом слегка притормаживает, работать неудобно.
Добрый день, для удобства работы с модулем мв110-8А, появился вот такой вопрос, можно ли менять тип датчика через CodeSys?
Можно, смотрите описание регистров на МВ110-8А