自動コード生成

SCALEではPRCまたはDSPの制御プログラムからC言語コードに自動生成できます。

自動コード生成の方法

自動コード生成はツールバー内のFile:Generate C Codeから実行できます。
実行すると、以下のようなダイアログボックスが現れます。

Auto Code Generate1

自動コード生成したい素子シンボルをcodeパネルに残し、生成したコードのメインファイル名と出力先を選んでOKボタンを押してください。
これで自動コード生成が行われ、指定した出力先にソースファイルが出力されます。


C関数と生成ファイル

自動コード生成を行うと、1個の素子(PRCまたはDSP)に1個のC関数が割り当てられ、
1個のソースファイルを生成します。
素子の大域シンボル名が関数名となります。
引数と戻り値は双方ともvoidとなります。
全ての関数宣言は1個のヘッダファイルにまとめて記述されます。

自動コード生成を行ったときに生成されるファイルは下記となります。
メインファイル名は任意に設定できます。
デフォルトのメインファイル名は回路のCVTファイル名です。

ファイルの種類 ファイル名 生成数
ヘッダファイル メインファイル名.h 1個
大域変数定義ファイル メインファイル名_global_variable.c 1個
ソースファイル メインファイル名_大域シンボル.c 素子数個

コード変換規則

SCALEのプログラム関数の中で、メイン回路の電圧・電流や素子パラメーターの値をやり取りする関数は、コード変換規則でCコードの大域変数に変換されます。

局所変数は関数内の冒頭に型がstatic float(前回値保持をするため)、初期値0で宣言されます。 ただし、init文の中で局所変数の代入文がある場合はその代入文が初期化文となります。

全ての大域変数は型がfloat、初期値0として大域変数定義ファイルに一括で定義され、
extern floatとしてヘッダファイルに宣言されます。

Note

変数型はfloatのみであり、変更はできません。

Note

function文を使用することで同じソースファイル内に別のC関数として割り当てることも可能です。 詳細はプログラマブル素子言語文法のfunction文を参照してください。

コード変換規則例

シンボル名"PRC1"のPRCブロック

ヘッダファイル

void PRC1(void);
ソースファイル
void PRC1(void)
{
    文1;
    文2;
}

output関数:メイン回路の電圧・電流を取得する

x = output("Sym", "Type", "Mode"); 

ヘッダファイル

extern float g_in_Sym_Type_Mode;
大域変数定義ファイル
float g_in_Sym_Type_Mode = 0.0;
ソースファイル
static float x = 0.0;
x = g_in_Sym_Type_Mode;入力グローバル変数

param関数:メイン回路の素子パラメーターを取得する

x = param("Sym", "Par"); 

ヘッダファイル

extern float g_in_Sym_Par;
大域変数定義ファイル
float g_in_Sym_Par = 0.0;
ソースファイル
static float x = 0.0;
x = g_in_Sym_Par;入力グローバル変数

setparam関数:メイン回路の素子パラメーターに値を設定する

setparam("Sym", "Par", Value);

ヘッダファイル

extern float g_out_Sym_Par;
大域変数定義ファイル
float g_out_Sym_Par = 0.0;
ソースファイル
g_out_Sym_Par = Value;出力グローバル変数

var関数:PRCまたはDSPの変数値を取得する

x = var("PRCSym", "Var"); 

ヘッダファイル

extern float g_arg_PRCSym_Var;
大域変数定義ファイル
float g_arg_PRCSym_Var = 0.0;
ソースファイル
static float x = 0.0;
x = g_arg_PRCSym_Var;引数グローバル変数

  • "PRCSym"で指定される"PRCSym"の変数、"Var"はすべてg_arg_PRCSym_Varに変換されます。
  • "PRCSym"が空の場合は自分自身を指します(自分自身のシンボルを入れてもよい)。
  • "PRCSym"を"VIO"(Virtual I/Oの意)と書けばPRCやDSPに関係なく新しいグローバル変数が定義できます。

setvar関数:PRCまたはDSPの変数に値を設定する

setvar("PRCSym", "Var", Value); 

ヘッダファイル

