2017-07-17 3 views
1

間隔を空けて1秒間、または30秒間を少し上回る出力が必要なサブシステムが必要です。 MATLABコードで書かれSimulink - 30秒ごとに1を出力し、それ以外の場合は0を出力します。

それはulplinkTimeIntervalは30秒であること

function y = fcn(time,uplinkTimeInterval) 

%#codegen 

persistent lastTriggerTime 

if isempty(lastTriggerTime) 

    lastTriggerTime = 0; 

end 

if time>=lastTriggerTime || time == 0 

    y = 1; 

    lastTriggerTime = time + uplinkTimeInterval; 
else 

    y = 0; 

end 

end 

のように動作するはずです。もちろん、私はこのコードでmatlab関数ブロックを使用しようとしましたが、何らかの理由で動作しません(デバッグモードでは、yは値1をとりますが、ブロック外の値を出力しないことがわかります)。私はブロックを使用したかったが、どうやってそれをするのか分からない。

ご協力ありがとうございます

答えて

2

このロジックは、コードやブロックで比較的簡単に作成できます。ブロックを使用してソリューションをリクエストしたので、ここにあります!

block diagram

  • memoryブロックを使用する代わりに、0
  • 1を得たれる間隔(秒単位)を決定するための時間を追跡するclockブロックを使用し、そしていくつかのconstantブロックclock信号を1タイムステップだけ遅らせて、連続するステップの値を比較することができます。
  • 間隔を時間で割り、小数点以下を切り捨てると、が多く、の間隔が経過しています。
  • 最後に、relational operatorを使用して、連続する「渡されたインターバル数」を比較します。上の行でより多くの間隔が経過した場合は、間隔しきい値を踏んだだけです。

注:これはあなたが持っている個々のタイムステップで新しい間隔を渡り、1れていないすべての時間ステップのために0を返します。出力の精度は、モデルのステップサイズによって異なります。


編集:は、それはあなたが一度だけ丸め/除算を行っているので、ちょうど、floorブロックの後memoryブロックを追加する/明確方が簡単かもしれません。以前のタイムステップと比較することができます。それは次のようになります。

2nd option

0

これを行う最も簡単な方法は、1、30秒ごとの「高」に設定1つだけPulse Generatorブロック、です。それは下の画像の一部として示されています。ブロックダイアログで指定された期間の割合に関係なく、信号はハイになります。

何らかの理由で本当にサブシステムを使用する必要がある場合は、トリガーおよび有効サブシステムを使用します(画像の右上を参照)。同じパルス信号をトリガポートとイネーブルポートの両方に入力し、サブシステム内の出力ポートをOutput when disabledresetに設定し、Initial Output0に設定します(画像の右下を参照)。

以下のモデルは、これを行う方法を示しています。この場合、パルスは30秒の周期で設定されており、立ち上がりエッジはその周期の1%ごとに発生します(画像の左上を参照)。

出力信号(トリガを立ち上がりエッジに設定されていると仮定)。つの時間ステップのための入力が立ち上がるたびに高くなり

Simulink Model

関連する問題