ユーザーによる制御部品の作成

○ユーザー定義コントロールの概要
標準にない部品をユーザ自身で作れるように用意した機能です。例えば、デットタイムコントローラやPWM制御器などを作成できます。
この部品は、C言語で記述したコードをコンパイルして用いるので、同機能の制御器を、複数の制御部品で構成するのに比べて、高速に演算できるメリットもあります。

○ユーザー定義コントロールの作成
tokuzoフォルダ内のUserCtl.DLLに部品を組み込むことで使用が可能となります。
UserCtl.DLLの作成は、tokuzoフォルダのUserCtlフォルダ内にあるソースファイルから行います。
コンパイルには、VisualC++が必要になります。
作成は次ぎのように行います。
1.関数のインプリメントの作成
2.呼び出し関数への追加
3.DLLの作成
4.Tokuzoフォルダへのコピー

○モデル関数の構造
モデル関数の書式は、以下の通りです。

書式 [モデル名]( double t, double dt, double *vin, double *in, double *out, double *parameter)

引数の意味
引数 概要

詳細

t 現在時間 シミュレーション上の現在時間
dt ステップ時間 計算ステップ時間 現バージョンでは固定のステップで計算しているが、将来可変ステップの検討中
vin 電圧/電流配列 前ステップ時のノード電圧を参照するための配列
in 制御入力配列 制御ノードの現在値を参照するための配列
out 制御出力配列 制御ノードの次回値を更新するための配列
parameter パラメータ配列 固定パラメータ値。参照用

○作成法
1.関数のインプリメントの作成
モデル名と同じ名前の関数を作成します。
たとえば、モデル名を「TEST」とすると

int TEST( double t, double dt, double *vin, double *in, double *out, double *parameter)
{
    〜プログラム〜
    return 0;
}
を、UserCtl.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);

を、追加します。

○作成例
簡単な例として、αβ変換部品を作成する場合を考えます。
入力端子をU, V, W 出力端子をa, b, oであるとします。
これらの関係は、
a = sqrt(2./3.) * ( u - v/2. - w/2. );
b = sqrt(2./3.) * ( sqrt(3.)/2.*( v - w ));
o = sqrt(2./3.) * ( ( u + v + w )/sqrt(6.));
となります。
引数パラメータは、
in[0] : U
in[1] : V
in[2] : W
out[0] : a
out[1] : b
out[2] : o

これをモデル関数に記述します。
モジュールのソースコードは、インストールフォルダ内のSRCフォルダにあります。
VC++で、プロジェクトUserCtl.dswを開いてUserCtl.cppに記述します。
モデル名を、「ABCONV」とします。下記コードを追加します。

int ABCONV( double t, double dt, double *vin,
double *in, double *out,double *parameter)
{
    out[0] = sqrt(2./3.) * ( in[0] - in[1]/2. - in[2]/2. );
    out[1] = sqrt(2./3.) * ( sqrt(3.)/2.*( in[1] - in[2] ));
    out[2] = sqrt(2./3.) * ( ( in[0] + in[1] + in[2] )/sqrt(6.));

    return 0; //エラーがあれば、ゼロ以外を返す
}

呼び出し関数usercallにモデルのコールを記述します。

USERMODULE_API int usercall( const char* model, double t, double dt, double *vin,
double *in, double *out, double *parameter)
{
    if( strcmp( model, "ABCONV")==0)
         return ABCONV(t,dt,vin,in,out,parameter);

これで、準備はできたので、ビルドしてUseCtl.DLLを作成します。
作成したDLLを、インストールディレクトリにある古いDLLに上書きコピーします。

他に、サンプルとしてデッドタイム(DEADMAKE)、dq変換(DQCONV)等があります。
関数はソースコードに記述してあります。参考にして下さい。