で、私(とびやま)の今までのスタイルは以下の通りでした。
このスタイルの対極にあるスタイルとして
今まではPCから直接アクセスする方法が整備されていなかった(実は方法は あったがVisual Cのみでサポートされていたのでナンセンス)ので、 この状況をあきらめて いたのですが、このたびPF光源研究系の帯名氏の努力でDelphiで直接 EPICSアクセスが出来るようになりました。Delphiで直接EPICS制御する メリットは
SET EPICS_CA_SEARCH_ADDR_LIST=172.19.63.255 SET EPICS_CA_ADDR_LIST=172.19.63.255なお、制御ネットの外からアクセスするためには、PC側のroute設定も必要です。
uses なんたら... , EPICStypes;また、imprementationのuses節で
uses CA_i,...と言うように宣言します。CA_iの中にはepicsアクセスのための関数、procedureが
function ca_connect(Name:Pchar):integer; function ca_get_ai(ChanID : integer) : double; function ca_get_li(ChanID : integer) : integer; function ca_get_string(ChanID: integer) : string; procedure GetWaveformFloat(ChanID: integer; NumElem : cardinal;var s :array of single); procedure GetWaveformDouble(ChanID: integer; NumElem : cardinal;var s :array of double); procedure ca_put_ao(ChanID: integer; var iarr : double); procedure ca_put_lo(ChanID: integer; var iarr : integer); procedure ca_put_string(ChanID: integer; iarr : string); procedure PutWaveformFloat(ChanID: integer; NumElem : cardinal; var s :array of single); procedure PutWaveformDouble(ChanID: integer; NumElem : cardinal; var s :array of double); procedure GetWaveformInteger(ChanID: integer; NumElem : cardinal; var s :array of integer); procedure PutWaveformInteger(ChanID: integer; NumElem : cardinal; var s :array of integer);
の様に宣言してあります(これ以外にももっと宣言してある)。 waveformに関しては、elementがfloat、double、integerの 場合だけ宣言してありますが、それ以外の時は別に作る必要があるでしょう。bi、mbbi、 mbbiDirect、bo、mbbo、mbboDirectについては多分ca_get_li、ca_put_loで済むと 思います。
var her_dcct_ptr : integer; her_dcct : double;と宣言しておき、form初期化部分でca_connectをします。
procedure Tなんとか.formcreate(Sender : TObject); var s1 : PChar; rtn : integer; begin rtn := ca_task_initialize; {忘れると計算機が不安定になることがある} s1 := 'BMH:DCCT:CURRENT'; her_dcct_ptr := ca_connect(s1); end;とします。なお、ここで結構時間がかかりますので、ソフトがなかなか 出てこなくてユーザーに不安を与えます。別の場所で初期化するか、あるいは 何らかのメッセージを表示しておくのも良いでしょう。その場合でも、 ca_task_initializeはca_connectをする前に確実に1回(だけ)呼ぶ必要があります。 ca_task_initializeのリターンコードは正常に終了したときは1が帰ってきます。 ここでエラーとなる可能性があるときは(あまり思いつかないが)コードを終了した 方が良いでしょう。 ca_connectはソフトを 終了するまでは同じepics recordについては二度と使う必要はありません(つかっては いけません)。 しつこくca_connectをするとIOC上でメモリーリークが起きるためIOCがくたばります。
一定時間ごとにレコードの値をとってくるためには、timerコンポーネントを使い
procedure Tなんとか.Timer1Timer(Sender: TObject); begin Timer1.enabled := false; her_dcct := ca_get_ai(her_dcct_ptr); 色々な処理(labelに書いたり、chartに書いたり) Timer1.enabled := true; end;という感じで使います。waveformの時はすでにおわかりと思いますが
var bcm1_ptr,bcm2_ptr : integer; bcm1,bcm2 : array[0..2559] of single; procedure Tなんとか.formcreate(Sender : TObject); var s1 : PChar; begin s1 := 'FBHBCMT:FILL1'; bcm1_ptr := ca_connect(s1); s1 := 'FBHBCMT:FILL2'; bcm2_ptr := caconnect(s1); end; procedure Tなんとか.Timer1Timer(Sender: TObject); begin Timer1.enabled := false; GetWaveformFloat(bcm1_ptr,2560,bcm1); GetWaveformFloat(bcm2_ptr,2560,bcm2); 色々な処理 Timer1.enabled := true; end;と言った形になります。なお、特には要らないですが、 プログラムを終了するときca_task_exitをしておきます(自動的に呼ばれること になっている)。
バンチ電流表示本体フォームです。これが表示された段階で、channel connectionは完了しています。また、caRepeaterが動いていなければ caRepeaterを起動し、taskが常駐します。このため、caRepeterとか ca.dllを更新、削除するためにはwindows98系ではリブートが、 NTではタスク終了が必要となります。 スタートボタンを押すとtimerがenable となり、スタートボタンの横で設定した時間間隔でデータをとってきます。 (record自体の更新は入射時はキッカートリガー間隔(最小20ms)、 通常蓄積時は1秒)。ストップではtimerを止めているだけです。
HER(上)とLER(下)のバンチ電流を表示させたところです。グラフの作成には TeeChart Pro 5.01を使用しています。なお、multi chart表示に なんだかバグがいるみたいで(TeeChartに)、妙なことをしないと うまく表示できません。
IOCで接続状況を表示させると
>casr 2 Client Name="tobiyama", Client Host="tobiyama-98", V4.8, Channel Count=10 TId=0X3BC8738, Protocol=TCP, Socket FD=66 Secs since last send 0.47, Secs since last receive 0.47 Unprocessed request bytes=0, Undelivered response bytes=0 Remote Address 130.87.??.??? Remote Port 1708 State=up 33648 bytes allocated FBH:BCM:FILL1(0rw) FBH:BCM:FILL2(0rw) FBL:BCM:FILL1(0rw) FBL:BCM:FILL2(0rw) FBLBCM:MAX(0rw) FBHBCM:MAX(0rw) FBHBCM:NBUNCH(0rw) FBLBCM:NBUNCH(0rw) FBHBCM:AVE(0rw) FBLBCM:AVE(0rw)と、ちゃんと直接にアクセスしていることが分かります。
フィードバック機器の温度及び真空度を表示するソフトウエアです。5秒に一回データ を取ってきて、chartのxy変数に代入すると同時に画面にも表示します。 つまり、timerの中でlabelへの書き込みとchart.seriesへのaddを同時にやっています。 また、chartへの記録長は最長2時間としてそれ以前のデータは捨てています。
各グループボックスをdouble clickすると履歴のchartが出るようにしています。 チャートの下の時刻はnowで取ってきた(このプログラムが動いている)計算機の ローカルタイムです。
KEKBリング(HER、LER)のリング情報とルミノシティ情報を同時に表示するパネルです。