Курсовая... А с одним нельзя сделать никак ? =( Хотя бы чего-нибудь...:( Пожаалуйста
Вид для печати
Добрый день господа , подскажите пожалуйста как работать с библиотекой Work_mode.lib
Нужно значение анал. сигнала показать на экране
попробывал так ShowReal(1, 1, 1, '%2.1f', Value)
но все равно на экране нету цифры. помогите!
Добрый день!
Не могу настроить «Конфигуратор виртуальных портов на (Windows 7 профессиональная) Программа устанавливается без ошибок, находит ЕКОН134 но тут же вылетает. Ест видео — вот ссылка (https://drive.google.com/open?id=0B9...DVJYktUZTdmT3M)
Народ, добрый день... Никак не пойму: Как считать системное время с контроллера ПЛК110(М02)-60. Задача: нужно каждые 10 минут выводить количество деталей с указанием времени этого события.
С помощью библиотеки SysLibTime.lib
Например
Вложение 31117Код:FUNCTION_BLOCK REAL_TIME
VAR_INPUT
END_VAR
VAR_OUTPUT
current_time: TOD; (*Текущее время*)
current_date:DATE; (*Текущая дата*)
current_day: INT; (*Номер дня в году*)
END_VAR
VAR
CurTimeExInst: CurTimeEx;
CurSystemTimeDate: SystemTimeDate;
CurSysTime64: SysTime64;
year: INT;
second: INT;
day: INT;
hour: INT;
minute: INT;
month: INT;
count: INT;
END_VAR
VAR CONSTANT
nulldt: SystemTimeDate;
END_VAR
(*Получить текущее время и дату*)
CurSystemTimeDate:=nulldt;
CurTimeExInst(TimeDate := CurSystemTimeDate, SystemTime := CurSysTime64);
year :=CurSystemTimeDate.Year;
month :=CurSystemTimeDate.Month;
day :=CurSystemTimeDate.Day;
hour :=CurSystemTimeDate.Hour;
minute :=CurSystemTimeDate.Minute;
second :=CurSystemTimeDate.Second;
IF year =0 THEN
year :=1970;
month :=1;
day :=1;
END_IF
(*собираем часы, минуты и секунды в одну кучу - в миллисекунды*)
current_time:=DWORD_TO_TOD((INT_TO_DWORD(Hour) * 3600
+ INT_TO_DWORD(Minute * 60)
+ INT_TO_DWORD(Second))*1000);
(*Вычислить дату с учетом високосных лет*)
IF month > 2 THEN
count := (month - 1) * 30;
IF month > 7 THEN count := count + SHR(month - 3,1);
ELSE count := count + SHR(month - 4,1); END_IF;
(* проверить на високосный год и добавить один день если год високосный *)
IF SHL(year,14) = 0 THEN count := count + 1; END_IF;
ELSE
count := (month - 1) * 31;
END_IF;
current_date:=DWORD_TO_DATE((INT_TO_DWORD(count + day - 1)
+ SHR(INT_TO_DWORD(year) * 1461 - 2878169, 2)) * 86400);
current_day:= DAY_OF_YEAR(current_date);
Для вычисления номера дня в году здесь нужна такая функция
Код:FUNCTION DAY_OF_YEAR : INT
VAR_INPUT
IDATE : DATE;
END_VAR
DAY_OF_YEAR := UDINT_TO_INT((DATE_TO_UDINT(idate) / UDINT#86400) MOD UDINT#1461);
IF DAY_OF_YEAR > 729 THEN
IF DAY_OF_YEAR > 1095 THEN DAY_OF_YEAR := DAY_OF_YEAR - 1095; ELSE DAY_OF_YEAR := DAY_OF_YEAR - 729; END_IF;
ELSIF DAY_OF_YEAR > 364 THEN
DAY_OF_YEAR := DAY_OF_YEAR - 364;
ELSE
DAY_OF_YEAR := DAY_OF_YEAR + 1;
END_IF;
Впал в ступор от простейшей задачи управления светом. После полдня мучений создал вот такую конструкцию:
Вложение 31176
Она работает только благодаря "костылю" в виде посторонней переменной, которая синхронизируется со светом в другом месте программы.
Дело в том, что этот переключатель нужно оформить в виде ФБ чтобы использовать многократно и эта переменная там ни к чему.
Подскажите пожалуйста: как на CFC сделать без костыля?
Видимо на языке типа ST это проще и правильнее, но я его пока не освоил.
Для меня проще на CFC, сделайте так.
Вложение 31178
Спасибо за ответ!
Но честно говоря просветления не наступило :(
При чем здесь ИЛИ - не понимаю?
Мне представляется, что для моей задачи нужна бы конструкция типа If ... Then ... Else.
Если свет горит - переменную Light установить в TRUE, если нет - сбросить в FALSHE.
Моя беда в том, что я не понимаю какой блок на CFC применить для этого?
Или все не так совсем: растолкуйте пожалуйста.
Upd:
Голова сообразила наконец, что если добавить задержку во вторую часть блока, чтобы прошел цикл, блок начинает работать.
Вложение 31220
Только это тоже костыль. Поэтому вопрос остается открытым: "какая конструкция на CFC соответствует логике If ... Then ... Else?
Добрый день господа, подскажите пожалуйста как увеличить частоту опроса аналогового входа на ПЛК 73 ????
сигнал меняется очень быстро а результат я вижу спустя 2 секунды. Буду признателен
Вот вам без всяких костылей.
Вложение 31223Вложение 31224Вложение 31225Вложение 31226и это не ИЛИ, а ИСКЛЮЧАЮЩЕЕ ИЛИ.
Берем паспорт и смотрим характеристики, время опроса аналоговых входов. И получаем что у вас вполне нормальный результат если вы все входы задействовали. Ускорить можно только путем уменьшения опрашиваемых входов.
Теперь я попробую объяснить. Логическая операция исключающее ИЛИ (XOR)
Вложение 31239
Применение в такой виде будет означать:
если А=1 и В=1, то В=0
если А=1 и В=0, то В=1
если А=0, то В не меняется
Вопрос:
Подскажите пожалуйста, есть ли в КДС какой-либо ФБ, который выполняет функции измерителя скорости. Т. е. задача состоит в том, что на одном из входов нужно считать импульсы за определенный интервал времени. Контрольный интервал - 1 минута, частота импульсов - до 300 имп\мин. Да, я могу написать это с помощью стандартных ФБ, но не хотелось бы изобретать велосипед.
Добрый день всем!
Поставил Codesys с сайта ОВЕН, но в нем не запускается ни один пример с того же сайта. Точнее, примеры загружаются и открываются, но программа пустая. Таргеты все поставил, библиотеки тоже, русский язык настроил. В чем может быть причина?
Спасибо!
Codesys с сайта ОВЕН какая версия 2.3?
Прошу прощения, да, 2.3.
Попробовать перезагрузить ПК, если нет переустановить кдс, ОС какая?
Win 7 x64. Странно, ни одной ошибки не выдавал, перезагрузить пробовал, не помогло.
Попробовать создать новый проект, при выборе плк обратть внимание таргеты плк установились?
Доброе утро!
Сегодня проверил. Встроенные в кодесис проекты открываются без проблем. Созданные проекты также сохраняются и открываются.
Такое ощущение, что галочка где-то не проставлена.
А может они не пустые, а там ; стоит? Можно их вручную с Рабочего стола поместить в папку Проекты CoDeSys, туда где находятся рабочие проекты, тогда наверняка откроются..
Есть генератор случайных чисел. Подскажите пожалуйста, можно ли сделать так чтобы число генерировалось 1 раз при запуске программы и больше не генерировалось.
FUNCTION_BLOCK RNG (* Генератор случайных чисел *)
VAR_INPUT
LOAD: BOOL;
X0: USINT := 1;
END_VAR
VAR_OUTPUT
X: USINT := 1; (* Случайное число *)
END_VAR
VAR
RESET: R_TRIG; (* Экземпляр ФБ R_TRIG *)
END_VAR
===================================
RESET(CLK := LOAD);
IF RESET.Q THEN X := X0; END_IF
X := X *10 - 11 * (X * 10/11);
Есть генератор случайных чисел. Подскажите пожалуйста, можно ли сделать так чтобы число генерировалось 1 раз при запуске программы и больше не генерировалось.
FUNCTION_BLOCK RNG (* Генератор случайных чисел *)
VAR_INPUT
LOAD: BOOL;
X0: USINT := 1;
END_VAR
VAR_OUTPUT
X: USINT := 1; (* Случайное число *)
END_VAR
VAR
RESET: R_TRIG; (* Экземпляр ФБ R_TRIG *)
END_VAR
===================================
RESET(CLK := LOAD);
IF RESET.Q THEN X := X0; END_IF
X := X *10 - 11 * (X * 10/11);
http://www.picshare.ru/uploads/17052...HOQN_thumb.jpg
Ускорить можно, если часть входов перенести на МВ110-8А и скорость опроса хорошую задать при опросе, и опрос групповой сделать. Но подключать через ModBus.lib придется.Цитата:
И еще была версия что можно с помощью МВ110 модуль ввода аналоговых сигналов ускорить!
Подскажите если есть информация по этим вариантам!
Заранее спасибо!
Вещица безусловно полезная, спасибо! Скажите, это ваша разработка?
К сожалению, для моей задачи не годится, т.к. переменная на выходе получается "привязана" к выходу out. А мне нужно чтобы ее можно было изменить в любом другом месте программы. Отсюда и мои извращения с Set/Reset.
XOR, который посоветовали Василий и Дмитрий, как нельзя лучше подходит в данном случае.
Еще раз спасибо всем откликнувшимся!
Я бы посоветовал использовать для этого Power status из модуля статистики. Он меняется при подаче питания.
Вложение 31315
Добрый день. Есть необходимость запилить пид-регулятор для электропривода шарового крана для плавной регулировки уровня в накопительной емкости по сигналу датчика уровня (или давления) 4..20 мА.
Хочу разобраться в применении пид из стандартной библиотеки util.lib.
На данный момент пока не понял назначение некоторых переменных.
Y_OFFSET - правильно ли я понимаю, что это смещение будет суммировано с вычисленным значением?
Y_MIN, Y_MAX - эти значения должны быть как то коррелировать с предельным рассогласованием, как их правильно высчитать?
Допустим, у меня уровень изменяется от 0 до 4 м.в.ст., тогда минимальное и максимальное воздействие будет +-4? Хотя, вряд ли такие значения можно получить с коэффициентами... тогда как?
Спасибо за участие.
PS. Жутко не хватает нормального описания функций, по типу описания API для операционных систем.
Y_OFFSET - правильно ли я понимаю, что это смещение будет суммировано с вычисленным значением?
Да, вы правильно понимаете
Y_MIN, Y_MAX - эти значения должны быть как то коррелировать с предельным рассогласованием, как их правильно высчитать?
Это пределы управления устройством. Например от 0 до 100%. Эти величины потом необходимо масштабировать в аналоговый выход
Спасибо за быстрый ответ. Я думал, что значения ACTUAL, SET_POINT, Y должны быть одной размерности, но судя по вашему ответу я ошибался. Получается, что именно Y_MIN, Y_MAX задают размерность величине Y?
Если на вход пида мы подадим ACTUAL:=400 (kPa), SET_POINT:= 200 (kPa) и Y_MIN, Y_MAX соответственно 0 и 100%, то на выходе мы получим какое-то значение в % от 0 до 100?
Будет 0, если пропорциональный коэффициент = 1(положительный), интегральный поставьте 10. Для начала
Подскажите пожалуйста, верно ли я расписал порт Modbus?
Задача состоит в том, что читать со слейва нужно постоянно, а писать в него только по изменению значений.
ПЛК110М2, слейв - Delta C2000.
Вложение 31451
Вложение 31452
Не могу посмотреть картинку, нет доступа, но общий принцип такой:
в модуле Universal Modbus device вы указываете время опроса Polling time в ms - это и будет частота, с которой функции чтения (InputModule) опрашивают ваш Slave.
С другой стороны, функции записи (output module) записывают значение переменной в указанный регистр только после его изменения, на то они и функции записи.