自動コード生成
SCALEではPRC
またはDSP
の制御プログラムからC言語コードに自動生成できます。
自動コード生成の方法
自動コード生成はツールバー内のFile:Generate C Code
から実行できます。
実行すると、以下のようなダイアログボックスが現れます。
自動コード生成したい素子シンボルを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;
#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;
}
#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;
}
自動コード生成機能で発生するエラー対処方法
自動コード生成機能で発生するエラーとその対処方法は以下を参照してください。