これは、ややオープンエンドの質問を扱う、少し複雑な問題です。StackOverflow がこの慣習に眉をひそめていることは承知していますが、おわかりのように、それを小さな部分に分解するのは私には困難です。
CMEX S-Function (を使用してコンパイル) を使用して呼び出される C++ コードがありlegacy_code
ます。マイナータイム ステップで S-Fn が連続するようにラッパー ファイルを手動で変更しました。これは重要です。マイナー ステップで修正すると、関数の出力が滑らかな線ではなく階段状に変化することがわかったからです。連続化してから、この問題は解決しました。
残念ながら、入力信号と S-Function (代数ループを解くために使用していた) の間のメモリ ブロックがマイナー タイム ステップで固定されていることを後で発見しました。私は以前、継続的な選択肢があるかどうかについて (ここで)質問しましたが、質問が埋もれてしまったようです。
代わりに、このMathworks のドキュメントを参照しました。彼らは、PWork ベクトルを使用して、S-Function の連続する呼び出し間で値をメモリに永続的に保持できると主張しています。このベクトルを使用してこれを行うことができました: 1. 次のステップのために現在の時間ステップの値を保存します 2. 次のステップで古い値を使用します 3. 計算後、古い値を現在の値に更新します 4. 繰り返します
要するに、メモリ ブロックの機能を内部的に複製しました。ここで、Memory ブロックを削除して、Initial Condition ブロックに置き換えることができると考えました。残念ながら、これを行うと、代数ループの警告が表示されます。さて、私のモデルは時々解決し、時には解決しません。
2 つのケースを以下に概略的に示します。
S-Function
とS-Function2
CMEX オブジェクトです。
おそらくCMEX関数は代数ループ診断コードに密集しており、Simulinkは実際には実際の代数ループではなく人工的なものだけであることを認識できませんか?
私の質問は、代数ループが実際に存在しないことを Simulinkに伝えるためにできることはありますか? そのような場合に何をすべきかについて、ある種のベストプラクティスはありますか?
*編集: 回路図は不正確で、モデルを適切に表していませんでした。更新しました