ユーザーによる回路部品の作成

○ユーザー定義モジュールの概要
標準にない部品をユーザ自身で作れるように用意した機能です。例えば、モータや演算器などを作成できます。
この部品は、電圧入力−電流出力の素子としてデザインします。具体的には、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)があります。
関数はソースコードに記述してあります。参考にして下さい。


サンプルホールド(SH)
機能 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  
使用例  

乗算器(MUL)
機能 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  
使用例  

誘導電動機(IM3P)
機能 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)
機能 モータと組み合わせて使用する模擬負荷。
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