Доброй ночи.
Прошу помощи в следующем вопросе:
Хочу сделать ФБ для имитации токового датчика (температуры или другого какого типа). Смысл в том, что бы можно было имитировать работу датчика вращая энкодер.
Собственно говоря частично получилось. На выходе целые числа 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);