extern float g_arg_PRCSym_Var;
大域変数定義ファイル
float g_arg_PRCSym_Var = 0.0;
ソースファイル
g_arg_PRCSym_Var = Value;引数グローバル変数

  • "PRCSym"で指定される"PRCSym"の変数、"Var"はすべてg_arg_PRCSym_Varに変換されます。
  • "PRCSym"が空の場合は自分自身を指します(自分自身のシンボルを入れてもよい)。
  • "PRCSym"を"VIO"(Virtual I/Oの意)と書けばPRCやDSPに関係なく新しいグローバル変数が定義できます。

function文:同じソースファイル内に別のC関数として割り当てる

function ADD()
{    
    gain = 10;
    OUT = gain * (IN1 + IN2);
}
setvar("","ADD_IN1",5);
setvar("","ADD_IN2,10);
ADD();
ans = var("","ADD_OUT");

ヘッダファイル

void PRC_ADD(void);
extern float g_arg_PRC_ADD_IN1;
extern float g_arg_PRC_ADD_IN2;
extern float g_arg_PRC_ADD_OUT;
大域変数定義ファイル
float g_arg_PRC_ADD_IN1 = 0.0;
float g_arg_PRC_ADD_IN2 = 0.0;
float g_arg_PRC_ADD_OUT = 0.0;    
ソースファイル
void PRC_ADD(void)
{
    static float gain = 0.0;

    gain = 10;
    g_arg_PRC_ADD_OUT  = gain * (g_arg_PRC_ADD_IN1 + g_arg_PRC_ADD_IN2);
}
void PRC(void)
{
    static float ans = 0.0;
    g_arg_PRC_ADD_IN1 = 5;  
    g_arg_PRC_ADD_IN2 = 10;   
    PRC_ADD();                   
    ans = g_arg_PRC_ADD_OUT; 
}

その他の変換規則

制御プログラム名 C言語コード
define X (x) #define X (x)
init {・・・} 変数代入文があれば、Cコードでは変数初期化文に変換し、そのほかはそのまま
quit 削除
setoutvar(Var) 削除
table("TBL", x) table("TBL", x)
SLimport() SLimport()
SLexport() SLexport()
SLSync() SLSync()
PI π(少数点以下12桁の実数)
PI2 2π(少数点以下12桁の実数)
ON 1
OFF 0

上記以外のプログラムはそのままCコードとなります。

生成コード例

生成コードの例

変換前の制御プログラム

*/ PRC1のプログラム */
init {
a = 5;
}
x = param("R", "Value")
setparam("Q", "T0", 0.5);
y = var("PRC2", "Var1");
setvar("PRC2", "Var2", a);
z = output("R", "V", "AVE");

/* PRC2のプログラム */
Var1 = 5;
setparam("Vi", "Value", Var2);
Var3 = 2 * x;
上記の制御プログラムから自動コード生成によって生成されるソースファイルは下記となります。

ヘッダファイル:CVT.H

void PRC1(void);
void PRC2(void);

extern float g_in_R_Value;
extern float g_in_R_V_AVE;

extern float g_out_Q_T0;
extern float g_out_Vi_Value;

extern float g_arg_PRC2_Var1;
extern float g_arg_PRC2_Var2;

大域変数定義ファイル:CVT_global_variable.c

#include "CVT.h"

float g_in_R_Value = 0.0;
float g_in_R_V_AVE = 0.0;

float g_out_Q_T0 = 0.0;
float g_out_Vi_Value = 0.0;

float g_arg_PRC2_Var1 = 0.0;
float g_arg_PRC2_Var2 = 0.0;
ソースファイル:CVT_PRC1.c
#include "CVT.h"

void PRC1(void)
{
    static float x = 0.0;
    static float y = 0.0;
    static float z = 0.0;

    static float a = 5;
    x = g_in_R_Value;
    g_out_Q_T0 = 0.5; 
    y = g_arg_PRC2_Var1;
    g_arg_PRC2_Var2 = a;
    z = g_in_R_V_AVE;
}
ソースファイル:CVT_PRC2.c
#include "CVT.h"

void PRC2(void)
{
    static float Var3 = 0.0;
    static float x = 0.0; 

    g_arg_PRC2_Var1 = 5;
    g_out_Vi_Value = g_arg_PRC2_Var2;
    Var3 = 2 * x;
}

自動コード生成機能で発生するエラー対処方法

自動コード生成機能で発生するエラーとその対処方法は以下を参照してください。

プログラムに関するエラー対処方法

参考

プログラマブル素子言語文法
PRC
DSP
プログラムに関するエラー対処方法