このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
パワー ウィンドウ コントローラーのモデル化
この例では、MATLAB® をアクション言語として使用する Stateflow® チャートと、App Designer で作成された MATLAB アプリの間のインターフェイスを作成する方法を説明します。C をアクション言語として使用する Stateflow チャートを MATLAB アプリに接続する方法の詳細については、Simulate a Media Playerを参照してください。
この例では、自動車のパワー ウィンドウ システムが、1 対のウィンドウ制御スイッチに応答して助手席側のウィンドウを上げ下げします。MATLAB アプリのスイッチは、運転席と助手席のドアのコントロールを表しています。アプリにはパワー ウィンドウ システムのステータスを監視する複数のインジケーター ランプと、ウィンドウの道筋に障害物を入れるためのボタンもあります。
Stateflow チャート App Interface
では、MATLAB アプリと、Simulink® モデルの制御およびプラント システムの間の双方向接続を使用できます。アプリのスイッチを新しい位置に向けると、チャートはこれに対応した "Up"、"Down"、または "Neutral" コマンドをパワー ウィンドウ制御システムに送信します。逆に、制御システムでステートが変更されると、チャートはアプリで対応するステータス ランプを有効または無効にします。
この例を実行するには、Simulink モデルを開いて [実行] をクリックします。チャート App Interface
がアプリを開き、パワー ウィンドウ システムの制御システムとプラント システムを初期化します。シミュレーションを停止するには、[停止] をクリックするか、アプリを閉じます。
チャートと MATLAB アプリとの接続
チャート App Interface
は、既に MATLAB アプリ sf_power_window_app
と通信するよう構成されています。MATLAB アプリと、MATLAB をアクション言語として使用する Stateflow チャートの間で双方向の接続を作成するには、以下の手順に従ってください。MATLAB アプリで、以下を行います。
シミュレーション中にチャートとのインターフェイスをとるカスタム プロパティを作成します。アプリはこのプロパティを使用してチャートの入力、チャートの出力、ローカル データにアクセスします。詳細については、App Designer アプリ内でのデータの共有を参照してください。
アプリの
startupFcn
コールバックで新しい入力引数を追加して、前のステップで作成したプロパティとしてその値を格納し、このコールバックを変更します。詳細については、App Designer のコールバックを参照してください。
Stateflow チャートで、以下を行います。
アプリとのインターフェイスをとるローカル データ オブジェクトを作成します。チャートがアプリで補助関数を呼び出すときに、このローカル データ オブジェクトを引数として使用します。
前のステップで作成したローカル データ オブジェクトのタイプを
Inherit: From definition in chart
に設定します。詳細については、Stateflow データの型の指定を参照してください。関数
coder.extrinsic
を呼び出して、アプリと任意の補助関数を外部 MATLAB コードとして宣言します。詳細については、Stateflow チャートでの外部 MATLAB 関数の呼び出しを参照してください。キーワード
this
を引数として使用してアプリを実行し、シミュレーション中にアプリがチャートにアクセスできるようにします。関数呼び出しによりアプリに返された値を、アプリとのインターフェイスをとるために作成したローカル データ オブジェクトとして格納します。
この例では、パワー ウィンドウ アプリは chart
というプロパティを使用して、チャート App Interface
とのインターフェイスをとります。アプリのコールバックはこのプロパティを使用してチャートの出力に書き込みます。
運転席側の制御スイッチを新しい位置に移動すると、
DriverControlValueChanged
コールバックによりswitches.driver_up
とswitches.driver_down
の値が設定されます。助手席側の制御スイッチを新しい位置に移動すると、
PassengerControlValueChanged
コールバックによりswitches.passenger_up
とswitches.passenger_down
の値が設定されます。[Obstacle] ボタンをクリックすると、
ObstacleButtonPushed
コールバックによりobstacle
の値がtrue
に設定されます。アプリを閉じると、
UIFigureCloseRequest
コールバックによりstop
の値がtrue
に設定されます。
逆に、チャートでは、InterfaceWithApp
ステートの entry アクションがアプリ sf_power_window_app
を実行し、戻り値をローカル データ オブジェクト app
として格納します。チャートは、補助関数 updateLamps
を呼び出すときに、このローカル データ オブジェクトを使用します。アプリで、この補助関数がチャート入力 lamps
の値を使用してランプのオンとオフを切り替えます。
Control System の設計
パワー ウィンドウ制御システムはモード ロジックを使用して、ウィンドウを動かす時点を判別し、サーボ モーターに統合運動コマンドを出力します。製造コストを抑えるため、制御システムはウィンドウの位置を追跡しません。代わりに、サーボ モーターから受信する信号を使用して、ウィンドウが完全に開いた時点、ウィンドウが完全に閉じた時点、またはウィンドウが障害物に接触した時点を判別します。
制御システムは以下の性能要件を満たします。
ウィンドウが完全に開くまで、または完全に閉じるまでの時間が 5 秒以内であること。
ウィンドウが完全に開いた位置または閉じた位置に到達したらモーターが停止すること。
ウィンドウが上がるとき、モーターは障害物を検出できること。モーターがウィンドウの道筋で障害物を検出した場合、1 秒間、またはウィンドウが完全に開くまで、ウィンドウを下げること。
いずれかの方向に続けて 10 秒移動した場合、モーターが停止すること。この要件は、ウィンドウ メカニズム、モーターおよびドライブに対するフェイルセーフの保護を提供します。
制御スイッチが 0.5 秒に満たない時間押された場合、または 1 秒より長い時間押された場合、スイッチを離した時点でウィンドウが停止すること。
制御スイッチが 0.5 秒より長く、1 秒に満たない時間押された場合、ウィンドウは新しいコマンドまたは障害物により運動を中断されない限り、完全に開くか、または完全に閉じること。この要件はパワー ウィンドウの自動モード機能を表します。
運転席側の制御は助手席側の制御よりも優先されること。
障害物の検知は運転席側および助手席側のどちらの制御よりも優先されること。
Stateflow チャート Control System
は、これらの要件を満たすイベントドリブン コントローラーをモデル化します。このチャートは、パラレル構造の 2 つのステート (Switch
と Logic
) で構成されます。これらのステートは、チャート入力の変化に反応し、パワー ウィンドウ システムの動作モードを判別し、サーボ モーターをアクティブにする出力信号を管理します。
コントローラー入力の監視
ステート Switch
はチャート入力の値を読み取り、ローカル イベントをブロードキャストして、パワー ウィンドウ システムの動作モードを変更します。詳細については、ローカル イベントをブロードキャストしてパラレル ステートを同期を参照してください。
シミュレーションのすべてのタイム ステップで、このステートは真理値表関数 checkSwitches
を呼び出して、運転席側と助手席側の制御スイッチの位置を判別します。入力構造体 switches
の値に応じて、この関数は UP
、DOWN
、および NEUTRAL
イベントをブロードキャストします。この関数は、運転席側のコントロールが "Neutral" の位置にない場合は助手席側のコントロールからの入力をすべて無視するため、要件 7 で指定されているとおり、運転席側のコントロールが助手席側のコントロールより優先されます。
同様に、このステートはグラフィカル関数 detectObstacles
を呼び出し、サーボ モーターの電機子電流の強度を判別します。current
の値が小さく非ゼロの場合、障害物が存在するため、この関数はイベント OBSTACLE
をブロードキャストします。一方、current
の値が大きい場合、ウィンドウは完全に開いた位置、または完全に閉じた位置に達しているため、この関数はイベント ENDSTOP
をブロードキャストします。このチャートは detectObstacles
を checkSwitches
より前に呼び出すため、要件 8 で指定されているとおり、障害物検出が運転席側および助手席側のコントロールより優先されます。
動作モードの判別
ステート Logic
は故障検出アルゴリズムを組み込み、ウィンドウのハードウェアの保護およびウィンドウの道筋にある障害物の検出を行います。このステートには、パワー ウィンドウ システムの動作モードを表す Stop
、Move
、EmergencyDown
の 3 つのサブステートがあります。
初期状態では、ステート Stop
がアクティブです。このステートには、Mode
と Position
という 2 つのパラレル サブステートがあります。
Mode
は、パワー システムが制御スイッチからの新しいコマンドを受け入れる準備ができた時点を判別します。システムは、両方の制御スイッチが "Neutral" の位置にあるときに新しいコマンドを受け入れることができます。Position
は、ウィンドウが完全に開いているか、完全に閉じているか、その間にあるかを記録します。チャートは、サーボ モーターが範囲の終点に達した時点でのウィンドウの移動方向を記録することにより、この判別を行います。
Stop
は、イベント UP
または DOWN
のブロードキャストがいずれかの制御スイッチからのコマンドを示すまで、アクティブのままとなります。ウィンドウが完全には開いておらず、完全に閉じてもいない場合、これらのイベントはステート Move
への遷移をトリガーします。一方、イベント UP
は、ウィンドウが既に完全に閉じている場合は無効と判断されます。同様に、イベント DOWN
はウィンドウが完全に開いている場合は無効となります。
ステート Move
は、ウィンドウが動いているときは常にアクティブとなります。このステートは、ウィンドウの自動的な作動と故障検出に関連するパワー ウィンドウのいくつかの要件を実装します。このステートには、Direction
および Mode
という名前の 2 つのパラレル サブステートがあります。
Direction
はウィンドウが動く方向を判別し、必要に応じて関数go.up
およびgo.down
を呼び出します。これらの関数は、サーボ モーターと、アプリの [Up] および [Down] ステータス ランプを制御する出力信号の値を設定します。Mode
は、要件 5 および 6 で指定されている、パワー ウィンドウの自動モードと手動モードを実装します。このステートには 3 つの排他的サブステート (Initializing
、Auto
、Manual
) があります。初期状態では、サブステートInitializing
がアクティブです。このサブステートは、制御スイッチが "Neutral" の位置に戻ったことを示すNEUTRAL
イベントのブロードキャストを待機します。このブロードキャストが、Initializing
がアクティブになってから 0.5 秒以内に発生した場合、このイベントはStop
ステートへの遷移をトリガーし、ウィンドウが移動を停止しなければならないことを示します。このブロードキャストが、Initializing
がアクティブになってから 0.5 秒後より後で、1 秒後より前に発生した場合、このイベントはサブステートAuto
への遷移をトリガーし、パワー ウィンドウ システムが自動モードで動作していることを示します。このサブステートは、イベントENDSTOP
(ウィンドウが完全に開いているか完全に閉じている場合)、イベントOBSTACLE
(ウィンドウが障害物と接触した場合)、またはイベントUP
あるいはDOWN
(システムがいずれかの制御スイッチからの新しいコマンドを受信した場合) のブロードキャストにより中断されるまで、アクティブのままとなります。最後に、ブロードキャストがInitializing
がアクティブになってから 1 秒に満たない間に発生しなかった場合、時相論理式after(1,sec)
はサブステートManual
への遷移をトリガーします。このサブステートは、イベントNEUTRAL
のブロードキャストがStop
ステートに戻る遷移をトリガーするまで、アクティブのままとなります。
システムが自動モードであるか手動モードであるかにかかわらず、要件 2 および 4 で指定されているとおり、イベント ENDSTOP
がブロードキャストされた場合、または Move
が FAILSAFE_TIMEOUT
秒より長くアクティブになった場合、チャートは Move
から Stop
に直接遷移します。既定では、この定数の値は 10 に設定されています。
障害物の検出
ウィンドウが障害物に接すると、ウィンドウにかかる力によってサーボ モーターに荷重が加わり、これにより電機子電流が増加します。電機子電流の急激な増加を監視することで、システムはウィンドウの道筋にある障害物を検知します。
この例では、Simulink サブシステムがサーボ モーターをシミュレートします。ウィンドウの位置は、飽和制限 0 (完全に開いている) および 10 (完全に閉じている) を使用して、Integrator (Simulink)ブロックにより計算されます。このブロックの入力のゲインが 2 であるため、要件 1 で指定されたとおり、ウィンドウが完全に開くまで、および完全に閉じるまでの時間は 5 秒です。Integrator ブロックが飽和点に達すると、システム出力 armature current
は 10 に増加します。この値は、ウィンドウが完全に開いているか、完全に閉じていることを示しています。
ウィンドウの道筋に障害物を入れるには、ウィンドウが上がる間にアプリで [Obstacle] ボタンをクリックします。App Interface
チャートは、サーボ モーターに正の信号を送信して応答し、これにより電機子電流がわずかに上がります。Control System
チャートで、関数 detectObstacles
はこの電流の変化を登録し、イベント OBSTACLE
をブロードキャストします。Logic
ステートで、このイベントはサブステート Move
からサブステート EmergencyDown
への遷移をトリガーします。このサブステートがアクティブである間、システムにより 1 秒間、またはウィンドウが完全に開くまで、ウィンドウが下げられます。その後、要件 3 で指定されたとおり、チャートはウィンドウが停止しなければならないことを示すサブステート Stop
に戻ります。
参考
after
| hasChanged
| send
| this
| coder.extrinsic
(MATLAB Coder) | Integrator (Simulink)