Ага уже увидел это нюанс , вроде удалось подобрать усредненное значение
Вид для печати
Ага уже увидел это нюанс , вроде удалось подобрать усредненное значение
По просьбе Эдуарда "перевел" на ST проект от amm http://www.owen.ru/forum/showthread....l=1#post157526
Вложение 16035
Теперь из этого сделал один ФБ "clock_week".
Пример использования
Вложение 16036
Спасибо большое!!!
При открытии нового проекта в закладке КОНФИГУРАЦИЯ КОНТРОЛЛЕРА отсутствуют типы контроллеров. Что делать? Подскажите, пожалуйста, подробно.
А в настройках целевой платформы не пробовали?
Вложение 16042
Может просто таргет файлы забыли установить?:)
Здравствуйте, подскажите, возможно ли настроить связь CoDeSys с виртуальным симулятором ПЛК, например, таким http://www.plcsimulator.org/Home
petera, ну так введите on_Hour = 23, of_Hour = 2, текущий час = 1 (все дни разрешены)
RV9WFJ наверное об этом.
Хотя дополнительный алгоритм не нужен. Нужна легкая модификация существующего.
С уменьшением кол-ва строк ессно ))
Первоначальный код вообще то был не мой.
Поправил
Вложение 16078
Вложение 19051
Всем Доброго утра! С Новым Годом! С Рождеством!
Есть вопрос. Поиск по форуму результата не дал :(
Мне необходимо с определённой периодичностью (допустим каждую секунду) из одного значения (допустим А), вычитать второе значение (допустим В), пока А не станет равно 0 (ноль). Подкиньте мысль как реализовать???
Спасибо!!!
P.S. .... забыл добавить .... программу "пишу" на CFC
Если А и Б не кратны - можно и не реализовать никогда )))
Есть оператор sub (можно в имени блока просто поставить знак "-").
Для проверки и отчета времени добавляем условие - "таймер отсчитал интервал времени" и "значение меньше или равно нужного", тогда выполнить блок sub.
Хватит КЭПствовать :)
Но Валенок прав. Лучше проверять не больше или меньше, а больше или равно, или, меньше или равно.
Как-то так
Вложение 16138
А если А и Б не кратны можно так:
Вложение 16139
Братцы.... СПАСИБО БОЛЬШОЕ!!!! Есть теперь с чем поработать!!! :)
Нужна помощь!
Есть переменная типа REAL, которая изменяется со временем по определенному закону, по происшествии заданного интервала времени сбрасывается в 0 и вновь меняется.
Требуется каждую минуту записывать значение этой переменной так, чтобы после сброса на ноль сохранилась последняя запись.
Как это реализовать?
Это должна быть одна переменная или массив из переменных после каждого сброса на ноль?
если одна переменная то можно так:
t1(in:=TRUE, pt:=T#60s);
IF t1.Q AND a1<>0 THEN
b1:=a1;
t1(in:=FALSE);
ELSIF a1=0 AND fl THEN
c1:=b1;
fl:=FALSE;
END_IF
где a1 - заданная переменная типа real, b1 - переменная типа real, в которую записывается значения каждую минуту, t1 - таймер TON, с1 - переменная типа real, в которую записывается последнее значение перед сбросом на ноль переменной a1, fl - флаг, по которому происходит запись в переменную c1, используется если необходимо сохранить только первое значение перед сбросом на ноль, при объявлении fl:bool:=true;, если необходимо сохранить последнее значение, то не используйте этот флаг, удалите соответствующие строки.
если нужно записать массив значений, то как-то так:
t1(in:=TRUE, pt:=T#60s);
IF t1.Q AND a1<>0 THEN
b1:=a1;
t1(in:=FALSE);
ELSIF a1=0 THEN
ar[i]:=b1;
i:=i+1;
ELSIF i=11 THEN
i:=0;
END_IF
где a1 - заданная переменная типа real, b1 - переменная типа real, в которую записывается значения каждую минуту, t1 - таймер TON, ar - массив из переменных типа real, в которые записывается последнее значение перед сбросом на ноль переменной a1, i - указатель на элемент массива при записи.
при написании программы блоки переименовываются только в ручную хотя должен быть ассистент ввода подскажите как его установить?
Вы о чём? Вызываемый по F2 ассистент ввода во втором кодесисе позволяет только вводить уже объявленное, а не переименовывать. Возможностей переименования символов я в этой версии не припомню (в третьей вроде есть).Цитата:
при написании программы блоки переименовываются только в ручную хотя должен быть ассистент ввода подскажите как его установить?
спасибо вот то что надо задача была установленный блок переименовать
Добрый день. Изучаю в свободное время плк110-60 и кодесис естественно.
Купили модули аналогового ввода/вывода му110-8и и мв110-8а.
Согласно РЭ и видео из интернетов подключил и настроил, но работает у меня только AI, на AO не моргает индикатор rs485? обмена нет.
Идея простая, на 1 вход подцеплен пт100, его показания читаются и в программе видны, дальше хочу вывести с 1 выхода на ИТП1 сигнал.
Программу приложил. Прошу помощи, что нет так.
ps в конфигурации плк? где я добавил модбас мастер попеременно моргают оба нужных мне адреса (last adress) 15 и 16. last error 81
acs.ufk - Почему у вас на выходе REAL ?, у 8И по РЭ INT16 от 0 до 1000, единица измерения в % 0,1%, следователь 1000*0,1 = 100%
И не обязательно вбивать регистры в виде 0000, достаточно 0.
Всем привет!
После выполнения арифметических действий результат имеет дробное значение с пятью знаками после запятой. Каким образом убрать дробные значения??? Программирование ведётся на CFC. Спасибо!
Всё... сам нашёл решение .... вопрос снимается....
Если только целую, то для преобразования Real в INT используйте оператор TRUNC (см. справку) только TRUNC просто отбрасывает дробную часть без округления целой части.
Если нужно в Real уменьшить число знаков после запятой, то В библиотеке OSCAT есть ф-ция ROUND(in,N), выгядит она почти так:
Код:VAR_INPUT in : REAL;
N : INT;
END_VAR
VAR
X: REAL;
DECADES : ARRAY[0..8] OF REAL := 1.0,10.0,100.0,1000.0,10000.0,10000.0,100000.0,1000000.0,10000000.0;
END_VAR
X :=DECADES[LIMIT(0,N,8)];
ROUND := DINT_TO_REAL(REAL_TO_DINT(in * X)) / X;
Спасибо за подсказку.
Я сделал преобразование REAL_TO_WORD.
Спасибо!
По работе алгоритма, .... при достижении значения = 0, работа останавливается, по сему отрицательных значений не будет.
всем здрасте, видел как то в что кодесис функциональные блоки описание на отечественном языке были , где их взять?
Файл на диске CoDeSys_V23_RU.pdf или на сайте
нее там прямо в программе