ユーザーによる制御部品の作成
○ユーザー定義コントロールの概要
標準にない部品をユーザ自身で作れるように用意した機能です。例えば、デットタイムコントローラや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)等があります。
関数はソースコードに記述してあります。参考にして下さい。