ユーザーによる回路部品の作成
○ユーザー定義モジュールの概要
標準にない部品をユーザ自身で作れるように用意した機能です。例えば、モータや演算器などを作成できます。
この部品は、電圧入力−電流出力の素子としてデザインします。具体的には、C言語を用いて入力電圧に応じて電流を出力する関数を作成して、解析プログラムに組み込んで使用します。
作成した関数は、計算フロー中、回路方程式の作成時に、呼び出されます。この関数は、同一ステップ計算時に複数回呼び出されることがありますので、それを考慮して作る必要があります。
○ユーザー定義モジュールの作成
Tokuzoフォルダ内のUserModule.DLLに部品を組み込むことで使用が可能となります。
UserModule.DLLの作成は、tokuzoフォルダのUserModuleフォルダ内にあるソースファイルから行います。
コンパイルには、VisualC++が必要になります。
作成は次ぎのように行います。
1.関数のインプリメントの作成
2.呼び出し関数への追加
3.DLLの作成
4.tokuzoフォルダへのコピー
5.CAD用シンボルの作成(汎用のシンボルを用いるなら必要ありません)
○モデル関数の構造
モデル関数の書式は、以下の通りです。
書式 int [モデル名]( double t, double dt, double *in, double *out,
double *cin, double *cout,double *parameter, double *val, double *dval)
引数の意味
引数 | 概要 |
詳細 |
t | 現在時間 | シミュレーション上の現在時間 |
dt | ステップ時間 | 計算ステップ時間 現バージョンでは固定のステップで計算しているが、将来可変ステップの検討中 |
in | 電圧配列 | 前ステップ時のノード電圧を参照するための配列 |
out | 電流配列 | 次ステップのノード電流を更新するための配列 |
cin | 制御入力配列 | 制御ノードの値を参照するための配列 |
cout | 制御出力配列 | 制御ノードに値を出力するための配列
(内部変数のモニタにも使用できます) |
parameter | パラメータ配列 | 固定パラメータ値。参照用 |
val | 内部変数配列 | 前ステップの変数値。初期値はネットリストで指定する。参照用。 |
dval | 内部変数差分配列 | 各変数の差分値配列。valの次回値の演算に用いられる。
val(t+1) = val(t) + dval*dt |
○作成法
1.関数のインプリメントの作成
モデル名と同じ名前の関数を作成します。
たとえば、モデル名を「TEST」とすると
int TEST( double t, double dt, double *in, double *out,
double *cin, double
*cout,double *parameter, double *val, double *dval)
{
〜プログラム〜
return 0;
}
を、UserModule.cppに追記します。
2.呼び出し関数への追加
作成したモデル関数を呼び出すための、コールルーチンを追加します。
モデル関数は、ファイルUserModule.cpp中の関数modulesから、呼び出されます。
この関数には、モデル名とモデル関数の引数がメインプログラムから渡されます。
ユーザは、モデル名を判断して、モデル関数を呼び出すプログラムを記述します。
モデル関数名が、「TEST」であるならば、UserModule.cpp
のmodules()内に、
if( strcmp( model, "TEST")==0)
return TEST(t,dt,in,out,cin,cout,parameter,val,dval);
を、追加します。
○作成例
簡単な例として、抵抗素子を作成する場合を考えます。
抵抗Rの両端の電圧をV0,V1、両端の電流をI0,I1であるとします。
これらの関係は、
I0 = (V1-V0)/R
I1 = (V0-V1)/R
となります。
引数パラメータは、
in[0] : V0
in[1] : V1
out[0] : I0
out[1] : I1
parameter[0] : R
これをモデル関数に記述します。
モジュールのソースコードは、インストールフォルダ内のSRCフォルダにあります。
VC++で、プロジェクトUserModule.dswを開いてUserModule.cppに記述します。
モデル名を、「RESISTANCE」とします。下記コードを追加します。
int RESISTANCE( double t, double dt, double *in, double *out,
double *cin, double *cout,double *parameter, double *val, double *dval)
{
double V0, V1, I0, I1, R;
//電圧入力
V0 = in[0];
V1 = in[1];
R = parameter[0];
//演算
I0 = (V1-V0)/R; //オームの法則
I1 = (V0-V1)/R;
//電流出力
out[0] = I0;
out[1] = I1;
return 0; //エラーがあれば、ゼロ以外を返す
}
呼び出し関数modulesにモデルのコールを記述します。
USERMODULE_API int modules( const char* model, double t, double dt, double *in, double *out,
double *cin, double *cout, double *parameter, double *val, double
*dval)
{
if( strcmp( model, "RESISTANCE")==0)
return RESISTANCE(t,dt,in,out,cin,cout,parameter,val,dval);
これで、準備はできたので、ビルドしてUseModule.DLLを作成します。
作成したDLLを、インストールディレクトリにある古いDLLに上書きコピーします。
つぎに、作成した部品を使って解析を行ってみます。
描く蔵を起動して、回路図を描きます。
ここでは、RESISTANCEに正弦波電圧を印可して、電源電圧と電流を観測した例を示します。
上記のように部品を配置します。ユーザ素子は、部品メニューのユーザー定義素子を選択して、配置します。
ユーザー定義素子を選択すると、ダイアログが表示されるので、ダイアログに、必要事項を記入します。
この場合は、モデル名が、RESISTANCE
回路ノード数は、2(ここでは,上下に1個づつ計2個。トータル数が2であればよい)
制御ノードは、無し
パラメータは、抵抗値R用に1個
内部変数は、なし
以上を記入して、OKをクリックすると部品が配置できます。
上下が回路ノード、左右が制御ノードの入力・出力になります。
また、●印が0番ピンを示しています。
各部品のパラメータを書式にしたがって入力します。
ユーザー定義素子は、5オームなので下記のように入力します。
解析をステップ100usで40ms行うと
このような結果になります。
他に、サンプルとしてサンプルホールド(SH)、誘導電動機(IM3P)、乗算器(MUL)があります。
関数はソースコードに記述してあります。参考にして下さい。
機能 | 2ノード間の電位差を、指定時間間隔でサンプリングして、電流出力する。 |
回路ノード:4 | in[0]: 入力電圧(+)
in[1]: 入力電圧(-) in[2]: N/A in[3]: N/A out[0]: N/A out[1]: N/A out[2]: 電流出力(+) out[3]: 電流出力(-) |
制御ノード
入力:0 出力:0 |
|
パラメータ:1 | p[0]: サンプリング間隔[sec] |
内部変数:0 | |
使用例 |
機能 | 2ノード間の電位差V0,V1を、乗算して電流として出力する。 |
回路ノード:6 | in[0]: 入力電圧(V0+)
in[1]: 入力電圧(V0-) in[2]: 入力電圧(V1+) in[3]: 入力電圧(V1-) in[4]: N/A in[5]: N/A out[0]: N/A out[1]: N/A out[2]: N/A out[3]: N/A out[4]: 電流出力(+) V0*V1 out[5]: 電流出力(-) -V0*V1 |
制御ノード
入力:0 出力:0 |
|
パラメータ:0 | |
内部変数:0 | |
使用例 |
機能 | 3相誘導機をT型等価回路で模擬する。
慣性は、回転数ノードに等価コンデンサを接続して模擬する。 |
回路ノード:5 | in[0]: u相入力電圧
in[1]: v相入力電圧 in[2]: w相入力電圧 in[3]: 回転数(+) [rad/s] in[4]: 回転数(-) [rad/s] out[0]: u相入力電流 out[1]: v相入力電流 out[2]: w相入力電流 out[3]: トルク出力(+) out[4]: トルク出力(-) |
制御ノード
入力:0 出力:9 |
cout[0]: torque (Electrical)
cout[1]: d-axis current (stater) cout[2]: q-axis current (stater) cout[3]: d-axis current (roter) cout[4]: d-axis current (roter) cout[5]: d-axis voltage (stater) cout[6]: q-axis voltage (stater) cout[7]: speed (rad/s) cout[8]: u-phase voltage |
パラメータ:9 |
p[0]: 1次抵抗
p[1]: 2次抵抗 p[2]: 等価1次インダクタ p[3]: 等価2次インダクタ p[4]: 等価相互インダクタ p[5]: 極対数 p[6]-p[8]: 内部演算用パラメータ |
内部変数:5 | val[0]: d-axis current (stater)
val[1]: q-axis current (stater) val[2]: d-axis current (roter) val[3]: d-axis current (roter) val[4]: torque |
使用例 | IM3P.KAK |
機能 | モータと組み合わせて使用する模擬負荷。
TLOAD= P0 + P1*Wm + P2*Wm^2 + P3*Wm^3 |
回路ノード:2 | in[0]: 回転数(+) [rad/s]
in[1]: 回転数(-) [rad/s] out[0]: 負荷トルク(+) out[1]: 負荷トルク(-) |
制御ノード
入力:0 出力:0 |
|
パラメータ:3 | p[0]: 定数項
p[1]: 1次係数 p[2]: 2次抵抗 p[3]: 3次係数 |
内部変数:0 | |
使用例 | IM3P.KAK |