速度によって出力を変​えるリレーのプログラ​ムを作りたいです

6 views (last 30 days)
克弥 山崎
克弥 山崎 on 4 Nov 2023
Edited: Atsushi Ueno on 5 Nov 2023
リレーの切り替えが速度によって出力が変わるプログラムを作りたいです。
ただし条件が3つあるのですが3つ目の条件がうまくいきません。
1:速度u1が0.2以上の場合リレーがONになりu1に1295をかけてを出力。
2 :速度u1が0になった時リレーがOFFになりu1に30をかけて出力。
3 :1つ前のステップで1295を出力している場合0.2~0の場合もリレーがONになりu1に1295をかけて出力。
それ以外はu1に30をかけて出力。
写真の色がついてるか所でリレーがONの状態になってほしいです。プログラムの問題点がわかる方いらっしゃいましたらご回答お願いします。
                               
function y = fcn(u1)
% リレーON/OFF状態のフラグ
relay_on = false;
for k = length(u1)
% 条件1
if u1(k) == 0.0001
y = u1(k)*30;
relay_on = false;
%条件2
elseif ~relay_on && abs(u1(k)) >= 0.2
y = u1(k)*1295;
relay_on = true;
%条件3
elseif relay_on
y = u1(k)*1295;
else
y = u1(k)*30;
end
end

Answers (1)

Atsushi Ueno
Atsushi Ueno on 5 Nov 2023
>プログラムの問題点がわかる方いらっしゃいましたらご回答お願いします
  • 浮動小数点数の等号==による判定は危険なので、不等号で判定すべきです
  • 仕様およびプログラムにおいて絶対値の有無が統一されていません
  • for 文を回して計算する出力 y に引数が無い為、毎回スカラ値を上書きしてしまいます
  • for k = length(u1)ではループが1回しか回らないのでfor k = 1:length(u1)とすべきです
u1 = 0.3 * sin(0:pi/100:4*pi);
tm = 0:length(u1)-1;
y = fcn(u1);
yyaxis left
plot(tm,u1);
xlabel('時刻 [単位未指定]')
ylabel('速度u1 [単位未指定]')
yyaxis right
plot(tm,y);
ylabel('リレー出力電圧 [単位未指定]');
function y = fcn(u1)
% リレーON/OFF状態のフラグ
relay_on = false;
for k = 1:length(u1)
% 条件2 :速度u1が0になった時リレーがOFFになりu1に30をかけて出力
if abs(u1(k)) <= 0.0001
y(k) = u1(k)*30;
relay_on = false;
%条件1:速度u1が0.2以上の場合リレーがONになりu1に1295をかけてを出力
elseif ~relay_on && abs(u1(k)) >= 0.2
y(k) = u1(k)*1295;
relay_on = true;
%条件3 :1つ前のステップで1295を出力している場合0.2~0の場合もリレーがONになりu1に1295をかけて出力
elseif relay_on
y(k) = u1(k)*1295;
else %条件3 :それ以外はu1に30をかけて出力
y(k) = u1(k)*30;
end
end
end
  1 Comment
Atsushi Ueno
Atsushi Ueno on 5 Nov 2023
Edited: Atsushi Ueno on 5 Nov 2023
関数 (simulink ブロック)が「スカラ入力・スカラ出力」なら、下記の様にします。
u1 = 0.3 * sin(0:pi/100:4*pi);
tm = 0:length(u1)-1;
for k = 1:length(u1)
y(k) = fcn(u1(k));
end
function y = fcn(u1)
persistent relay_on;
if isempty(relay_on)
relay_on = false;
end
if abs(u1) <= 0.0001
y = u1*30;
relay_on = false;
elseif ~relay_on && abs(u1) >= 0.2
y = u1*1295;
relay_on = true;
elseif relay_on
y = u1*1295;
else
y = u1*30;
end
end

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!