wiki:epics/saverestore

Version 6 (modified by obina, 9 years ago) (diff)

--

Autosave の使い方

目的:IOC再起動時にレコードの値を自動で保存し、起動時に元の値を復元する。自動保存を省略して初期化する目的にも使用可能であり、waveformの初期化をしたいときには便利。

ダウンロード・インストール

  • ダウンロードしたファイルを 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
    <appname>_DBD  += asSupport.dbd
    <appname>_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 というファイルを作成する。レコード名と値のリスト、最終行に<END>と記載する。(フォーマットの詳細は公式ドキュメント参照)
    obina:wf1 @array@ { "1" "2" "3" "4" "5" }
    <END>
    
  • 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)

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
    create_monitor_set("test1.req", 10)   # iocInit の後に記載すること。
                                          # requestファイル記載のレコードをモニター開始
                                          # 変化があれば .sav ファイルに保存する(この例では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
    <END>