- 浮動小数点数の等号==による判定は危険なので、不等号で判定すべきです
- 仕様およびプログラムにおいて絶対値の有無が統一されていません
- for 文を回して計算する出力 y に引数が無い為、毎回スカラ値を上書きしてしまいます
- for k = length(u1)ではループが1回しか回らないのでfor k = 1:length(u1)とすべきです
速度によって出力を変えるリレーのプログラムを作りたいです
1 回表示 (過去 30 日間)
古いコメントを表示
リレーの切り替えが速度によって出力が変わるプログラムを作りたいです。
ただし条件が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
0 件のコメント
回答 (1 件)
Atsushi Ueno
2023 年 11 月 5 日
>プログラムの問題点がわかる方いらっしゃいましたらご回答お願いします
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 件のコメント
Atsushi Ueno
2023 年 11 月 5 日
編集済み: Atsushi Ueno
2023 年 11 月 5 日
関数 (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
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!