目的
Xcosで作成したモデルから、ソースを生成したい。
Scilab/Xcosのインストール
sudo apt install scilab
でOK。
パッケージの調査
Xcosからコード生成するのは、ググってみると以下2つが見つかった。
Scilab Code Generator
の方が公式っぽいので、こっちで動かせないか試してみる。
Scilab Code Generator
インストール1(失敗)
Webページによると、コマンドでインストールできるらしい。Scilabを立ち上げて、コンソールで以下操作を行ったが、うまくインストールされない。Scilabをrootで立ち上げて、同じ操作をしてもインストール失敗。
-->atomsInstall("xcos_code_generator")
レポジトリをスキャン中 http://atoms.scilab.org/6.0 ... 完了
関数の 265 行目 atomsDESCRIPTIONget ( /usr/share/scilab/modules/atoms/macros/atoms_internals/atomsDESCRIPTIONget.sci 行 284 )
関数の 31 行目 atomsIsPackage ( /usr/share/scilab/modules/atoms/macros/atoms_internals/atomsIsPackage.sci 行 47 )
関数の 69 行目 atomsInstallList ( /usr/share/scilab/modules/atoms/macros/atoms_internals/atomsInstallList.sci 行 108 )
関数の 233 行目 atomsInstall ( /usr/share/scilab/modules/atoms/macros/atomsInstall.sci 行 249 )
atomsDESCRIPTIONget: save ('/home/projectm/.Scilab/scilab-6.0.1/.atoms/packages') でエラーが発生しました.
インストール2(成功)
Webページより、xcos_code_generator-0.9.201901-bin-6.0.zip
をダウンロード。
$ unzip xcos_code_generator-0.9.201901-bin-6.0.zip
Archive: xcos_code_generator-0.9.201901-bin-6.0.zip
creating: xcos_code_generator-0.9.201901-bin-6.0/
...
inflating: xcos_code_generator-0.9.201901-bin-6.0/unloader.sce
$
Scilabのファイルブラウザでの現在地がxcos_code_generator-0.9.201901-bin-6.0
ディレクトリになるように、Scilabのコンソールより以下操作。( 実際に入力しているのは、exec("builder.sce")
とexec('loader.sce')
のみ。セミコロンをつければ、もっと出力が減っていたはず。 )
-->exec("builder.sce")
--> // Copyright (C) 2008 - INRIA
--> // Copyright (C) 2009-2011 - DIGITEO
--> // This file is released under the 3-clause BSD license. See COPYING-BSD.
--> mode(-1);
マクロを構築中...
-- [xcos_code_generatorlib]の作成 (マクロ) --
genlib: ファイルを処理しています: xcg_to_SIL.sci
genlib: ファイルを処理しています: xcg_to_SIL_eCG.sci
-- [xcg_sci_codegenlib]の作成 (マクロ) --
-- [xcg_sci_librarylib]の作成 (マクロ) --
ヘルプを構築中...
loader.sceを生成中...
unloader.sce を生成中 ...
cleaner.sceを生成中...
-->exec('loader.sce')
--> // This file is released under the 3-clause BSD license. See COPYING-BSD.
--> // Generated by builder.sce: Please, do not edit this file
--> oldmode = mode(); mode(-1);
Start Scilab Code Generator
Version: 0.9.20190122
Load macros
Load help
Load demos
--> clear oldlines oldmode;
demosディレクトリにあった、SampleCodeGenModel.zcos
をXcosで開く。
以下手順で、Cソースを生成できた。
1 青いブロックを選択して、「シミュレーション」→「コンパイル」
2 「ツール」→「Code Generation to C(Emmtrix)」
Start Scilab Code Generator
警告: Scilab Code Generator is already loaded
Using Emmtrix CodeGen latest version
emmtrix Code Generator (Oct 26 2017 01,14,08)
SampleCodeGen.sci(1,31-32), W00053 Warning, Variable t not used.
function [y1] = SampleCodeGen(t, u1, u2)
~
Value Range Coverage, 166/272
Memory Stats, 128 stack, 0 heap, 0 global
Compile time, 169 ms
Build succeeded ... 0 error(s), 1 warning(s), 0 note(s)
Retrieving file Makefile.gen
...
Retrieving file emx_codegen_rand.h
[]
-->
コードはgeneratedディレクトリに生成された。
以下の通り、makeして実行することができた。
$ cd generated
$ ls
Makefile.gen SampleCodeGen.h.map SampleCodeGen_inputs.h SampleCodeGen_outputs.c.map SampleCodeGen_scenario.c SampleCodeGen_scenario.h.map emx_codegen_intern.h
SampleCodeGen.c SampleCodeGen.sci SampleCodeGen_inputs.h.map SampleCodeGen_outputs.h SampleCodeGen_scenario.c.map SampleCodeGen_scenario.html emx_codegen_rand.c
SampleCodeGen.c.map SampleCodeGen_inputs.c SampleCodeGen_inputs.sci SampleCodeGen_outputs.h.map SampleCodeGen_scenario.d SampleCodeGen_scenario.sce emx_codegen_rand.h
SampleCodeGen.h SampleCodeGen_inputs.c.map SampleCodeGen_outputs.c SampleCodeGen_outputs.sci SampleCodeGen_scenario.h emx_codegen.h
$ make -f Makefile.gen
cc -g -Wall -Wno-unused-function -Wno-unknown-pragmas -std=c99 -c SampleCodeGen.c -o SampleCodeGen.o
cc -g -Wall -Wno-unused-function -Wno-unknown-pragmas -std=c99 -c SampleCodeGen_inputs.c -o SampleCodeGen_inputs.o
cc -g -Wall -Wno-unused-function -Wno-unknown-pragmas -std=c99 -c SampleCodeGen_outputs.c -o SampleCodeGen_outputs.o
cc -g -Wall -Wno-unused-function -Wno-unknown-pragmas -std=c99 -c SampleCodeGen_scenario.c -o SampleCodeGen_scenario.o
cc -g -Wall -Wno-unused-function -Wno-unknown-pragmas -std=c99 -c emx_codegen_rand.c -o emx_codegen_rand.o
cc SampleCodeGen.o SampleCodeGen_inputs.o SampleCodeGen_outputs.o SampleCodeGen_scenario.o emx_codegen_rand.o -lm -o SampleCodeGen_scenario
$ ./SampleCodeGen_scenario
0.211325
0.17035
$
今後
デモ以外のXcosモデルでCコード生成できるようにする。