= Aloka ポータブルエリアモニタ MAR-783 用IOC = データフォーマットは [wiki:epics/streamdevice/Aloka_MAR_783/control 制御方法]を参照。 == protocol ファイル == データ通信がバイナリだが、データ長が固定で単純なデータ形式なので、StreamDeviceで対応。 {{{ Terminator = ETX; ExtraInput = Ignore; # getRadVal { out STX 0x52 0x30; # in STX 0x44 0x30 "%4d" "%(\$1)1d" "%(\$2)1c" 0x31; in STX 0x44 0x30 "%4d" "%(\$1)1d" "%*1d" 0x31; } getRadStat { in STX 0x44 0x30 "%*4d" "%*1d" "%1d" 0x31; } # setAlarm { InTerminator = ""; out STX 0x57 0x30 "%(A)4d" "%(B)1d" "%(C)4d" "%(D)1d" "%(E)02d"; in ACK; @mismatch{} } # getIntrStat { out STX 0x52 0x33; in STX 0x44 0x33 "%1d" 0x30; } }}} デリミタをETX(0x03)に設定し、通信データをASCIIコードで設定。[[br]] データ部は固定長なので、データサイズを指定することによって、個別に取得した。 == db ファイル == 小数部と指数部でレコードを分けて取得し、CALCレコードで計算したものをデータとする。 また、アラームの閾値設定は、alarm1,alarm2で閾値を設定し、setAlarmで機器に設定するようにした。 {{{ record(longin, "$(user):getRadVal") { field(DESC, "Get Radiation decimal Value") field(DTYP, "stream") # field(INP, "@mar783.proto getRadVal($(user):getRadExp,$(user):getStat) $(DEV)") field(INP, "@mar783.proto getRadVal($(user):getRadExp) $(DEV)") field(SCAN, "$(SCAN)") field(FLNK, "$(user):getRadiation") } record(longin, "$(user):getStat") { field(DESC, "Get Radiation Status") field(DTYP, "stream") field(INP, "@mar783.proto getRadStat $(DEV)") field(SCAN, "I/O Intr") } record(longin, "$(user):getRadExp") { field(DESC, "Get Radiation Exponential") } record(calc, "$(user):getRadiation") { field(DESC, "Get Radiation") field(EGU, "mSV/h") field(CALC, "A*(10**(B-4))") field(INPA, "$(user):getRadVal") field(INPB, "$(user):getRadExp") field(MDEL, "0.005") field(ADEL, "0.005") } record(ai, "$(user):alarm1") { field(DESC, "Set Alarm1 Parameter") field(EGU, "uSv/h") field(PREC, "4") field(HOPR, "999000") field(LOPR, "1") field(FLNK, "$(user):alarm1Exp") } record(calc, "$(user):alarm1Val") { field(DESC, "Calc Alarm1 value") field(INPA, "$(user):alarm1") field(INPB, "$(user):alarm1Exp") field(CALC, "(A#0)?(10^((-1*B)+4))*A:0") } record(calc, "$(user):alarm1Exp") { field(DESC, "Calc Alarm1 Exponential") field(INPA, "$(user):alarm1") field(CALC, "(A#0)?(FLOOR(LOG(A))+1):0") field(FLNK, "$(user):alarm1Val") } record(ai, "$(user):alarm2") { field(DESC, "Set Alarm2 Parameter") field(EGU, "mSv/h") field(PREC, "4") field(HOPR, "999000") field(LOPR, "1") field(FLNK, "$(user):alarm2Exp") } record(calc, "$(user):alarm2Val") { field(DESC, "Calc Alarm2 value") field(INPA, "$(user):alarm2") field(INPB, "$(user):alarm2Exp") field(CALC, "(A#0)?(10^((-1 * B)+4))*A:0") } record(calc, "$(user):alarm2Exp") { field(DESC, "Calc Alarm2 Exponential") field(INPA, "$(user):alarm2") field(CALC, "(A#0)?(floor(log(A))+1):0") field(FLNK, "$(user):alarm2Val") } record(longin, "$(user):alarmResp") { field(DESC, "Set Alarm Response(SD mode)") field(EGU, "%") field(PREC, "0") field(HOPR, "20") field(LOPR, "1") } record(calcout, "$(user):setAlarm") { field(DESC, "Set Alarm Parameter") field(INPA, "$(user):alarm1Val") field(INPB, "$(user):alarm1Exp") field(INPC, "$(user):alarm2Val") field(INPD, "$(user):alarm2Exp") field(INPE, "$(user):alarmResp") field(CALC, "0") field(DTYP, "stream") field(OUT, "@mar783.proto setAlarm $(DEV)") } record(longin, "$(user):getIntrStat") { field(DESC, "Get Interupt Status") field(DTYP, "stream") field(INP, "@mar783.proto getIntrStat $(DEV)") field(SCAN, "$(SCAN)") } }}}