asynSetTracemask の指定について
PDF文書にも記載していますが、ioc shell 上でデバッグする際に どのようなメッセージが行き来しているかをみることは重要です。
正式なドキュメントは本家のサイト http://www.aps.anl.gov/epics/modules/soft/asyn/ からasynDriverへのリンクを参照してください。
書式
asynSetTraceMask(portName,addr,mask) asynSetTraceIOMask(portName,addr,mask)
定義は公式ドキュメントのTrace Interfaceの項か、ソース ${EPICS_BASE}/../modules/soft/asyn/[ver]/asyn/asynDriver/asynDriver.h を参照。 (バージョンによって違いがあり、下の例はR4-31)
Trace Interface /*asynTrace is implemented by asynManager*/ /*All asynTrace methods can be called from any thread*/ /* traceMask definitions*/ #define ASYN_TRACE_ERROR 0x0001 #define ASYN_TRACEIO_DEVICE 0x0002 #define ASYN_TRACEIO_FILTER 0x0004 #define ASYN_TRACEIO_DRIVER 0x0008 #define ASYN_TRACE_FLOW 0x0010 #define ASYN_TRACE_WARNING 0x0020 /* traceIO mask definitions*/ #define ASYN_TRACEIO_NODATA 0x0000 #define ASYN_TRACEIO_ASCII 0x0001 #define ASYN_TRACEIO_ESCAPE 0x0002 #define ASYN_TRACEIO_HEX 0x0004
デフォルトでは TraceMask が 0x1, TraceIOMask が 0x0 になっているので、 エラーが出たときのみログが表示されるようになっている。
使用例: iocsh上での操作
お勧めは
- 通常時はデフォルトのまま
asynSetTraceMask(PS1, 0, 0x1) asynSetTraceIOMask(PS1, 0, 0x0)
- デバッグ時には traceError と traceIODriver を有効にして
asynSetTraceMask(PS1, 0, 0x9) asynSetTraceIOMask(PS1, 0, 0x4)
としておけば、バイナリ列がどのように行き来しているか分かる。(ASCIIで読みたいときにはIOMaskを0x1に)
とにかく全部見たい場合、まずは
asynSetTraceMask(PS1, 0, -1) asynSetTraceIOMask(PS1, 0, -1)
とかやっても良いです(後で適切なマスクにした方が幸せになれます)。
使用例: AsynRecord GUI
デバッグ用にもともと用意されているレコード類を使うことも便利です。
まずはスタートアップスクリプト st.cmd 内の iocInit より前の位置において
cd $(ASYN) dbLoadRecords("db/asynRecord.db","P=asyn,R=Test,PORT=PS1,ADDR=0,IMAX=0,OMAX=0") cd ${TOP}/iocBoot/${IOC} iocInit
とします。そしてGUIの起動は例えば
medm -x -macro "P=asyn,R=Test" /pf/epics/R315.5/modules/soft/asyn/4-31/opi/medm/asynRecord.adl
のように直接指定すれば良いです(バージョンは使っているioc, asyn と合わせたほうが無難です)。 CSS BOY, medm, edm のGUIが用意されていますので、お好きなモノをお使いください。最新の asyn(R4-31) ではcaqtdm ファイルもあります。
注:PF内でやる場合、他の人とレコード名が衝突しないよう、P=の引数は 自分の名前+asynにするようにしてください。