プラズマ計測制御アップデートモジュール ファイル: plasma_win.zip Windowsのplasma.exeのiniファイル plasma_cmdseq.tar.Z VxWorksの変更・追加ソースファイル ソフトのインストール クライアント側(Windows NT): plasma_win.zipの中のplasma.INIをウィンドウズのシステムディレクトリに 展開してください。 plasma.INI内の環境変数をシステムに合うように設定してください。 変更内容は plasma.INIの変更についてを参照して下さい。 ターゲット側(VxWorks): -rw-rw-rw- 12004/100 21433 Jan 29 13:06 1998 ./com/PSmNameMaster.C -rw-rw-rw- 12004/100 73168 Jan 29 13:16 1998 ./com/PMemBlock.C -rw-rw-rw- 10008/10 2270 Jan 22 11:53 1998 ./com/_com/Makefile -rw-rw-rw- 12004/100 71742 Jan 29 13:44 1998 ./com/_com/PComSequencer1.C p-rw-rw-rw- 12004/100 244987 Jan 29 14:00 1998 ./com/_com/PComSequencer2.C -rw-r--r-- 12004/100 55069 Jan 29 18:49 1998 ./com/_com/PComSequencer3.C -rw-rw-rw- 12004/100 24827 Jan 29 14:41 1998 ./include/PComCommon.H -rw-rw-rw- 12004/100 1709 Jan 29 14:46 1998 ./include/PSmNameMaster.H -rw-rw-rw- 12004/100 5974 Jan 29 14:50 1998 ./include/PMemBlock.H -rw-rw-rw- 12004/100 8505 Jan 29 15:06 1998 ./measure/fch/fChannel.C -rw-rw-rw- 12004/100 2396 Jan 29 15:02 1998 ./measure/inc/fChannel.H ターゲットのソースファイルのディレクトリ(plasma/src) で、 plasma_cmdseq.tar.Zを展開してください。 % uncompress plasma_cmdseq.tar.Z % cd $PLASMA_HOME/src % tar xf plasma_cmdseq.tar そこで、各ソースをmakeしてください。 (ヘッダのみ変更しているもののあるので、オブジェクトファイルを 削除してからmakeしてください。) ------------------------------------------------------------------------------- 追加したコマンドシーケンサのコマンドの説明 追加したコマンドの説明を次に示します。 コマンド名: WHILELOOP 機能: ENDWHILELOOPまでのコマンド繰り返しを 実行 複数または無限ループ対応コマンド。 インターフェース: WHILELOOP x x 繰り返し回数 (0で無限ループ。それ以外は有限ループ) コマンド名: ENDWHILELOOP 機能: WHILELOOPの終了判断コマンド インターフェース: ENDNWHILE コマンド名: BREAK 機能: WHILELOOPから抜けるコマンド インターフェース: BREAK コマンド名: OTHERFCHREAD 機能: 論理チャネル名より論理チャネルのデー タを読み出す インターフェース: OTHERFCHREAD errcheck fchname buf n errcheck エラーチェックパラメータ fchname 論理チャネル名 buf 読み込みデータ格納用文字列変数 n 読み込み要求数 ※論理チャネル名は、論理チャネル作成/変更ダイアログで作成 された論理チャネル名を使います。(例:GPIB0のカード名称の 論理チャネル番号0の場合なら "GPIB0##0") コマンドシーケンスリスト例 例1:WHILELOOPの使用例 # PLASMA-DAIG&CONTROL V1.00 GSQ # COMMAND SEQUENCER TEST SCRIPT # LIST 4 START DEFINE $A WHILELOOP ADD 0 $A 1 IF $A == 10 BREAK ENDIF ENDWHILELOOP PRINTF "$A %d END!!\n" $A ENDMAIN 例2:ADCの論理チャネルデータを取得する # PLASMA-DAIG&CONTROL V1.00 GSQ # COMMAND SEQUENCER TEST SCRIPT # LIST 5 START # 変数定義 DEFINE $BUF[10] DEFINE $BUF1[10] DEFINE $FCHNAME[100] $FCHNAME = "ADC0##0" SET_FORMAT 0 1 "," WHILELOOP 10 OTHERFCHREAD 0 $FCHNAME $BUF 1 PRINTF "READ %s\n" $BUF WAIT 0 100 ENDWHILELOOP ENDMAIN --------------------------------------- plasma.INIの変更について 以下のフィールドを変更しました。 [Control Command] CMD_NUMBER=13 <- 変更 # while <- 追加 CMD_11=WHILELOOP PAR_11=5 PAS_11=1 RET_11= CTL_11=4 # end while CMD_12=ENDWHILELOOP PAR_12= PAS_12= RET_12= CTL_12=5 # break CMD_13=BREAK PAR_13= PAS_13= RET_13= CTL_13=5 [common Command] CMD_NUMBER=20 <- 変更 # fchannel read <- 追加 # OTHERFCHREAD [論理チャネル名] [数値変数] [取得数] CMD_20=OTHERFCHREAD PAR_20=5,10,8,5 PAS_20= RET_20= CTL_20= --------------------------------------- コマンドシーケンサ改造 1.概要 コマンドシーケンサの改造についてプログラム仕様書です。 2.内容 次の要望より、コマンドシーケンサの改造します。 (1) 無限ループの対応 (2) 他ボードの論理チャネル読み出し この2点より次のコマンドを追加します。 WHILELOOP 無限ループ対応ループコマンド ENDWHILELOOP 'WHILELOOP'の終了判断コマンド BREAK 'WHILELOOP'から抜出すコマンド OTHERFCHREAD 他ボード論理チャネルデータ読み出しコマンド 2-1. 追加コマンド仕様 追加コマンドの仕様を次に示します。 コマンド名: WHILELOOP 機能: ENDWHILELOOPまでのコマンド繰り返しを 実行 複数または無限ループ対応コマンド。 インターフェース: WHILELOOP x x 繰り返し回数 (0で無限ループ。それ以外は有限ループ) コマンド名: ENDWHILELOOP 機能: WHILELOOPの終了判断コマンド インターフェース: ENDNWHILE コマンド名: BREAK 機能: WHILELOOPから抜けるコマンド インターフェース: BREAK コマンド名: OTHERFCHREAD 機能: 論理チャネル名より論理チャネルのデー タを読み出す インターフェース: OTHERFCHREAD errcheck fchname buf n errcheck エラーチェックパラメータ fchname 論理チャネル名 buf 読み込みデータ格納用文字列変数 n 読み込み要求数 ※論理チャネル名は、論理チャネル作成/変更ダイアログで作成 された論理チャネル名を使います。(例:GPIB0のカード名称の 論理チャネル番号0の場合なら "GPIB0##0") 3.改造点 プログラムの改造点を次に示します。 3-1.クライアント側(Windows NT) コマンドシーケンサの構文チェック用に次の内容のパラメータを環境ファイルに 追加します。 環境ファイル名: %SYSTEMDIR%plasma.ini WHILELOOPの設定 引数:1 第1引数の型:整数、変数(整数) パラメータ CMD_11=WHILELOOP PAR_11=5 PAS_11=1 RET_11= CTL_11=4 ENDWHILELOOPの設定 引数:0 パラメータ CMD_12=ENDWHILELOOP PAR_12= PAS_12= RET_12= CTL_12=5 BREAKの設定 引数:0 パラメータ CMD_13=BREAK PAR_13= PAS_13= RET_13= CTL_13=5 OTHERFCHREADの設定 引数:4 第1引数の型:整数、変数(整数) 第2引数の型:文字列、変数(文字列) 第3引数の型:変数(文字列) 第4引数の型:整数、変数(整数) パラメータ CMD_20=OTHERFCHREAD PAR_20=5,10,8,5 PAS_20= RET_20= CTL_20= 3-2.サーバー側(VxWorks) 3-2-1.無限ループ対応 現モジュールにおいて、再帰を使ったコマンドシーケンサの処理を行って いるため、回数の多いループ等を使用した場合にスタックのオーバーで処理 が出来なくなることがあります。 ループの時のスタックオーバーを起こしやすい原因は再帰処理を多用して いるためであり、今回の改造においては再帰処理によるシーケンスの処理実 行を、ループ内だけを再帰処理を行わないよう処理を追加しました。 ループコマンドは現状のWHILEをそのまま残し、新たにWHILELOOPというコ マンドを追加しました。 注)ループコマンドにおいてのみの改造なので、スタックのオーバーは根本 的には解決してません。(数千行にも及ぶコマンドシーケンサを実行さ せた場合にはスタックオーバーを起こすことがあります。) 動作フローの違いは次のようになります。 従来のコマンドWHILE WHILE ↓ コマンド ↓ コマンド ↓ ENDWHILE → WHILEへ再帰処理 新規追加コマンドのWHILELOOP WHILE ↓ コマンド ←┐ ↓ │ コマンド │WHILEの条件が真 ↓ │ ENDWHILE ─┘ ↓ WHILEの条件が偽 抜ける 3-2-2.WHILEの2重ループのバグ改修 WHILELOOPのロジックをWHILEのロジックをベースに作成しています。2重 ループコマンドシーケンサをテストした際にバグを発見し、このバグがもと のWHILEにあったのでそれを改修いたしました。 3-2-3.他ボード論理チャネルデータ読み出し 各ボードの論理チャネルのデータを論理チャネル名から読み出す関数を追 加することによって、コマンドシーケンサ上から他のボードの論理チャネル データを読み出すコマンドを追加しました。 4.追加・修正関数 4-1.無限ループ対応 追加変更クラス:PComSequencer クラス:PComSequencer 修正関数 get1Line() 'WHILELOOP'、'ENDWHILELOOP'、'BREAK'の処理追加 execControl() 'WHILELOOP'、'ENDWHILELOOP'、'BREAK'の処理追加 2重ループのバグ改修 追加関数 exec1Command2() 機能: コマンド実行関数(再帰処理不要型) インターフェース: STATUS exec1Command2(int , PComCommand*, int mode = PComSequencer::Default); int devFd デバイスのファイルディスクプリタ PComCommand* cmd コマンド属性オブジェクトポインタ int mode 分岐モード execControl2() 機能: 制御コマンド実行関数(再帰処理不要型) インターフェース: STATUS execControl2(int , PComCommand* , int mode = PComSequencer::Default); int devFd デバイスのファイルディスクプリタ PComCommand* cmd コマンド属性オブジェクトポインタ int mode 分岐モード execGpib2() 機能: GPIBコマンド実行関数(再帰処理不要型) インターフェース: STATUS execGpib2(int , PComCommand* , int mode = PComSequencer::Default); int devFd デバイスのファイルディスクプリタ PComCommand* cmd コマンド属性オブジェクトポインタ int mode 分岐モード execSerial2() 機能: SERIALコマンド実行関数(再帰処理不要型) インターフェース: STATUS execSerial2(int , PComCommand* , int mode = PComSequencer::Default); int devFd デバイスのファイルディスクプリタ PComCommand* cmd コマンド属性オブジェクトポインタ int mode 分岐モード execCommon2() 機能: 共通コマンド実行関数(再帰処理不要型) インターフェース: STATUS execCommon2(int , PComCommand* , int mode = PComSequencer::Default); int devFd デバイスのファイルディスクプリタ PComCommand* cmd コマンド属性オブジェクトポインタ int mode 分岐モード execMacro2() 機能: マクロ呼び出しコマンド実行関数(再帰処理不要型) インターフェース: STATUS execMacro2(int , PComCommand* , int mode = PComSequencer::Default); int devFd デバイスのファイルディスクプリタ PComCommand* cmd コマンド属性オブジェクトポインタ int mode 分岐モード execWhileloop() 機能: "WHILELOOP"コマンド実行関数 インターフェース: STATUS execWhileloop(int , PComCommand* , int mode = PComSequencer::Default); int devFd デバイスのファイルディスクプリタ PComCommand* cmd コマンド属性オブジェクトポインタ int mode 分岐モード 4-2.論理チャネル 追加変更クラス:PSmLogicalMaster fChannel PSmData PComSequencer クラス:PSmLogicalMaster 追加関数 getFchData() 機能: 論理チャネルデータ取得 インターフェース: getFchData(char *chname, double *data, double mix, double max) char *chname; 論理チャネル名 double *data 論理チャネルデータ double min 最小値 double max 最大値 機能: 論理チャネル最新データ取得 インターフェース: getFchRealData(char *chname, double *data, double mix, double max) char *chname; 論理チャネル名 double *data 論理チャネルデータ double min 最小値 double max 最大値 クラス:fChannel 追加関数 機能: 論理チャネル最新データ取得 インターフェース: getRealData(double *data, double mix, double max) double *data 論理チャネルデータ double min 最小値 double max 最大値 クラス:PSmData 追加関数 機能: 論理チャネル最新データ取得 インターフェース: RealRead(double *data, double mix, double max) double *data 論理チャネルデータ double min 最小値 double max 最大値 クラス:PComSequencer 修正関数 execCommon() 'OTHERFCHREAD'の処理を追加 execCommon2() 'OTHERFCHREAD'の処理を追加 追加関数 機能: 他ボード論理チャンネルデータの読み込み実行関数(共通関数) インターフェース: execOtherFchRead(PcomCommand *cmd, int mode) PComCommand *cmd コマンド属性オブジェクトポインタ int mode 分岐モード