Как выделить написал выше, ничего не поломает при экспорте, импорте. Если объекты с одинаковыми именами, перед экспортом сразу переименовать.
Вид для печати
Кто Вас заставляет экспортировать ВСЕ объекты из проекта-донора?
Можете экспортировать всего ОДИН объект (новый объект ВНС) !
ЗЫ
https://owen.ru/forum/attachment.php...6&d=1648625239
Здравствуйте. Вопрос по переменным IN_OUT в FB.
Проблема такая. Я создаю блок с IN_OUT переменной. В документации написано, что передается адрес на переменную, нельзя константу, нельзя обратится напрямую через точку. В версии 3.5 все четко. Компилятор ругается на вышеописанные действия, блок работает правильно. А вот в версии 2.3 абсолютно такой же блок не работает. Причем я могу в переменную IN_OUT записать константу, обратится через точку и компилятор не выдает ошибку. Хотя если выбирать переменную в ниспадающем списке она отображается как IN_OUT. Если при вызове блока писать := то переменная работает как входная (т.е. переписывается внешним значением), а если => то как выходная (т.е. переписывает внешнюю переменную). А как IN_OUT не работает...
Я на 2.3 не писал раньше и не могу понять в чем дело.
Блок простейший:
FUNCTION_BLOCK Test_In_Out
VAR_IN_OUT
test: INT := 0;
END_VAR
IF test<32000 THEN
test:=test + 1;
ELSE
test:= 0;
END_IF
Вызов:
VAR
Test: Test_In_Out;
Test_var: INT:=0;
END_VAR
Test(test:=Test_var); Такой вариант работает на 3.5 и не работает на 2.3 (на 2.3 test работает как входная переменная)
единственный вариант заставить работать это после вызова блока дописать
Test_var:=Test.test; Но это противоречит сути этой переменной и компилятор в 3.5 выдает ошибку. а на 2.3 нормально запускается....
В чем может быть дело?
Добрый день.
Приведенный вами код не должен компилироваться в 2.3 из-за попытки инициализации VAR_IN_OUT переменной.
Вложение 60016
Если убрать начальное значение - то программа компилируется и корректно работает.
В версии V3.5 конкретно этот же код не вызовет ошибок, потому что там компилятор несколько более продвинутый - он видит, что вы пытаетесь инициализировать переменную нулем (а это дефолтное поведение), и вообще не генерирует никакого кода для этого случая. Но если бы вы заменили 0 на любое другое число - то ошибка бы проявилась и в V3.5.
Вложение 60017
Спасибо, но мой компилятор не выдает ошибку и блок не работает. Переменная не работает как IN_OUT! Работает нормально только если после вызова блока добавить Test_var:=Test.test; Но ведь компилятор должен ругаться на такое обращение к переменной IN_OUT?
PS: Может это связано с версией codesys? У меня какой-то кривой, видимо, codesys 2.3, я на нем программирую только chitic. Установил 2.3.9, а потом установщик chitic что-то изменил в нем, и теперь codesys запускается только ярлыком chitic.
Вот проект. Он сделан в среде, которая получилась установкой Версии 2.3.9 с вашего сайта, а потом запущен установщик от chitic, который устанавливает таргеты, но при этом он создает свой ярлык на codesys и codesys запускается только с этого ярлыка...
также во вложении установщик от chitic
Нет, у меня много чего есть. Весовые терминалы, модули ввода/вывода, модемы с облаком и 210е контроллеры. Но это все не имело отношения к версии codesys 2.3.
компания ЛИТ (но закупки могут быть от разных фирм). Последняя покупка была 210тых, но пока еще не пришла. Я категорически против 2.3, так как когда-то бодался с ним уже на итоне (xsoft. лет 15 назад). Я за 210ый и 3.5, но меня ставят перед фактом...
ЗЫ:
собственно по понятным причинам ален, сименс, бр и шнайдер сейчас не в моде
Добрый День, приобрел ПЛК110-60 М02 к нему подключен модуль дискретных выводов МУ210-401, к выходу модуля подключены драйверы которые управляют гибридными ШД вопрос заключается в том, что мне нужно программно включить двигатель на определенное количество импульсов дабы ШД повернулся на определённое количество оборотов и тд, получается так что выход модуля настроен на генератор импульсов и программа рассчитывает количество импульсов и задает на выход и выполняет то что нужно, но поскольку программа читается циклично то и выполнение поворотов не останавливается, а мне требуется чтобы после нажатия кнопки он повернулся на рассчитанное количество импульсов и остановился, потом если потребуется заново повторить, подскажите пожалуйста как это можно осуществить?
Вложение 60039
IF in27=1 THEN
Lz:=Rz;
Ri:=Lz*10;
H:=500/ABS(Lz*10-37.5);
kol_vo_imp:= H*800/5;
okr:= REAL_TO_INT(kol_vo_imp);
itog:= INT_TO_WORD(okr);
IF Ri>44 AND Ri<350 AND in28=1 THEN
sh1:=itog;
END_IF;
sh3:=0;
bm.3:=0;
bm.4:=0;
END_IF;
Здравствуйте, разрабатываю программу для контроллера в Codesys 2.3 и визуализацию в СП300 Конфигуратор. на руках ни контроллера ни панели нет. Можно ли организовать связь между ними. Какой-то эмулятор контроллера и modbus rtu?
Программу ПЛК и программу в конфигураторе (кроме макросов) можно проверить в эмуляции без подключения.
Можно использовать виртуальный контроллер PLC Win NT V2.4 (используется для проверки работы некоторых биб-тек, которые не работают без контроллера или к Скаде) и виртуальную панель в Онлайн эмуляции, но связать их не получится.
Виртуальную панель в Онлайн включении можно подключить только к реальному ПЛК (только панель мастер, Модбас RTU и только 30 минут).
Вам надо поискать похожие темы и почитать для начала, https://owen.ru/forum/showthread.php?t=35829
https://owen.ru/forum/showthread.php?t=23013
https://owen.ru/forum/showthread.php?t=35875
https://owen.ru/forum/showthread.php?t=22169&page=45
Здесь пример: Примеры для ПЛК1хх
16 Работа с быстрыми входами/выходами по прерыванию высокочастотного таймера https://owen.ru/product/codesys_v2/example_program
Здравствуйте,
Помогите пожалуйста понять)
Кратко:
Пр 200 на экране создаю ввод и отдельно вывод переменной с плавающей запятой, загружаю в прибор, соединяю с плк, в плк создаю глобальную переменну одно для вывода то что я прописал на экране плк, а вторую что бы задать из codesis в режиме онлайн на пр200
Ввожу на приборе пр к примеру 21,8 в переменной плк показывает 2.730196е+023
Как добиться , что бы я на пр 200 задал 21,8 и что бы в codesis показало21,8???
Я пробывал real_to_int и real_to_word и int, фигня!
Так же попробовал из библиотеки oscat real_to_strf конвертирует real с плавающей запятой в значение стринг с плавающей запятой.
Так же попробовал fract
Конвертирует значение с плавающей точки в дробь! ,не помогла , не то
Такая же ситуация когда я отправляю значение из codesis в пр, к примеру прописываю 25,6 , в по пишет ноль, копирую и вставляю
2.730196е+023, там показывает 21,8...
Как конвертировать это значение в понятные?
При передачe Float ( вещественная с плавающей запятой), адрес указывается первого регистра, например Float - регистры 512,513, адрес будет 512.
В ПЛК Float должен быть с чётным адресом. Тут важен порядок регистров, при передаче по модбас они меняются местами.
Для правильного отображения:
Если ПЛК мастер, то в UMD ( Универсал модбас девайс), поменять в параметрах Trase_Mode на Native.
Если ПР мастер, снять (поставить) в настройках галку "Переставить регистры", галку "Переставить байты" снять.
Так же можно использовать функциональный блок, для перестановки местами регистров. Пример выкладывал тут https://owen.ru/forum/showthread.php?t=36062
А вообще то флоаты гонять по модбас не обязательно, для температур, давлений можно флоат умножить на 10 или 100 и конвертировать в INT, передать через 1 регистр, а при получении INT, разделить на 10.0, 100.0, получив флоат с нужным количеством знаков после запятой.
Здравствуйте! При наличии внешних модулей в сети Modbus-RTU, какие можно использовать дискретные методы записи булевых значений в регистры внешних модулей помимо использования таймеров?
Напр., нужно замкнуть сухой контакт на внешнем модуле, но только чтобы в регистре кратковременно появилась логическая единица, а не постоянно замкнутый контакт. Если вы сами используете именно таймеры, дайте знать пожалуйста!
ээээээ....ничего непонятно.
Что такое "внешние модули"? входА? выхода?
что такое "замкнуть сухой контакт на внешнем модуле"? чтобы сработал выходной канал на модуле вывода?
откройте интернет, и найдите описание F триггер (Falling Edge detection) и R триггер (Rising Edge detection) , прочтите как они работают, после этого найдите их в библиотеке кодесис и используйте в вашей программе
Элемент R триггер формирует короткий импульс по переднему фронту.
Элемент F триггер формирует короткий импульс по заднему фронту.
Если вход замкнуть, то в регистре этот бит будет 1 до размыкания. А уже в программе вы можете вставить R триггер, для формирования короткого импульса.
Но в блоке сухой контакт, вам потом всё равно надо разорвать, чтобы сработало в следующий раз, если это нужно.
Переформулию вопрос. На несколько циклов работы программы нужно создать импульс TRUE установленной продолжительности в мсек. Я использую таймер TP, что мне кажется слишком топорным. Есть ещё какие способы?
Спасибо за ответы!
Спасибо за ответ.
Можно ли поставить пароль на чтение программы из контроллера? Среда CoDeSys V2.3
Верхние два поля это на чтение программы из контроллера?
Понял! Большое спасибо!
Добрый День, имеется ПЛК110[M02] к нему купил модуль аналоговых входов МВ110 подключенный через RS-485, все работает отлично, вижу сигналы с датчика в программе, так как измеряю ток переменный требуется действующее значение тока, подскажите пожалуйста как обработать сигнал с датчика тока что бы я мог наблюдать действующее значение тока, а не скачущее амплитудное значение?
Ты сейчас меришь не амплитудное, а мгновенной значение тока. Если сможешь найти амплитудное значение, то действующее значение можно будет вычислить по формуле. I = 0,707 * Im. Организуй в программе ПЛК поиск максимума в непрерывной выборке измеряемой величины и в конце концов найдешь максимальное значение.
Периодически максимум надо сбрасывать и искать по новой.
Здравствуйте, собираю щит на оборудование eaton с использование SmartWIre DT, имеются частотники dc1 подключенные через DX-NET SWD3. Использую стандарные профили для управления по SWD. Нужно вывести ток частотника через codesys v2, для этого нужно использовать ациклические данные, но я не понимаю как ими пользоваться. Если кто встречался с таким оборудованием, прошу помощи.