В плане передачи по RS485, однозначно быстрее ПЛК110,
по скорости работы самой программы, зависит от WEB визуализации в 210, если она есть, то 110 быстрее.
По моим наблюдениям, 110 быстрее всегда.
Вид для печати
В сп3хх 'С' (что вы называете макросами) я могу управлять свойствами объектов, координаты, видимость и прочее на уровне С?
Вопросы по Панелям надо задавать в соответствующей теме https://owen.ru/forum/forumdisplay.php?f=23
В примерах есть Организация обмена через макросы+ статья и Набор макросов для работы с памятью, Анимация и перемещение элементов,
в эмуляции макросы не работают.
скачивайте, читайте и пробуйте https://owen.ru/product/sp3xx/software
Доброго времени суток!
В общем есть две ПР200, первая Slave, вторая соответственно Master, в общем вторая читает битовую маску состояния датчиков которую контролирует первая, проблема в том что если на первой передаются все биты с 1-го по 32-ой, то вторая видит только первую половину, с 1 по 16
Так это выглядит при отладке:
То что уходит:
https://owen.ru/forum/attachment.php...1&d=1698397448
То что приходит:
https://owen.ru/forum/attachment.php...1&d=1698397460
Подозреваю, что между ПР-ками я могу гонять только половину от 32-х разрядов и мне это дело нужно разделять или все же я где то накосячил? :)
Ну как бы да, там 2 регистра читаются, эта настойка в мастере, в слейве там этого нет...
https://owen.ru/forum/attachment.php...1&d=1698399305
В слейве нельзя поставить 2 регистра сразу, надо взять 2 регистра по отдельности с собрать их в целочисленную 32 битную переменную. Вложение 71200
Либо передавать две 16 битные маски и принимать их
Я чет ничего не понимаю, слейв же не читает, читает мастер, что записано в слейве, ладно я к словам придираюсь, прошу прощения, в общем я понял, я могу передать только по 16 бит по очереди, а не 32 бита сразу, хотя с модулями вывода работает и сразу 32 бита... :)
В принципе я выкрутился по другому, эти 7 значений (не подразумевается, что они смогут срабатывать сразу по несколько) упаковал в двоичную маску, а ее уже считываю, как раз все уместилось... :)
https://owen.ru/forum/attachment.php...1&d=1698402067
https://owen.ru/forum/attachment.php...1&d=1698402099
Спасибо за помощь! :)
Доброго дня всем!
Вопрос про ПИД регулятор из библиотеки Pid_Regulators.lib.
Используется для регулировки давления воздуха с помощью задвижки типа МЭО.
Использую два ФБ: PID_FUNCTION и VALVE_REG_NO_POS
Вот такая проблема, почему то когда давление уставки равно давлению измеренному то ФБ управления задвижкой VALVE_REG_NO_POS постоянно выдает поочередные сигналы на открытие и закрытие через 3 секунды (это время в настройках указано как - Минимальное время остановки, сек)
Когда система отрегулирована и показания не меняются зачем он посылает постоянные короткие сигналы на открытие и закрытие которые не влияют на положение задвижки даже, но сработка реле каждые 3 секунды ушатает контакты?
Добрый день. Делаю проект на ПЛК, 160М мастер плюс блоки расширения. Локальная сеть работает по протоколу Modbus RTU. По Modbus TCP подключена панель оператора ONI, ПЛК - слейв. Сначала был сделан алгоритм управления оборудованием, отлажен с помощью визуализации. Проблемы возникли после конфигурирования (см. скриншот) Не могу понять в чем дело, в алгоритме нет переменных с объявлением «WORD».
Программа написана на CFC.
По ссылке файл алгоритма. Хотелось бы услышать критику по поводу структуры алгоритма. Т.е. алгоритм состоит из нескольких POU, для каждой технологической группы своя программа, головная программа поочередно вызывает соответствующий POUи не вызовет ли это проблем при организации коммуникаций?
https://cloud.mail.ru/public/LS54/EQitCrY5q
Тыкайте в ошибку. Выделяется переменная/блок. Увидеть трудно, но возможно.
Вложение 71211
Вложение 71209
Вложение 71210
Обычно вызов нескольких отдельных программ реализуется через "Конфигурацию задач". Если в одну задачу в вашем порядке добавить ваши программы работать будет так-же.
Коммуникациям, организованным через конфигурацию вообще помешать трудно
На скринах ваши ошибки,
нет соединений 4 штуки, выходы надо оттянуть и увидите Вложение 71212 переменная Real присвоена в переменную WORDВложение 71213
Спасибо за ответ, действительно, все просто.
DBF - зона нечувствительности задвижки.
В данном случае она у меня равна нулю.
Рассказываю почему так сделал:
- если выставляю DBF любое число отличное от нуля то исчезает эта проблема фиктивных поочередных сигналов на LESS и MORE но появляется другая еще более опасная.
Например выставили DBF = 1%
Все работает, пид регулирует.
Но в определенный момент когда давление уходит ниже уставки и при этом значение IN_VAL было меньше DBF то не происходит полного закрытия задвижки вообще и получается провал. Когда IN_VAL больше DBF то все работает.
Тестировал несколько дней и даже заново переписал код.
Ну это же не проблема, у позиционеров даже не аппаратном уровне есть параметр отсечки в граничных областях, чтоб не подтравливало если оборудование изношено. В этом случае тоже можно решить вопрос подачей дополнительного сигнала на закрытие если значение регулятора находится между нулем и dbf
ЗЫ или селектор поставить на dbf если вход ниже трёх процентов например
не подскажете, каким образом или на какой вход подать сигнал на "дозакрытие"? Например реальная ситуация когда DBF = 3% то при вышеописанном рассогласовании вход уже равен 0 положению задвижки, но задвижка при этом приоткрыта. Программа думает что клапан закрыт и никаких действий не предпринимает, а по факту чуть приоткрыта задвижка. Тогда давление идет ниже уставки и ПИД уже не реагирует.
Если положение задвижки меньше или равно 4 то DBF=0
Но когда DBF=0 тогда появляются эти поочередные срабатывания LESS и MORE, от которых я и хочу избавиться. Таким образом DBF=0 недопустимо при уравновешенной системе ((
На задвижку сигнал через ФБ не подать напрямую, значит получается нужно уже своим кодом обходить ФБ управления задвижкои и подавать сигнал на выходы ПЛК на принудительное дозакрытие когда _PID.POS < _PID.DBF
Уставка выставлена 6.0, допустимые отклонения 5.8-6.2 но они нигде не прописываются.
Сейчас работает так что при давлении 6.0 сигнал на вход равен 0 (то есть задвижка закрывается полностью), как только становится 6.1 то задвижка открывается в зависимости от пропорциональной составляющей.
А причем тут ПИД ? VALVE_REG_NO_POS вроде как просто эмулятор положения, не ?Цитата:
_PID.POS < _PID.DBF
Здравствуйте!
У меня задача осуществлять логирование данных на флешку, как бы лог работы установки с временными метками.
Пробовал модуль Archiver, работает, но функционал крайне скуден.
Получше с библиотекой OwenLibFileAsync.lib, но при её использовании возникла проблема - в режиме отладки данные на флешку пишутся, а при запуске ПЛК в RUN флешка как будто подключается (сужу по морганию диода на ней), но файл не пишется вообще.
Может я что-то упустил в настройках проекта, например?
Если что, код архивирования
С русским проблема в кодсисе или на форуме)
Код:(* Îòëàâëèâàòü è çàïèñûâàòü
â retain îòêëþ÷åíèÿ è ïîäêëþ÷åíèÿ ôëåøêè *)
(* ×òåíèå òåêóùèõ âðåìåíè è äàòû *)
TimeAndDate.Day:=0;
TimeAndDate.DayOfWeek:=0;
TimeAndDate.dwHighMsec:=0;
TimeAndDate.dwLowMSecs:=0;
TimeAndDate.Milliseconds:=0;
TimeAndDate.Minute:=0;
TimeAndDate.Second:=0;
TimeAndDate.Hour:=0;
TimeAndDate.Year:=0;
TimeAndDate.Month:=0;
Sys_time.ulHigh:=0;
Sys_time.ulLow:=0;
GetTime (SystemTime:=Sys_Time , TimeDate:= TimeAndDate);
IF today <> TimeAndDate.Day THEN (*åñëè íàñòóïèë íîâûé äåíü, òî ôîðìèðóåì íîâûé ôàéë ñ íîâûì èìåíåì äàòû*)
name_of_file:= CONCAT(pref , UINT_TO_STRING(TimeAndDate.Day));
name_of_file:= CONCAT(name_of_file , '.');
name_of_file:= CONCAT(name_of_file , UINT_TO_STRING(TimeAndDate.Month));
name_of_file:= CONCAT(name_of_file , '.');
name_of_file:= CONCAT(name_of_file , UINT_TO_STRING(TimeAndDate.Year));
name_of_file:= CONCAT(name_of_file , '.csv');
today:= TimeAndDate.Day;
need_new_header:= TRUE; (*äàëåå â íîâîì ôàéëå íåîáõîäèìî áóäåò ñîçäàòü "øàïêó" àðõèâà*)
END_IF
IF write_log = TRUE THEN
IF need_new_header THEN
header:= CONCAT( '', 'Äàòà');
header:= CONCAT( header, ';');
header:= CONCAT( header, 'Âðåìÿ');
header:= CONCAT( header, ';');
header:= CONCAT( header, '$0A');
ELSE (* Èíà÷å äîçàïèñûâàåì â (ñåãîäíÿøíèé) ôàéë *)
header:= CONCAT('' , UINT_TO_STRING(TimeAndDate.Day));
header:= CONCAT( header, '.');
header:= CONCAT(header , UINT_TO_STRING(TimeAndDate.Month));
header:= CONCAT( header, '.');
header:= CONCAT(header , UINT_TO_STRING(TimeAndDate.Year));
header:= CONCAT( header, ';');
header:= CONCAT(header , UINT_TO_STRING(TimeAndDate.Hour));
header:= CONCAT( header, ':');
header:= CONCAT(header , UINT_TO_STRING(TimeAndDate.Minute));
header:= CONCAT( header, ':');
header:= CONCAT(header , UINT_TO_STRING(TimeAndDate.Second));
header:= CONCAT( header, ';');
(* Äàëåå - ïåðåìåííûå *)
header:= CONCAT( header, ';');
header:= CONCAT( header, '$0A');
END_IF
END_IF (* write_log = TRUE*)
(* ×ÅÊÀÒÜ USB ïî òàéìåðó à íå
ïîñòîÿííî *)
IF usb_check_connection = TRUE THEN
(* Ïðîâåðêà ïîäêëþ÷åíèÿ ïî USB *)
usb_connection:= GetUSBSerial(0, ADR(buf));
IF usb_connection = 0 THEN
(*×òåíèå ñåðèéíîãî íîìåðà ïðîøëî óñïåøíî*)
(* file_name:= 'usb:mylogfile.txt'; *)
(* file_st:= File_open_start; *)
usb_check_connection:= FALSE;
ELSIF usb_connection = -1 THEN
; (* Óñòðîéñòâî USB íå ïîäêëþ÷åíî *)
ELSIF usb_connection = -2 THEN
; (*×òåíèå ñåðèéíîãî íîìåðà ïðîèçîøëî ñ îøèáêîé*)
END_IF
END_IF (* usb_check_connection = TRUE *)
IF write_log = TRUE AND usb_check_connection = FALSE THEN
IF file_opened = FALSE THEN
file_st:= File_open_start;
ELSE
file_st:= File_write_start;
END_IF
END_IF
CASE file_st OF
File_lazy:
(* Çäåñü ðåàëèçîâàòü
ïåðèîäè÷åñêèå ïîïûòêè îòêðûòü USB ïîðò ïî òàéìåðó*)
;
File_open_start:
res:= OwenFileOpenAsync(name_of_file, 'a', ADR(f_handle));
write_log:= FALSE;
IF res = ASYNC_WORKING THEN
file_st:= File_open_check;
END_IF
File_open_check:
res:= OwenFileOpenAsync(name_of_file, 'a', ADR(f_handle));
IF res = ASYNC_DONE THEN
IF f_handle <> 0 THEN
file_st:= File_write_start;
file_opened:= TRUE;
END_IF
END_IF
File_write_start:
res:= OwenFileWriteAsync( f_handle, ADR(header), LEN(header), ADR(wr_result));
write_log:= FALSE;
IF res = ASYNC_WORKING THEN
file_st:= File_write_check;
END_IF
File_write_check:
res:= OwenFileWriteAsync( f_handle, ADR(header), LEN(header), ADR(wr_result));
IF res = ASYNC_DONE THEN
IF wr_result = LEN(header) THEN
need_new_header:= FALSE;
file_st:= File_end;
END_IF
END_IF
File_end:
(* ÍÀäî çàêðûâàòü ôàéë? *)
;
END_CASE
нет проблем, пробуйте:
иначе получите:Код:(*это комментарий на русском*)
(*раскладка клавиатуры ТОЛЬКО RU:
1)при копировании кода с CDS;
2)при вставке этого кода в браузере.*)
Код:(*ýòî êîììåíòàðèé íà ðóññêîì*)
(*ðàñêëàäêà êëàâèàòóðû ÒÎËÜÊÎ RU:
1)ïðè êîïèðîâàíèè êîäà ñ CDS;
2)ïðè âñòàâêå ýòîãî êîäà â áðàóçåðå.*)
Ладно, я понял, вопрос не для новичков.
А если так: в чем может быть разница при запуске программы с ноутбука, подключенного по Ethernet к ПЛК110[М02] в режиме отладки и запуске ПЛК в режиме RUN?
Здравствуйте! Не могу понять почему функция P_izmer_pid := ROUND(P_izmer_pid, 2); работает не всегда.
На скринах видно, что в какие то циклы значение округляется до 2 знаков после точки, а в некоторые бывает что не округляется, с чем это связано?
Функция не лежит в условных операторах и выполняется при каждом цикле по идее.Вложение 71277Вложение 71278
Добрый день!
Имеется ПЛК110-24.32.Р-М и модуль аналоговых входов МВ210-101. Между собой ПЛК и модуль входов общаются по Modbus TCP, при этом ПЛК - master, а модуль - slave, если я правильно понимаю. Хочу получать и передавать данные на ПЛК с WinCC v7.5 через тот же Modbus TCP, но в этом случае ПЛК получается должен быть slave.
Будет ли это работать, если в "Конфигурации ПЛК" одновременно добавить Modbus (master) и Modbus (slave)? Или мне нужен другой модуль входов (например, МВ110 с интерфейсом RS-485), который будет общаться с ПЛК по Modbus RTU (здесь ПЛК - master), а уже WinCC c ПЛК - по Modbus TCP (здесь ПЛК - slave)?