wiki:epics/streamdevice/Aloka_MAR_783/ioc

Version 1 (modified by michkawa, 11 years ago) (diff)

--

Aloka ポータブルエリアモニタ MAR-783 用IOC

データフォーマットは 制御方法を参照。

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コードで設定。
データ部は固定長なので、データサイズを指定することによって、個別に取得した。

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)")
}

Attachments (1)

Download all attachments as: .zip