Scilab/XcosでCコード生成

### 目的

Xcosで作成したモデルから、ソースを生成したい。

### Scilab/Xcosのインストール

`sudo apt install scilab`でOK。

### パッケージの調査

Xcosからコード生成するのは、ググってみると以下2つが見つかった。

- [Scilab Code Generator](https://atoms.scilab.org/toolboxes/xcos_code_generator/)
- [X2C](https://x2c.lcm.at/)

`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で開く。

![Screenshot from 2020-02-08 17-51-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403008/1ec49814-62dc-fec7-7f04-d2741849aad1.png)

以下手順で、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コード生成できるようにする。