= !Save/Restore の使い方 = == ダウンロード・インストール == * 念のため最新の autosave をインストールする。 * ダウンロード先は http://aps.anl.gov/bcda/synApps/autosave/autosave.html * 今回はR5-7-1を使った。 * ダウンロードしたファイルを extensions/src 以下に展開 * configure/RELEASE で base ディレクトリを指定 * make == test Application 作成 == * いつものように makeBaseApp.pl * configure/RELEASE で参照する場所を指定する {{{ AUTOSAVE=$(EPICS_BASE)/../extensions/src/autosave-R5-7-1 }}} * src ディレクトリで Makefileを編集。以下の2行を追加する。 {{{ # for autosave _DBD += asSupport.dbd _LIBS += autosave }}} * db ファイル作成し、waveformレコードを1つ作る {{{ record(waveform, "obina:wf1") { field(DESC, "Analog input") field(INP, "") field(NELM, "10") field(FTVL, "DOUBLE") } }}} == 実行例1:saveせず、単に初期値を設定したいときのやりかた == ここでは例として waveform レコードを初期化する方法について記載します。 (本来の save/restore ではなく restore 部分のみ使うやり方です。邪道かどうかは知りません。) iocBoot ディレクトリでの作業 * st.cmd を編集して set_pass1_restoreFile の1行を追加する(iocInitの前) {{{ .... (snip) .... dbLoadRecords "db/wf1.db" ... # for autosave set_pass1_restoreFile("auto.sav") cd ${TOP}/iocBoot/${IOC} iocInit .... (snip) .... }}} * 同じディレクトリに auto.sav というファイルを作成する。レコード名と値のリスト、最終行にと記載する。(フォーマットの詳細は公式ドキュメント参照) {{{ obina:wf1 @array@ { "1" "2" "3" "4" "5" } }}} * ioc実行(st.cmd) {{{ [obina@erlserv iocsrtest]$ ./st.cmd .... (snip) .... iocInit Starting iocInit ############################################################################ ## EPICS R3.14.12.2 $Date: Mon 2011-12-12 14:09:32 -0600$ ## EPICS Base built Jun 25 2012 ############################################################################ reboot_restore: entry for file 'auto.sav' reboot_restore: Found filename 'auto.sav' in restoreFileList. *** restoring from 'auto.sav' at initHookState 7 (after record/device init) *** reboot_restore: done with file 'auto.sav' iocRun: All initialization complete }}} * caget して、初期化されていることを確認。この例では NELM=10に対して、初期値は5個のみ与えている。 {{{ [obina@erlserv ~]$ caget obina:wf1 obina:wf1 10 1 2 3 4 5 0 0 0 0 0 }}} * 確認のため st.cmd 内の set_pass1_restoreFile 行をコメントアウトすると初期化されていない。 {{{ [obina@erlserv ~]$ caget obina:wf1 obina:wf1 10 2.50321e-308 0 0 0 0 0 0 0 0 0 }}} この例では簡単のため sav ファイルを st.cmd と同じところにおいていますが、別ディレクトリに置くことは可能です。 各種パラメータの詳細は本家のwebページを参照してください。デバッグメッセージの on/off など、いろいろと設定可能です。 == 実行例2:IOC再起動時に元の値を書き戻すやりかた。これが通常の使い方 == 例として ai レコードを3個用意する(obina:ai1, :ai2, :ai3)[[br]] iocBoot ディレクトリでの作業 * 保存したいレコード名を記載した request ファイルを作成 {{{ [obina@erlserv iocsrtest]$ cat test1.req obina:ai1.VAL obina:ai2.VAL obina:ai3.VAL }}} * st.cmd ファイル {{{ ..... dbLoadRecords "db/ai_sample.db" # for autosave set_requestfile_path("$(TOP)/iocBoot/$(IOC)", "") # saveファイルの場所を指定 save_restoreSet_DatedBackupFiles(1) # バックアップファイル作成(日付ごと) set_pass0_restoreFile("test1.sav") # restore ファイル指定 cd ${TOP}/iocBoot/${IOC} iocInit # start monitor for save/restore # iocInit の後に記載する create_monitor_set("test1.req", 10) # requestファイルに記載のレコードをモニター開始。変化があればファイル保存(10秒ごと)。 }}} set_pass0_restore を使うのか _pass1_ を使うのか(あるいは両方)は目的によって異る。また、databaseファイルで PINI=YES/NO の違いもある。 このサンプルで色々試してみると動作を理解しやすいかもしれない。 * create_monitor_set を実行すると .sav ファイルが作成される。中身は今回の例だと以下のようになる。 {{{ [obina@erlserv iocsrtest]$ cat test1.sav # autosave R5.3 Automatically generated - DO NOT MODIFY - 151209-184538 obina:ai1.VAL 3.4567 obina:ai2.VAL 1.2345 obina:ai3.VAL 7.65432 }}}