Делаю счетчик м/ч на ST. Необходима запись в переменные через экран. Проблема в том, что переменные участвует в цикле счетчиков. Пришлось создать дополнительные входы и панели ввода на экране.
Вид для печати
Делаю счетчик м/ч на ST. Необходима запись в переменные через экран. Проблема в том, что переменные участвует в цикле счетчиков. Пришлось создать дополнительные входы и панели ввода на экране.
Ну, как-то так
В ПРках энергонезависимые переменные записываются на флэшку только при потери питания
Забыл я про нееЦитата:
Вход SetOn, выход sOn не работают.
Вот допишите
Код:if Run then
if T-T1 >= 1000 then
Work := Work_ +1;
T1 := T;
end_if
cOn := cOn_ + bool_to_udint(RunTrig.Q);
sHour := Work / 3600;
sMin := (Work / 60) mod 60;
sSec := Work mod 60;
sOn := cOn;
else
Тоже самое, только в версии OWEN Logic2.6.345.
Жалко только, что при отключении питания ничего не сохраняется.
Да, мой косяк.
Исправил
Код:FUNCTION_BLOCK RunTime_Counter //имя функционального блока
VAR_INPUT //объявление входных переменных
Run : BOOL; //разрешение работы
Set : BOOL; //запись уставок времени
Res : BOOL; //сброс счетчиов
SetHour, SetMin, SetSec, SetOn: UDINT; //входы уставок
Work_ : udint; //Вход для энергонезависимоцй переменной наработки
cOn_ : udint; //Вход для энергонезависимой перееменной количество включений
END_VAR
VAR_OUTPUT //объявление выходных переменных
Work, cOn : UDINT; //выходы для энергонезависимых переменных
sHour, sMin, sSec, sOn: UDINT; //выходы времени и количества включений
END_VAR
VAR //объявление локальных переменных
T, T1: UDINT;
RunTrig : SYS.RTRIG;
init : BOOL:=true;
END_VAR
T:= TIME_TO_UDINT(GET_TIME());
if Init then //Инициализация при первом включении
Work := Work_;
cOn := cOn_;
SetHour := Work / 3600;
SetMin := (Work / 60) mod 60;
SetSec := Work mod 60;
SetOn:=cOn;
T1 := T;
Init := false;
end_if
RunTrig(I := Run);
if Run then
if T-T1 >= 1000 then
Work := Work_ + 1;
T1 := T;
end_if
cOn := cOn_ + bool_to_udint(RunTrig.Q);
sHour := Work / 3600;
sMin := (Work / 60) mod 60;
sSec := Work mod 60;
sOn:=cOn;
else
T1 := T;
sHour := SetHour;
sMin := SetMin;
sSec := SetSec;
sOn := SetOn;
if Set then
Work := sHour * 3600 + sMin * 60 + sSec;
cOn := sOn;
end_if
if Res then
sHour := 0;
sMin := 0;
sSec := 0;
sOn := 0;
Work := 0;
cOn := 0;
end_if
end_if
END_FUNCTION_BLOCK
А можно и в квадратиках
Ну вот. Не успел. А так сам хотел. За меня все сделали)
На блинк, будет время уходить, на ПР вообще не точные часы, а с блинком ещё хуже.
Как по мне, то работать со временем, с расчётами на ST намного лучше. Большой минус пока один, нельзя использовать энергонезависимые прямо в ФБ.
Надеюсь допилят.
По памяти, даже сравнивая последние 2 проекта, разница в 1% ПЗУ, на ST больше, как раз из-за вывода переменных за пределы ФБ.
Если блинк правильно приготовить, то с чего это времени уплывать?
Если кому не лень, можно устроить батл
Вложение 83268
И еще раз к вопросу целесообразности ротации оборудования по м/ч (заехал на вахту и могу поделиться живыми данными).
ДГУ работают периодически для заряда АКБ на установленных вдоль трубопровода блоках местной и дистанционной автоматики. В 9 из 10 блок-боксах на ДГУ я реализовал алгоритм ротации по м/ч. На 10-й, производства Элеси, простая поочередная ротация от Zelio. Количество активных ДГУ разное. Дельта - 24 м/ч.
https://owen.ru/forum/image/png;base...AASUVORK5CYII=
https://owen.ru/forum/image/png;base...AASUVORK5CYII=
1 2 3 4 5 6 7 8 9 ЭЛЕСИ 1797 1310 2240 2809 1313 1601 1927 1489 2871 1773 1785 1304 2236 2814 1302 1608 1924 1489 2861 2618 1921 1528
Именно возможность менять наработку и количество пусков (а так же выработку ЭЭ и т.д.) позволило перенести данные при замене контроллеров. Картина маслом..
P.S. В ситуации как у 8 агрегаты имеют приоритеты пуска.
Всё подтягивает, уже проверено) введите переменные на входе и нажмите Set. Вложение 83316
Наработку подтягивает автоматом.
Переменная Час обычная, у нее нет значения по умолчанию. Вычисляется она по переменной Work - вот она у нас энергонезависимая
Переменные дублируются. А как еще, если вы их выставляете по команде Set. Можно вообще без всех танцев обойтись, просто на экранчике поменять значения и всеЦитата:
2. SetOn, cOn дублируют друг друга. Достаточно как и со временем одной петли переменных.
Видать мне не лень было. В общем, показания счетчиков
Вложение 83354
А это сколько реально времени прошло
Вложение 83355
Код на ST
Код:function_block functionblock1
var_input
Enb : bool;
Res : bool;
end_var
var_output
Q : udint;
end_var
var
T1, T2 : udint;
end_var
T1 := time_to_udint(get_time());
if Enb then
if (T1 - T2) >= 1000 then
Q := Q+1;
T2 := T1;
end_if
else
T2 := T1;
end_if
if Res then Q := 0; end_if
end_function_block
Короче врут все, поэтому и беру счёт на счётчик прямо с изменения секунд. Так считает точно.
CTU1 (U :=ET<>ET_, N:=T_1, R:=x_ or Res OR R_Trig.Q, Q=>T1 );
ET_:=ET;
Таймер обратного_прямого отсчёта https://owen.ru/forum/showthread.php...l=1#post461025
Таймер обратного_прямого отсчёта_Запись наработки https://owen.ru/forum/showthread.php...l=1#post461734
В новом проекте созданный блок работает. Как на ST так и на FBD. При переносе в основной проект перестает работать ввод с экрана, появляются предупреждения о циклических связях..
Я многого жду от симулятора?
Предположу, что на циклические связи ругается, потому что переменные не энергонезависимые
А не работает ввод с экрана, потому что у переменных не задан параметр "запись в конце цикла"
Все получилось. Век живи.. Спасибо всем за помощь!