MATLAB Answers

0

S-Function​をModelにより複​数回呼び出しを行なう​方法について

kanji saimaru さんによって質問されました 2019 年 1 月 25 日
最新アクティビティ Toshinobu Shintai さんによって 回答されました 2019 年 5 月 23 日
MATLAB/Simulink質問
お世話になります。弊社の製作担当からの質問を記述しますのでご査収の上、宜しく回答の程、お願い致します。
【質問内容】
S-FunctionをModelにより複数回呼び出しを行なう方法について
【開発環境】
 Windows10 Pro(64bit)
MATLAB関連
MATLAB Ver. 9.4
Simulink Ver. 9.1
Stateflow Ver. 9.1
MATLAB Coder Ver. 4.0
Simulink Coder Ver. 8.14
Embedded Coder Ver. 7.0
Cコンパイラ
VisualStudio 2017 Community
【やりたい事】
 S-Function(FUNC_TEST_01)で作成したSimulinkモデル(func_01)を上位のSimulinkモデル(top_01)から複数回呼び出す。
【作成したサンプルプロジェクトの概略】
S-Function(FUNC_TEST_01) : 入力u0を出力y0へそのまま受け渡すC言語の処理。
Simulinkモデル(func_01) : S-Function(FUNC_TEST_01)を呼び出すSimulinkモデル。
Simulinkモデル(top_01) : ModelライブラリによりSimulinkモデル(func_01)を2回呼び出すSimulinkモデル。
【モデルのビルド実行時のエラーの内容】
Simulinkモデル(top_01)の階層でモデルのビルドを実行すると、下記の【エラーその1】がでます。
【エラーその1に対して実施してみたこと】
S-Function(FUNC_TEST_01) "ssSupportsMultipleExecInstances(S, true);"を「出力」タブに追記してビルドを行なう。
 この時そのままビルドを行うと下記の【エラーその2】が発生するため、
「ビルド情報」タブのビルドオプションより「SimStructへのアクセスを有効にする」にチェックを入れてビルドを通します。
 その後、Simulinkモデル(func_01)の「モデルのビルド」を行い、Simulinkモデル(top_01)「モデルのビルド」を行なってみても、
最初と同じ下記の【エラーその1】がでます。
【エラーその1】
====================================================================================================
### 次のモデルに対するビルド プロセス:'top_01' はエラーのため中止されました。
S-function ブロック 'func_01/S-Function Builder' は、複数の実行インスタンスをサポートすることを宣言していないため、複数インスタンスのノーマル モードでサポートされていません。S-function が複数インスタンス要件を満たしている場合は、'mdlSetWorkWidths' メソッドで SimStruct 関数 'ssSupportsMultipleExecInstances' を使用してこれを宣言できます。
コンポーネント:Simulink | カテゴリ:Block diagram エラー
====================================================================================================
【エラーその2】
====================================================================================================
FUNC_TEST_01_wrapper.c
C:\共有\テスト\VISA_M\func_test\FUNC_TEST_01_wrapper.c(45): warning C4013: 関数 'ssSupportsMultipleExecInstances' は定義されていません。int 型の値を返す外部関数と見なします。
C:\共有\テスト\VISA_M\func_test\FUNC_TEST_01_wrapper.c(45): error C2065: 'S': 定義されていない識別子です。
コンポーネント:S-function Builder | カテゴリ:Build エラー
====================================================================================================

  0 件のコメント

サインイン to comment.

1 件の回答

回答者: Toshinobu Shintai 2019 年 5 月 23 日

MATLAB 2018aにてサンプルを作成してみたのでご確認いただけますでしょうか。
作り方については、以下をご確認ください。
1. 何等かの処理をs-function builderで作成します。
  作成し、ビルドが問題ないことを確認した後、
  生成された「FUNC_TEST_01.c」を開き、static void mdlInitializeSizes(SimStruct *S)内に
  ssSupportsMultipleExecInstances(S, true);
  を記述します。(添付画像参照)
  その後、MATLABのコマンドウィンドウで再ビルドします。
  以下のコマンドを実行してください。
  mex FUNC_TEST_01.c FUNC_TEST_01_wrapper.c
2. s-function呼び出し元のモデル(今回はfunc_01.slx)の
  コンフィギュレーションのソルバーにて
  固定ステップ かつ サンプル時間に依存しない
  にします。
3. func_01の呼び出し元のtop_01でモデル参照を用いて2回呼び出し、実行します。

  0 件のコメント

サインイン to comment.