Если ПР слейв, то вход останется TRUE, и выходные переменные останутся как до отключения панели.
Вид для печати
Спасибо. Буду пока програмку дома кодить.
Спасибо за совет. Просто я думал, если входной сигнал пропадёт то триггер будет запоминать последнее состояние входа.
Чтобы триггер запомнил состояние, он должен быть энергонезависимый. Схемы таких триггеров, скрин Вложение 79921
На ST, входная и выходная переменная должна запоминаться вне блока. Если триггеров много, то запоминать маской бит.
Появился ещё один вопрос. У меня в проекте есть несколько ПР200 с идентичными программами. Отличаются только адресом Cam. для каждого приходится создавать отдельное окно и в нём переназначать номера регистров.
Может быть есть какой то способ использовать одно окно и из него обращаться к разным ПР200?
Доброй ночи.
Прошу помощи в следующем вопросе:
Хочу сделать ФБ для имитации токового датчика (температуры или другого какого типа). Смысл в том, что бы можно было имитировать работу датчика вращая энкодер.
Собственно говоря частично получилось. На выходе целые числа 0 1 2 3 и тд. Если это считать милиамперами, то регулировка получается грубой. Если сделать счёт такой: 401 402 403 и потом всё разделить на 10, то получается приемлемо, но до 4 мА долго крутить ручку.
В ФБ я сделал 2 варианта подсчёта с множителями х1 и х10.Переключение по кнопке энкодера. Только почему то при переключении накопленное значение меняется либо на 1 либо на 10. Подскажите как решить вопрос. Чего то я не знаю ещё.
На выходе мне нужно число с плавающей запятой с точностью до десятых в пределах 4,0 --- 20,0 и что бы по нажатию кнопки менялись либо десятые либо единицы.
Код:function_block encoder_1_
var_input
in_1 : bool;
in_2 : bool;
reset : bool;
end_var
var_output
Q_int : udint;
Q_float : real;
end_var
var
in_1_rt : SYS.RTRIG;
in_2_rt : SYS.RTRIG;
in_1_tof : SYS.TOF;
in_2_tof : SYS.TOF;
ctn : SYS.CTN;
reset_ctn : SYS.CTN;
mul_ctn : udint;
res_int1 : udint;
res_int2 : udint;
res_1 : udint;
res_2 : udint;
stop_u : bool;
stop_d : bool;
ctn_r : bool;
end_var
(*код программы*)
in_1_tof(I := in_1 T := t#100ms); in_1_rt(i:=in_1);
in_2_tof(I := in_2 T := t#100ms); in_2_rt(i:=in_2);
reset_ctn(U := reset, R := reset_ctn.Q = 2 N := 0);
if reset_ctn.Q = 0 then mul_ctn := 1;
elsif reset_ctn.Q = 1 then mul_ctn := 2;
else mul_ctn := 0;
end_if
case mul_ctn of
1:
ctn(U := in_1_rt.Q and not stop_u and not in_2_tof.Q, D := in_2_rt.Q and not stop_d and not in_1_tof.Q);
stop_u := ctn.Q = 200;
stop_d := ctn.Q = 0;
res_int1 := ctn.Q;
2:
ctn(U := in_1_rt.Q and not stop_u and not in_2_tof.Q, D := in_2_rt.Q and not stop_d and not in_1_tof.Q);
stop_u := ctn.Q = 20;
stop_d := ctn.Q = 0;
res_int2 := ctn.Q*10;
end_case
//дальше я не понимаю как сделать
res_1:=res_int1; res_2:=res_int2;
Q_int := res_1 + res_2;
Q_float := udint_to_real(Q_int/10);
Попробуйте так:
Дискретность изменения выхода задаётся на одном из входов блока (N) - можете сами прикрутить туда то, как хотите её изменятьКод:function_block encoder_1_
var_input
in_1 : bool;
in_2 : bool;
reset : bool;
N: real := 0.1;
end_var
var_output
count : real := 4;
end_var
var
in_1_rt : SYS.RTRIG;
in_2_rt : SYS.RTRIG;
in_1_tof : SYS.TOF;
in_2_tof : SYS.TOF;
end_var
in_1_tof(I := in_1 T := t#100ms); in_1_rt(i:=in_1);
in_2_tof(I := in_2 T := t#100ms); in_2_rt(i:=in_2);
if reset then count := 4.0;
else
if in_1_rt.Q and not in_2_tof.Q then count := count + N;
elsif in_2_rt.Q and not in_1_tof.Q then count := count - N;
end_if
end_if
if count > 20.0 then count := 20.0; end_if
if count < 4.0 then count := 4.0; end_if
end_function_block
Спасибо. Ваш вариант проще.
Буду экспериментировать.
Может быть есть смысл подсчёт вести не в целых числах, а десятичных и прибавлять/вычитать либо 1 либо 0.1 и это как то переключать....
А по ресету устанавливать 12мА - середину диапазона.
Надо пробовать разные варианты.