トップ «前の日記(2017-12-07) 最新 次の日記(2017-12-09)» 編集

Orz日記 by Akio Morita

ToDo:

  • 15 SAD Fit[]回りの障害事例の解析
  • 10 smart pointer版PEGクラスの再実装(Left Recursionまわり)
2006|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|06|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|07|08|09|10|11|12|
2013|01|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|06|07|08|10|12|
2016|01|02|03|05|06|08|10|11|
2017|01|02|03|04|05|06|07|09|10|11|12|
2018|01|02|03|04|06|07|08|09|10|11|12|
2019|01|03|04|05|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2017-12-08 [長年日記]

_ [SAD]CaWrite1/CaWrite2

既存実装の動作解析まとめ

CaWrite1[chid, value]

  • 返り値 - value (ca_put後に ca_getしたものを返す)
  • エラー
    • General::narg - 引数が2個では無い
    • General::wrongtype - 引数の型が正しくない
    • CA::write - valueがReal ListもしくはString Listで無い(ぉぃぉぃ)
      • caputrealarray_/caputstringarray_にてList要素の型検査エラーで発生
      • EPICS CA APIのエラーは、すべて無視されている
  • 実装本体は、nfCaWrite(src/tfefun2.f)及び caputreal_/caputstring_/caputrealarray_/caputstringarray_(src/CaSearch_.c)
    • ca_stateは調べていない
      • ca_put時点で接続状態になければ、ECA_DISCONNが返る
    • ca_put/ca_getの後で、ca_pend_ioする(計2回)ので、Blocking I/Oになっている
      • ca_put後のca_pend_ioは、ca_flush_ioで十分と思われる
    • EPICS CA APIのエラーハンドリングは行われない
    • ca_pend_ioのタイムアウト設定値
関数タイムアウト
caputreal_100
caputsyring_0.1
caputrealarray_0.5
caputstringarray_0.5

CaWrite2[{chid, value}...]

  • 返り値 - Null
  • エラー
    • General::narg - 引数無しの場合
  • 引数を個別 nfCaWriteNoWait(src/tfefun2.f)で処理する
  • nfCaWriteNoWait側では、itfmessageによるエラー処理を行っているが、ドライバ側(tfefun2)で irtcをクリアし、Nullを返している
    • ca_state(chid)が cs_connであることをca_putの事前条件に設定している
    • ca_putは、DBR_STRING/DBR_DOUBLEにて、ca_put/ca_array_putを実行している(caput*nowait_ @ src/CaSearch_.c)
      • ca_putは、ca_array_putのマクロなので、この部分は EPICS\$CaPutと同様と言える
      • General::nargを返すケースを除外すると、エラーを無視してEPICS\$CaPutをScanする以下のコードと同義
CaWrite2[arguments__] := Scan[Check[EPICS$CaPut@@#, Null]&, {arguments}]

再実装の方針

  • CaWrite1は、EPICS\$CaPutに ca_pend_io→ca_get→ca_pend_ioのシーケンスを追加した派生版として実装可能
    • DBRテンプレートと戻り値生成部の改修で対応可能
    • ca_pend_ioのタイムアウト値は、再検討が必要
      • CaOpen1/CaOpen2/CaRead1/CaRead2にも存在するので、調査の上、合理的な値を設定すべき
  • CaWrite2は、EPICS\$CaPutにエラー時のMessage生成を抑制した派生版で引数列をScanするドライバーとして実装可能

_ [SAD][EPICS]ca_put前のca_state検査

ca_putのマニュアルによれば、ca_put時点でchannelが接続状態になければ、ECA_DISCONNが返るとあるので、ca_putに投げ込む値を組み立てるのにコストが必要な場合は、事前にca_stateで接続状態を確認した方が良いと思われる


カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記