
ScilabにはC/FORTRANなどで書かれた関数をリンクして利用できる機能があります。またXcos処理系の中にもC/FORTRANなどで書かれた関数をブロックとして呼び出す機能があります。今回はC言語で書かれた関数を呼び出すXcosブロックを試用してみます。なにやらいろいろ出来そうなんだが、ナンジャラホイ?
※「ブロックを積みながら」投稿順 index はこちら
※動作確認にはWindows 11の パソコン(64bit)上にインストールしたScilabの以下バージョンを使用しています。
Scilab 2024.0.0
Scilab/Xcosと「外部」関数のリンク
Scilabには、外部でコンパイルされた関数とのリンク機能が内蔵されており、関数を動的にリンクして実行することが可能です。当方で使用しているWindows版のScilabの場合、
.dll 型式のダイナミック・リンク・ライブラリ
をリンクできるようになってました。Linux版では、.so形式になるのだと思われます。
Scilab/Xcosからの関数ビルド
上記の仕組みで動的にリンクされるC/FORTRAN記述の関数について、Scilab/Xcosがソースファイルの作成からビルド、Scilabとのリンクまでを自動的に行う仕組みが用意されていました。よって、ユーザ的にはScilab環境を離れることなく、またどんなコンパイラが動作しているのだか意識することなく利用可能です(イマイチ腑に落ちない原因でもあるけど。)
今回調べたところでは、Windows環境のCコンパイラとしては、Microsoft社のCコンパイラ(MSVC、ファイルとしては cl.exe)が推奨みたいです。MinGW上のg++も使用できるみたいですが、当方環境では cl.exe が動いているみたい。
-
- gcc.exeとcl.exeのどちらもPATHに入っていない状態と一方だけがPATHに入っている状態の3通りで以下を確認したが常に結果は同じ。
- haveacompiler()関数(Scilabからコンパイラが利用可能か否か判定する関数)は3通りとも真。
- findmsvccompiler()関数(Windows専用のMSVCを発見する関数)も3通りともvs2022(当方環境にインストール済のもの)を検出。
- PATHの設定に応じて、dos(‘where cl.exe’)、dos(‘where gcc.exe’)などとやるとそれぞれ検出されたりされなかったりするのは予定どおり。
Xcos上のC言語記述可能なブロック
3通りのブロックがあり、その違いはパラメータ設定にあるようです。
一番左の c_block はパラメータが少ないというか、緑のマーカのところに押し込められている感じです。真ん中の C_BLOCK2はパラメータが増えてます、さらに右の C_BLOCK4はもっと「小分け」になっている感じ。両者の差異(単なる名称だけかもしれない)のありそうなところに黄色のマーカ引きました。
今回は一番左の簡単なブロックで実験してみたいと思います。
c_blockを試用
パラメータ設定画面でOKボタンを押すと、以下のようなコード記述画面が現れます。
関数定義の外形(無暗と引数がいっぱいある)が定義済で、自分で書けるのは/* modify below this line */以下の部分だけみたいです。
以前のscifuncブロックの回でやったとおり、入力はu1、出力はy1だろ~ということで丈夫の黄色のマーカの部分を書き入れました。入ったデータに一律1.12を足し込むだけ。なお全ての引数はポインタ渡しみたいです。
上記入力画面でOKすると、コンソールに以下のようなビルド結果が表示されてきます。
末尾にリンク完了とあり、これでブロックの使用準備まで出来たようです。簡単じゃん。
上の黒線が入力波形で、下の緑線がc_blockの出力波形です。+1.12されているみたい。Cソースの関数をXcosから使えたね。