diff --git a/conman.c b/conman.c index 6afdc5cc..e069cc51 100644 --- a/conman.c +++ b/conman.c @@ -2127,8 +2127,17 @@ static void hookFunc(const char *pText, OutCode eOut, void*pData) { SConnection *pCon = (SConnection *) pData; int text_len = strlen(pText); + char txt[5]; - ANETwrite(pCon->sockHandle, pText, text_len); + if (!VerifyConnection(pCon)) { + return; + } + if (!ANETvalidHandle(pCon->sockHandle)) { + return; + } + snprintf(txt, 5, "%3s:", OutCodeToTxt(eOut)); + ANETwrite(pCon->sockHandle, txt, 4); + ANETwrite(pCon->sockHandle, (char *)pText, text_len); if (pText[text_len - 1] != '\n') ANETwrite(pCon->sockHandle, "\n", 1); } @@ -2151,9 +2160,13 @@ int KillCapture(SConnection * pCon) int LogCapture(SConnection * pCon, SicsInterp * pSics, void *pData, int argc, char *argv[]) { + SConnection * pConMaster; char pBueffel[512]; int i; + pConMaster = SCfindMaster(pCon); + if (pConMaster == NULL) + return 0; /* check no af args */ if (argc < 2) { snprintf(pBueffel,sizeof(pBueffel)-1, "Insufficient number of arguments to %s", argv[0]); @@ -2164,18 +2177,19 @@ int LogCapture(SConnection * pCon, SicsInterp * pSics, void *pData, /* Branch according to argv[1] */ if (strcmp(argv[1], "kill") == 0) { - KillCapture(pCon); + KillCapture(pConMaster); return 1; } else if (strcmp(argv[1], "all") == 0) { - AddSICSLogHook(hookFunc, "all", pCon); + AddSICSLogHook(hookFunc, "all", pConMaster); return 1; } else if (argc == 2) { /* must be outcode, try find it */ - AddSICSLogHook(hookFunc, argv[1], pCon); + AddSICSLogHook(hookFunc, argv[1], pConMaster); return 1; } else { /* make it a list */ - int i, len; + int i; + size_t len; char *pBuff; for (i = 1, len = 0; i < argc; ++i) len += strlen(argv[i]) + 1; @@ -2193,7 +2207,7 @@ int LogCapture(SConnection * pCon, SicsInterp * pSics, void *pData, strcpy(&pBuff[len], argv[i]); len += strlen(argv[i]); } - AddSICSLogHook(hookFunc, pBuff, pCon); + AddSICSLogHook(hookFunc, pBuff, pConMaster); if (pBuff != pBueffel) free(pBuff); return 1; @@ -2212,7 +2226,8 @@ int LogOutput(SConnection * pCon, SicsInterp * pSics, void *pData, { char pBueffel[512]; char *pBuff; - int i, len, result, start; + int i, result, start; + size_t len; OutCode outcode; /* check no af args */ @@ -2323,7 +2338,7 @@ int SCTaskFunction(void *pData) pPassword = strtok(NULL, " \t\r\n"); iRet = IsValidUser(pUser, pPassword); if (iRet >= 0) { - SCWrite(self, "Login OK", eError); + SCWrite(self, "Login OK", eLog); self->iLogin = 1; SCSetRights(self, iRet); pHost[0] = '\0'; diff --git a/servlog.c b/servlog.c index 72cf3825..da51c839 100644 --- a/servlog.c +++ b/servlog.c @@ -270,8 +270,8 @@ static FILE *fLogFile = NULL; static int iFile = 0; static int iLineCount = 0; static int iLogUsable = 1; -static char filnam[512]; -static char prevfilnam[512]; +static char filnam[1024]; +static char prevfilnam[1024]; /*---------------------------------------------------------------------------*/ int OpenVerifyLogFile() @@ -280,17 +280,21 @@ int OpenVerifyLogFile() char *pChar = NULL; char fPath[1024]; -/* snprintf(fPath, 1023, "%s/", getenv("SICS_INIT_LOGPATH")); */ - snprintf(fPath, 1023, "%s/", "../log"); + pChar = getenv("SICS_INIT_LOGPATH"); + if (!pChar) { + snprintf(fPath, sizeof(fPath) - 1, "%s/", "../log"); + } else { + snprintf(fPath, sizeof(fPath) - 1, "%s/", pChar); + } pChar = IFindOption(pSICSOptions, "LogFileBaseName"); if (!pChar) { /* Try to write to file "server" in */ strcpy(pFile, "server"); } else { - strlcpy(pFile, pChar, 255); + strlcpy(pFile, pChar, sizeof(pFile) - 1); } - snprintf(filnam, 511, "%s%s_%19.19s.%02d.log", fPath, pFile, timestamp(NULL, '-'), iFile); + snprintf(filnam, sizeof(filnam) - 1, "%s%s_%19.19s.%02d.log", fPath, pFile, timestamp(NULL, '-'), iFile); iFile++; if (iFile >= MAXFILES) { iFile = 0; diff --git a/sicvar.c b/sicvar.c index be6d8e07..125277e4 100644 --- a/sicvar.c +++ b/sicvar.c @@ -456,7 +456,7 @@ int VarWrapper(SConnection * pCon, SicsInterp * pInterp, void *pData, return 1; case veFloat: VarGetFloat(pVar, &fVal); - snprintf(pBueffel,sizeof(pBueffel)-1, "%s = %f", argv[0], fVal); + snprintf(pBueffel,sizeof(pBueffel)-1, "%s = %g", argv[0], fVal); SCWrite(pCon, pBueffel, eValue); DeleteTokenList(pList); return 1; diff --git a/site_ansto/instrument/bilby/MANIFEST.TXT b/site_ansto/instrument/bilby/MANIFEST.TXT index 06aa801e..333ba0cf 100644 --- a/site_ansto/instrument/bilby/MANIFEST.TXT +++ b/site_ansto/instrument/bilby/MANIFEST.TXT @@ -4,3 +4,4 @@ config util hostport_config.tcl hostport_config_test.tcl +sics_simulation.tcl diff --git a/site_ansto/instrument/bilby/sics_simulation.tcl b/site_ansto/instrument/bilby/sics_simulation.tcl new file mode 100644 index 00000000..61074dae --- /dev/null +++ b/site_ansto/instrument/bilby/sics_simulation.tcl @@ -0,0 +1,23 @@ +# Simulation flags, possible values = true or false +# true: The simulated driver will be used. +# false: The real driver will be used. +# icsval column = settings when running on the Instrument Control Server (ie SICS_SIMULATION not defined) +# fakedev column = settings for test platforms (ie SICS_SIMULATION=fakedev) +foreach {simflag icsval fakedev} { + opal_simulation false true + detector_simulation false true + hmm_simulation false true + environment_simulation false false + counter_simulation true true + motor_simulation false false + chopper_simulation false true + velsel_simulation false true + plc_simulation false true + rfgen_simulation false true + goniometer_simulation false true + magnetic_simulation false true +} { + dict set SIMFLAG_VAL $simflag ICSVAL $icsval + dict set SIMFLAG_VAL $simflag FAKEDEV $fakedev + VarMake $simflag Text internal +} diff --git a/site_ansto/instrument/bilby/util/sics_config.ini b/site_ansto/instrument/bilby/util/sics_config.ini index 33150521..462d7341 100644 --- a/site_ansto/instrument/bilby/util/sics_config.ini +++ b/site_ansto/instrument/bilby/util/sics_config.ini @@ -8,4 +8,4 @@ driver = astrium_chopper imptype = disk_chopper ip = 137.157.203.39 port = 3302 - +terminator = \r\n diff --git a/site_ansto/instrument/config/anticollider/anticollider_common.tcl b/site_ansto/instrument/config/anticollider/anticollider_common.tcl index c9b0ec8a..209a3522 100644 --- a/site_ansto/instrument/config/anticollider/anticollider_common.tcl +++ b/site_ansto/instrument/config/anticollider/anticollider_common.tcl @@ -45,13 +45,18 @@ proc handle_acscript_exception {status message args} { proc ::anticollider::loadscript {args} { variable veto_rules - set fh [open $::cfPath(anticollider)/[lindex $args 0] RDONLY ] - while {[gets $fh line] >= 0} { - # Skip empty lines and comments - if [regexp {^\s*$|^ *#} $line] { - continue + catch { + set fh [open $::cfPath(anticollider)/[lindex $args 0] RDONLY ] + while {[gets $fh line] >= 0} { + # Skip empty lines and comments + if [regexp {^\s*$|^ *#} $line] { + continue + } + lappend veto_rules $line } - lappend veto_rules $line + } + catch { + close $fh } } diff --git a/site_ansto/instrument/config/environment/agilent_33220A_sct.tcl b/site_ansto/instrument/config/environment/agilent_33220A_sct.tcl index 3fd61064..363371d9 100644 --- a/site_ansto/instrument/config/environment/agilent_33220A_sct.tcl +++ b/site_ansto/instrument/config/environment/agilent_33220A_sct.tcl @@ -27,8 +27,8 @@ proc ::scobj::agilent_33220A::sics_log {debug_level debug_string} { } catch_message ] } -proc ::scobj::agilent_33220A::mkDriver { sct_controller name ip_address tcp_port } { - ::scobj::agilent_33220A::sics_log 9 "::scobj::agilent_33220A::mkDriver ${sct_controller} ${name} ${ip_address} ${tcp_port}" +proc ::scobj::agilent_33220A::mkDriver { sct_controller name device_class simulation_flag ip_address tcp_port } { + ::scobj::agilent_33220A::sics_log 9 "::scobj::agilent_33220A::mkDriver ${sct_controller} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}" set ns "[namespace current]" set catch_status [ catch { @@ -40,21 +40,27 @@ proc ::scobj::agilent_33220A::mkDriver { sct_controller name ip_address tcp_port handle_exception ${catch_status} ${catch_message} } +proc ::scobj::agilent_33220A::add_driver {name device_class simulation_flag ip_address tcp_port} { + set catch_status [ catch { + ::scobj::agilent_33220A::sics_log 9 "::scobj::agilent_33220A::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}" + ::scobj::agilent_33220A::sics_log 9 "No sctcontroller for agilent_33220A" + ::scobj::agilent_33220A::sics_log 1 "::scobj::agilent_33220A::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}" + ::scobj::agilent_33220A::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + namespace eval ::scobj::agilent_33220A { namespace export debug_threshold namespace export debug_log namespace export sics_log namespace export mkDriver + namespace export add_driver } proc add_agilent_33220A {name ip_address tcp_port} { - set catch_status [ catch { - ::scobj::agilent_33220A::sics_log 9 "add_agilent_33220A ${name} ${ip_address} ${tcp_port}" - ::scobj::agilent_33220A::sics_log 9 "No sctcontroller for agilent_33220A" - ::scobj::agilent_33220A::sics_log 1 "::scobj::agilent_33220A::mkDriver sct_${name} ${name} ${ip_address} ${tcp_port}" - ::scobj::agilent_33220A::mkDriver sct_${name} ${name} ${ip_address} ${tcp_port} - } catch_message ] - handle_exception ${catch_status} ${catch_message} + set simulation_flag "[string tolower [SplitReply [environment_simulation]]]" + ::scobj::agilent_33220A::add_driver ${name} "environment" "${simulation_flag}" ${ip_address} ${tcp_port} } clientput "file evaluation of agilent_33220A_sct.tcl" @@ -65,6 +71,8 @@ proc ::scobj::agilent_33220A::read_config {} { set ns "::scobj::agilent_33220A" dict for {k u} $::config_dict { if { [dict exists $u "implementation"] } { + set simulation_flag "[string tolower [SplitReply [environment_simulation]]]" + set device_class "environment" if { !([dict exists $u "name"] && [dict exists $u "enabled"]) } { continue } @@ -72,6 +80,12 @@ proc ::scobj::agilent_33220A::read_config {} { if { ! ([string equal -nocase $enabled "true" ] || [string equal -nocase $enabled "always"]) } { continue } + if { [dict exists $u "simulation_group"] } { + set simulation_flag [SplitReply [[string tolower [dict get $u "simulation_group"]]]] + } + if { [dict exists $u "device_class"] } { + set device_class "[dict get $u "device_class"]" + } set name [dict get $u name] set implementation [dict get $u "implementation"] if { !([dict exists $::config_dict $implementation]) } { @@ -82,9 +96,9 @@ proc ::scobj::agilent_33220A::read_config {} { continue } if { [string equal -nocase [dict get $v "driver"] "agilent_33220A"] } { - if { ![string equal -nocase [SplitReply [environment_simulation]] "false"] } { + if { ![string equal -nocase "${simulation_flag}" "false"] } { set asyncqueue "null" - ${ns}::sics_log 9 "[environment_simulation] => using null asyncqueue" + ${ns}::sics_log 9 "simulation_flag=${simulation_flag} => using null asyncqueue" } elseif { [dict exists $v "asyncqueue"] } { set asyncqueue [dict get $v "asyncqueue"] if { [string equal -nocase ${asyncqueue} "sct"] } { @@ -111,9 +125,9 @@ proc ::scobj::agilent_33220A::read_config {} { } } if { [string equal -nocase ${asyncqueue} "sct"] } { - add_agilent_33220A ${name} ${ip_address} ${tcp_port} + ${ns}::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} } else { - add_agilent_33220A ${name} "aqadapter" ${asyncqueue} + ${ns}::add_driver ${name} ${device_class} ${simulation_flag} "aqadapter" ${asyncqueue} } } } diff --git a/site_ansto/instrument/config/environment/knauer_pump.sct b/site_ansto/instrument/config/environment/knauer_pump.sct new file mode 100644 index 00000000..7d78e18a --- /dev/null +++ b/site_ansto/instrument/config/environment/knauer_pump.sct @@ -0,0 +1,372 @@ +# +# Template driver for the Knauer BlueShadow Pump 40P +# vim: ts=8 sts=2 sw=2 expandtab autoindent smartindent nocindent +# +driver knauer_pump = { + debug_threshold = 0; + vendor = knauer; device = pump40p; protocol = knauer_ap; + class = environment; + simulation_group = environment_simulation; +# + group dummy = { + type = text; readable = 1; data = false; control = false; nxsave = false; + var status = { read_command = 'STATUS?'; read_function = read_status; } + var glp = { read_command = 'GLP?'; read_function = read_glp; property real_data = ' '; } + } + + group pump = { + var remote = { + type = int; + readable = 1; read_command = 'REMOTE?'; read_function = remote_read; + writeable = 1; write_function = remote_write; + } + var state = { + type = text; + readable = 1; + read_command = ' '; + fetch_function = state_fetch; + } + var status = { + type = text; + readable = 1; + read_command = ' '; + fetch_function = status_fetch; + } + var volume_pv = { + type = float; + readable = 1; + read_command = ' '; + fetch_function = volume_fetch; +#checkrange_function = volume_reject; + property 'units' = 'mL'; + } + var volume_sp = { + type = float; + writeable = 1; + write_command = ' '; + write_function = volume_write; + driveable = pump/volume_pv + checkstatus_function = volume_checkstatus; + halt_function = volume_halt; + lowerlimit = 0; upperlimit = 100; tolerance = 0.01; + readable = 1; + read_command = ' '; + fetch_function = volume_checkpumping; + property 'units' = 'mL'; + } + var ratio_pv = { + type = text; + readable = 1; read_command = ' '; fetch_function = ratios_fetch; + property 'units' = 'percent'; + } + var ratio_sp = { + type = text; + writeable = 1; write_command = ' '; write_function = ratios_write; checkrange_function = ratios_check; + property 'units' = 'percent'; + } + var flow_pv = { + type = float; + readable = 1; read_command = ' '; fetch_function = flow_fetch; + property 'units' = 'mL/min'; + } + var flow_sp = { + type = float; + writeable = 1; write_command = ' '; write_function = flow_write; + lowerlimit = 0; upperlimit = 10; + property 'units' = 'mL/min'; + } + } + + group stuff = { + readable = 60; + type = text; + data = false; control = false; nxsave = false; + var an_out = { read_command = 'AN_OUT?'; } + var boardinfo = { read_command = 'BOARDINFO?'; } + var config = { read_command = 'CONFIG?'; } + var cprofinfo = { read_command = 'CPROFINFO?'; } + var dout = { read_command = 'DOUT?'; } + var error = { read_command = 'ERROR?'; } + var errors = { read_command = 'ERRORS?'; } + var flushpmp = { read_command = 'FLUSHPMP?'; } + var head = { read_command = 'HEAD?'; } + var head_par = { read_command = 'HEAD_PAR?'; } + var identify = { read_command = 'IDENTIFY?'; } + var lpg = { read_command = 'LPG?'; } + var oem = { read_command = 'OEM?'; } + var opt = { read_command = 'OPT?'; } + var plim = { read_command = 'PLIM?'; } + var pressure = { read_command = 'PRESSURE?'; } + var prfastacq = { read_command = 'PRFASTACQ?'; } + var purge = { read_command = 'PURGE?'; } + var remote = { read_command = 'REMOTE?'; } + var rfid = { read_command = 'RFID?'; } + var service = { read_command = 'SERVICE?'; } + var sysinfo = { read_command = 'SYSINFO?'; } + var 'units' = { read_command = 'UNITS?'; } + var valves = { read_command = 'VALVES?'; } + } + group prog = { + readable = 30; + type = text; + var line_01 = { read_command = "TT_GET:1,1"; } + var line_02 = { read_command = "TT_GET:1,2"; } + var line_03 = { read_command = "TT_GET:1,3"; } + var line_04 = { read_command = "TT_GET:1,4"; } + var line_05 = { read_command = "TT_GET:1,5"; } + } + group glp = { + type = text; + readable = 1; + fetch_function = fetch_from_glp; + var board_time = { read_command = '0'; } + var motor_time = { read_command = '1'; } + var head_count = { read_command = '3'; } + var head_time = { read_command = '4'; } + var head_volm = { read_command = '5'; } + var head_voln = { read_command = '6'; } + var head_pwrhi = { read_command = '7'; } + var head_pwrlo = { read_command = '8'; } + var pump_revs = { read_command = '9'; } + var pump_volm = { read_command = '10'; } + var pump_voln = { read_command = '11'; } + var pump_pwrhi = { read_command = '12'; } + var pump_pwrlo = { read_command = '13'; } + } + group status = { + type = text; + readable = 1; + fetch_function = fetch_from_status; + var state = { read_command = '1'; } + var cur_error = { read_command = '2'; } + var cur_run_time = { read_command = '3'; } + var flow_rate = { read_command = '4'; } + var lpg_0 = { read_command = '5'; } + var lpg_1 = { read_command = '6'; } + var lpg_2 = { read_command = '7'; } + var lpg_3 = { read_command = '8'; } + var evt_0 = { read_command = '9'; } + var evt_1 = { read_command = '10'; } + var evt_2 = { read_command = '11'; } + var evt_3 = { read_command = '12'; } + var evt_4 = { read_command = '13'; } + var evt_5 = { read_command = '14'; } + var evt_6 = { read_command = '15'; } + var evt_7 = { read_command = '16'; } + var cur_pres = { read_command = '17'; } + var start_in = { read_command = '18'; } + var error_in = { read_command = '19'; } + } + + code fetch_from_glp = {%% + set index ${cmd_str} + set data [hgetpropval ${tc_root}/dummy/glp real_data] + set dlist [split ${data} ","] + if { [llength ${dlist}] > ${index} } { + sct result [lindex ${dlist} ${index}] + } else { + sct result "" + } + set cmd "@@NOSEND@@" + %%} + + code fetch_from_status = {%% + set index ${cmd_str} + set data [hgetpropval ${tc_root}/dummy/status real_data] + set dlist [split ${data} ","] + if { [llength ${dlist}] > ${index} } { + sct result [lindex ${dlist} ${index}] + } else { + sct result "" + } + set cmd "@@NOSEND@@" + %%} + + code read_glp = {%% + if { [string equal -nocase -length 6 ${data} "ERROR:"] } { + } else { + set dlist [split [lindex [split ${data} ":"] 1] ","] + sct real_data "[join [lrange ${dlist} 0 end] ,]" + set data "Hidden in real_data property" + } + %%} + code read_status = {%% + set dlist [split [lindex [split ${data} ":"] 1] ","] + sct real_data "[join [lrange ${dlist} 0 end] ,]" + set data "Hidden in real_data property" + %%} + code status_fetch = {%% + set index 1 + set data [hgetpropval ${tc_root}/dummy/status real_data] + set dlist [split ${data} ","] + set status_code [lindex ${dlist} ${index}] + set cmd "@@NOSEND@@" + if { ${status_code} == 3 } { + sct result "PUMPING" + } else { + sct result "IDLE" + } + %%} + code state_fetch = {%% + set index 1 + set data [hgetpropval ${tc_root}/dummy/status real_data] + set dlist [split ${data} ","] + set state_code [lindex ${dlist} ${index}] + set cmd "@@NOSEND@@" + if { ${state_code} < 0 || ${state_code} > 9 } { + sct geterror "Invalid device_state ${state_code}" + error "[sct geterror]" + } + set slist [list "SYS_ST_INITIALIZING" \ + "SYS_ST_OFF" \ + "SYS_ST_IDLE" \ + "SYS_ST_RUN" \ + "SYS_ST_HOLD" \ + "SYS_ST_PURGE" \ + "SYS_ST_STANDBY" \ + "SYS_ST_FAILED" \ + "SYS_ST_RUNATEND" \ + ] + sct result [lindex ${slist} ${state_code}] + %%} + + code halt = {%% + set rlist [hval ${tc_root}/pump/ratio_sp] + set ratio_tgt [join [split ${rlist} /] ,] + set cmd "RAMP:0,0,${ratio_tgt},0,0,0,0,0,0,0,0,2" + %%} + + code flow_fetch = {%% + set data [hgetpropval ${tc_root}/dummy/status real_data] + set dlist [split ${data} ","] + set flow_pv [lindex ${dlist} 4] + sct result [expr {0.001 * ${flow_pv}}] + set cmd "@@NOSEND@@" + %%} + code flow_write = {%% + set data [sct target] + set cmd "@@NOSEND@@" + set nextState idle + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } + %%} + + code ratios_check = {%% + set rlist [split ${setpoint} /] + if { [llength ${rlist}] != 4 } { + sct geterror "${setpoint} has [llength ${rlist}] components, needs 4" + error [sct geterror] + } + set sum [expr [lindex ${rlist} 0] + [lindex ${rlist} 1] + [lindex ${rlist} 2] + [lindex ${rlist} 3]] + if { ${sum} != 100 } { + sct geterror "sum is ${sum}, must be 100" + error [sct geterror] + } + %%} + + code ratios_fetch = {%% + set data [hgetpropval ${tc_root}/dummy/status real_data] + set dlist [split ${data} ","] + set ratio_vals "[lindex ${dlist} 5]/[lindex ${dlist} 6]/[lindex ${dlist} 7]/[lindex ${dlist} 8]" + sct result ${ratio_vals} + set cmd "@@NOSEND@@" + %%} + code ratios_write = {%% + set data [sct target] + set cmd "@@NOSEND@@" + set nextState idle + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } + %%} + + code remote_read = {%% + if { [string equal -length 7 ${data} "REMOTE:"] } { + set data [lindex [split ${data} :] 1] + } else { + sct geterror "bad response" + error "[sct geterror]" + } + %%} + + code remote_write = {%% + if { ${par} == 0 } { + set cmd "LOCAL" + } else { + set cmd "REMOTE" + } + %%} + code volume_fetch = {%% + set data [hgetpropval ${tc_root}/dummy/glp real_data] + set dlist [split ${data} ","] + if { [llength ${dlist}] > 11 } { + set pump_volm [lindex ${dlist} 10] + set pump_voln [lindex ${dlist} 11] + set pump_volume [expr {${pump_volm} + 0.000001 * ${pump_voln}}] + } else { + set pump_volume 0.0 + } + sct raw_volume ${pump_volume} + if { [hpropexists [sct] base_volume] } { + set pump_volume [expr {${pump_volume} - [sct base_volume]}] + } elseif { [hpropexists [sct] raw_volume] } { + sct base_volume [sct raw_volume] + } + sct result [format "%.2f" ${pump_volume}] + set cmd "@@NOSEND@@" + %%} + code volume_write = {%% + hsetprop ${tc_root}/[sct driveable] base_volume [hgetpropval ${tc_root}/[sct driveable] raw_volume] + hset ${tc_root}/[sct driveable] 0.0 + set flow_tgt [expr {int(1000.0 * [hval ${tc_root}/pump/flow_sp])}] + set ratio_tgt [join [split [hval ${tc_root}/pump/ratio_sp] /] ,] + set cmd "RAMP:0,${flow_tgt},${ratio_tgt},0,0,0,0,0,0,0,0,3" + sct pumping 1 + set data ${par} + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } + %%} + + code volume_checkpumping = {%% + set cmd "@@NOSEND@@" + set nextState idle + if { [hpropexists [sct] pumping] && [sct pumping] } { + if { [hpropexists [sct] driving] && [sct driving] } { + volume_checkstatus "${tc_root}" + } + set sp "[sct target]" + set pv "[hval ${tc_root}/[sct driveable]]" + if { (${sp} - ${pv}) <= [sct tolerance] } { + set flow_tgt 0 + set ratio_tgt [join [split [hval ${tc_root}/pump/ratio_sp] /] ,] + set cmd "RAMP:0,${flow_tgt},${ratio_tgt},0,0,0,0,0,0,0,0,2" + set nextState noResponse + sct driving 0 + sct pumping 0 + } + } + %%} + + code volume_halt = {%% + set flow_tgt 0 + set ratio_tgt [join [split [hval ${tc_root}/pump/ratio_sp] /] ,] + set cmd "RAMP:0,${flow_tgt},${ratio_tgt},0,0,0,0,0,0,0,0,2" + sct send ${cmd} + %%} + + code volume_reject = {%% + sct geterror "cannot use hset on [sct]" + error "[sct geterror]" + %%} +} diff --git a/site_ansto/instrument/config/environment/magneticField/green_magnet_labview_sct.tcl b/site_ansto/instrument/config/environment/magneticField/green_magnet_labview_sct.tcl index 28a5382b..1104d82a 100644 --- a/site_ansto/instrument/config/environment/magneticField/green_magnet_labview_sct.tcl +++ b/site_ansto/instrument/config/environment/magneticField/green_magnet_labview_sct.tcl @@ -27,8 +27,8 @@ proc ::scobj::green_magnet_labview::sics_log {debug_level debug_string} { } catch_message ] } -proc ::scobj::green_magnet_labview::mkDriver { sct_controller name ip_address tcp_port } { - ::scobj::green_magnet_labview::sics_log 9 "::scobj::green_magnet_labview::mkDriver ${sct_controller} ${name} ${ip_address} ${tcp_port}" +proc ::scobj::green_magnet_labview::mkDriver { sct_controller name device_class simulation_flag ip_address tcp_port } { + ::scobj::green_magnet_labview::sics_log 9 "::scobj::green_magnet_labview::mkDriver ${sct_controller} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}" set ns "[namespace current]" set catch_status [ catch { @@ -46,21 +46,27 @@ proc ::scobj::green_magnet_labview::mkDriver { sct_controller name ip_address tc handle_exception ${catch_status} ${catch_message} } +proc ::scobj::green_magnet_labview::add_driver {name device_class simulation_flag ip_address tcp_port} { + set catch_status [ catch { + ::scobj::green_magnet_labview::sics_log 9 "::scobj::green_magnet_labview::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}" + ::scobj::green_magnet_labview::sics_log 9 "No sctcontroller for green_magnet_labview" + ::scobj::green_magnet_labview::sics_log 1 "::scobj::green_magnet_labview::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}" + ::scobj::green_magnet_labview::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + namespace eval ::scobj::green_magnet_labview { namespace export debug_threshold namespace export debug_log namespace export sics_log namespace export mkDriver + namespace export add_driver } proc add_green_magnet_labview {name ip_address tcp_port} { - set catch_status [ catch { - ::scobj::green_magnet_labview::sics_log 9 "add_green_magnet_labview ${name} ${ip_address} ${tcp_port}" - ::scobj::green_magnet_labview::sics_log 9 "No sctcontroller for green_magnet_labview" - ::scobj::green_magnet_labview::sics_log 1 "::scobj::green_magnet_labview::mkDriver sct_${name} ${name} ${ip_address} ${tcp_port}" - ::scobj::green_magnet_labview::mkDriver sct_${name} ${name} ${ip_address} ${tcp_port} - } catch_message ] - handle_exception ${catch_status} ${catch_message} + set simulation_flag "[string tolower [SplitReply [environment_simulation]]]" + ::scobj::green_magnet_labview::add_driver ${name} "environment" "${simulation_flag}" ${ip_address} ${tcp_port} } clientput "file evaluation of green_magnet_labview_sct.tcl" @@ -71,6 +77,8 @@ proc ::scobj::green_magnet_labview::read_config {} { set ns "::scobj::green_magnet_labview" dict for {k u} $::config_dict { if { [dict exists $u "implementation"] } { + set simulation_flag "[string tolower [SplitReply [environment_simulation]]]" + set device_class "environment" if { !([dict exists $u "name"] && [dict exists $u "enabled"]) } { continue } @@ -78,6 +86,12 @@ proc ::scobj::green_magnet_labview::read_config {} { if { ! ([string equal -nocase $enabled "true" ] || [string equal -nocase $enabled "always"]) } { continue } + if { [dict exists $u "simulation_group"] } { + set simulation_flag [SplitReply [[string tolower [dict get $u "simulation_group"]]]] + } + if { [dict exists $u "device_class"] } { + set device_class "[dict get $u "device_class"]" + } set name [dict get $u name] set implementation [dict get $u "implementation"] if { !([dict exists $::config_dict $implementation]) } { @@ -88,9 +102,9 @@ proc ::scobj::green_magnet_labview::read_config {} { continue } if { [string equal -nocase [dict get $v "driver"] "green_magnet_labview"] } { - if { ![string equal -nocase [SplitReply [environment_simulation]] "false"] } { + if { ![string equal -nocase "${simulation_flag}" "false"] } { set asyncqueue "null" - ${ns}::sics_log 9 "[environment_simulation] => using null asyncqueue" + ${ns}::sics_log 9 "simulation_flag=${simulation_flag} => using null asyncqueue" } elseif { [dict exists $v "asyncqueue"] } { set asyncqueue [dict get $v "asyncqueue"] if { [string equal -nocase ${asyncqueue} "sct"] } { @@ -117,9 +131,9 @@ proc ::scobj::green_magnet_labview::read_config {} { } } if { [string equal -nocase ${asyncqueue} "sct"] } { - add_green_magnet_labview ${name} ${ip_address} ${tcp_port} + ${ns}::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} } else { - add_green_magnet_labview ${name} "aqadapter" ${asyncqueue} + ${ns}::add_driver ${name} ${device_class} ${simulation_flag} "aqadapter" ${asyncqueue} } } } diff --git a/site_ansto/instrument/config/environment/nhq_200.sct b/site_ansto/instrument/config/environment/nhq_200.sct index 1b98f4f1..29dd4cc8 100644 --- a/site_ansto/instrument/config/environment/nhq_200.sct +++ b/site_ansto/instrument/config/environment/nhq_200.sct @@ -3,8 +3,8 @@ # driver nhq_200 = { vendor = FastComTech; device = NHQ; protocol = std; - class = environment; - simulation_group = environment_simulation; + class = NXdetector; + simulation_group = detector_simulation; group = { readable = 10; diff --git a/site_ansto/instrument/config/environment/sct_knauer_pump.tcl b/site_ansto/instrument/config/environment/sct_knauer_pump.tcl new file mode 100644 index 00000000..d58d4bf4 --- /dev/null +++ b/site_ansto/instrument/config/environment/sct_knauer_pump.tcl @@ -0,0 +1,1877 @@ +# Generated driver for knauer_pump +# vim: ft=tcl tabstop=8 softtabstop=2 shiftwidth=2 nocindent smartindent +# + +namespace eval ::scobj::knauer_pump { + set debug_threshold 0 +} + +proc ::scobj::knauer_pump::debug_log {tc_root debug_level debug_string} { + set catch_status [ catch { + set debug_threshold [hgetpropval ${tc_root} debug_threshold] + if {${debug_level} >= ${debug_threshold}} { + set fd [open "../log/knauer_pump_[basename ${tc_root}].log" "a"] + set line "[clock format [clock seconds] -format "%T"] ${debug_string}" + puts ${fd} "${line}" + close ${fd} + } + } catch_message ] +} + +proc ::scobj::knauer_pump::sics_log {debug_level debug_string} { + set catch_status [ catch { + set debug_threshold ${::scobj::knauer_pump::debug_threshold} + if {${debug_level} >= ${debug_threshold}} { + sicslog "::scobj::knauer_pump::${debug_string}" + } + } catch_message ] +} + +# checklimits function for driveable interface +proc ::scobj::knauer_pump::checklimits {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "checklimits tc_root=${tc_root} sct=[sct] target=[sct target]" + set setpoint [sct target] + if { [hpropexists [sct] lowerlimit] } { + set lolimit [sct lowerlimit] + } else { + # lowerlimit not set, use target + set lolimit [sct target] + } + if { [hpropexists [sct] upperlimit] } { + set hilimit [sct upperlimit] + } else { + # upperlimit not set, use target + set hilimit [sct target] + } +# checklimits hook code goes here + if { ${setpoint} < ${lolimit} || ${setpoint} > ${hilimit} } { + sct driving 0 + error "setpoint ${setpoint} violates limits (${lolimit}..${hilimit}) on [sct]" + } + return OK + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# check function for hset change +proc ::scobj::knauer_pump::checkrange {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "checkrange tc_root=${tc_root} sct=[sct] target=[sct target]" + set setpoint [sct target] + if { [hpropexists [sct] lowerlimit] } { + set lolimit [sct lowerlimit] + } else { + # lowerlimit not set, use target + set lolimit [sct target] + } + if { [hpropexists [sct] upperlimit] } { + set hilimit [sct upperlimit] + } else { + # upperlimit not set, use target + set hilimit [sct target] + } +# checkrange hook code goes here + if { ${setpoint} < ${lolimit} || ${setpoint} > ${hilimit} } { + error "setpoint ${setpoint} violates limits (${lolimit}..${hilimit}) on [sct]" + } + return OK + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::fetch_from_glp {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "fetch_from_glp tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# fetch_from_glp hook code starts + set index ${cmd_str} + set data [hgetpropval ${tc_root}/dummy/glp real_data] + set dlist [split ${data} ","] + sct result [lindex ${dlist} ${index}] + set cmd "@@NOSEND@@" +# fetch_from_glp hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "fetch_from_glp sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::fetch_from_status {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "fetch_from_status tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# fetch_from_status hook code starts + set index ${cmd_str} + set data [hgetpropval ${tc_root}/dummy/status real_data] + set dlist [split ${data} ","] + sct result [lindex ${dlist} ${index}] + set cmd "@@NOSEND@@" +# fetch_from_status hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "fetch_from_status sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::flow_fetch {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "flow_fetch tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# flow_fetch hook code starts + set data [hgetpropval ${tc_root}/dummy/status real_data] + set dlist [split ${data} ","] + set flow_pv [lindex ${dlist} 4] + sct result [expr {0.001 * ${flow_pv}}] + set cmd "@@NOSEND@@" +# flow_fetch hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "flow_fetch sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to write a parameter value on a device +proc ::scobj::knauer_pump::flow_write {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "flow_write tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set par [sct target] + set cmd "${cmd_str}${par}" +# flow_write hook code starts + set data [sct target] + set cmd "@@NOSEND@@" + set nextState idle + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } +# flow_write hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + if { [hpropexists [sct] driving] } { + if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } { + sct driving 1 + } + } + debug_log ${tc_root} 1 "flow_write sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::getValue {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "getValue tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# getValue hook code goes here + debug_log ${tc_root} 1 "getValue sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to check the write parameter on a device +proc ::scobj::knauer_pump::noResponse {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "noResponse tc_root=${tc_root} sct=[sct] resp=[sct result]" +# noResponse hook code goes here + return "idle" + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# check function for hset change +proc ::scobj::knauer_pump::ratios_check {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "ratios_check tc_root=${tc_root} sct=[sct] target=[sct target]" + set setpoint [sct target] + if { [hpropexists [sct] lowerlimit] } { + set lolimit [sct lowerlimit] + } else { + # lowerlimit not set, use target + set lolimit [sct target] + } + if { [hpropexists [sct] upperlimit] } { + set hilimit [sct upperlimit] + } else { + # upperlimit not set, use target + set hilimit [sct target] + } +# ratios_check hook code starts + set rlist [split ${setpoint} /] + if { [llength ${rlist}] != 4 } { + sct geterror "${setpoint} has [llength ${rlist}] components, needs 4" + error [sct geterror] + } + set sum [expr [lindex ${rlist} 0] + [lindex ${rlist} 1] + [lindex ${rlist} 2] + [lindex ${rlist} 3]] + if { ${sum} != 100 } { + sct geterror "sum is ${sum}, must be 100" + error [sct geterror] + } +# ratios_check hook code ends + if { ${setpoint} < ${lolimit} || ${setpoint} > ${hilimit} } { + error "setpoint ${setpoint} violates limits (${lolimit}..${hilimit}) on [sct]" + } + return OK + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::ratios_fetch {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "ratios_fetch tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# ratios_fetch hook code starts + set data [hgetpropval ${tc_root}/dummy/status real_data] + set dlist [split ${data} ","] + set ratio_vals "[lindex ${dlist} 5]/[lindex ${dlist} 6]/[lindex ${dlist} 7]/[lindex ${dlist} 8]" + sct result ${ratio_vals} + set cmd "@@NOSEND@@" +# ratios_fetch hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "ratios_fetch sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to write a parameter value on a device +proc ::scobj::knauer_pump::ratios_write {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "ratios_write tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set par [sct target] + set cmd "${cmd_str}${par}" +# ratios_write hook code starts + set data [sct target] + set cmd "@@NOSEND@@" + set nextState idle + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } +# ratios_write hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + if { [hpropexists [sct] driving] } { + if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } { + sct driving 1 + } + } + debug_log ${tc_root} 1 "ratios_write sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to parse the read of a parameter on a device +proc ::scobj::knauer_pump::rdValue {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "rdValue tc_root=${tc_root} sct=[sct] result=[sct result]" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set data [sct result] + set nextState "idle" + if {[string equal -nocase -length 7 ${data} "ASCERR:"]} { + # the protocol driver has reported an error + sct geterror "${data}" + error "[sct geterror]" + } +# rdValue hook code goes here + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to parse the read of a parameter on a device +proc ::scobj::knauer_pump::read_glp {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "read_glp tc_root=${tc_root} sct=[sct] result=[sct result]" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set data [sct result] + set nextState "idle" + if {[string equal -nocase -length 7 ${data} "ASCERR:"]} { + # the protocol driver has reported an error + sct geterror "${data}" + error "[sct geterror]" + } +# read_glp hook code starts + set dlist [split [lindex [split ${data} ":"] 1] ","] + sct real_data "[join [lrange ${dlist} 0 end] ,]" + set data "Hidden in real_data property" +# read_glp hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to parse the read of a parameter on a device +proc ::scobj::knauer_pump::read_status {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "read_status tc_root=${tc_root} sct=[sct] result=[sct result]" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set data [sct result] + set nextState "idle" + if {[string equal -nocase -length 7 ${data} "ASCERR:"]} { + # the protocol driver has reported an error + sct geterror "${data}" + error "[sct geterror]" + } +# read_status hook code starts + set dlist [split [lindex [split ${data} ":"] 1] ","] + sct real_data "[join [lrange ${dlist} 0 end] ,]" + set data "Hidden in real_data property" +# read_status hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to write a parameter value on a device +proc ::scobj::knauer_pump::setValue {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "setValue tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set par [sct target] + set cmd "${cmd_str}${par}" +# setValue hook code goes here + if { [hpropexists [sct] driving] } { + if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } { + sct driving 1 + } + } + debug_log ${tc_root} 1 "setValue sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::state_fetch {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "state_fetch tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# state_fetch hook code starts + set index 1 + set data [hgetpropval ${tc_root}/dummy/status real_data] + set dlist [split ${data} ","] + set state_code [lindex ${dlist} ${index}] + set cmd "@@NOSEND@@" + if { ${state_code} < 0 || ${state_code} > 9 } { + sct geterror "Invalid device_state ${state_code}" + error "[sct geterror]" + } + set slist [list "SYS_ST_INITIALIZING" \ + "SYS_ST_OFF" \ + "SYS_ST_IDLE" \ + "SYS_ST_RUN" \ + "SYS_ST_HOLD" \ + "SYS_ST_PURGE" \ + "SYS_ST_STANDBY" \ + "SYS_ST_FAILED" \ + "SYS_ST_RUNATEND" \ + ] + sct result [lindex ${slist} ${state_code}] +# state_fetch hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "state_fetch sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::status_fetch {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "status_fetch tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# status_fetch hook code starts + set index 1 + set data [hgetpropval ${tc_root}/dummy/status real_data] + set dlist [split ${data} ","] + set status_code [lindex ${dlist} ${index}] + set cmd "@@NOSEND@@" + if { ${status_code} == 3 } { + sct result "PUMPING" + } else { + sct result "IDLE" + } +# status_fetch hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "status_fetch sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::volume_checkpumping {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "volume_checkpumping tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# volume_checkpumping hook code starts + set cmd "@@NOSEND@@" + set nextState idle + if { [hpropexists [sct] pumping] && [sct pumping] } { + if { [hpropexists [sct] driving] && [sct driving] } { + volume_checkstatus "${tc_root}" + } + set sp "[sct target]" + set pv "[hval ${tc_root}/[sct driveable]]" + if { (${sp} - ${pv}) <= [sct tolerance] } { + set flow_tgt 0 + set ratio_tgt [join [split [hval ${tc_root}/pump/ratio_sp] /] ,] + set cmd "RAMP:0,${flow_tgt},${ratio_tgt},0,0,0,0,0,0,0,0,2" + set nextState noResponse + sct pumping 0 + } + } +# volume_checkpumping hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "volume_checkpumping sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# checkstatus function for driveable interface +proc ::scobj::knauer_pump::volume_checkstatus {tc_root} { + set catch_status [ catch { +# volume_checkstatus hook code goes here + if {[sct driving]} { + set sp "[sct target]" + set pv "[hval ${tc_root}/[sct driveable]]" + if { abs(${pv} - ${sp}) <= [sct tolerance] } { + if { [hpropexists [sct] settle_time] } { + if { [hpropexists [sct] settle_time_start] } { + if { [sct utime] - [sct settle_time_start] >= [sct settle_time]} { + sct driving 0 + return "idle" + } + return "busy" + } else { + sct utime settle_time_start + return "busy" + } + } + sct driving 0 + return "idle" + } + if { [hpropexists [sct] settle_time_start] } { + hdelprop [sct] settle_time_start + } + return "busy" + } else { + return "idle" + } + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::knauer_pump::volume_fetch {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "volume_fetch tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# volume_fetch hook code starts + set data [hgetpropval ${tc_root}/dummy/glp real_data] + set dlist [split ${data} ","] + if { [llength ${dlist}] > 11 } { + set pump_volm [lindex ${dlist} 10] + set pump_voln [lindex ${dlist} 11] + set pump_volume [expr {${pump_volm} + 0.000001 * ${pump_voln}}] + } else { + set pump_volume 0.0 + } + sct raw_volume ${pump_volume} + if { [hpropexists [sct] base_volume] } { + set pump_volume [expr {${pump_volume} - [sct base_volume]}] + } else { + sct base_volume [sct raw_volume] + } + sct result ${pump_volume} + set cmd "@@NOSEND@@" +# volume_fetch hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "volume_fetch sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# halt function for driveable interface +proc ::scobj::knauer_pump::volume_halt {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "volume_halt tc_root=${tc_root} sct=[sct] driving=[sct driving]" + ### TODO hset [sct] [hval [sct]] +# volume_halt hook code starts + set flow_tgt 0 + set ratio_tgt [join [split [hval ${tc_root}/pump/ratio_sp] /] ,] + set cmd "RAMP:0,${flow_tgt},${ratio_tgt},0,0,0,0,0,0,0,0,2" + sct send ${cmd} +# volume_halt hook code ends + sct driving 0 + return "idle" + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to write a parameter value on a device +proc ::scobj::knauer_pump::volume_write {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "volume_write tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set par [sct target] + set cmd "${cmd_str}${par}" +# volume_write hook code starts + hsetprop ${tc_root}/[sct driveable] base_volume [hgetpropval ${tc_root}/[sct driveable] raw_volume] + hset ${tc_root}/[sct driveable] 0.0 + set flow_tgt [expr {int(1000.0 * [hval ${tc_root}/pump/flow_sp])}] + set ratio_tgt [join [split [hval ${tc_root}/pump/ratio_sp] /] ,] + set cmd "RAMP:0,${flow_tgt},${ratio_tgt},0,0,0,0,0,0,0,0,3" + sct pumping 1 +# volume_write hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + if { [hpropexists [sct] driving] } { + if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } { + sct driving 1 + } + } + debug_log ${tc_root} 1 "volume_write sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +proc ::scobj::knauer_pump::mkDriver { sct_controller name device_class simulation_flag ip_address tcp_port } { + ::scobj::knauer_pump::sics_log 9 "::scobj::knauer_pump::mkDriver ${sct_controller} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}" + set ns "[namespace current]" + set catch_status [ catch { + + MakeSICSObj ${name} SCT_OBJECT + + sicslist setatt ${name} klass ${device_class} + sicslist setatt ${name} long_name ${name} + + set scobj_hpath /sics/${name} + + hfactory ${scobj_hpath}/dummy plain spy none + hsetprop ${scobj_hpath}/dummy data "false" + hsetprop ${scobj_hpath}/dummy klass "@none" + hsetprop ${scobj_hpath}/dummy type "part" + + hfactory ${scobj_hpath}/dummy/glp plain user text + hsetprop ${scobj_hpath}/dummy/glp read ${ns}::getValue ${scobj_hpath} read_glp {GLP?} + hsetprop ${scobj_hpath}/dummy/glp read_glp ${ns}::read_glp ${scobj_hpath} + hsetprop ${scobj_hpath}/dummy/glp control false + hsetprop ${scobj_hpath}/dummy/glp data false + hsetprop ${scobj_hpath}/dummy/glp mutable true + hsetprop ${scobj_hpath}/dummy/glp nxsave false + hsetprop ${scobj_hpath}/dummy/glp oldval UNKNOWN + hsetprop ${scobj_hpath}/dummy/glp sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/dummy/glp type "part" + hsetprop ${scobj_hpath}/dummy/glp nxalias "${name}_dummy_glp" + + hfactory ${scobj_hpath}/dummy/status plain user text + hsetprop ${scobj_hpath}/dummy/status read ${ns}::getValue ${scobj_hpath} read_status {STATUS?} + hsetprop ${scobj_hpath}/dummy/status read_status ${ns}::read_status ${scobj_hpath} + hsetprop ${scobj_hpath}/dummy/status control false + hsetprop ${scobj_hpath}/dummy/status data false + hsetprop ${scobj_hpath}/dummy/status mutable true + hsetprop ${scobj_hpath}/dummy/status nxsave false + hsetprop ${scobj_hpath}/dummy/status oldval UNKNOWN + hsetprop ${scobj_hpath}/dummy/status sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/dummy/status type "part" + hsetprop ${scobj_hpath}/dummy/status nxalias "${name}_dummy_status" + + if {[string equal -nocase "${simulation_flag}" "false"]} { + ${sct_controller} poll ${scobj_hpath}/dummy/glp 1 + ${sct_controller} poll ${scobj_hpath}/dummy/status 1 + } else { + ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" + } + + hfactory ${scobj_hpath}/glp plain spy none + hsetprop ${scobj_hpath}/glp data "true" + hsetprop ${scobj_hpath}/glp klass "@none" + hsetprop ${scobj_hpath}/glp type "part" + + hfactory ${scobj_hpath}/glp/board_time plain user text + hsetprop ${scobj_hpath}/glp/board_time read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {0} + hsetprop ${scobj_hpath}/glp/board_time rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/board_time control true + hsetprop ${scobj_hpath}/glp/board_time data true + hsetprop ${scobj_hpath}/glp/board_time mutable true + hsetprop ${scobj_hpath}/glp/board_time nxsave true + hsetprop ${scobj_hpath}/glp/board_time oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/board_time klass "parameter" + hsetprop ${scobj_hpath}/glp/board_time sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/board_time type "part" + hsetprop ${scobj_hpath}/glp/board_time nxalias "${name}_glp_board_time" + + hfactory ${scobj_hpath}/glp/head_count plain user text + hsetprop ${scobj_hpath}/glp/head_count read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {3} + hsetprop ${scobj_hpath}/glp/head_count rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/head_count control true + hsetprop ${scobj_hpath}/glp/head_count data true + hsetprop ${scobj_hpath}/glp/head_count mutable true + hsetprop ${scobj_hpath}/glp/head_count nxsave true + hsetprop ${scobj_hpath}/glp/head_count oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/head_count klass "parameter" + hsetprop ${scobj_hpath}/glp/head_count sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/head_count type "part" + hsetprop ${scobj_hpath}/glp/head_count nxalias "${name}_glp_head_count" + + hfactory ${scobj_hpath}/glp/head_pwrhi plain user text + hsetprop ${scobj_hpath}/glp/head_pwrhi read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {7} + hsetprop ${scobj_hpath}/glp/head_pwrhi rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/head_pwrhi control true + hsetprop ${scobj_hpath}/glp/head_pwrhi data true + hsetprop ${scobj_hpath}/glp/head_pwrhi mutable true + hsetprop ${scobj_hpath}/glp/head_pwrhi nxsave true + hsetprop ${scobj_hpath}/glp/head_pwrhi oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/head_pwrhi klass "parameter" + hsetprop ${scobj_hpath}/glp/head_pwrhi sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/head_pwrhi type "part" + hsetprop ${scobj_hpath}/glp/head_pwrhi nxalias "${name}_glp_head_pwrhi" + + hfactory ${scobj_hpath}/glp/head_pwrlo plain user text + hsetprop ${scobj_hpath}/glp/head_pwrlo read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {8} + hsetprop ${scobj_hpath}/glp/head_pwrlo rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/head_pwrlo control true + hsetprop ${scobj_hpath}/glp/head_pwrlo data true + hsetprop ${scobj_hpath}/glp/head_pwrlo mutable true + hsetprop ${scobj_hpath}/glp/head_pwrlo nxsave true + hsetprop ${scobj_hpath}/glp/head_pwrlo oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/head_pwrlo klass "parameter" + hsetprop ${scobj_hpath}/glp/head_pwrlo sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/head_pwrlo type "part" + hsetprop ${scobj_hpath}/glp/head_pwrlo nxalias "${name}_glp_head_pwrlo" + + hfactory ${scobj_hpath}/glp/head_time plain user text + hsetprop ${scobj_hpath}/glp/head_time read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {4} + hsetprop ${scobj_hpath}/glp/head_time rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/head_time control true + hsetprop ${scobj_hpath}/glp/head_time data true + hsetprop ${scobj_hpath}/glp/head_time mutable true + hsetprop ${scobj_hpath}/glp/head_time nxsave true + hsetprop ${scobj_hpath}/glp/head_time oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/head_time klass "parameter" + hsetprop ${scobj_hpath}/glp/head_time sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/head_time type "part" + hsetprop ${scobj_hpath}/glp/head_time nxalias "${name}_glp_head_time" + + hfactory ${scobj_hpath}/glp/head_volm plain user text + hsetprop ${scobj_hpath}/glp/head_volm read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {5} + hsetprop ${scobj_hpath}/glp/head_volm rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/head_volm control true + hsetprop ${scobj_hpath}/glp/head_volm data true + hsetprop ${scobj_hpath}/glp/head_volm mutable true + hsetprop ${scobj_hpath}/glp/head_volm nxsave true + hsetprop ${scobj_hpath}/glp/head_volm oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/head_volm klass "parameter" + hsetprop ${scobj_hpath}/glp/head_volm sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/head_volm type "part" + hsetprop ${scobj_hpath}/glp/head_volm nxalias "${name}_glp_head_volm" + + hfactory ${scobj_hpath}/glp/head_voln plain user text + hsetprop ${scobj_hpath}/glp/head_voln read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {6} + hsetprop ${scobj_hpath}/glp/head_voln rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/head_voln control true + hsetprop ${scobj_hpath}/glp/head_voln data true + hsetprop ${scobj_hpath}/glp/head_voln mutable true + hsetprop ${scobj_hpath}/glp/head_voln nxsave true + hsetprop ${scobj_hpath}/glp/head_voln oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/head_voln klass "parameter" + hsetprop ${scobj_hpath}/glp/head_voln sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/head_voln type "part" + hsetprop ${scobj_hpath}/glp/head_voln nxalias "${name}_glp_head_voln" + + hfactory ${scobj_hpath}/glp/motor_time plain user text + hsetprop ${scobj_hpath}/glp/motor_time read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {1} + hsetprop ${scobj_hpath}/glp/motor_time rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/motor_time control true + hsetprop ${scobj_hpath}/glp/motor_time data true + hsetprop ${scobj_hpath}/glp/motor_time mutable true + hsetprop ${scobj_hpath}/glp/motor_time nxsave true + hsetprop ${scobj_hpath}/glp/motor_time oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/motor_time klass "parameter" + hsetprop ${scobj_hpath}/glp/motor_time sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/motor_time type "part" + hsetprop ${scobj_hpath}/glp/motor_time nxalias "${name}_glp_motor_time" + + hfactory ${scobj_hpath}/glp/pump_pwrhi plain user text + hsetprop ${scobj_hpath}/glp/pump_pwrhi read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {12} + hsetprop ${scobj_hpath}/glp/pump_pwrhi rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/pump_pwrhi control true + hsetprop ${scobj_hpath}/glp/pump_pwrhi data true + hsetprop ${scobj_hpath}/glp/pump_pwrhi mutable true + hsetprop ${scobj_hpath}/glp/pump_pwrhi nxsave true + hsetprop ${scobj_hpath}/glp/pump_pwrhi oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/pump_pwrhi klass "parameter" + hsetprop ${scobj_hpath}/glp/pump_pwrhi sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/pump_pwrhi type "part" + hsetprop ${scobj_hpath}/glp/pump_pwrhi nxalias "${name}_glp_pump_pwrhi" + + hfactory ${scobj_hpath}/glp/pump_pwrlo plain user text + hsetprop ${scobj_hpath}/glp/pump_pwrlo read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {13} + hsetprop ${scobj_hpath}/glp/pump_pwrlo rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/pump_pwrlo control true + hsetprop ${scobj_hpath}/glp/pump_pwrlo data true + hsetprop ${scobj_hpath}/glp/pump_pwrlo mutable true + hsetprop ${scobj_hpath}/glp/pump_pwrlo nxsave true + hsetprop ${scobj_hpath}/glp/pump_pwrlo oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/pump_pwrlo klass "parameter" + hsetprop ${scobj_hpath}/glp/pump_pwrlo sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/pump_pwrlo type "part" + hsetprop ${scobj_hpath}/glp/pump_pwrlo nxalias "${name}_glp_pump_pwrlo" + + hfactory ${scobj_hpath}/glp/pump_revs plain user text + hsetprop ${scobj_hpath}/glp/pump_revs read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {9} + hsetprop ${scobj_hpath}/glp/pump_revs rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/pump_revs control true + hsetprop ${scobj_hpath}/glp/pump_revs data true + hsetprop ${scobj_hpath}/glp/pump_revs mutable true + hsetprop ${scobj_hpath}/glp/pump_revs nxsave true + hsetprop ${scobj_hpath}/glp/pump_revs oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/pump_revs klass "parameter" + hsetprop ${scobj_hpath}/glp/pump_revs sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/pump_revs type "part" + hsetprop ${scobj_hpath}/glp/pump_revs nxalias "${name}_glp_pump_revs" + + hfactory ${scobj_hpath}/glp/pump_volm plain user text + hsetprop ${scobj_hpath}/glp/pump_volm read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {10} + hsetprop ${scobj_hpath}/glp/pump_volm rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/pump_volm control true + hsetprop ${scobj_hpath}/glp/pump_volm data true + hsetprop ${scobj_hpath}/glp/pump_volm mutable true + hsetprop ${scobj_hpath}/glp/pump_volm nxsave true + hsetprop ${scobj_hpath}/glp/pump_volm oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/pump_volm klass "parameter" + hsetprop ${scobj_hpath}/glp/pump_volm sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/pump_volm type "part" + hsetprop ${scobj_hpath}/glp/pump_volm nxalias "${name}_glp_pump_volm" + + hfactory ${scobj_hpath}/glp/pump_voln plain user text + hsetprop ${scobj_hpath}/glp/pump_voln read ${ns}::fetch_from_glp ${scobj_hpath} rdValue {11} + hsetprop ${scobj_hpath}/glp/pump_voln rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/glp/pump_voln control true + hsetprop ${scobj_hpath}/glp/pump_voln data true + hsetprop ${scobj_hpath}/glp/pump_voln mutable true + hsetprop ${scobj_hpath}/glp/pump_voln nxsave true + hsetprop ${scobj_hpath}/glp/pump_voln oldval UNKNOWN + hsetprop ${scobj_hpath}/glp/pump_voln klass "parameter" + hsetprop ${scobj_hpath}/glp/pump_voln sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/glp/pump_voln type "part" + hsetprop ${scobj_hpath}/glp/pump_voln nxalias "${name}_glp_pump_voln" + + if {[string equal -nocase "${simulation_flag}" "false"]} { + ${sct_controller} poll ${scobj_hpath}/glp/board_time 1 + ${sct_controller} poll ${scobj_hpath}/glp/head_count 1 + ${sct_controller} poll ${scobj_hpath}/glp/head_pwrhi 1 + ${sct_controller} poll ${scobj_hpath}/glp/head_pwrlo 1 + ${sct_controller} poll ${scobj_hpath}/glp/head_time 1 + ${sct_controller} poll ${scobj_hpath}/glp/head_volm 1 + ${sct_controller} poll ${scobj_hpath}/glp/head_voln 1 + ${sct_controller} poll ${scobj_hpath}/glp/motor_time 1 + ${sct_controller} poll ${scobj_hpath}/glp/pump_pwrhi 1 + ${sct_controller} poll ${scobj_hpath}/glp/pump_pwrlo 1 + ${sct_controller} poll ${scobj_hpath}/glp/pump_revs 1 + ${sct_controller} poll ${scobj_hpath}/glp/pump_volm 1 + ${sct_controller} poll ${scobj_hpath}/glp/pump_voln 1 + } else { + ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" + } + + hfactory ${scobj_hpath}/prog plain spy none + hsetprop ${scobj_hpath}/prog data "true" + hsetprop ${scobj_hpath}/prog klass "@none" + hsetprop ${scobj_hpath}/prog type "part" + + hfactory ${scobj_hpath}/prog/line_01 plain user text + hsetprop ${scobj_hpath}/prog/line_01 read ${ns}::getValue ${scobj_hpath} rdValue {TT_GET:1,1} + hsetprop ${scobj_hpath}/prog/line_01 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/prog/line_01 control true + hsetprop ${scobj_hpath}/prog/line_01 data true + hsetprop ${scobj_hpath}/prog/line_01 mutable true + hsetprop ${scobj_hpath}/prog/line_01 nxsave true + hsetprop ${scobj_hpath}/prog/line_01 oldval UNKNOWN + hsetprop ${scobj_hpath}/prog/line_01 klass "parameter" + hsetprop ${scobj_hpath}/prog/line_01 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/prog/line_01 type "part" + hsetprop ${scobj_hpath}/prog/line_01 nxalias "${name}_prog_line_01" + + hfactory ${scobj_hpath}/prog/line_02 plain user text + hsetprop ${scobj_hpath}/prog/line_02 read ${ns}::getValue ${scobj_hpath} rdValue {TT_GET:1,2} + hsetprop ${scobj_hpath}/prog/line_02 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/prog/line_02 control true + hsetprop ${scobj_hpath}/prog/line_02 data true + hsetprop ${scobj_hpath}/prog/line_02 mutable true + hsetprop ${scobj_hpath}/prog/line_02 nxsave true + hsetprop ${scobj_hpath}/prog/line_02 oldval UNKNOWN + hsetprop ${scobj_hpath}/prog/line_02 klass "parameter" + hsetprop ${scobj_hpath}/prog/line_02 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/prog/line_02 type "part" + hsetprop ${scobj_hpath}/prog/line_02 nxalias "${name}_prog_line_02" + + hfactory ${scobj_hpath}/prog/line_03 plain user text + hsetprop ${scobj_hpath}/prog/line_03 read ${ns}::getValue ${scobj_hpath} rdValue {TT_GET:1,3} + hsetprop ${scobj_hpath}/prog/line_03 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/prog/line_03 control true + hsetprop ${scobj_hpath}/prog/line_03 data true + hsetprop ${scobj_hpath}/prog/line_03 mutable true + hsetprop ${scobj_hpath}/prog/line_03 nxsave true + hsetprop ${scobj_hpath}/prog/line_03 oldval UNKNOWN + hsetprop ${scobj_hpath}/prog/line_03 klass "parameter" + hsetprop ${scobj_hpath}/prog/line_03 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/prog/line_03 type "part" + hsetprop ${scobj_hpath}/prog/line_03 nxalias "${name}_prog_line_03" + + hfactory ${scobj_hpath}/prog/line_04 plain user text + hsetprop ${scobj_hpath}/prog/line_04 read ${ns}::getValue ${scobj_hpath} rdValue {TT_GET:1,4} + hsetprop ${scobj_hpath}/prog/line_04 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/prog/line_04 control true + hsetprop ${scobj_hpath}/prog/line_04 data true + hsetprop ${scobj_hpath}/prog/line_04 mutable true + hsetprop ${scobj_hpath}/prog/line_04 nxsave true + hsetprop ${scobj_hpath}/prog/line_04 oldval UNKNOWN + hsetprop ${scobj_hpath}/prog/line_04 klass "parameter" + hsetprop ${scobj_hpath}/prog/line_04 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/prog/line_04 type "part" + hsetprop ${scobj_hpath}/prog/line_04 nxalias "${name}_prog_line_04" + + hfactory ${scobj_hpath}/prog/line_05 plain user text + hsetprop ${scobj_hpath}/prog/line_05 read ${ns}::getValue ${scobj_hpath} rdValue {TT_GET:1,5} + hsetprop ${scobj_hpath}/prog/line_05 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/prog/line_05 control true + hsetprop ${scobj_hpath}/prog/line_05 data true + hsetprop ${scobj_hpath}/prog/line_05 mutable true + hsetprop ${scobj_hpath}/prog/line_05 nxsave true + hsetprop ${scobj_hpath}/prog/line_05 oldval UNKNOWN + hsetprop ${scobj_hpath}/prog/line_05 klass "parameter" + hsetprop ${scobj_hpath}/prog/line_05 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/prog/line_05 type "part" + hsetprop ${scobj_hpath}/prog/line_05 nxalias "${name}_prog_line_05" + + if {[string equal -nocase "${simulation_flag}" "false"]} { + ${sct_controller} poll ${scobj_hpath}/prog/line_01 30 + ${sct_controller} poll ${scobj_hpath}/prog/line_02 30 + ${sct_controller} poll ${scobj_hpath}/prog/line_03 30 + ${sct_controller} poll ${scobj_hpath}/prog/line_04 30 + ${sct_controller} poll ${scobj_hpath}/prog/line_05 30 + } else { + ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" + } + + hfactory ${scobj_hpath}/pump plain spy none + hsetprop ${scobj_hpath}/pump data "true" + hsetprop ${scobj_hpath}/pump klass "@none" + hsetprop ${scobj_hpath}/pump type "part" + + hfactory ${scobj_hpath}/pump/flow_pv plain user float + hsetprop ${scobj_hpath}/pump/flow_pv read ${ns}::flow_fetch ${scobj_hpath} rdValue { } + hsetprop ${scobj_hpath}/pump/flow_pv rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/flow_pv control true + hsetprop ${scobj_hpath}/pump/flow_pv data true + hsetprop ${scobj_hpath}/pump/flow_pv mutable true + hsetprop ${scobj_hpath}/pump/flow_pv nxsave true + hsetprop ${scobj_hpath}/pump/flow_pv oldval 0.0 + hsetprop ${scobj_hpath}/pump/flow_pv klass "parameter" + hsetprop ${scobj_hpath}/pump/flow_pv sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/pump/flow_pv type "part" + hsetprop ${scobj_hpath}/pump/flow_pv units "mL/min" + hsetprop ${scobj_hpath}/pump/flow_pv nxalias "${name}_pump_flow_pv" + + hfactory ${scobj_hpath}/pump/flow_sp plain user float + hsetprop ${scobj_hpath}/pump/flow_sp write ${ns}::flow_write ${scobj_hpath} noResponse { } + hsetprop ${scobj_hpath}/pump/flow_sp noResponse ${ns}::noResponse ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/flow_sp check ${ns}::checkrange ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/flow_sp control true + hsetprop ${scobj_hpath}/pump/flow_sp data true + hsetprop ${scobj_hpath}/pump/flow_sp mutable true + hsetprop ${scobj_hpath}/pump/flow_sp nxsave true + hsetprop ${scobj_hpath}/pump/flow_sp lowerlimit 0 + hsetprop ${scobj_hpath}/pump/flow_sp upperlimit 10 + hsetprop ${scobj_hpath}/pump/flow_sp oldval 0.0 + hsetprop ${scobj_hpath}/pump/flow_sp klass "parameter" + hsetprop ${scobj_hpath}/pump/flow_sp sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/pump/flow_sp type "part" + hsetprop ${scobj_hpath}/pump/flow_sp units "mL/min" + hsetprop ${scobj_hpath}/pump/flow_sp nxalias "${name}_pump_flow_sp" + + hfactory ${scobj_hpath}/pump/ratio_pv plain user text + hsetprop ${scobj_hpath}/pump/ratio_pv read ${ns}::ratios_fetch ${scobj_hpath} rdValue { } + hsetprop ${scobj_hpath}/pump/ratio_pv rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/ratio_pv control true + hsetprop ${scobj_hpath}/pump/ratio_pv data true + hsetprop ${scobj_hpath}/pump/ratio_pv mutable true + hsetprop ${scobj_hpath}/pump/ratio_pv nxsave true + hsetprop ${scobj_hpath}/pump/ratio_pv oldval UNKNOWN + hsetprop ${scobj_hpath}/pump/ratio_pv klass "parameter" + hsetprop ${scobj_hpath}/pump/ratio_pv sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/pump/ratio_pv type "part" + hsetprop ${scobj_hpath}/pump/ratio_pv units "percent" + hsetprop ${scobj_hpath}/pump/ratio_pv nxalias "${name}_pump_ratio_pv" + + hfactory ${scobj_hpath}/pump/ratio_sp plain user text + hsetprop ${scobj_hpath}/pump/ratio_sp write ${ns}::ratios_write ${scobj_hpath} noResponse { } + hsetprop ${scobj_hpath}/pump/ratio_sp noResponse ${ns}::noResponse ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/ratio_sp check ${ns}::ratios_check ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/ratio_sp control true + hsetprop ${scobj_hpath}/pump/ratio_sp data true + hsetprop ${scobj_hpath}/pump/ratio_sp mutable true + hsetprop ${scobj_hpath}/pump/ratio_sp nxsave true + hsetprop ${scobj_hpath}/pump/ratio_sp oldval UNKNOWN + hsetprop ${scobj_hpath}/pump/ratio_sp klass "parameter" + hsetprop ${scobj_hpath}/pump/ratio_sp sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/pump/ratio_sp type "part" + hsetprop ${scobj_hpath}/pump/ratio_sp units "percent" + hsetprop ${scobj_hpath}/pump/ratio_sp nxalias "${name}_pump_ratio_sp" + + hfactory ${scobj_hpath}/pump/state plain user text + hsetprop ${scobj_hpath}/pump/state read ${ns}::state_fetch ${scobj_hpath} rdValue { } + hsetprop ${scobj_hpath}/pump/state rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/state control true + hsetprop ${scobj_hpath}/pump/state data true + hsetprop ${scobj_hpath}/pump/state mutable true + hsetprop ${scobj_hpath}/pump/state nxsave true + hsetprop ${scobj_hpath}/pump/state oldval UNKNOWN + hsetprop ${scobj_hpath}/pump/state klass "parameter" + hsetprop ${scobj_hpath}/pump/state sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/pump/state type "part" + hsetprop ${scobj_hpath}/pump/state nxalias "${name}_pump_state" + + hfactory ${scobj_hpath}/pump/status plain user text + hsetprop ${scobj_hpath}/pump/status read ${ns}::status_fetch ${scobj_hpath} rdValue { } + hsetprop ${scobj_hpath}/pump/status rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/status control true + hsetprop ${scobj_hpath}/pump/status data true + hsetprop ${scobj_hpath}/pump/status mutable true + hsetprop ${scobj_hpath}/pump/status nxsave true + hsetprop ${scobj_hpath}/pump/status oldval UNKNOWN + hsetprop ${scobj_hpath}/pump/status klass "parameter" + hsetprop ${scobj_hpath}/pump/status sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/pump/status type "part" + hsetprop ${scobj_hpath}/pump/status nxalias "${name}_pump_status" + + hfactory ${scobj_hpath}/pump/volume_pv plain user float + hsetprop ${scobj_hpath}/pump/volume_pv read ${ns}::volume_fetch ${scobj_hpath} rdValue { } + hsetprop ${scobj_hpath}/pump/volume_pv rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/volume_pv control true + hsetprop ${scobj_hpath}/pump/volume_pv data true + hsetprop ${scobj_hpath}/pump/volume_pv mutable true + hsetprop ${scobj_hpath}/pump/volume_pv nxsave true + hsetprop ${scobj_hpath}/pump/volume_pv oldval 0.0 + hsetprop ${scobj_hpath}/pump/volume_pv klass "parameter" + hsetprop ${scobj_hpath}/pump/volume_pv sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/pump/volume_pv type "part" + hsetprop ${scobj_hpath}/pump/volume_pv units "mL" + hsetprop ${scobj_hpath}/pump/volume_pv nxalias "${name}_pump_volume_pv" + + hfactory ${scobj_hpath}/pump/volume_sp plain user float + hsetprop ${scobj_hpath}/pump/volume_sp read ${ns}::volume_checkpumping ${scobj_hpath} rdValue { } + hsetprop ${scobj_hpath}/pump/volume_sp rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/volume_sp write ${ns}::volume_write ${scobj_hpath} noResponse { } + hsetprop ${scobj_hpath}/pump/volume_sp noResponse ${ns}::noResponse ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/volume_sp check ${ns}::checkrange ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/volume_sp driving 0 + hsetprop ${scobj_hpath}/pump/volume_sp checklimits ${ns}::checklimits ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/volume_sp checkstatus ${ns}::volume_checkstatus ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/volume_sp halt ${ns}::volume_halt ${scobj_hpath} + hsetprop ${scobj_hpath}/pump/volume_sp driveable pump/volume_pv + hsetprop ${scobj_hpath}/pump/volume_sp control true + hsetprop ${scobj_hpath}/pump/volume_sp data true + hsetprop ${scobj_hpath}/pump/volume_sp mutable true + hsetprop ${scobj_hpath}/pump/volume_sp nxsave true + hsetprop ${scobj_hpath}/pump/volume_sp lowerlimit 0 + hsetprop ${scobj_hpath}/pump/volume_sp upperlimit 100 + hsetprop ${scobj_hpath}/pump/volume_sp tolerance 0.01 + hsetprop ${scobj_hpath}/pump/volume_sp oldval 0.0 + hsetprop ${scobj_hpath}/pump/volume_sp klass "parameter" + hsetprop ${scobj_hpath}/pump/volume_sp sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/pump/volume_sp type "drivable" + hsetprop ${scobj_hpath}/pump/volume_sp units "mL" + hsetprop ${scobj_hpath}/pump/volume_sp nxalias "${name}_pump_volume_sp" + + if {[string equal -nocase "${simulation_flag}" "false"]} { + ${sct_controller} poll ${scobj_hpath}/pump/flow_pv 1 + ${sct_controller} poll ${scobj_hpath}/pump/ratio_pv 1 + ${sct_controller} poll ${scobj_hpath}/pump/state 1 + ${sct_controller} poll ${scobj_hpath}/pump/status 1 + ${sct_controller} poll ${scobj_hpath}/pump/volume_pv 1 + ${sct_controller} poll ${scobj_hpath}/pump/volume_sp 1 + ${sct_controller} write ${scobj_hpath}/pump/flow_sp + ${sct_controller} write ${scobj_hpath}/pump/ratio_sp + ${sct_controller} write ${scobj_hpath}/pump/volume_sp + } else { + ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" + } + + hfactory ${scobj_hpath}/status plain spy none + hsetprop ${scobj_hpath}/status data "true" + hsetprop ${scobj_hpath}/status klass "@none" + hsetprop ${scobj_hpath}/status type "part" + + hfactory ${scobj_hpath}/status/cur_error plain user text + hsetprop ${scobj_hpath}/status/cur_error read ${ns}::fetch_from_status ${scobj_hpath} rdValue {2} + hsetprop ${scobj_hpath}/status/cur_error rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/cur_error control true + hsetprop ${scobj_hpath}/status/cur_error data true + hsetprop ${scobj_hpath}/status/cur_error mutable true + hsetprop ${scobj_hpath}/status/cur_error nxsave true + hsetprop ${scobj_hpath}/status/cur_error oldval UNKNOWN + hsetprop ${scobj_hpath}/status/cur_error klass "parameter" + hsetprop ${scobj_hpath}/status/cur_error sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/cur_error type "part" + hsetprop ${scobj_hpath}/status/cur_error nxalias "${name}_status_cur_error" + + hfactory ${scobj_hpath}/status/cur_pres plain user text + hsetprop ${scobj_hpath}/status/cur_pres read ${ns}::fetch_from_status ${scobj_hpath} rdValue {17} + hsetprop ${scobj_hpath}/status/cur_pres rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/cur_pres control true + hsetprop ${scobj_hpath}/status/cur_pres data true + hsetprop ${scobj_hpath}/status/cur_pres mutable true + hsetprop ${scobj_hpath}/status/cur_pres nxsave true + hsetprop ${scobj_hpath}/status/cur_pres oldval UNKNOWN + hsetprop ${scobj_hpath}/status/cur_pres klass "parameter" + hsetprop ${scobj_hpath}/status/cur_pres sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/cur_pres type "part" + hsetprop ${scobj_hpath}/status/cur_pres nxalias "${name}_status_cur_pres" + + hfactory ${scobj_hpath}/status/cur_run_time plain user text + hsetprop ${scobj_hpath}/status/cur_run_time read ${ns}::fetch_from_status ${scobj_hpath} rdValue {3} + hsetprop ${scobj_hpath}/status/cur_run_time rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/cur_run_time control true + hsetprop ${scobj_hpath}/status/cur_run_time data true + hsetprop ${scobj_hpath}/status/cur_run_time mutable true + hsetprop ${scobj_hpath}/status/cur_run_time nxsave true + hsetprop ${scobj_hpath}/status/cur_run_time oldval UNKNOWN + hsetprop ${scobj_hpath}/status/cur_run_time klass "parameter" + hsetprop ${scobj_hpath}/status/cur_run_time sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/cur_run_time type "part" + hsetprop ${scobj_hpath}/status/cur_run_time nxalias "${name}_status_cur_run_time" + + hfactory ${scobj_hpath}/status/error_in plain user text + hsetprop ${scobj_hpath}/status/error_in read ${ns}::fetch_from_status ${scobj_hpath} rdValue {19} + hsetprop ${scobj_hpath}/status/error_in rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/error_in control true + hsetprop ${scobj_hpath}/status/error_in data true + hsetprop ${scobj_hpath}/status/error_in mutable true + hsetprop ${scobj_hpath}/status/error_in nxsave true + hsetprop ${scobj_hpath}/status/error_in oldval UNKNOWN + hsetprop ${scobj_hpath}/status/error_in klass "parameter" + hsetprop ${scobj_hpath}/status/error_in sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/error_in type "part" + hsetprop ${scobj_hpath}/status/error_in nxalias "${name}_status_error_in" + + hfactory ${scobj_hpath}/status/evt_0 plain user text + hsetprop ${scobj_hpath}/status/evt_0 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {9} + hsetprop ${scobj_hpath}/status/evt_0 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/evt_0 control true + hsetprop ${scobj_hpath}/status/evt_0 data true + hsetprop ${scobj_hpath}/status/evt_0 mutable true + hsetprop ${scobj_hpath}/status/evt_0 nxsave true + hsetprop ${scobj_hpath}/status/evt_0 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/evt_0 klass "parameter" + hsetprop ${scobj_hpath}/status/evt_0 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/evt_0 type "part" + hsetprop ${scobj_hpath}/status/evt_0 nxalias "${name}_status_evt_0" + + hfactory ${scobj_hpath}/status/evt_1 plain user text + hsetprop ${scobj_hpath}/status/evt_1 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {10} + hsetprop ${scobj_hpath}/status/evt_1 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/evt_1 control true + hsetprop ${scobj_hpath}/status/evt_1 data true + hsetprop ${scobj_hpath}/status/evt_1 mutable true + hsetprop ${scobj_hpath}/status/evt_1 nxsave true + hsetprop ${scobj_hpath}/status/evt_1 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/evt_1 klass "parameter" + hsetprop ${scobj_hpath}/status/evt_1 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/evt_1 type "part" + hsetprop ${scobj_hpath}/status/evt_1 nxalias "${name}_status_evt_1" + + hfactory ${scobj_hpath}/status/evt_2 plain user text + hsetprop ${scobj_hpath}/status/evt_2 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {11} + hsetprop ${scobj_hpath}/status/evt_2 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/evt_2 control true + hsetprop ${scobj_hpath}/status/evt_2 data true + hsetprop ${scobj_hpath}/status/evt_2 mutable true + hsetprop ${scobj_hpath}/status/evt_2 nxsave true + hsetprop ${scobj_hpath}/status/evt_2 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/evt_2 klass "parameter" + hsetprop ${scobj_hpath}/status/evt_2 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/evt_2 type "part" + hsetprop ${scobj_hpath}/status/evt_2 nxalias "${name}_status_evt_2" + + hfactory ${scobj_hpath}/status/evt_3 plain user text + hsetprop ${scobj_hpath}/status/evt_3 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {12} + hsetprop ${scobj_hpath}/status/evt_3 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/evt_3 control true + hsetprop ${scobj_hpath}/status/evt_3 data true + hsetprop ${scobj_hpath}/status/evt_3 mutable true + hsetprop ${scobj_hpath}/status/evt_3 nxsave true + hsetprop ${scobj_hpath}/status/evt_3 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/evt_3 klass "parameter" + hsetprop ${scobj_hpath}/status/evt_3 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/evt_3 type "part" + hsetprop ${scobj_hpath}/status/evt_3 nxalias "${name}_status_evt_3" + + hfactory ${scobj_hpath}/status/evt_4 plain user text + hsetprop ${scobj_hpath}/status/evt_4 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {13} + hsetprop ${scobj_hpath}/status/evt_4 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/evt_4 control true + hsetprop ${scobj_hpath}/status/evt_4 data true + hsetprop ${scobj_hpath}/status/evt_4 mutable true + hsetprop ${scobj_hpath}/status/evt_4 nxsave true + hsetprop ${scobj_hpath}/status/evt_4 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/evt_4 klass "parameter" + hsetprop ${scobj_hpath}/status/evt_4 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/evt_4 type "part" + hsetprop ${scobj_hpath}/status/evt_4 nxalias "${name}_status_evt_4" + + hfactory ${scobj_hpath}/status/evt_5 plain user text + hsetprop ${scobj_hpath}/status/evt_5 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {14} + hsetprop ${scobj_hpath}/status/evt_5 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/evt_5 control true + hsetprop ${scobj_hpath}/status/evt_5 data true + hsetprop ${scobj_hpath}/status/evt_5 mutable true + hsetprop ${scobj_hpath}/status/evt_5 nxsave true + hsetprop ${scobj_hpath}/status/evt_5 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/evt_5 klass "parameter" + hsetprop ${scobj_hpath}/status/evt_5 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/evt_5 type "part" + hsetprop ${scobj_hpath}/status/evt_5 nxalias "${name}_status_evt_5" + + hfactory ${scobj_hpath}/status/evt_6 plain user text + hsetprop ${scobj_hpath}/status/evt_6 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {15} + hsetprop ${scobj_hpath}/status/evt_6 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/evt_6 control true + hsetprop ${scobj_hpath}/status/evt_6 data true + hsetprop ${scobj_hpath}/status/evt_6 mutable true + hsetprop ${scobj_hpath}/status/evt_6 nxsave true + hsetprop ${scobj_hpath}/status/evt_6 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/evt_6 klass "parameter" + hsetprop ${scobj_hpath}/status/evt_6 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/evt_6 type "part" + hsetprop ${scobj_hpath}/status/evt_6 nxalias "${name}_status_evt_6" + + hfactory ${scobj_hpath}/status/evt_7 plain user text + hsetprop ${scobj_hpath}/status/evt_7 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {16} + hsetprop ${scobj_hpath}/status/evt_7 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/evt_7 control true + hsetprop ${scobj_hpath}/status/evt_7 data true + hsetprop ${scobj_hpath}/status/evt_7 mutable true + hsetprop ${scobj_hpath}/status/evt_7 nxsave true + hsetprop ${scobj_hpath}/status/evt_7 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/evt_7 klass "parameter" + hsetprop ${scobj_hpath}/status/evt_7 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/evt_7 type "part" + hsetprop ${scobj_hpath}/status/evt_7 nxalias "${name}_status_evt_7" + + hfactory ${scobj_hpath}/status/flow_rate plain user text + hsetprop ${scobj_hpath}/status/flow_rate read ${ns}::fetch_from_status ${scobj_hpath} rdValue {4} + hsetprop ${scobj_hpath}/status/flow_rate rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/flow_rate control true + hsetprop ${scobj_hpath}/status/flow_rate data true + hsetprop ${scobj_hpath}/status/flow_rate mutable true + hsetprop ${scobj_hpath}/status/flow_rate nxsave true + hsetprop ${scobj_hpath}/status/flow_rate oldval UNKNOWN + hsetprop ${scobj_hpath}/status/flow_rate klass "parameter" + hsetprop ${scobj_hpath}/status/flow_rate sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/flow_rate type "part" + hsetprop ${scobj_hpath}/status/flow_rate nxalias "${name}_status_flow_rate" + + hfactory ${scobj_hpath}/status/lpg_0 plain user text + hsetprop ${scobj_hpath}/status/lpg_0 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {5} + hsetprop ${scobj_hpath}/status/lpg_0 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/lpg_0 control true + hsetprop ${scobj_hpath}/status/lpg_0 data true + hsetprop ${scobj_hpath}/status/lpg_0 mutable true + hsetprop ${scobj_hpath}/status/lpg_0 nxsave true + hsetprop ${scobj_hpath}/status/lpg_0 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/lpg_0 klass "parameter" + hsetprop ${scobj_hpath}/status/lpg_0 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/lpg_0 type "part" + hsetprop ${scobj_hpath}/status/lpg_0 nxalias "${name}_status_lpg_0" + + hfactory ${scobj_hpath}/status/lpg_1 plain user text + hsetprop ${scobj_hpath}/status/lpg_1 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {6} + hsetprop ${scobj_hpath}/status/lpg_1 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/lpg_1 control true + hsetprop ${scobj_hpath}/status/lpg_1 data true + hsetprop ${scobj_hpath}/status/lpg_1 mutable true + hsetprop ${scobj_hpath}/status/lpg_1 nxsave true + hsetprop ${scobj_hpath}/status/lpg_1 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/lpg_1 klass "parameter" + hsetprop ${scobj_hpath}/status/lpg_1 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/lpg_1 type "part" + hsetprop ${scobj_hpath}/status/lpg_1 nxalias "${name}_status_lpg_1" + + hfactory ${scobj_hpath}/status/lpg_2 plain user text + hsetprop ${scobj_hpath}/status/lpg_2 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {7} + hsetprop ${scobj_hpath}/status/lpg_2 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/lpg_2 control true + hsetprop ${scobj_hpath}/status/lpg_2 data true + hsetprop ${scobj_hpath}/status/lpg_2 mutable true + hsetprop ${scobj_hpath}/status/lpg_2 nxsave true + hsetprop ${scobj_hpath}/status/lpg_2 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/lpg_2 klass "parameter" + hsetprop ${scobj_hpath}/status/lpg_2 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/lpg_2 type "part" + hsetprop ${scobj_hpath}/status/lpg_2 nxalias "${name}_status_lpg_2" + + hfactory ${scobj_hpath}/status/lpg_3 plain user text + hsetprop ${scobj_hpath}/status/lpg_3 read ${ns}::fetch_from_status ${scobj_hpath} rdValue {8} + hsetprop ${scobj_hpath}/status/lpg_3 rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/lpg_3 control true + hsetprop ${scobj_hpath}/status/lpg_3 data true + hsetprop ${scobj_hpath}/status/lpg_3 mutable true + hsetprop ${scobj_hpath}/status/lpg_3 nxsave true + hsetprop ${scobj_hpath}/status/lpg_3 oldval UNKNOWN + hsetprop ${scobj_hpath}/status/lpg_3 klass "parameter" + hsetprop ${scobj_hpath}/status/lpg_3 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/lpg_3 type "part" + hsetprop ${scobj_hpath}/status/lpg_3 nxalias "${name}_status_lpg_3" + + hfactory ${scobj_hpath}/status/start_in plain user text + hsetprop ${scobj_hpath}/status/start_in read ${ns}::fetch_from_status ${scobj_hpath} rdValue {18} + hsetprop ${scobj_hpath}/status/start_in rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/start_in control true + hsetprop ${scobj_hpath}/status/start_in data true + hsetprop ${scobj_hpath}/status/start_in mutable true + hsetprop ${scobj_hpath}/status/start_in nxsave true + hsetprop ${scobj_hpath}/status/start_in oldval UNKNOWN + hsetprop ${scobj_hpath}/status/start_in klass "parameter" + hsetprop ${scobj_hpath}/status/start_in sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/start_in type "part" + hsetprop ${scobj_hpath}/status/start_in nxalias "${name}_status_start_in" + + hfactory ${scobj_hpath}/status/state plain user text + hsetprop ${scobj_hpath}/status/state read ${ns}::fetch_from_status ${scobj_hpath} rdValue {1} + hsetprop ${scobj_hpath}/status/state rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/status/state control true + hsetprop ${scobj_hpath}/status/state data true + hsetprop ${scobj_hpath}/status/state mutable true + hsetprop ${scobj_hpath}/status/state nxsave true + hsetprop ${scobj_hpath}/status/state oldval UNKNOWN + hsetprop ${scobj_hpath}/status/state klass "parameter" + hsetprop ${scobj_hpath}/status/state sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/status/state type "part" + hsetprop ${scobj_hpath}/status/state nxalias "${name}_status_state" + + if {[string equal -nocase "${simulation_flag}" "false"]} { + ${sct_controller} poll ${scobj_hpath}/status/cur_error 1 + ${sct_controller} poll ${scobj_hpath}/status/cur_pres 1 + ${sct_controller} poll ${scobj_hpath}/status/cur_run_time 1 + ${sct_controller} poll ${scobj_hpath}/status/error_in 1 + ${sct_controller} poll ${scobj_hpath}/status/evt_0 1 + ${sct_controller} poll ${scobj_hpath}/status/evt_1 1 + ${sct_controller} poll ${scobj_hpath}/status/evt_2 1 + ${sct_controller} poll ${scobj_hpath}/status/evt_3 1 + ${sct_controller} poll ${scobj_hpath}/status/evt_4 1 + ${sct_controller} poll ${scobj_hpath}/status/evt_5 1 + ${sct_controller} poll ${scobj_hpath}/status/evt_6 1 + ${sct_controller} poll ${scobj_hpath}/status/evt_7 1 + ${sct_controller} poll ${scobj_hpath}/status/flow_rate 1 + ${sct_controller} poll ${scobj_hpath}/status/lpg_0 1 + ${sct_controller} poll ${scobj_hpath}/status/lpg_1 1 + ${sct_controller} poll ${scobj_hpath}/status/lpg_2 1 + ${sct_controller} poll ${scobj_hpath}/status/lpg_3 1 + ${sct_controller} poll ${scobj_hpath}/status/start_in 1 + ${sct_controller} poll ${scobj_hpath}/status/state 1 + } else { + ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" + } + + hfactory ${scobj_hpath}/stuff plain spy none + hsetprop ${scobj_hpath}/stuff data "false" + hsetprop ${scobj_hpath}/stuff klass "@none" + hsetprop ${scobj_hpath}/stuff type "part" + + hfactory ${scobj_hpath}/stuff/an_out plain user text + hsetprop ${scobj_hpath}/stuff/an_out read ${ns}::getValue ${scobj_hpath} rdValue {AN_OUT?} + hsetprop ${scobj_hpath}/stuff/an_out rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/an_out control false + hsetprop ${scobj_hpath}/stuff/an_out data false + hsetprop ${scobj_hpath}/stuff/an_out mutable true + hsetprop ${scobj_hpath}/stuff/an_out nxsave false + hsetprop ${scobj_hpath}/stuff/an_out oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/an_out sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/an_out type "part" + hsetprop ${scobj_hpath}/stuff/an_out nxalias "${name}_stuff_an_out" + + hfactory ${scobj_hpath}/stuff/boardinfo plain user text + hsetprop ${scobj_hpath}/stuff/boardinfo read ${ns}::getValue ${scobj_hpath} rdValue {BOARDINFO?} + hsetprop ${scobj_hpath}/stuff/boardinfo rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/boardinfo control false + hsetprop ${scobj_hpath}/stuff/boardinfo data false + hsetprop ${scobj_hpath}/stuff/boardinfo mutable true + hsetprop ${scobj_hpath}/stuff/boardinfo nxsave false + hsetprop ${scobj_hpath}/stuff/boardinfo oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/boardinfo sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/boardinfo type "part" + hsetprop ${scobj_hpath}/stuff/boardinfo nxalias "${name}_stuff_boardinfo" + + hfactory ${scobj_hpath}/stuff/config plain user text + hsetprop ${scobj_hpath}/stuff/config read ${ns}::getValue ${scobj_hpath} rdValue {CONFIG?} + hsetprop ${scobj_hpath}/stuff/config rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/config control false + hsetprop ${scobj_hpath}/stuff/config data false + hsetprop ${scobj_hpath}/stuff/config mutable true + hsetprop ${scobj_hpath}/stuff/config nxsave false + hsetprop ${scobj_hpath}/stuff/config oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/config sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/config type "part" + hsetprop ${scobj_hpath}/stuff/config nxalias "${name}_stuff_config" + + hfactory ${scobj_hpath}/stuff/cprofinfo plain user text + hsetprop ${scobj_hpath}/stuff/cprofinfo read ${ns}::getValue ${scobj_hpath} rdValue {CPROFINFO?} + hsetprop ${scobj_hpath}/stuff/cprofinfo rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/cprofinfo control false + hsetprop ${scobj_hpath}/stuff/cprofinfo data false + hsetprop ${scobj_hpath}/stuff/cprofinfo mutable true + hsetprop ${scobj_hpath}/stuff/cprofinfo nxsave false + hsetprop ${scobj_hpath}/stuff/cprofinfo oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/cprofinfo sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/cprofinfo type "part" + hsetprop ${scobj_hpath}/stuff/cprofinfo nxalias "${name}_stuff_cprofinfo" + + hfactory ${scobj_hpath}/stuff/dout plain user text + hsetprop ${scobj_hpath}/stuff/dout read ${ns}::getValue ${scobj_hpath} rdValue {DOUT?} + hsetprop ${scobj_hpath}/stuff/dout rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/dout control false + hsetprop ${scobj_hpath}/stuff/dout data false + hsetprop ${scobj_hpath}/stuff/dout mutable true + hsetprop ${scobj_hpath}/stuff/dout nxsave false + hsetprop ${scobj_hpath}/stuff/dout oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/dout sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/dout type "part" + hsetprop ${scobj_hpath}/stuff/dout nxalias "${name}_stuff_dout" + + hfactory ${scobj_hpath}/stuff/error plain user text + hsetprop ${scobj_hpath}/stuff/error read ${ns}::getValue ${scobj_hpath} rdValue {ERROR?} + hsetprop ${scobj_hpath}/stuff/error rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/error control false + hsetprop ${scobj_hpath}/stuff/error data false + hsetprop ${scobj_hpath}/stuff/error mutable true + hsetprop ${scobj_hpath}/stuff/error nxsave false + hsetprop ${scobj_hpath}/stuff/error oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/error sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/error type "part" + hsetprop ${scobj_hpath}/stuff/error nxalias "${name}_stuff_error" + + hfactory ${scobj_hpath}/stuff/errors plain user text + hsetprop ${scobj_hpath}/stuff/errors read ${ns}::getValue ${scobj_hpath} rdValue {ERRORS?} + hsetprop ${scobj_hpath}/stuff/errors rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/errors control false + hsetprop ${scobj_hpath}/stuff/errors data false + hsetprop ${scobj_hpath}/stuff/errors mutable true + hsetprop ${scobj_hpath}/stuff/errors nxsave false + hsetprop ${scobj_hpath}/stuff/errors oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/errors sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/errors type "part" + hsetprop ${scobj_hpath}/stuff/errors nxalias "${name}_stuff_errors" + + hfactory ${scobj_hpath}/stuff/flushpmp plain user text + hsetprop ${scobj_hpath}/stuff/flushpmp read ${ns}::getValue ${scobj_hpath} rdValue {FLUSHPMP?} + hsetprop ${scobj_hpath}/stuff/flushpmp rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/flushpmp control false + hsetprop ${scobj_hpath}/stuff/flushpmp data false + hsetprop ${scobj_hpath}/stuff/flushpmp mutable true + hsetprop ${scobj_hpath}/stuff/flushpmp nxsave false + hsetprop ${scobj_hpath}/stuff/flushpmp oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/flushpmp sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/flushpmp type "part" + hsetprop ${scobj_hpath}/stuff/flushpmp nxalias "${name}_stuff_flushpmp" + + hfactory ${scobj_hpath}/stuff/head plain user text + hsetprop ${scobj_hpath}/stuff/head read ${ns}::getValue ${scobj_hpath} rdValue {HEAD?} + hsetprop ${scobj_hpath}/stuff/head rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/head control false + hsetprop ${scobj_hpath}/stuff/head data false + hsetprop ${scobj_hpath}/stuff/head mutable true + hsetprop ${scobj_hpath}/stuff/head nxsave false + hsetprop ${scobj_hpath}/stuff/head oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/head sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/head type "part" + hsetprop ${scobj_hpath}/stuff/head nxalias "${name}_stuff_head" + + hfactory ${scobj_hpath}/stuff/head_par plain user text + hsetprop ${scobj_hpath}/stuff/head_par read ${ns}::getValue ${scobj_hpath} rdValue {HEAD_PAR?} + hsetprop ${scobj_hpath}/stuff/head_par rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/head_par control false + hsetprop ${scobj_hpath}/stuff/head_par data false + hsetprop ${scobj_hpath}/stuff/head_par mutable true + hsetprop ${scobj_hpath}/stuff/head_par nxsave false + hsetprop ${scobj_hpath}/stuff/head_par oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/head_par sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/head_par type "part" + hsetprop ${scobj_hpath}/stuff/head_par nxalias "${name}_stuff_head_par" + + hfactory ${scobj_hpath}/stuff/identify plain user text + hsetprop ${scobj_hpath}/stuff/identify read ${ns}::getValue ${scobj_hpath} rdValue {IDENTIFY?} + hsetprop ${scobj_hpath}/stuff/identify rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/identify control false + hsetprop ${scobj_hpath}/stuff/identify data false + hsetprop ${scobj_hpath}/stuff/identify mutable true + hsetprop ${scobj_hpath}/stuff/identify nxsave false + hsetprop ${scobj_hpath}/stuff/identify oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/identify sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/identify type "part" + hsetprop ${scobj_hpath}/stuff/identify nxalias "${name}_stuff_identify" + + hfactory ${scobj_hpath}/stuff/lpg plain user text + hsetprop ${scobj_hpath}/stuff/lpg read ${ns}::getValue ${scobj_hpath} rdValue {LPG?} + hsetprop ${scobj_hpath}/stuff/lpg rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/lpg control false + hsetprop ${scobj_hpath}/stuff/lpg data false + hsetprop ${scobj_hpath}/stuff/lpg mutable true + hsetprop ${scobj_hpath}/stuff/lpg nxsave false + hsetprop ${scobj_hpath}/stuff/lpg oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/lpg sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/lpg type "part" + hsetprop ${scobj_hpath}/stuff/lpg nxalias "${name}_stuff_lpg" + + hfactory ${scobj_hpath}/stuff/oem plain user text + hsetprop ${scobj_hpath}/stuff/oem read ${ns}::getValue ${scobj_hpath} rdValue {OEM?} + hsetprop ${scobj_hpath}/stuff/oem rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/oem control false + hsetprop ${scobj_hpath}/stuff/oem data false + hsetprop ${scobj_hpath}/stuff/oem mutable true + hsetprop ${scobj_hpath}/stuff/oem nxsave false + hsetprop ${scobj_hpath}/stuff/oem oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/oem sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/oem type "part" + hsetprop ${scobj_hpath}/stuff/oem nxalias "${name}_stuff_oem" + + hfactory ${scobj_hpath}/stuff/opt plain user text + hsetprop ${scobj_hpath}/stuff/opt read ${ns}::getValue ${scobj_hpath} rdValue {OPT?} + hsetprop ${scobj_hpath}/stuff/opt rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/opt control false + hsetprop ${scobj_hpath}/stuff/opt data false + hsetprop ${scobj_hpath}/stuff/opt mutable true + hsetprop ${scobj_hpath}/stuff/opt nxsave false + hsetprop ${scobj_hpath}/stuff/opt oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/opt sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/opt type "part" + hsetprop ${scobj_hpath}/stuff/opt nxalias "${name}_stuff_opt" + + hfactory ${scobj_hpath}/stuff/plim plain user text + hsetprop ${scobj_hpath}/stuff/plim read ${ns}::getValue ${scobj_hpath} rdValue {PLIM?} + hsetprop ${scobj_hpath}/stuff/plim rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/plim control false + hsetprop ${scobj_hpath}/stuff/plim data false + hsetprop ${scobj_hpath}/stuff/plim mutable true + hsetprop ${scobj_hpath}/stuff/plim nxsave false + hsetprop ${scobj_hpath}/stuff/plim oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/plim sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/plim type "part" + hsetprop ${scobj_hpath}/stuff/plim nxalias "${name}_stuff_plim" + + hfactory ${scobj_hpath}/stuff/pressure plain user text + hsetprop ${scobj_hpath}/stuff/pressure read ${ns}::getValue ${scobj_hpath} rdValue {PRESSURE?} + hsetprop ${scobj_hpath}/stuff/pressure rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/pressure control false + hsetprop ${scobj_hpath}/stuff/pressure data false + hsetprop ${scobj_hpath}/stuff/pressure mutable true + hsetprop ${scobj_hpath}/stuff/pressure nxsave false + hsetprop ${scobj_hpath}/stuff/pressure oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/pressure sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/pressure type "part" + hsetprop ${scobj_hpath}/stuff/pressure nxalias "${name}_stuff_pressure" + + hfactory ${scobj_hpath}/stuff/prfastacq plain user text + hsetprop ${scobj_hpath}/stuff/prfastacq read ${ns}::getValue ${scobj_hpath} rdValue {PRFASTACQ?} + hsetprop ${scobj_hpath}/stuff/prfastacq rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/prfastacq control false + hsetprop ${scobj_hpath}/stuff/prfastacq data false + hsetprop ${scobj_hpath}/stuff/prfastacq mutable true + hsetprop ${scobj_hpath}/stuff/prfastacq nxsave false + hsetprop ${scobj_hpath}/stuff/prfastacq oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/prfastacq sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/prfastacq type "part" + hsetprop ${scobj_hpath}/stuff/prfastacq nxalias "${name}_stuff_prfastacq" + + hfactory ${scobj_hpath}/stuff/purge plain user text + hsetprop ${scobj_hpath}/stuff/purge read ${ns}::getValue ${scobj_hpath} rdValue {PURGE?} + hsetprop ${scobj_hpath}/stuff/purge rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/purge control false + hsetprop ${scobj_hpath}/stuff/purge data false + hsetprop ${scobj_hpath}/stuff/purge mutable true + hsetprop ${scobj_hpath}/stuff/purge nxsave false + hsetprop ${scobj_hpath}/stuff/purge oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/purge sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/purge type "part" + hsetprop ${scobj_hpath}/stuff/purge nxalias "${name}_stuff_purge" + + hfactory ${scobj_hpath}/stuff/remote plain user text + hsetprop ${scobj_hpath}/stuff/remote read ${ns}::getValue ${scobj_hpath} rdValue {REMOTE?} + hsetprop ${scobj_hpath}/stuff/remote rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/remote control false + hsetprop ${scobj_hpath}/stuff/remote data false + hsetprop ${scobj_hpath}/stuff/remote mutable true + hsetprop ${scobj_hpath}/stuff/remote nxsave false + hsetprop ${scobj_hpath}/stuff/remote oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/remote sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/remote type "part" + hsetprop ${scobj_hpath}/stuff/remote nxalias "${name}_stuff_remote" + + hfactory ${scobj_hpath}/stuff/rfid plain user text + hsetprop ${scobj_hpath}/stuff/rfid read ${ns}::getValue ${scobj_hpath} rdValue {RFID?} + hsetprop ${scobj_hpath}/stuff/rfid rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/rfid control false + hsetprop ${scobj_hpath}/stuff/rfid data false + hsetprop ${scobj_hpath}/stuff/rfid mutable true + hsetprop ${scobj_hpath}/stuff/rfid nxsave false + hsetprop ${scobj_hpath}/stuff/rfid oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/rfid sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/rfid type "part" + hsetprop ${scobj_hpath}/stuff/rfid nxalias "${name}_stuff_rfid" + + hfactory ${scobj_hpath}/stuff/service plain user text + hsetprop ${scobj_hpath}/stuff/service read ${ns}::getValue ${scobj_hpath} rdValue {SERVICE?} + hsetprop ${scobj_hpath}/stuff/service rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/service control false + hsetprop ${scobj_hpath}/stuff/service data false + hsetprop ${scobj_hpath}/stuff/service mutable true + hsetprop ${scobj_hpath}/stuff/service nxsave false + hsetprop ${scobj_hpath}/stuff/service oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/service sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/service type "part" + hsetprop ${scobj_hpath}/stuff/service nxalias "${name}_stuff_service" + + hfactory ${scobj_hpath}/stuff/sysinfo plain user text + hsetprop ${scobj_hpath}/stuff/sysinfo read ${ns}::getValue ${scobj_hpath} rdValue {SYSINFO?} + hsetprop ${scobj_hpath}/stuff/sysinfo rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/sysinfo control false + hsetprop ${scobj_hpath}/stuff/sysinfo data false + hsetprop ${scobj_hpath}/stuff/sysinfo mutable true + hsetprop ${scobj_hpath}/stuff/sysinfo nxsave false + hsetprop ${scobj_hpath}/stuff/sysinfo oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/sysinfo sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/sysinfo type "part" + hsetprop ${scobj_hpath}/stuff/sysinfo nxalias "${name}_stuff_sysinfo" + + hfactory ${scobj_hpath}/stuff/units plain user text + hsetprop ${scobj_hpath}/stuff/units read ${ns}::getValue ${scobj_hpath} rdValue {UNITS?} + hsetprop ${scobj_hpath}/stuff/units rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/units control false + hsetprop ${scobj_hpath}/stuff/units data false + hsetprop ${scobj_hpath}/stuff/units mutable true + hsetprop ${scobj_hpath}/stuff/units nxsave false + hsetprop ${scobj_hpath}/stuff/units oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/units sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/units type "part" + hsetprop ${scobj_hpath}/stuff/units nxalias "${name}_stuff_units" + + hfactory ${scobj_hpath}/stuff/valves plain user text + hsetprop ${scobj_hpath}/stuff/valves read ${ns}::getValue ${scobj_hpath} rdValue {VALVES?} + hsetprop ${scobj_hpath}/stuff/valves rdValue ${ns}::rdValue ${scobj_hpath} + hsetprop ${scobj_hpath}/stuff/valves control false + hsetprop ${scobj_hpath}/stuff/valves data false + hsetprop ${scobj_hpath}/stuff/valves mutable true + hsetprop ${scobj_hpath}/stuff/valves nxsave false + hsetprop ${scobj_hpath}/stuff/valves oldval UNKNOWN + hsetprop ${scobj_hpath}/stuff/valves sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/stuff/valves type "part" + hsetprop ${scobj_hpath}/stuff/valves nxalias "${name}_stuff_valves" + + if {[string equal -nocase "${simulation_flag}" "false"]} { + ${sct_controller} poll ${scobj_hpath}/stuff/an_out 60 + ${sct_controller} poll ${scobj_hpath}/stuff/boardinfo 60 + ${sct_controller} poll ${scobj_hpath}/stuff/config 60 + ${sct_controller} poll ${scobj_hpath}/stuff/cprofinfo 60 + ${sct_controller} poll ${scobj_hpath}/stuff/dout 60 + ${sct_controller} poll ${scobj_hpath}/stuff/error 60 + ${sct_controller} poll ${scobj_hpath}/stuff/errors 60 + ${sct_controller} poll ${scobj_hpath}/stuff/flushpmp 60 + ${sct_controller} poll ${scobj_hpath}/stuff/head 60 + ${sct_controller} poll ${scobj_hpath}/stuff/head_par 60 + ${sct_controller} poll ${scobj_hpath}/stuff/identify 60 + ${sct_controller} poll ${scobj_hpath}/stuff/lpg 60 + ${sct_controller} poll ${scobj_hpath}/stuff/oem 60 + ${sct_controller} poll ${scobj_hpath}/stuff/opt 60 + ${sct_controller} poll ${scobj_hpath}/stuff/plim 60 + ${sct_controller} poll ${scobj_hpath}/stuff/pressure 60 + ${sct_controller} poll ${scobj_hpath}/stuff/prfastacq 60 + ${sct_controller} poll ${scobj_hpath}/stuff/purge 60 + ${sct_controller} poll ${scobj_hpath}/stuff/remote 60 + ${sct_controller} poll ${scobj_hpath}/stuff/rfid 60 + ${sct_controller} poll ${scobj_hpath}/stuff/service 60 + ${sct_controller} poll ${scobj_hpath}/stuff/sysinfo 60 + ${sct_controller} poll ${scobj_hpath}/stuff/units 60 + ${sct_controller} poll ${scobj_hpath}/stuff/valves 60 + } else { + ::scobj::knauer_pump::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for knauer_pump" + } + hsetprop ${scobj_hpath} klass ${device_class} + hsetprop ${scobj_hpath} data true + hsetprop ${scobj_hpath} debug_threshold 0 + if {[string equal -nocase "${simulation_flag}" "false"]} { + ansto_makesctdrive ${name}_pump_volume_sp ${scobj_hpath}/pump/volume_sp ${scobj_hpath}/pump/volume_pv ${sct_controller} + } +# mkDriver hook code goes here + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +proc ::scobj::knauer_pump::add_driver {name device_class simulation_flag ip_address tcp_port} { + set catch_status [ catch { + ::scobj::knauer_pump::sics_log 9 "::scobj::knauer_pump::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}" + if {[string equal -nocase "${simulation_flag}" "false"]} { + if {[string equal -nocase "aqadapter" "${ip_address}"]} { + ::scobj::knauer_pump::sics_log 9 "makesctcontroller sct_${name} aqadapter ${tcp_port}" + makesctcontroller sct_${name} aqadapter ${tcp_port} + } else { + ::scobj::knauer_pump::sics_log 9 "makesctcontroller sct_${name} knauer_ap ${ip_address}:${tcp_port}" + makesctcontroller sct_${name} knauer_ap ${ip_address}:${tcp_port} + } + } else { + ::scobj::knauer_pump::sics_log 9 "simulation_flag={simulation_flag} => No sctcontroller for knauer_pump" + } + ::scobj::knauer_pump::sics_log 1 "::scobj::knauer_pump::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}" + ::scobj::knauer_pump::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +namespace eval ::scobj::knauer_pump { + namespace export debug_threshold + namespace export debug_log + namespace export sics_log + namespace export mkDriver + namespace export add_driver +} + +proc add_knauer_pump {name ip_address tcp_port} { + set simulation_flag "[string tolower [SplitReply [environment_simulation]]]" + ::scobj::knauer_pump::add_driver ${name} "environment" "${simulation_flag}" ${ip_address} ${tcp_port} +} + +clientput "file evaluation of sct_knauer_pump.tcl" +::scobj::knauer_pump::sics_log 9 "file evaluation of sct_knauer_pump.tcl" + +proc ::scobj::knauer_pump::read_config {} { + set catch_status [ catch { + set ns "::scobj::knauer_pump" + dict for {k u} $::config_dict { + if { [dict exists $u "implementation"] } { + set simulation_flag "[string tolower [SplitReply [environment_simulation]]]" + set device_class "environment" + if { !([dict exists $u "name"] && [dict exists $u "enabled"]) } { + continue + } + set enabled [string tolower [dict get $u "enabled"]] + if { ! ([string equal -nocase $enabled "true" ] || [string equal -nocase $enabled "always"]) } { + continue + } + if { [dict exists $u "simulation_group"] } { + set simulation_flag [SplitReply [[string tolower [dict get $u "simulation_group"]]]] + } + if { [dict exists $u "device_class"] } { + set device_class "[dict get $u "device_class"]" + } + set name [dict get $u name] + set implementation [dict get $u "implementation"] + if { !([dict exists $::config_dict $implementation]) } { + continue + } + set v [dict get $::config_dict $implementation] + if { !([dict exists $v "driver"]) } { + continue + } + if { [string equal -nocase [dict get $v "driver"] "knauer_pump"] } { + if { ![string equal -nocase "${simulation_flag}" "false"] } { + set asyncqueue "null" + ${ns}::sics_log 9 "simulation_flag=${simulation_flag} => using null asyncqueue" + } elseif { [dict exists $v "asyncqueue"] } { + set asyncqueue [dict get $v "asyncqueue"] + if { [string equal -nocase ${asyncqueue} "sct"] } { + set ip_address [dict get $v ip] + set tcp_port [dict get $v port] + } + } else { + if { [dict exists $v "asyncprotocol"] } { + set asyncprotocol [dict get $v "asyncprotocol"] + } else { + set asyncprotocol ${name}_protocol + MakeAsyncProtocol ${asyncprotocol} + if { [dict exists $v "terminator"] } { + ${asyncprotocol} sendterminator "[dict get $v "terminator"]" + ${asyncprotocol} replyterminator "[dict get $v "terminator"]" + } + } + set asyncqueue ${name}_queue + set ip_address [dict get $v ip] + set tcp_port [dict get $v port] + MakeAsyncQueue ${asyncqueue} ${asyncprotocol} ${ip_address} ${tcp_port} + if { [dict exists $v "timeout"] } { + ${asyncqueue} timeout "[dict get $v "timeout"]" + } + } + if { [string equal -nocase ${asyncqueue} "sct"] } { + ${ns}::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} + } else { + ${ns}::add_driver ${name} ${device_class} ${simulation_flag} "aqadapter" ${asyncqueue} + } + } + } + } + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +if { [info exists ::config_dict] } { + ::scobj::knauer_pump::read_config +} else { + ::scobj::knauer_pump::sics_log 5 "No config dict" +} diff --git a/site_ansto/instrument/config/environment/temperature/lakeshore_218.sct b/site_ansto/instrument/config/environment/temperature/lakeshore_218.sct index f081597b..64a87296 100644 --- a/site_ansto/instrument/config/environment/temperature/lakeshore_218.sct +++ b/site_ansto/instrument/config/environment/temperature/lakeshore_218.sct @@ -1,6 +1,6 @@ driver lakeshore_218 = { vendor = lakeshore; device = ls218; protocol = std; - class = environment; simulation_group = environment_simulation; + class = NXdetector; simulation_group = detector_simulation; group = { data = false; diff --git a/site_ansto/instrument/config/environment/temperature/lakeshore_m370.sct b/site_ansto/instrument/config/environment/temperature/lakeshore_m370.sct index 9db80f11..d33dc87a 100644 --- a/site_ansto/instrument/config/environment/temperature/lakeshore_m370.sct +++ b/site_ansto/instrument/config/environment/temperature/lakeshore_m370.sct @@ -1,15 +1,15 @@ # vim: ts=8 sts=2 sw=2 expandtab autoindent smartindent nocindent driver lakeshore_m370 = { protocol = std - sobj_priv_type = 'user float' + sobj_priv_type = 'user none' class = environment simulation_group = environment_simulation add_args = 'id tol' make_args = 'id tol' code mkDriver = {%% ::scobj::lakeshore_370::mk_sct_driver $sct_controller environment $name $tol - hsetprop ${scobj_hpath}/setpoint permlink data_set T[format "%02d" ${id}]SP01 - hsetprop ${scobj_hpath}/setpoint @description T[format "%02d" ${id}]SP01 + hsetprop ${scobj_hpath}/Loop1/setpoint permlink data_set T[format "%02d" ${id}]SP01 + hsetprop ${scobj_hpath}/Loop1/setpoint @description T[format "%02d" ${id}]SP01 hsetprop ${scobj_hpath}/Sensor/value permlink data_set T[format "%02d" ${id}]S01 hsetprop ${scobj_hpath}/Sensor/value @description T[format "%02d" ${id}]S01 %%} diff --git a/site_ansto/instrument/config/environment/temperature/lakeshore_m370_sct.tcl b/site_ansto/instrument/config/environment/temperature/lakeshore_m370_sct.tcl index 4169fcae..20cab233 100644 --- a/site_ansto/instrument/config/environment/temperature/lakeshore_m370_sct.tcl +++ b/site_ansto/instrument/config/environment/temperature/lakeshore_m370_sct.tcl @@ -27,24 +27,23 @@ proc ::scobj::lakeshore_m370::sics_log {debug_level debug_string} { } catch_message ] } -proc ::scobj::lakeshore_m370::mkDriver { sct_controller name ip_address tcp_port id tol } { - ::scobj::lakeshore_m370::sics_log 9 "::scobj::lakeshore_m370::mkDriver ${sct_controller} ${name} ${ip_address} ${tcp_port} ${id} ${tol}" +proc ::scobj::lakeshore_m370::mkDriver { sct_controller name id tol} { + ::scobj::lakeshore_m370::sics_log 9 "::scobj::lakeshore_m370::mkDriver ${sct_controller} ${name} ${id} ${tol}" set ns "[namespace current]" set catch_status [ catch { - MakeSICSObj ${name} SCT_OBJECT user float + MakeSICSObj ${name} SCT_OBJECT user none sicslist setatt ${name} klass environment sicslist setatt ${name} long_name ${name} set scobj_hpath /sics/${name} hsetprop ${scobj_hpath} klass environment - hsetprop ${scobj_hpath} data true hsetprop ${scobj_hpath} debug_threshold 5 # mkDriver hook code starts ::scobj::lakeshore_370::mk_sct_driver $sct_controller environment $name $tol - hsetprop ${scobj_hpath}/setpoint permlink data_set T[format "%02d" ${id}]SP01 - hsetprop ${scobj_hpath}/setpoint @description T[format "%02d" ${id}]SP01 + hsetprop ${scobj_hpath}/Loop1/setpoint permlink data_set T[format "%02d" ${id}]SP01 + hsetprop ${scobj_hpath}/Loop1/setpoint @description T[format "%02d" ${id}]SP01 hsetprop ${scobj_hpath}/Sensor/value permlink data_set T[format "%02d" ${id}]S01 hsetprop ${scobj_hpath}/Sensor/value @description T[format "%02d" ${id}]S01 # mkDriver hook code ends @@ -59,24 +58,24 @@ namespace eval ::scobj::lakeshore_m370 { namespace export mkDriver } -proc add_lakeshore_m370 {name ip_address tcp_port id tol} { +proc add_lakeshore_m370 {name IP port id tol} { set catch_status [ catch { - ::scobj::lakeshore_m370::sics_log 9 "add_lakeshore_m370 ${name} ${ip_address} ${tcp_port} ${id} ${tol}" + ::scobj::lakeshore_m370::sics_log 9 "add_lakeshore_m370 ${name} ${IP} ${port} ${tol}" if {[string equal -nocase [SplitReply [environment_simulation]] "false"]} { - if {[string equal -nocase "aqadapter" "${ip_address}"]} { - ::scobj::lakeshore_m370::sics_log 9 "makesctcontroller sct_${name} aqadapter ${tcp_port}" - makesctcontroller sct_${name} aqadapter ${tcp_port} + if {[string equal -nocase "aqadapter" "${IP}"]} { + ::scobj::lakeshore_m370::sics_log 9 "makesctcontroller sct_${name} aqadapter ${port}" + makesctcontroller sct_${name} aqadapter ${port} } else { - ::scobj::lakeshore_m370::sics_log 9 "makesctcontroller sct_${name} std ${ip_address}:${tcp_port}" - makesctcontroller sct_${name} std ${ip_address}:${tcp_port} + ::scobj::lakeshore_m370::sics_log 9 "makesctcontroller sct_${name} std ${IP}:${port}" + makesctcontroller sct_${name} std ${IP}:${port} } } else { ::scobj::lakeshore_m370::sics_log 9 "[environment_simulation] => Null sctcontroller for lakeshore_m370" ::scobj::lakeshore_m370::sics_log 9 "makesctcontroller sct_${name} aqadapter NULL" makesctcontroller sct_${name} aqadapter NULL } - ::scobj::lakeshore_m370::sics_log 1 "::scobj::lakeshore_m370::mkDriver sct_${name} ${name} ${ip_address} ${tcp_port} ${id} ${tol}" - ::scobj::lakeshore_m370::mkDriver sct_${name} ${name} ${ip_address} ${tcp_port} ${id} ${tol} + ::scobj::lakeshore_m370::sics_log 1 "::scobj::lakeshore_m370::mkDriver sct_${name} ${name} ${id} ${tol}" + ::scobj::lakeshore_m370::mkDriver sct_${name} ${name} ${id} ${tol} } catch_message ] handle_exception ${catch_status} ${catch_message} } @@ -87,20 +86,29 @@ clientput "file evaluation of lakeshore_m370_sct.tcl" proc ::scobj::lakeshore_m370::read_config {} { set catch_status [ catch { set ns "::scobj::lakeshore_m370" - dict for {k u} $::config_dict { - if { [dict exists $u "implementation"] } { - if { !([dict exists $u "name"] && [dict exists $u "enabled"]) } { + dict for {k v} $::config_dict { + if { [dict exists $v "implementation"] } { + if { !([dict exists $v "name"] && [dict exists $v "enabled"]) } { continue } - set enabled [string tolower [dict get $u "enabled"]] + set enabled [string tolower [dict get $v "enabled"]] if { ! ([string equal -nocase $enabled "true" ] || [string equal -nocase $enabled "always"]) } { continue } - set name [dict get $u name] - set implementation [dict get $u "implementation"] + set name [dict get $v name] + set implementation [dict get $v "implementation"] if { !([dict exists $::config_dict $implementation]) } { continue } + set arg_list [list] + foreach arg {id} { + if {[dict exists $v $arg]} { + lappend arg_list "[dict get $v $arg]" + } else { + ${ns}::sics_log 9 "Missing configuration value $arg" + error "Missing configuration value $arg" + } + } set v [dict get $::config_dict $implementation] if { !([dict exists $v "driver"]) } { continue @@ -112,8 +120,8 @@ proc ::scobj::lakeshore_m370::read_config {} { } elseif { [dict exists $v "asyncqueue"] } { set asyncqueue [dict get $v "asyncqueue"] if { [string equal -nocase ${asyncqueue} "sct"] } { - set ip_address [dict get $v ip] - set tcp_port [dict get $v port] + set IP [dict get $v ip] + set PORT [dict get $v port] } } else { if { [dict exists $v "asyncprotocol"] } { @@ -127,30 +135,23 @@ proc ::scobj::lakeshore_m370::read_config {} { } } set asyncqueue ${name}_queue - set ip_address [dict get $v ip] - set tcp_port [dict get $v port] - MakeAsyncQueue ${asyncqueue} ${asyncprotocol} ${ip_address} ${tcp_port} + set IP [dict get $v ip] + set PORT [dict get $v port] + MakeAsyncQueue ${asyncqueue} ${asyncprotocol} ${IP} ${PORT} if { [dict exists $v "timeout"] } { ${asyncqueue} timeout "[dict get $v "timeout"]" } } - set arg_list [list] - set missing_list [list] - foreach arg {id tol} { - if {[dict exists $u $arg]} { - lappend arg_list "[dict get $u $arg]" - } elseif {[dict exists $v $arg]} { + foreach arg {tol} { + if {[dict exists $v $arg]} { lappend arg_list "[dict get $v $arg]" } else { ${ns}::sics_log 9 "Missing configuration value $arg" - lappend missing_list $arg + error "Missing configuration value $arg" } } - if { [llength $missing_list] > 0 } { - error "$name is missing configuration values $missing_list" - } if { [string equal -nocase ${asyncqueue} "sct"] } { - add_lakeshore_m370 ${name} ${ip_address} ${tcp_port} {*}$arg_list + add_lakeshore_m370 ${name} ${IP} ${PORT} {*}$arg_list } else { add_lakeshore_m370 ${name} "aqadapter" ${asyncqueue} {*}$arg_list } diff --git a/site_ansto/instrument/config/environment/temperature/sct_lakeshore_340.tcl b/site_ansto/instrument/config/environment/temperature/sct_lakeshore_340.tcl index 8e2e8738..77c10c3a 100644 --- a/site_ansto/instrument/config/environment/temperature/sct_lakeshore_340.tcl +++ b/site_ansto/instrument/config/environment/temperature/sct_lakeshore_340.tcl @@ -989,6 +989,8 @@ proc sendCmd {tc_root nextState cmd {idx ""}} { set sensorValue $tc_root/sensor/sensorValue$whichSensor if {$whichCtrlLoop <= 2} { set nodename $tc_root/sensor/setpoint$whichCtrlLoop + hset $tc_root/control/tolerance1 1 + hset $tc_root/control/tolerance2 1 hset $nodename [hval $sensorValue] hsetprop $nodename driving 0 } diff --git a/site_ansto/instrument/config/environment/temperature/sct_srs_sr630.tcl b/site_ansto/instrument/config/environment/temperature/sct_srs_sr630.tcl new file mode 100644 index 00000000..e6bb69eb --- /dev/null +++ b/site_ansto/instrument/config/environment/temperature/sct_srs_sr630.tcl @@ -0,0 +1,459 @@ +# Generated driver for srs_sr630 +# vim: ft=tcl tabstop=8 softtabstop=2 shiftwidth=2 nocindent smartindent +# + +namespace eval ::scobj::srs_sr630 { + set debug_threshold 5 +} + +proc ::scobj::srs_sr630::debug_log {tc_root debug_level debug_string} { + set catch_status [ catch { + set debug_threshold [hgetpropval ${tc_root} debug_threshold] + if {${debug_level} >= ${debug_threshold}} { + set fd [open "../log/srs_sr630_[basename ${tc_root}].log" "a"] + set line "[clock format [clock seconds] -format "%T"] ${debug_string}" + puts ${fd} "${line}" + close ${fd} + } + } catch_message ] +} + +proc ::scobj::srs_sr630::sics_log {debug_level debug_string} { + set catch_status [ catch { + set debug_threshold ${::scobj::srs_sr630::debug_threshold} + if {${debug_level} >= ${debug_threshold}} { + sicslog "::scobj::srs_sr630::${debug_string}" + } + } catch_message ] +} + +# check function for hset change +proc ::scobj::srs_sr630::checkrange {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "checkrange tc_root=${tc_root} sct=[sct] target=[sct target]" + set setpoint [sct target] + if { [hpropexists [sct] lowerlimit] } { + set lolimit [sct lowerlimit] + } else { + # lowerlimit not set, use target + set lolimit [sct target] + } + if { [hpropexists [sct] upperlimit] } { + set hilimit [sct upperlimit] + } else { + # upperlimit not set, use target + set hilimit [sct target] + } +# checkrange hook code goes here + if { ${setpoint} < ${lolimit} || ${setpoint} > ${hilimit} } { + error "setpoint ${setpoint} violates limits (${lolimit}..${hilimit}) on [sct]" + } + return OK + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::srs_sr630::fetch_id {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "fetch_id tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# fetch_id hook code starts + if {[hval [sct]] == "UNKNOWN"} { + set cmd "[clock format [clock seconds] -format "DATE %m,%d,%Y;TIME %H,%M,%S;*IDN?"]" + } else { + set cmd "*IDN?" + } +# fetch_id hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "fetch_id sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::srs_sr630::getSensor {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "getSensor tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# getSensor hook code starts + set cmd "UNIT ${cmd_str},ABS;MEAS? ${cmd_str}" +# getSensor hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "getSensor sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to check the write parameter on a device +proc ::scobj::srs_sr630::noResponse {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "noResponse tc_root=${tc_root} sct=[sct] resp=[sct result]" +# noResponse hook code goes here + return "idle" + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to parse the read of a parameter on a device +proc ::scobj::srs_sr630::readSensor {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "readSensor tc_root=${tc_root} sct=[sct] result=[sct result]" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set data [sct result] + set nextState "idle" + if {[string equal -nocase -length 7 ${data} "ASCERR:"]} { + # the protocol driver has reported an error + sct geterror "${data}" + error "[sct geterror]" + } +# readSensor hook code goes here + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to parse the read of a parameter on a device +proc ::scobj::srs_sr630::read_id {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "read_id tc_root=${tc_root} sct=[sct] result=[sct result]" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set data [sct result] + set nextState "idle" + if {[string equal -nocase -length 7 ${data} "ASCERR:"]} { + # the protocol driver has reported an error + sct geterror "${data}" + error "[sct geterror]" + } +# read_id hook code goes here + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to write a parameter value on a device +proc ::scobj::srs_sr630::setValue {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "setValue tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set par [sct target] + set cmd "${cmd_str}${par}" +# setValue hook code goes here + if { [hpropexists [sct] driving] } { + if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } { + sct driving 1 + } + } + debug_log ${tc_root} 1 "setValue sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +proc ::scobj::srs_sr630::mkDriver { sct_controller name device_class simulation_flag ip_address tcp_port } { + ::scobj::srs_sr630::sics_log 9 "::scobj::srs_sr630::mkDriver ${sct_controller} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}" + set ns "[namespace current]" + set catch_status [ catch { + + MakeSICSObj ${name} SCT_OBJECT + + sicslist setatt ${name} klass ${device_class} + sicslist setatt ${name} long_name ${name} + + set scobj_hpath /sics/${name} + + hfactory ${scobj_hpath}/id plain user text + hsetprop ${scobj_hpath}/id read ${ns}::fetch_id ${scobj_hpath} read_id {@} + hsetprop ${scobj_hpath}/id read_id ${ns}::read_id ${scobj_hpath} + hsetprop ${scobj_hpath}/id control true + hsetprop ${scobj_hpath}/id data true + hsetprop ${scobj_hpath}/id mutable true + hsetprop ${scobj_hpath}/id nxsave true + hsetprop ${scobj_hpath}/id oldval UNKNOWN + hset ${scobj_hpath}/id UNKNOWN + hsetprop ${scobj_hpath}/id klass "parameter" + hsetprop ${scobj_hpath}/id sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/id type "part" + hsetprop ${scobj_hpath}/id nxalias "${name}_id" + + hfactory ${scobj_hpath}/sensor_01 plain user float + hsetprop ${scobj_hpath}/sensor_01 read ${ns}::getSensor ${scobj_hpath} readSensor {1} + hsetprop ${scobj_hpath}/sensor_01 readSensor ${ns}::readSensor ${scobj_hpath} + hsetprop ${scobj_hpath}/sensor_01 control true + hsetprop ${scobj_hpath}/sensor_01 data true + hsetprop ${scobj_hpath}/sensor_01 mutable true + hsetprop ${scobj_hpath}/sensor_01 nxsave true + hsetprop ${scobj_hpath}/sensor_01 oldval 0.0 + hsetprop ${scobj_hpath}/sensor_01 klass "parameter" + hsetprop ${scobj_hpath}/sensor_01 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/sensor_01 type "part" + hsetprop ${scobj_hpath}/sensor_01 nxalias "${name}_sensor_01" + + hfactory ${scobj_hpath}/sensor_02 plain user float + hsetprop ${scobj_hpath}/sensor_02 read ${ns}::getSensor ${scobj_hpath} readSensor {2} + hsetprop ${scobj_hpath}/sensor_02 readSensor ${ns}::readSensor ${scobj_hpath} + hsetprop ${scobj_hpath}/sensor_02 control true + hsetprop ${scobj_hpath}/sensor_02 data true + hsetprop ${scobj_hpath}/sensor_02 mutable true + hsetprop ${scobj_hpath}/sensor_02 nxsave true + hsetprop ${scobj_hpath}/sensor_02 oldval 0.0 + hsetprop ${scobj_hpath}/sensor_02 klass "parameter" + hsetprop ${scobj_hpath}/sensor_02 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/sensor_02 type "part" + hsetprop ${scobj_hpath}/sensor_02 nxalias "${name}_sensor_02" + + hfactory ${scobj_hpath}/sensor_03 plain user float + hsetprop ${scobj_hpath}/sensor_03 read ${ns}::getSensor ${scobj_hpath} readSensor {3} + hsetprop ${scobj_hpath}/sensor_03 readSensor ${ns}::readSensor ${scobj_hpath} + hsetprop ${scobj_hpath}/sensor_03 control true + hsetprop ${scobj_hpath}/sensor_03 data true + hsetprop ${scobj_hpath}/sensor_03 mutable true + hsetprop ${scobj_hpath}/sensor_03 nxsave true + hsetprop ${scobj_hpath}/sensor_03 oldval 0.0 + hsetprop ${scobj_hpath}/sensor_03 klass "parameter" + hsetprop ${scobj_hpath}/sensor_03 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/sensor_03 type "part" + hsetprop ${scobj_hpath}/sensor_03 nxalias "${name}_sensor_03" + + hfactory ${scobj_hpath}/sensor_04 plain user float + hsetprop ${scobj_hpath}/sensor_04 read ${ns}::getSensor ${scobj_hpath} readSensor {4} + hsetprop ${scobj_hpath}/sensor_04 readSensor ${ns}::readSensor ${scobj_hpath} + hsetprop ${scobj_hpath}/sensor_04 control true + hsetprop ${scobj_hpath}/sensor_04 data true + hsetprop ${scobj_hpath}/sensor_04 mutable true + hsetprop ${scobj_hpath}/sensor_04 nxsave true + hsetprop ${scobj_hpath}/sensor_04 oldval 0.0 + hsetprop ${scobj_hpath}/sensor_04 klass "parameter" + hsetprop ${scobj_hpath}/sensor_04 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/sensor_04 type "part" + hsetprop ${scobj_hpath}/sensor_04 nxalias "${name}_sensor_04" + + hfactory ${scobj_hpath}/sensor_05 plain user float + hsetprop ${scobj_hpath}/sensor_05 read ${ns}::getSensor ${scobj_hpath} readSensor {5} + hsetprop ${scobj_hpath}/sensor_05 readSensor ${ns}::readSensor ${scobj_hpath} + hsetprop ${scobj_hpath}/sensor_05 control true + hsetprop ${scobj_hpath}/sensor_05 data true + hsetprop ${scobj_hpath}/sensor_05 mutable true + hsetprop ${scobj_hpath}/sensor_05 nxsave true + hsetprop ${scobj_hpath}/sensor_05 oldval 0.0 + hsetprop ${scobj_hpath}/sensor_05 klass "parameter" + hsetprop ${scobj_hpath}/sensor_05 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/sensor_05 type "part" + hsetprop ${scobj_hpath}/sensor_05 nxalias "${name}_sensor_05" + + hfactory ${scobj_hpath}/sensor_06 plain user float + hsetprop ${scobj_hpath}/sensor_06 read ${ns}::getSensor ${scobj_hpath} readSensor {6} + hsetprop ${scobj_hpath}/sensor_06 readSensor ${ns}::readSensor ${scobj_hpath} + hsetprop ${scobj_hpath}/sensor_06 control true + hsetprop ${scobj_hpath}/sensor_06 data true + hsetprop ${scobj_hpath}/sensor_06 mutable true + hsetprop ${scobj_hpath}/sensor_06 nxsave true + hsetprop ${scobj_hpath}/sensor_06 oldval 0.0 + hsetprop ${scobj_hpath}/sensor_06 klass "parameter" + hsetprop ${scobj_hpath}/sensor_06 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/sensor_06 type "part" + hsetprop ${scobj_hpath}/sensor_06 nxalias "${name}_sensor_06" + + hfactory ${scobj_hpath}/sensor_07 plain user float + hsetprop ${scobj_hpath}/sensor_07 read ${ns}::getSensor ${scobj_hpath} readSensor {7} + hsetprop ${scobj_hpath}/sensor_07 readSensor ${ns}::readSensor ${scobj_hpath} + hsetprop ${scobj_hpath}/sensor_07 control true + hsetprop ${scobj_hpath}/sensor_07 data true + hsetprop ${scobj_hpath}/sensor_07 mutable true + hsetprop ${scobj_hpath}/sensor_07 nxsave true + hsetprop ${scobj_hpath}/sensor_07 oldval 0.0 + hsetprop ${scobj_hpath}/sensor_07 klass "parameter" + hsetprop ${scobj_hpath}/sensor_07 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/sensor_07 type "part" + hsetprop ${scobj_hpath}/sensor_07 nxalias "${name}_sensor_07" + + hfactory ${scobj_hpath}/sensor_08 plain user float + hsetprop ${scobj_hpath}/sensor_08 read ${ns}::getSensor ${scobj_hpath} readSensor {8} + hsetprop ${scobj_hpath}/sensor_08 readSensor ${ns}::readSensor ${scobj_hpath} + hsetprop ${scobj_hpath}/sensor_08 control true + hsetprop ${scobj_hpath}/sensor_08 data true + hsetprop ${scobj_hpath}/sensor_08 mutable true + hsetprop ${scobj_hpath}/sensor_08 nxsave true + hsetprop ${scobj_hpath}/sensor_08 oldval 0.0 + hsetprop ${scobj_hpath}/sensor_08 klass "parameter" + hsetprop ${scobj_hpath}/sensor_08 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/sensor_08 type "part" + hsetprop ${scobj_hpath}/sensor_08 nxalias "${name}_sensor_08" + + hsetprop ${scobj_hpath} data "true" + hsetprop ${scobj_hpath} klass "@none" + hsetprop ${scobj_hpath} type "part" + + if {[string equal -nocase "${simulation_flag}" "false"]} { + ${sct_controller} poll ${scobj_hpath}/id 600 + ${sct_controller} poll ${scobj_hpath}/sensor_01 60 + ${sct_controller} poll ${scobj_hpath}/sensor_02 600 + ${sct_controller} poll ${scobj_hpath}/sensor_03 600 + ${sct_controller} poll ${scobj_hpath}/sensor_04 600 + ${sct_controller} poll ${scobj_hpath}/sensor_05 600 + ${sct_controller} poll ${scobj_hpath}/sensor_06 600 + ${sct_controller} poll ${scobj_hpath}/sensor_07 600 + ${sct_controller} poll ${scobj_hpath}/sensor_08 600 + } else { + ::scobj::srs_sr630::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for srs_sr630" + } + hsetprop ${scobj_hpath} klass ${device_class} + hsetprop ${scobj_hpath} data true + hsetprop ${scobj_hpath} debug_threshold 5 +# mkDriver hook code goes here + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +proc ::scobj::srs_sr630::add_driver {name device_class simulation_flag ip_address tcp_port} { + set catch_status [ catch { + ::scobj::srs_sr630::sics_log 9 "::scobj::srs_sr630::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}" + if {[string equal -nocase "${simulation_flag}" "false"]} { + if {[string equal -nocase "aqadapter" "${ip_address}"]} { + ::scobj::srs_sr630::sics_log 9 "makesctcontroller sct_${name} aqadapter ${tcp_port}" + makesctcontroller sct_${name} aqadapter ${tcp_port} + } else { + ::scobj::srs_sr630::sics_log 9 "makesctcontroller sct_${name} std ${ip_address}:${tcp_port}" + makesctcontroller sct_${name} std ${ip_address}:${tcp_port} + } + } else { + ::scobj::srs_sr630::sics_log 9 "simulation_flag={simulation_flag} => No sctcontroller for srs_sr630" + } + ::scobj::srs_sr630::sics_log 1 "::scobj::srs_sr630::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}" + ::scobj::srs_sr630::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +namespace eval ::scobj::srs_sr630 { + namespace export debug_threshold + namespace export debug_log + namespace export sics_log + namespace export mkDriver + namespace export add_driver +} + +proc add_srs_sr630 {name ip_address tcp_port} { + set simulation_flag "[string tolower [SplitReply [detector_simulation]]]" + ::scobj::srs_sr630::add_driver ${name} "NXdetector" "${simulation_flag}" ${ip_address} ${tcp_port} +} + +clientput "file evaluation of sct_srs_sr630.tcl" +::scobj::srs_sr630::sics_log 9 "file evaluation of sct_srs_sr630.tcl" + +proc ::scobj::srs_sr630::read_config {} { + set catch_status [ catch { + set ns "::scobj::srs_sr630" + dict for {k u} $::config_dict { + if { [dict exists $u "implementation"] } { + set simulation_flag "[string tolower [SplitReply [detector_simulation]]]" + set device_class "NXdetector" + if { !([dict exists $u "name"] && [dict exists $u "enabled"]) } { + continue + } + set enabled [string tolower [dict get $u "enabled"]] + if { ! ([string equal -nocase $enabled "true" ] || [string equal -nocase $enabled "always"]) } { + continue + } + if { [dict exists $u "simulation_group"] } { + set simulation_flag [SplitReply [[string tolower [dict get $u "simulation_group"]]]] + } + if { [dict exists $u "device_class"] } { + set device_class "[dict get $u "device_class"]" + } + set name [dict get $u name] + set implementation [dict get $u "implementation"] + if { !([dict exists $::config_dict $implementation]) } { + continue + } + set v [dict get $::config_dict $implementation] + if { !([dict exists $v "driver"]) } { + continue + } + if { [string equal -nocase [dict get $v "driver"] "srs_sr630"] } { + if { ![string equal -nocase "${simulation_flag}" "false"] } { + set asyncqueue "null" + ${ns}::sics_log 9 "simulation_flag=${simulation_flag} => using null asyncqueue" + } elseif { [dict exists $v "asyncqueue"] } { + set asyncqueue [dict get $v "asyncqueue"] + if { [string equal -nocase ${asyncqueue} "sct"] } { + set ip_address [dict get $v ip] + set tcp_port [dict get $v port] + } + } else { + if { [dict exists $v "asyncprotocol"] } { + set asyncprotocol [dict get $v "asyncprotocol"] + } else { + set asyncprotocol ${name}_protocol + MakeAsyncProtocol ${asyncprotocol} + if { [dict exists $v "terminator"] } { + ${asyncprotocol} sendterminator "[dict get $v "terminator"]" + ${asyncprotocol} replyterminator "[dict get $v "terminator"]" + } + } + set asyncqueue ${name}_queue + set ip_address [dict get $v ip] + set tcp_port [dict get $v port] + MakeAsyncQueue ${asyncqueue} ${asyncprotocol} ${ip_address} ${tcp_port} + if { [dict exists $v "timeout"] } { + ${asyncqueue} timeout "[dict get $v "timeout"]" + } + } + if { [string equal -nocase ${asyncqueue} "sct"] } { + ${ns}::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} + } else { + ${ns}::add_driver ${name} ${device_class} ${simulation_flag} "aqadapter" ${asyncqueue} + } + } + } + } + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +if { [info exists ::config_dict] } { + ::scobj::srs_sr630::read_config +} else { + ::scobj::srs_sr630::sics_log 5 "No config dict" +} diff --git a/site_ansto/instrument/config/environment/temperature/sct_west_6100.tcl b/site_ansto/instrument/config/environment/temperature/sct_west_6100.tcl new file mode 100644 index 00000000..1372950a --- /dev/null +++ b/site_ansto/instrument/config/environment/temperature/sct_west_6100.tcl @@ -0,0 +1,604 @@ +# Generated driver for west_6100 +# vim: ft=tcl tabstop=8 softtabstop=2 shiftwidth=2 nocindent smartindent +# + +namespace eval ::scobj::west_6100 { + set debug_threshold 5 +} + +proc ::scobj::west_6100::debug_log {tc_root debug_level debug_string} { + set catch_status [ catch { + set debug_threshold [hgetpropval ${tc_root} debug_threshold] + if {${debug_level} >= ${debug_threshold}} { + set fd [open "../log/west_6100_[basename ${tc_root}].log" "a"] + set line "[clock format [clock seconds] -format "%T"] ${debug_string}" + puts ${fd} "${line}" + close ${fd} + } + } catch_message ] +} + +proc ::scobj::west_6100::sics_log {debug_level debug_string} { + set catch_status [ catch { + set debug_threshold ${::scobj::west_6100::debug_threshold} + if {${debug_level} >= ${debug_threshold}} { + sicslog "::scobj::west_6100::${debug_string}" + } + } catch_message ] +} + +# check function for hset change +proc ::scobj::west_6100::checkrange {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "checkrange tc_root=${tc_root} sct=[sct] target=[sct target]" + set setpoint [sct target] + if { [hpropexists [sct] lowerlimit] } { + set lolimit [sct lowerlimit] + } else { + # lowerlimit not set, use target + set lolimit [sct target] + } + if { [hpropexists [sct] upperlimit] } { + set hilimit [sct upperlimit] + } else { + # upperlimit not set, use target + set hilimit [sct target] + } +# checkrange hook code goes here + if { ${setpoint} < ${lolimit} || ${setpoint} > ${hilimit} } { + error "setpoint ${setpoint} violates limits (${lolimit}..${hilimit}) on [sct]" + } + return OK + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::west_6100::getDecimal {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "getDecimal tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# getDecimal hook code starts + set cmd "1:3:${cmd_str}:1:U16" +# getDecimal hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "getDecimal sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to request the read of a parameter on a device +proc ::scobj::west_6100::getInteger {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "getInteger tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set cmd "${cmd_str}" +# getInteger hook code starts + set cmd "1:3:${cmd_str}:1:U16" +# getInteger hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + debug_log ${tc_root} 1 "getInteger sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to check the write parameter on a device +proc ::scobj::west_6100::noResponse {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "noResponse tc_root=${tc_root} sct=[sct] resp=[sct result]" +# noResponse hook code goes here + return "idle" + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to parse the read of a parameter on a device +proc ::scobj::west_6100::rdDecimal {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "rdDecimal tc_root=${tc_root} sct=[sct] result=[sct result]" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set data [sct result] + set nextState "idle" + if {[string equal -nocase -length 7 ${data} "ASCERR:"]} { + # the protocol driver has reported an error + sct geterror "${data}" + error "[sct geterror]" + } +# rdDecimal hook code starts + set decimal [hval ${tc_root}/aux/decimal] + if { ${decimal} > 0 } { + set data [expr {pow(10, -${decimal}) * ${data}}] + } +# rdDecimal hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to parse the read of a parameter on a device +proc ::scobj::west_6100::rdInteger {tc_root} { + set catch_status [ catch { + debug_log ${tc_root} 1 "rdInteger tc_root=${tc_root} sct=[sct] result=[sct result]" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set data [sct result] + set nextState "idle" + if {[string equal -nocase -length 7 ${data} "ASCERR:"]} { + # the protocol driver has reported an error + sct geterror "${data}" + error "[sct geterror]" + } +# rdInteger hook code goes here + if { ${data} != [sct oldval] } { + debug_log ${tc_root} 1 "[sct] changed to new:${data}, from old:[sct oldval]" + sct oldval ${data} + sct update ${data} + sct utime readtime + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to write a parameter value on a device +proc ::scobj::west_6100::setValue {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "setValue tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set par [sct target] + set cmd "${cmd_str}${par}" +# setValue hook code goes here + if { [hpropexists [sct] driving] } { + if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } { + sct driving 1 + } + } + debug_log ${tc_root} 1 "setValue sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to write a parameter value on a device +proc ::scobj::west_6100::wrDecimal {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "wrDecimal tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set par [sct target] + set cmd "${cmd_str}${par}" +# wrDecimal hook code starts + set decimal [hval ${tc_root}/aux/decimal] + set par [sct target] + if { ${decimal} > 0 } { + set par [expr {pow(10, ${decimal}) * ${par}}] + } + set par [expr {round(${par})}] + set cmd "1:16:${cmd_str}:1:U16:${par}" +# wrDecimal hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + if { [hpropexists [sct] driving] } { + if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } { + sct driving 1 + } + } + debug_log ${tc_root} 1 "wrDecimal sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +# function to write a parameter value on a device +proc ::scobj::west_6100::wrInteger {tc_root nextState cmd_str} { + set catch_status [ catch { + debug_log ${tc_root} 1 "wrInteger tc_root=${tc_root} sct=[sct] cmd=${cmd_str}" + if { [hpropexists [sct] geterror] } { + hdelprop [sct] geterror + } + set par [sct target] + set cmd "${cmd_str}${par}" +# wrInteger hook code starts + set cmd "1:16:${cmd_str}:1:U16:${par}" +# wrInteger hook code ends + if { [hpropexists [sct] geterror] } { + debug_log ${tc_root} 9 "[sct] error: [sct geterror]" + error "[sct geterror]" + } + if { [hpropexists [sct] driving] } { + if { [hpropexists [sct] writestatus] && [sct writestatus] == "start" } { + sct driving 1 + } + } + debug_log ${tc_root} 1 "wrInteger sct send ${cmd}" + if {![string equal -nocase -length 10 ${cmd} "@@NOSEND@@"]} { + sct send "${cmd}" + } + return ${nextState} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +proc ::scobj::west_6100::mkDriver { sct_controller name device_class simulation_flag ip_address tcp_port dev_id } { + ::scobj::west_6100::sics_log 9 "::scobj::west_6100::mkDriver ${sct_controller} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${dev_id}" + set ns "[namespace current]" + set catch_status [ catch { + + MakeSICSObj ${name} SCT_OBJECT + + sicslist setatt ${name} klass ${device_class} + sicslist setatt ${name} long_name ${name} + + set scobj_hpath /sics/${name} + + hfactory ${scobj_hpath}/alarm1 plain user float + hsetprop ${scobj_hpath}/alarm1 read ${ns}::getDecimal ${scobj_hpath} rdDecimal {13} + hsetprop ${scobj_hpath}/alarm1 rdDecimal ${ns}::rdDecimal ${scobj_hpath} + hsetprop ${scobj_hpath}/alarm1 write ${ns}::wrDecimal ${scobj_hpath} noResponse {13} + hsetprop ${scobj_hpath}/alarm1 noResponse ${ns}::noResponse ${scobj_hpath} + hsetprop ${scobj_hpath}/alarm1 check ${ns}::checkrange ${scobj_hpath} + hsetprop ${scobj_hpath}/alarm1 control true + hsetprop ${scobj_hpath}/alarm1 data true + hsetprop ${scobj_hpath}/alarm1 mutable true + hsetprop ${scobj_hpath}/alarm1 nxsave true + hsetprop ${scobj_hpath}/alarm1 oldval 0.0 + hsetprop ${scobj_hpath}/alarm1 klass "parameter" + hsetprop ${scobj_hpath}/alarm1 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/alarm1 type "part" + hsetprop ${scobj_hpath}/alarm1 nxalias "${name}_alarm1" + + hfactory ${scobj_hpath}/alarm2 plain user float + hsetprop ${scobj_hpath}/alarm2 read ${ns}::getDecimal ${scobj_hpath} rdDecimal {14} + hsetprop ${scobj_hpath}/alarm2 rdDecimal ${ns}::rdDecimal ${scobj_hpath} + hsetprop ${scobj_hpath}/alarm2 write ${ns}::wrDecimal ${scobj_hpath} noResponse {14} + hsetprop ${scobj_hpath}/alarm2 noResponse ${ns}::noResponse ${scobj_hpath} + hsetprop ${scobj_hpath}/alarm2 check ${ns}::checkrange ${scobj_hpath} + hsetprop ${scobj_hpath}/alarm2 control true + hsetprop ${scobj_hpath}/alarm2 data true + hsetprop ${scobj_hpath}/alarm2 mutable true + hsetprop ${scobj_hpath}/alarm2 nxsave true + hsetprop ${scobj_hpath}/alarm2 oldval 0.0 + hsetprop ${scobj_hpath}/alarm2 klass "parameter" + hsetprop ${scobj_hpath}/alarm2 sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/alarm2 type "part" + hsetprop ${scobj_hpath}/alarm2 nxalias "${name}_alarm2" + + hfactory ${scobj_hpath}/power plain user int + hsetprop ${scobj_hpath}/power read ${ns}::getInteger ${scobj_hpath} rdInteger {3} + hsetprop ${scobj_hpath}/power rdInteger ${ns}::rdInteger ${scobj_hpath} + hsetprop ${scobj_hpath}/power control true + hsetprop ${scobj_hpath}/power data true + hsetprop ${scobj_hpath}/power mutable true + hsetprop ${scobj_hpath}/power nxsave true + hsetprop ${scobj_hpath}/power oldval 0 + hsetprop ${scobj_hpath}/power klass "parameter" + hsetprop ${scobj_hpath}/power sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/power type "part" + hsetprop ${scobj_hpath}/power nxalias "${name}_power" + + hfactory ${scobj_hpath}/powermax plain user int + hsetprop ${scobj_hpath}/powermax read ${ns}::getInteger ${scobj_hpath} rdInteger {20} + hsetprop ${scobj_hpath}/powermax rdInteger ${ns}::rdInteger ${scobj_hpath} + hsetprop ${scobj_hpath}/powermax write ${ns}::wrInteger ${scobj_hpath} noResponse {20} + hsetprop ${scobj_hpath}/powermax noResponse ${ns}::noResponse ${scobj_hpath} + hsetprop ${scobj_hpath}/powermax check ${ns}::checkrange ${scobj_hpath} + hsetprop ${scobj_hpath}/powermax control true + hsetprop ${scobj_hpath}/powermax data true + hsetprop ${scobj_hpath}/powermax mutable true + hsetprop ${scobj_hpath}/powermax nxsave true + hsetprop ${scobj_hpath}/powermax oldval 0 + hsetprop ${scobj_hpath}/powermax klass "parameter" + hsetprop ${scobj_hpath}/powermax sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/powermax type "part" + hsetprop ${scobj_hpath}/powermax nxalias "${name}_powermax" + + hfactory ${scobj_hpath}/ramprate plain user float + hsetprop ${scobj_hpath}/ramprate read ${ns}::getDecimal ${scobj_hpath} rdDecimal {24} + hsetprop ${scobj_hpath}/ramprate rdDecimal ${ns}::rdDecimal ${scobj_hpath} + hsetprop ${scobj_hpath}/ramprate write ${ns}::wrDecimal ${scobj_hpath} noResponse {24} + hsetprop ${scobj_hpath}/ramprate noResponse ${ns}::noResponse ${scobj_hpath} + hsetprop ${scobj_hpath}/ramprate check ${ns}::checkrange ${scobj_hpath} + hsetprop ${scobj_hpath}/ramprate control true + hsetprop ${scobj_hpath}/ramprate data true + hsetprop ${scobj_hpath}/ramprate mutable true + hsetprop ${scobj_hpath}/ramprate nxsave true + hsetprop ${scobj_hpath}/ramprate oldval 0.0 + hsetprop ${scobj_hpath}/ramprate klass "parameter" + hsetprop ${scobj_hpath}/ramprate sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/ramprate type "part" + hsetprop ${scobj_hpath}/ramprate nxalias "${name}_ramprate" + + hfactory ${scobj_hpath}/sensor plain user float + hsetprop ${scobj_hpath}/sensor read ${ns}::getDecimal ${scobj_hpath} rdDecimal {1} + hsetprop ${scobj_hpath}/sensor rdDecimal ${ns}::rdDecimal ${scobj_hpath} + hsetprop ${scobj_hpath}/sensor control true + hsetprop ${scobj_hpath}/sensor data true + hsetprop ${scobj_hpath}/sensor mutable true + hsetprop ${scobj_hpath}/sensor nxsave true + hsetprop ${scobj_hpath}/sensor oldval 0.0 + hsetprop ${scobj_hpath}/sensor klass "parameter" + hsetprop ${scobj_hpath}/sensor sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/sensor type "part" + hsetprop ${scobj_hpath}/sensor nxalias "${name}_sensor" + + hfactory ${scobj_hpath}/setpoint plain user float + hsetprop ${scobj_hpath}/setpoint read ${ns}::getDecimal ${scobj_hpath} rdDecimal {2} + hsetprop ${scobj_hpath}/setpoint rdDecimal ${ns}::rdDecimal ${scobj_hpath} + hsetprop ${scobj_hpath}/setpoint write ${ns}::wrDecimal ${scobj_hpath} noResponse {2} + hsetprop ${scobj_hpath}/setpoint noResponse ${ns}::noResponse ${scobj_hpath} + hsetprop ${scobj_hpath}/setpoint check ${ns}::checkrange ${scobj_hpath} + hsetprop ${scobj_hpath}/setpoint control true + hsetprop ${scobj_hpath}/setpoint data true + hsetprop ${scobj_hpath}/setpoint mutable true + hsetprop ${scobj_hpath}/setpoint nxsave true + hsetprop ${scobj_hpath}/setpoint oldval 0.0 + hsetprop ${scobj_hpath}/setpoint klass "parameter" + hsetprop ${scobj_hpath}/setpoint sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/setpoint type "part" + hsetprop ${scobj_hpath}/setpoint nxalias "${name}_setpoint" + + hfactory ${scobj_hpath}/w_sp plain user float + hsetprop ${scobj_hpath}/w_sp read ${ns}::getDecimal ${scobj_hpath} rdDecimal {21} + hsetprop ${scobj_hpath}/w_sp rdDecimal ${ns}::rdDecimal ${scobj_hpath} + hsetprop ${scobj_hpath}/w_sp write ${ns}::wrDecimal ${scobj_hpath} noResponse {21} + hsetprop ${scobj_hpath}/w_sp noResponse ${ns}::noResponse ${scobj_hpath} + hsetprop ${scobj_hpath}/w_sp check ${ns}::checkrange ${scobj_hpath} + hsetprop ${scobj_hpath}/w_sp control true + hsetprop ${scobj_hpath}/w_sp data true + hsetprop ${scobj_hpath}/w_sp mutable true + hsetprop ${scobj_hpath}/w_sp nxsave true + hsetprop ${scobj_hpath}/w_sp oldval 0.0 + hsetprop ${scobj_hpath}/w_sp klass "parameter" + hsetprop ${scobj_hpath}/w_sp sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/w_sp type "part" + hsetprop ${scobj_hpath}/w_sp nxalias "${name}_w_sp" + + hsetprop ${scobj_hpath} data "true" + hsetprop ${scobj_hpath} klass "@none" + hsetprop ${scobj_hpath} type "part" + + if {[string equal -nocase "${simulation_flag}" "false"]} { + ${sct_controller} poll ${scobj_hpath}/alarm1 1 + ${sct_controller} poll ${scobj_hpath}/alarm2 1 + ${sct_controller} poll ${scobj_hpath}/power 1 + ${sct_controller} poll ${scobj_hpath}/powermax 1 + ${sct_controller} poll ${scobj_hpath}/ramprate 1 + ${sct_controller} poll ${scobj_hpath}/sensor 1 + ${sct_controller} poll ${scobj_hpath}/setpoint 1 + ${sct_controller} poll ${scobj_hpath}/w_sp 1 + ${sct_controller} write ${scobj_hpath}/alarm1 + ${sct_controller} write ${scobj_hpath}/alarm2 + ${sct_controller} write ${scobj_hpath}/powermax + ${sct_controller} write ${scobj_hpath}/ramprate + ${sct_controller} write ${scobj_hpath}/setpoint + ${sct_controller} write ${scobj_hpath}/w_sp + } else { + ::scobj::west_6100::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for west_6100" + } + + hfactory ${scobj_hpath}/aux plain spy none + hsetprop ${scobj_hpath}/aux data "false" + hsetprop ${scobj_hpath}/aux klass "@none" + hsetprop ${scobj_hpath}/aux type "part" + + hfactory ${scobj_hpath}/aux/decimal plain user int + hsetprop ${scobj_hpath}/aux/decimal read ${ns}::getInteger ${scobj_hpath} rdInteger {18} + hsetprop ${scobj_hpath}/aux/decimal rdInteger ${ns}::rdInteger ${scobj_hpath} + hsetprop ${scobj_hpath}/aux/decimal control false + hsetprop ${scobj_hpath}/aux/decimal data false + hsetprop ${scobj_hpath}/aux/decimal mutable false + hsetprop ${scobj_hpath}/aux/decimal nxsave false + hsetprop ${scobj_hpath}/aux/decimal oldval 0 + hset ${scobj_hpath}/aux/decimal 0 + hsetprop ${scobj_hpath}/aux/decimal sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/aux/decimal type "part" + hsetprop ${scobj_hpath}/aux/decimal nxalias "${name}_aux_decimal" + + hfactory ${scobj_hpath}/aux/instatus plain user int + hsetprop ${scobj_hpath}/aux/instatus read ${ns}::getInteger ${scobj_hpath} rdInteger {133} + hsetprop ${scobj_hpath}/aux/instatus rdInteger ${ns}::rdInteger ${scobj_hpath} + hsetprop ${scobj_hpath}/aux/instatus control false + hsetprop ${scobj_hpath}/aux/instatus data false + hsetprop ${scobj_hpath}/aux/instatus mutable false + hsetprop ${scobj_hpath}/aux/instatus nxsave false + hsetprop ${scobj_hpath}/aux/instatus oldval 0 + hsetprop ${scobj_hpath}/aux/instatus sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/aux/instatus type "part" + hsetprop ${scobj_hpath}/aux/instatus nxalias "${name}_aux_instatus" + + hfactory ${scobj_hpath}/aux/model plain user int + hsetprop ${scobj_hpath}/aux/model read ${ns}::getInteger ${scobj_hpath} rdInteger {122} + hsetprop ${scobj_hpath}/aux/model rdInteger ${ns}::rdInteger ${scobj_hpath} + hsetprop ${scobj_hpath}/aux/model control false + hsetprop ${scobj_hpath}/aux/model data false + hsetprop ${scobj_hpath}/aux/model mutable false + hsetprop ${scobj_hpath}/aux/model nxsave false + hsetprop ${scobj_hpath}/aux/model oldval 0 + hsetprop ${scobj_hpath}/aux/model sdsinfo "::nexus::scobj::sdsinfo" + hsetprop ${scobj_hpath}/aux/model type "part" + hsetprop ${scobj_hpath}/aux/model nxalias "${name}_aux_model" + + if {[string equal -nocase "${simulation_flag}" "false"]} { + ${sct_controller} poll ${scobj_hpath}/aux/decimal 2 + ${sct_controller} poll ${scobj_hpath}/aux/instatus 2 + ${sct_controller} poll ${scobj_hpath}/aux/model 2 + } else { + ::scobj::west_6100::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for west_6100" + } + hsetprop ${scobj_hpath} klass ${device_class} + hsetprop ${scobj_hpath} data true + hsetprop ${scobj_hpath} debug_threshold 5 +# mkDriver hook code goes here + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +proc ::scobj::west_6100::add_driver {name device_class simulation_flag ip_address tcp_port dev_id} { + set catch_status [ catch { + ::scobj::west_6100::sics_log 9 "::scobj::west_6100::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${dev_id}" + if {[string equal -nocase "${simulation_flag}" "false"]} { + if {[string equal -nocase "aqadapter" "${ip_address}"]} { + ::scobj::west_6100::sics_log 9 "makesctcontroller sct_${name} aqadapter ${tcp_port}" + makesctcontroller sct_${name} aqadapter ${tcp_port} + } else { + ::scobj::west_6100::sics_log 9 "makesctcontroller sct_${name} modbus_ap ${ip_address}:${tcp_port}" + makesctcontroller sct_${name} modbus_ap ${ip_address}:${tcp_port} + } + } else { + ::scobj::west_6100::sics_log 9 "simulation_flag={simulation_flag} => No sctcontroller for west_6100" + } + ::scobj::west_6100::sics_log 1 "::scobj::west_6100::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${dev_id}" + ::scobj::west_6100::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${dev_id} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +namespace eval ::scobj::west_6100 { + namespace export debug_threshold + namespace export debug_log + namespace export sics_log + namespace export mkDriver + namespace export add_driver +} + +proc add_west_6100 {name ip_address tcp_port dev_id} { + set simulation_flag "[string tolower [SplitReply [environment_simulation]]]" + ::scobj::west_6100::add_driver ${name} "environment" "${simulation_flag}" ${ip_address} ${tcp_port} "${dev_id}" +} + +clientput "file evaluation of sct_west_6100.tcl" +::scobj::west_6100::sics_log 9 "file evaluation of sct_west_6100.tcl" + +proc ::scobj::west_6100::read_config {} { + set catch_status [ catch { + set ns "::scobj::west_6100" + dict for {k u} $::config_dict { + if { [dict exists $u "implementation"] } { + set simulation_flag "[string tolower [SplitReply [environment_simulation]]]" + set device_class "environment" + if { !([dict exists $u "name"] && [dict exists $u "enabled"]) } { + continue + } + set enabled [string tolower [dict get $u "enabled"]] + if { ! ([string equal -nocase $enabled "true" ] || [string equal -nocase $enabled "always"]) } { + continue + } + if { [dict exists $u "simulation_group"] } { + set simulation_flag [SplitReply [[string tolower [dict get $u "simulation_group"]]]] + } + if { [dict exists $u "device_class"] } { + set device_class "[dict get $u "device_class"]" + } + set name [dict get $u name] + set implementation [dict get $u "implementation"] + if { !([dict exists $::config_dict $implementation]) } { + continue + } + set v [dict get $::config_dict $implementation] + if { !([dict exists $v "driver"]) } { + continue + } + if { [string equal -nocase [dict get $v "driver"] "west_6100"] } { + if { ![string equal -nocase "${simulation_flag}" "false"] } { + set asyncqueue "null" + ${ns}::sics_log 9 "simulation_flag=${simulation_flag} => using null asyncqueue" + } elseif { [dict exists $v "asyncqueue"] } { + set asyncqueue [dict get $v "asyncqueue"] + if { [string equal -nocase ${asyncqueue} "sct"] } { + set ip_address [dict get $v ip] + set tcp_port [dict get $v port] + } + } else { + if { [dict exists $v "asyncprotocol"] } { + set asyncprotocol [dict get $v "asyncprotocol"] + } else { + set asyncprotocol ${name}_protocol + MakeAsyncProtocol ${asyncprotocol} + if { [dict exists $v "terminator"] } { + ${asyncprotocol} sendterminator "[dict get $v "terminator"]" + ${asyncprotocol} replyterminator "[dict get $v "terminator"]" + } + } + set asyncqueue ${name}_queue + set ip_address [dict get $v ip] + set tcp_port [dict get $v port] + MakeAsyncQueue ${asyncqueue} ${asyncprotocol} ${ip_address} ${tcp_port} + if { [dict exists $v "timeout"] } { + ${asyncqueue} timeout "[dict get $v "timeout"]" + } + } + set arg_list [list] + set missing_list [list] + foreach arg {dev_id} { + if {[dict exists $u $arg]} { + lappend arg_list "[dict get $u $arg]" + } elseif {[dict exists $v $arg]} { + lappend arg_list "[dict get $v $arg]" + } else { + ${ns}::sics_log 9 "Missing configuration value $arg" + lappend missing_list $arg + } + } + if { [llength $missing_list] > 0 } { + error "$name is missing configuration values $missing_list" + } + if { [string equal -nocase ${asyncqueue} "sct"] } { + ${ns}::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} {*}$arg_list + } else { + ${ns}::add_driver ${name} ${device_class} ${simulation_flag} "aqadapter" ${asyncqueue} {*}$arg_list + } + } + } + } + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +if { [info exists ::config_dict] } { + ::scobj::west_6100::read_config +} else { + ::scobj::west_6100::sics_log 5 "No config dict" +} diff --git a/site_ansto/instrument/config/environment/temperature/srs_sr630.sct b/site_ansto/instrument/config/environment/temperature/srs_sr630.sct new file mode 100644 index 00000000..b62b14d3 --- /dev/null +++ b/site_ansto/instrument/config/environment/temperature/srs_sr630.sct @@ -0,0 +1,45 @@ +# Stanford Research Systems SR630 Thermocouple Monitor +# vim: ts=8 sts=2 sw=2 expandtab nocindent autoindent smartindent +driver srs_sr630 = { + vendor = StanfordResearchSystems; device=SR630; + protocol = std; + class = NXdetector; + simulation_group = detector_simulation; + + group = { + priv = user; + var id = { + readable = 600; + type = text; + fetch_function = fetch_id; + read_function = read_id; + read_command = "@"; + value = "UNKNOWN"; + } + type = float; + fetch_function = getSensor; + read_function = readSensor; + var sensor_01 = { readable = 60; read_command = "1"; } + var sensor_02 = { readable = 600; read_command = "2"; } + var sensor_03 = { readable = 600; read_command = "3"; } + var sensor_04 = { readable = 600; read_command = "4"; } + var sensor_05 = { readable = 600; read_command = "5"; } + var sensor_06 = { readable = 600; read_command = "6"; } + var sensor_07 = { readable = 600; read_command = "7"; } + var sensor_08 = { readable = 600; read_command = "8"; } + } + code fetch_id = {%% + if {[hval [sct]] == "UNKNOWN"} { + set cmd "[clock format [clock seconds] -format "DATE %m,%d,%Y;TIME %H,%M,%S;*IDN?"]" + } else { + set cmd "*IDN?" + } + %%} + code read_id = {%% + %%} + code getSensor = {%% + set cmd "UNIT ${cmd_str},ABS;MEAS? ${cmd_str}" + %%} + code readSensor = {%% + %%} +} diff --git a/site_ansto/instrument/config/environment/temperature/west4100_sct.tcl b/site_ansto/instrument/config/environment/temperature/west4100_sct.tcl index b3b2d0fd..05ea5628 100644 --- a/site_ansto/instrument/config/environment/temperature/west4100_sct.tcl +++ b/site_ansto/instrument/config/environment/temperature/west4100_sct.tcl @@ -27,8 +27,8 @@ proc ::scobj::west4100::sics_log {debug_level debug_string} { } catch_message ] } -proc ::scobj::west4100::mkDriver { sct_controller name ip_address tcp_port dev_id } { - ::scobj::west4100::sics_log 9 "::scobj::west4100::mkDriver ${sct_controller} ${name} ${ip_address} ${tcp_port} ${dev_id}" +proc ::scobj::west4100::mkDriver { sct_controller name device_class simulation_flag ip_address tcp_port dev_id } { + ::scobj::west4100::sics_log 9 "::scobj::west4100::mkDriver ${sct_controller} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${dev_id}" set ns "[namespace current]" set catch_status [ catch { @@ -39,21 +39,27 @@ proc ::scobj::west4100::mkDriver { sct_controller name ip_address tcp_port dev_i handle_exception ${catch_status} ${catch_message} } +proc ::scobj::west4100::add_driver {name device_class simulation_flag ip_address tcp_port dev_id} { + set catch_status [ catch { + ::scobj::west4100::sics_log 9 "::scobj::west4100::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${dev_id}" + ::scobj::west4100::sics_log 9 "No sctcontroller for west4100" + ::scobj::west4100::sics_log 1 "::scobj::west4100::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${dev_id}" + ::scobj::west4100::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${dev_id} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + namespace eval ::scobj::west4100 { namespace export debug_threshold namespace export debug_log namespace export sics_log namespace export mkDriver + namespace export add_driver } proc add_west4100 {name ip_address tcp_port dev_id} { - set catch_status [ catch { - ::scobj::west4100::sics_log 9 "add_west4100 ${name} ${ip_address} ${tcp_port} ${dev_id}" - ::scobj::west4100::sics_log 9 "No sctcontroller for west4100" - ::scobj::west4100::sics_log 1 "::scobj::west4100::mkDriver sct_${name} ${name} ${ip_address} ${tcp_port} ${dev_id}" - ::scobj::west4100::mkDriver sct_${name} ${name} ${ip_address} ${tcp_port} ${dev_id} - } catch_message ] - handle_exception ${catch_status} ${catch_message} + set simulation_flag "[string tolower [SplitReply [environment_simulation]]]" + ::scobj::west4100::add_driver ${name} "environment" "${simulation_flag}" ${ip_address} ${tcp_port} "${dev_id}" } clientput "file evaluation of west4100_sct.tcl" @@ -64,6 +70,8 @@ proc ::scobj::west4100::read_config {} { set ns "::scobj::west4100" dict for {k u} $::config_dict { if { [dict exists $u "implementation"] } { + set simulation_flag "[string tolower [SplitReply [environment_simulation]]]" + set device_class "environment" if { !([dict exists $u "name"] && [dict exists $u "enabled"]) } { continue } @@ -71,6 +79,12 @@ proc ::scobj::west4100::read_config {} { if { ! ([string equal -nocase $enabled "true" ] || [string equal -nocase $enabled "always"]) } { continue } + if { [dict exists $u "simulation_group"] } { + set simulation_flag [SplitReply [[string tolower [dict get $u "simulation_group"]]]] + } + if { [dict exists $u "device_class"] } { + set device_class "[dict get $u "device_class"]" + } set name [dict get $u name] set implementation [dict get $u "implementation"] if { !([dict exists $::config_dict $implementation]) } { @@ -81,9 +95,9 @@ proc ::scobj::west4100::read_config {} { continue } if { [string equal -nocase [dict get $v "driver"] "west4100"] } { - if { ![string equal -nocase [SplitReply [environment_simulation]] "false"] } { + if { ![string equal -nocase "${simulation_flag}" "false"] } { set asyncqueue "null" - ${ns}::sics_log 9 "[environment_simulation] => using null asyncqueue" + ${ns}::sics_log 9 "simulation_flag=${simulation_flag} => using null asyncqueue" } elseif { [dict exists $v "asyncqueue"] } { set asyncqueue [dict get $v "asyncqueue"] if { [string equal -nocase ${asyncqueue} "sct"] } { @@ -125,9 +139,9 @@ proc ::scobj::west4100::read_config {} { error "$name is missing configuration values $missing_list" } if { [string equal -nocase ${asyncqueue} "sct"] } { - add_west4100 ${name} ${ip_address} ${tcp_port} {*}$arg_list + ${ns}::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} {*}$arg_list } else { - add_west4100 ${name} "aqadapter" ${asyncqueue} {*}$arg_list + ${ns}::add_driver ${name} ${device_class} ${simulation_flag} "aqadapter" ${asyncqueue} {*}$arg_list } } } diff --git a/site_ansto/instrument/config/environment/temperature/west_6100.sct b/site_ansto/instrument/config/environment/temperature/west_6100.sct index 72ff7050..178d25b7 100644 --- a/site_ansto/instrument/config/environment/temperature/west_6100.sct +++ b/site_ansto/instrument/config/environment/temperature/west_6100.sct @@ -34,7 +34,7 @@ driver west_6100 = { fetch_function = getInteger; read_function = rdInteger; var model = { type = int; read_command = "122"; } - var decimal = { type = int; read_command = "18"; } + var decimal = { type = int; read_command = "18"; value = 0; } var instatus = { type = int; read_command = "133"; } } code fetch_function getInteger = { @@ -59,12 +59,20 @@ driver west_6100 = { } code read_function rdDecimal = { @TCL - set data [expr {0.10 * ${data}}] + set decimal [hval ${tc_root}/aux/decimal] + if { ${decimal} > 0 } { + set data [expr {pow(10, -${decimal}) * ${data}}] + } @END } code write_function wrDecimal = { @TCL - set par [expr {round(10.0 * [sct target])}] + set decimal [hval ${tc_root}/aux/decimal] + set par [sct target] + if { ${decimal} > 0 } { + set par [expr {pow(10, ${decimal}) * ${par}}] + } + set par [expr {round(${par})}] set cmd "1:16:${cmd_str}:1:U16:${par}" @END } diff --git a/site_ansto/instrument/config/robots/epson_pandp.sct b/site_ansto/instrument/config/robots/epson_pandp.sct new file mode 100644 index 00000000..865ebb6c --- /dev/null +++ b/site_ansto/instrument/config/robots/epson_pandp.sct @@ -0,0 +1,15 @@ +# Simple driver generator for the Epson Pick and Place Robots +# vim: ts=8 sts=2 sw=2 expandtab autoindent smartindent +driver epson_pandp = { + vendor = Epson; device = 'Pick and Place Robot'; protocol = std; + class = environment; + simulation_group = environment_simulation; + add_args = "robot_name" + make_args = "robot_name" + wrapper_property nosctcontroller = True; + + code mkWrapper = {%% + clientput "add_robot ${robot_name} ${ip_address} ${tcp_port}" + add_robot ${robot_name} ${ip_address} ${tcp_port} + %%} +} diff --git a/site_ansto/instrument/config/robots/sct_epson_pandp.tcl b/site_ansto/instrument/config/robots/sct_epson_pandp.tcl new file mode 100644 index 00000000..5a3a318d --- /dev/null +++ b/site_ansto/instrument/config/robots/sct_epson_pandp.tcl @@ -0,0 +1,158 @@ +# Generated driver for epson_pandp +# vim: ft=tcl tabstop=8 softtabstop=2 shiftwidth=2 nocindent smartindent +# + +namespace eval ::scobj::epson_pandp { + set debug_threshold 5 +} + +proc ::scobj::epson_pandp::debug_log {tc_root debug_level debug_string} { + set catch_status [ catch { + set debug_threshold [hgetpropval ${tc_root} debug_threshold] + if {${debug_level} >= ${debug_threshold}} { + set fd [open "../log/epson_pandp_[basename ${tc_root}].log" "a"] + set line "[clock format [clock seconds] -format "%T"] ${debug_string}" + puts ${fd} "${line}" + close ${fd} + } + } catch_message ] +} + +proc ::scobj::epson_pandp::sics_log {debug_level debug_string} { + set catch_status [ catch { + set debug_threshold ${::scobj::epson_pandp::debug_threshold} + if {${debug_level} >= ${debug_threshold}} { + sicslog "::scobj::epson_pandp::${debug_string}" + } + } catch_message ] +} + +proc ::scobj::epson_pandp::mkDriver { sct_controller name device_class simulation_flag ip_address tcp_port robot_name } { + ::scobj::epson_pandp::sics_log 9 "::scobj::epson_pandp::mkDriver ${sct_controller} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${robot_name}" + set ns "[namespace current]" + set catch_status [ catch { + +# mkWrapper hook code starts + clientput "add_robot ${robot_name} ${ip_address} ${tcp_port}" + add_robot ${robot_name} ${ip_address} ${tcp_port} +# mkWrapper hook code ends + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +proc ::scobj::epson_pandp::add_driver {name device_class simulation_flag ip_address tcp_port robot_name} { + set catch_status [ catch { + ::scobj::epson_pandp::sics_log 9 "::scobj::epson_pandp::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${robot_name}" + ::scobj::epson_pandp::sics_log 9 "No sctcontroller for epson_pandp" + ::scobj::epson_pandp::sics_log 1 "::scobj::epson_pandp::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${robot_name}" + ::scobj::epson_pandp::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} ${robot_name} + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +namespace eval ::scobj::epson_pandp { + namespace export debug_threshold + namespace export debug_log + namespace export sics_log + namespace export mkDriver + namespace export add_driver +} + +proc add_epson_pandp {name ip_address tcp_port robot_name} { + set simulation_flag "[string tolower [SplitReply [environment_simulation]]]" + ::scobj::epson_pandp::add_driver ${name} "environment" "${simulation_flag}" ${ip_address} ${tcp_port} "${robot_name}" +} + +clientput "file evaluation of sct_epson_pandp.tcl" +::scobj::epson_pandp::sics_log 9 "file evaluation of sct_epson_pandp.tcl" + +proc ::scobj::epson_pandp::read_config {} { + set catch_status [ catch { + set ns "::scobj::epson_pandp" + dict for {k u} $::config_dict { + if { [dict exists $u "implementation"] } { + set simulation_flag "[string tolower [SplitReply [environment_simulation]]]" + set device_class "environment" + if { !([dict exists $u "name"] && [dict exists $u "enabled"]) } { + continue + } + set enabled [string tolower [dict get $u "enabled"]] + if { ! ([string equal -nocase $enabled "true" ] || [string equal -nocase $enabled "always"]) } { + continue + } + if { [dict exists $u "simulation_group"] } { + set simulation_flag [SplitReply [[string tolower [dict get $u "simulation_group"]]]] + } + if { [dict exists $u "device_class"] } { + set device_class "[dict get $u "device_class"]" + } + set name [dict get $u name] + set implementation [dict get $u "implementation"] + if { !([dict exists $::config_dict $implementation]) } { + continue + } + set v [dict get $::config_dict $implementation] + if { !([dict exists $v "driver"]) } { + continue + } + if { [string equal -nocase [dict get $v "driver"] "epson_pandp"] } { + if { ![string equal -nocase "${simulation_flag}" "false"] } { + set asyncqueue "null" + ${ns}::sics_log 9 "simulation_flag=${simulation_flag} => using null asyncqueue" + } elseif { [dict exists $v "asyncqueue"] } { + set asyncqueue [dict get $v "asyncqueue"] + if { [string equal -nocase ${asyncqueue} "sct"] } { + set ip_address [dict get $v ip] + set tcp_port [dict get $v port] + } + } else { + if { [dict exists $v "asyncprotocol"] } { + set asyncprotocol [dict get $v "asyncprotocol"] + } else { + set asyncprotocol ${name}_protocol + MakeAsyncProtocol ${asyncprotocol} + if { [dict exists $v "terminator"] } { + ${asyncprotocol} sendterminator "[dict get $v "terminator"]" + ${asyncprotocol} replyterminator "[dict get $v "terminator"]" + } + } + set asyncqueue ${name}_queue + set ip_address [dict get $v ip] + set tcp_port [dict get $v port] + MakeAsyncQueue ${asyncqueue} ${asyncprotocol} ${ip_address} ${tcp_port} + if { [dict exists $v "timeout"] } { + ${asyncqueue} timeout "[dict get $v "timeout"]" + } + } + set arg_list [list] + set missing_list [list] + foreach arg {robot_name} { + if {[dict exists $u $arg]} { + lappend arg_list "[dict get $u $arg]" + } elseif {[dict exists $v $arg]} { + lappend arg_list "[dict get $v $arg]" + } else { + ${ns}::sics_log 9 "Missing configuration value $arg" + lappend missing_list $arg + } + } + if { [llength $missing_list] > 0 } { + error "$name is missing configuration values $missing_list" + } + if { [string equal -nocase ${asyncqueue} "sct"] } { + ${ns}::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} {*}$arg_list + } else { + ${ns}::add_driver ${name} ${device_class} ${simulation_flag} "aqadapter" ${asyncqueue} {*}$arg_list + } + } + } + } + } catch_message ] + handle_exception ${catch_status} ${catch_message} +} + +if { [info exists ::config_dict] } { + ::scobj::epson_pandp::read_config +} else { + ::scobj::epson_pandp::sics_log 5 "No config dict" +} diff --git a/site_ansto/instrument/deploySICS.sh b/site_ansto/instrument/deploySICS.sh index e2fffe72..d5ab79a6 100755 --- a/site_ansto/instrument/deploySICS.sh +++ b/site_ansto/instrument/deploySICS.sh @@ -247,6 +247,10 @@ cat PATCH.TXT > $TEMPDIR/$DESTDIR/${NEWSERVER}/PATCH.TXT fi cat $SRCDIR/MANIFEST.TXT $SRCDIR/$INSTSRC/MANIFEST.TXT > $TEMPDIR/$DESTDIR/${NEWSERVER}/MANIFEST.TXT +# Strip the date and time from FILEMAP +echo sed -i $FILEMAP -e s/${NEWSERVER}/server/ +sed -i $FILEMAP -e s/${NEWSERVER}/server/ + cd $TEMPDIR # remove any .svn directories rm -rf $(find $TARDIR -type d -name .svn) diff --git a/site_ansto/instrument/dingo/MANIFEST.TXT b/site_ansto/instrument/dingo/MANIFEST.TXT index 5efb8a9a..808602de 100644 --- a/site_ansto/instrument/dingo/MANIFEST.TXT +++ b/site_ansto/instrument/dingo/MANIFEST.TXT @@ -8,3 +8,4 @@ hostport_config.tcl hostport_config_test.tcl camtest_configuration.tcl dingo.hdd +sics_simulation.tcl diff --git a/site_ansto/instrument/dingo/config/motors/motor_configuration.tcl b/site_ansto/instrument/dingo/config/motors/motor_configuration.tcl index 07129102..aa4a1f69 100644 --- a/site_ansto/instrument/dingo/config/motors/motor_configuration.tcl +++ b/site_ansto/instrument/dingo/config/motors/motor_configuration.tcl @@ -199,6 +199,41 @@ dz softlowerlim 0 dz softupperlim 170 dz home 0 +# mc1:H Sample rotation axis +# Resolver 2,048 counts per degree +# Motor 12,500 steps per degree +# Positive steps are CCW viewed from above +set soma_Home 9867748 +#set somaStepRate [expr -$motorrate*100.0] +set somaStepRate 12500 +Motor soma $motor_driver_type [params \ + asyncqueue mc1\ + host mc1-dingo\ + port pmc1-dingo\ + axis H\ + units degree\ + hardlowerlim -722\ + hardupperlim 722\ + maxSpeed 12\ + maxAccel 1\ + maxDecel 1\ + stepsPerX $somaStepRate\ + absEnc 1\ + absEncHome $soma_Home\ + nopowersave 1\ + cntsPerX 2048 ] +soma speed 0.1 +soma accel 0.1 +soma decel 0.1 +soma part sample +soma long_name soma +soma softlowerlim -1 +soma softupperlim 361 +soma home 0 +#soma bias_bits 25 +#soma rotary_bits 25 +soma creep_offset 0.05 + ############################ # Motor Controller 2 diff --git a/site_ansto/instrument/dingo/dingo_configuration.tcl b/site_ansto/instrument/dingo/dingo_configuration.tcl index d808ae00..7e044f44 100644 --- a/site_ansto/instrument/dingo/dingo_configuration.tcl +++ b/site_ansto/instrument/dingo/dingo_configuration.tcl @@ -1,8 +1,8 @@ -# Author: Ferdi Franceschini (ffr@ansto.gov.au) +# Author: Jing Chen (jgn@ansto.gov.au) # Required by server_config.tcl VarMake Instrument Text Internal -Instrument bare_dingo +Instrument dingo Instrument lock #START SERVER CONFIGURATION SECTION @@ -14,12 +14,46 @@ MakeDrive ######################################## # INSTRUMENT SPECIFIC CONFIGURATION + +source $cfPath(hipadaba)/hipadaba_configuration.tcl + fileeval $cfPath(source)/source.tcl -fileeval $cfPath(plc)/plc.tcl fileeval $cfPath(motors)/motor_configuration.tcl +#fileeval $cfPath(motors)/positmotor_configuration.tcl +#fileeval $cfPath(motors)/extraconfig.tcl +fileeval $cfPath(plc)/plc.tcl +#fileeval $cfPath(counter)/counter.tcl +#fileeval $cfPath(hmm)/hmm_configuration.tcl +fileeval $cfPath(nexus)/nxscripts.tcl fileeval $cfPath(scan)/scan.tcl +fileeval $cfPath(commands)/commands.tcl +#fileeval $cfPath(commands)/pulser.tcl +#fileeval $cfPath(commands)/hvcommands.tcl +fileeval $cfPath(anticollider)/anticollider.tcl + +source gumxml.tcl + +#::utility::mkVar ::anticollider::protect_detector text manager protect_detector false detector true false +#::anticollider::protect_detector "true" + +# fix all motors +if {1} { + set motorlist "[sicslist type motor]" + puts $motorlist + foreach m $motorlist { + if {$m == "motor" || $m == "dummy_motor"} { + # skipit + } else { + $m fixed 1 + } + } +} server_init -exe batchpath ../batch -exe syspath ../batch + clientput "serverport [get_portnum $::serverport]" + +########################################### +# WARNING: Do not add any code below server_init, if you do SICS may fail to initialise properly. + +# You can add extra-configuration code in ../extraconfig.tcl diff --git a/site_ansto/instrument/dingo/sics_simulation.tcl b/site_ansto/instrument/dingo/sics_simulation.tcl new file mode 100644 index 00000000..d1fad2a9 --- /dev/null +++ b/site_ansto/instrument/dingo/sics_simulation.tcl @@ -0,0 +1,23 @@ +# Simulation flags, possible values = true or false +# true: The simulated driver will be used. +# false: The real driver will be used. +# icsval column = settings when running on the Instrument Control Server (ie SICS_SIMULATION not defined) +# fakedev column = settings for test platforms (ie SICS_SIMULATION=fakedev) +foreach {simflag icsval fakedev} { + opal_simulation true true + detector_simulation true true + hmm_simulation true true + environment_simulation false false + counter_simulation true true + motor_simulation false false + chopper_simulation false true + velsel_simulation false true + plc_simulation true true + rfgen_simulation false true + goniometer_simulation false true + magnetic_simulation false true +} { + dict set SIMFLAG_VAL $simflag ICSVAL $icsval + dict set SIMFLAG_VAL $simflag FAKEDEV $fakedev + VarMake $simflag Text internal +} diff --git a/site_ansto/instrument/hipd/MANIFEST.TXT b/site_ansto/instrument/hipd/MANIFEST.TXT index 280229d1..b82887fe 100644 --- a/site_ansto/instrument/hipd/MANIFEST.TXT +++ b/site_ansto/instrument/hipd/MANIFEST.TXT @@ -7,3 +7,4 @@ config util hostport_config.tcl hostport_config_test.tcl +sics_simulation.tcl diff --git a/site_ansto/instrument/hipd/config/commands/eulerscan.tcl b/site_ansto/instrument/hipd/config/commands/eulerscan.tcl index 954453cd..45b0724b 100644 --- a/site_ansto/instrument/hipd/config/commands/eulerscan.tcl +++ b/site_ansto/instrument/hipd/config/commands/eulerscan.tcl @@ -2,58 +2,6 @@ # AJS Dec 2010 -# SetHistoSync: sets the histogram to receive $framenum worth of frames on receiving -# TTL pulse in frame sync input. Note: Framebuffer should be set to OFF for long runs - -proc SetHistoSync {framenum} { - histmem stop - bat_table -set NO_BAT_ENTRIES $framenum NO_BAT_PERIODS $framenum - bat_table -set NO_REPEAT_ENTRY 1 NO_REPEAT_TABLE 1 NO_EXECUTE_TABLE 1 PERIOD_INDICES { 0 1 } - fat_table -set NOS_PERIODS $framenum - oat_table -set T {0 2200000} NTC 1 - histmem loadconf - histmem fsrce EXTERNAL -} - -publish SetHistoSync user - -# SetHistoNormal: resets the histo for standard operation - -proc SetHistoNormal {} { - histmem stop - bat_table -set NO_BAT_ENTRIES 1 NO_BAT_PERIODS 1 - bat_table -set NO_REPEAT_ENTRY 0 NO_REPEAT_TABLE 0 NO_EXECUTE_TABLE 0 PERIOD_INDICES { 0} - fat_table -set NOS_PERIODS 1 - oat_table -set T {0 2200000} NTC 1 - oat_table -set Y {-0.5 3.5} NYC 128 - histmem loadconf - histmem fsrce INTERNAL - proc ::histogram_memory::pre_count {} {} -} - -publish SetHistoNormal user - -proc SetHistoOneShot {frq framenum } { - histmem stop - oct speed 0.25 - oct accel 0.25 - oct decel 0.25 - drive oct 0 - bat_table -set NO_BAT_ENTRIES $framenum NO_BAT_PERIODS $framenum - bat_table -set NO_REPEAT_ENTRY 1 NO_REPEAT_TABLE 1 NO_EXECUTE_TABLE 1 PERIOD_INDICES { 0 1 } - fat_table -set NOS_PERIODS $framenum - oat_table -set T {0 2200000} NTC 1 - oat_table -set Y {-0.5 15.5} NYC 16 - histmem freq $frq - - histmem loadconf - histmem fsrce INTERNAL - histmem mode unlimited - -} - - -publish SetHistoOneShot user # continous scan for EPHI- the euler cradle phi stage (innermost axis) # note make sure controller 2 has the PHISCAN code in it diff --git a/site_ansto/instrument/hipd/config/commands/vactex.tcl b/site_ansto/instrument/hipd/config/commands/vactex.tcl new file mode 100644 index 00000000..4910f138 --- /dev/null +++ b/site_ansto/instrument/hipd/config/commands/vactex.tcl @@ -0,0 +1,108 @@ +#vactex + +set currentoct 0 + +set somdir 1 +set somstart 0 +set somend 0 +set octrange 0 + +proc SetUpVacTex {_somstart _somend} { + global currentoct somdir somstart somend octrange + + set somstart $_somstart + set somend $_somend +# set octrange $_octrange + + set currentrun 0 + set somdir 1 +# set currentoct [expr $octrange/2.0] + oct accel 2 +# oct speed 0.5 + oct decel 2 + som accel 3 + som decel 3 + som speed 3 + drive som $somstart + som speed 3 +} + +publish SetUpVacTex user + +proc VacTex {somstep} { + global currentoct somdir somstart somend octrange + +# set octspeed [expr {$octrange*1.0/$somtime}] +# oct speed $octspeed + + set i_bool 0 + if {$somdir == 1} { + set currentsom $somstart + set i 0 + } else { + set currentsom $somend + set i [expr {int(($somend-$somstart)/$somstep)}] + } + histmem mode unlimited + newfile HISTOGRAM_XY + while {$i_bool==0} { + + set currentoct [expr {$currentoct *-1}] + drive som $currentsom +# run oct $currentoct + oct oscillate_count 1 + oct oscillate start + hmm countblock + save $i + broadcast $i $currentsom $currentoct + + if {($somdir > 0)} { + set currentsom [expr {$currentsom + $somstep}] + if {$currentsom > $somend} {set i_bool 1} + incr i + } else { + set currentsom [expr {$currentsom - $somstep}] + if {$currentsom < $somstart} {set i_bool 1} + incr i -1 + } + + + + + } + set somdir [expr {(-1*$somdir)}] +} +publish VacTex user + +proc VacRamp {temp rate somstep} { + set tstart [SplitReply [tc1 setpoint]] + set tim1 [clock seconds] + set tlength [expr abs($tstart-$temp)/($rate/3600.0)] + tc1 ramprate $rate + tc1 setpoint $temp + set bool 0 +# RadCollOn $oscno + while {$bool==0} { + VacTex $somstep + set tim2 [expr [clock seconds]-$tim1] + if {$tim2>$tlength} {set bool 1} + } +} + +publish VacRamp user + + +proc VacRun {tmins somstep} { + set tim1 [clock seconds] + set tlength [expr {$tmins * 60}] + set bool 0 +# RadCollOn $oscno + while {$bool==0} { + VacTex $somstep + set tim2 [expr [clock seconds]-$tim1] + if {$tim2>$tlength} {set bool 1} + } +} + +publish VacRun user + diff --git a/site_ansto/instrument/hipd/config/hmm/hmm_rapid.tcl b/site_ansto/instrument/hipd/config/hmm/hmm_rapid.tcl index 43f851a0..fd7c040f 100644 --- a/site_ansto/instrument/hipd/config/hmm/hmm_rapid.tcl +++ b/site_ansto/instrument/hipd/config/hmm/hmm_rapid.tcl @@ -29,6 +29,7 @@ proc histset_XYTperiod {} { proc histmem_period_single { } { # Because bugs may not yet have been corrected in hmm_configuration_common_1.tcl, # apply the default settings before attempting del/clear. + histmem astop global n_periods set n_periods 1 FAT_TABLE -set NOS_PERIODS 1 @@ -41,23 +42,9 @@ proc histmem_period_single { } { } Publish histmem_period_single User -# orig version of this pre Oct 09 -# -#proc histmem_period_sequence { Np Nf } { -# Note - sequence needs to be at least 2 periods. -# global n_periods -# set n_periods $Np -# set fatstr "FAT_TABLE -set NOS_PERIODS $Np" -# set fatstr2 "FAT_TABLE -set PERIOD_INDICES { 0 1 }" -# set batstr "BAT_TABLE -set NO_BAT_ENTRIES $Np NO_BAT_PERIODS $Np NO_REPEAT_ENTRY $Nf NO_REPEAT_TABLE 1 NO_EXECUTE_TABLE 1" -# eval $fatstr -# eval $fatstr2 -# eval $batstr -# histmem loadconf -# -#} - proc histmem_period_sequence {Np Nt} { + histmem stop + hmm astop global n_periods set n_periods $Np #FAT_TABLE -set NOS_PERIODS $Np @@ -69,9 +56,12 @@ proc histmem_period_sequence {Np Nt} { # newfile HISTOGRAM_XYT } +Publish histmem_period_sequence User proc histmem_period_sequence_off {} { + histmem stop + hmm astop global n_periods set n_periods $Np FAT_TABLE -set NOS_PERIODS 1 @@ -79,7 +69,7 @@ proc histmem_period_sequence_off {} { histmem loadconf histset_XYperiod } -Publish histmem_period_sequence User +Publish histmem_period_sequence_off User @@ -95,6 +85,8 @@ proc histmem_save_period_sequence { } { Publish histmem_save_period_sequence User proc histmem_period_strobo {Freq Bins} { + histmem stop + hmm astop global nos_bins set nos_bins $Bins set bintime [expr int(1000000./($Freq*$Bins))] @@ -108,6 +100,7 @@ proc histmem_period_strobo {Freq Bins} { Publish histmem_period_strobo User proc histmem_strobo_off {} { + hmm astop histmem fsrce INTERNAL OAT_TABLE -set T { 0 200000 } NTC 1 histmem loadconf @@ -115,44 +108,56 @@ proc histmem_strobo_off {} { } Publish histmem_strobo_off User +# SetHistoSync: sets the histogram to receive $framenum worth of frames on receiving +# TTL pulse in frame sync input. Note: Framebuffer should be set to OFF for long runs - -proc histmem_acquire_period_sequence { Np Nf } { - - newfile HISTOGRAM_XYT - +proc SetHistoSync {framenum} { histmem stop - histmem_period_sequence $Np $Nf + hmm astop + bat_table -set NO_BAT_ENTRIES $framenum NO_BAT_PERIODS $framenum + bat_table -set NO_REPEAT_ENTRY 1 NO_REPEAT_TABLE 1 NO_EXECUTE_TABLE 1 PERIOD_INDICES { 0 1 } + fat_table -set NOS_PERIODS $framenum + oat_table -set T {0 2200000} NTC 1 histmem loadconf - histmem start + histmem fsrce EXTERNAL +} - set dlytime [ expr int( 1000 * $Nf / 50. ) ] -# clientput "Waiting for" $dlytime "ms..." - after $dlytime +publish SetHistoSync user -# clientput "tc1 reading is: " [tc1 get] +# SetHistoNormal: resets the histo for standard operation - global n_periods - for { set i 0 } { $i < $n_periods } { incr i } { -# after $dlytime -# set current_period -1 -# while { $current_period < $i } { -# update -# after 500 -# # hmm count -# # hmm init 2 -# clientput [hmm configure current_period] -# set current_period [lindex [split [hmm configure current_period] " "] 2] -# clientput "i = " $i " and the current period is " $current_period -# } +proc SetHistoNormal {} { + histmem stop + hmm astop + bat_table -set NO_BAT_ENTRIES 1 NO_BAT_PERIODS 1 + bat_table -set NO_REPEAT_ENTRY 0 NO_REPEAT_TABLE 0 NO_EXECUTE_TABLE 0 PERIOD_INDICES { 0} + fat_table -set NOS_PERIODS 1 + oat_table -set T {0 2200000} NTC 1 + oat_table -set Y {-0.5 3.5} NYC 128 + histmem loadconf + histmem fsrce INTERNAL + proc ::histogram_memory::pre_count {} {} +} - hmm configure read_data_period_number $i - save [expr $i] - } +publish SetHistoNormal user - clientput "Acquisition completed." +proc SetHistoOneShot {frq framenum } { + histmem stop + hmm astop + bat_table -set NO_BAT_ENTRIES $framenum NO_BAT_PERIODS $framenum + bat_table -set NO_REPEAT_ENTRY 1 NO_REPEAT_TABLE 1 NO_EXECUTE_TABLE 1 PERIOD_INDICES { 0 1 } + fat_table -set NOS_PERIODS $framenum + oat_table -set T {0 2200000} NTC 1 + oat_table -set Y {-0.5 15.5} NYC 16 + histmem freq $frq + + histmem loadconf + histmem fsrce INTERNAL + histmem mode unlimited } -Publish histmem_acquire_period_sequence User + + +publish SetHistoOneShot user diff --git a/site_ansto/instrument/hipd/config/motors/motor_configuration.tcl b/site_ansto/instrument/hipd/config/motors/motor_configuration.tcl index a6fac755..e3953a9f 100644 --- a/site_ansto/instrument/hipd/config/motors/motor_configuration.tcl +++ b/site_ansto/instrument/hipd/config/motors/motor_configuration.tcl @@ -345,8 +345,8 @@ Motor $sample_stage_rotate $motor_driver_type [params \ hardlowerlim -71\ hardupperlim 116\ maxSpeed 5\ - maxAccel 1\ - maxDecel 1\ + maxAccel 3\ + maxDecel 3\ stepsPerX 12500\ absEnc 1\ absEncHome $som_Home\ diff --git a/site_ansto/instrument/hipd/sics_simulation.tcl b/site_ansto/instrument/hipd/sics_simulation.tcl new file mode 100644 index 00000000..20a84063 --- /dev/null +++ b/site_ansto/instrument/hipd/sics_simulation.tcl @@ -0,0 +1,23 @@ +# Simulation flags, possible values = true or false +# true: The simulated driver will be used. +# false: The real driver will be used. +# icsval column = settings when running on the Instrument Control Server (ie SICS_SIMULATION not defined) +# fakedev column = settings for test platforms (ie SICS_SIMULATION=fakedev) +foreach {simflag icsval fakedev} { + opal_simulation true true + detector_simulation false true + hmm_simulation false true + environment_simulation false false + counter_simulation false true + motor_simulation false false + chopper_simulation false true + velsel_simulation false true + plc_simulation false true + rfgen_simulation false true + goniometer_simulation false true + magnetic_simulation false true +} { + dict set SIMFLAG_VAL $simflag ICSVAL $icsval + dict set SIMFLAG_VAL $simflag FAKEDEV $fakedev + VarMake $simflag Text internal +} diff --git a/site_ansto/instrument/hipd/util/sics_config.ini b/site_ansto/instrument/hipd/util/sics_config.ini index 6e3403e8..ab40aac9 100644 --- a/site_ansto/instrument/hipd/util/sics_config.ini +++ b/site_ansto/instrument/hipd/util/sics_config.ini @@ -103,7 +103,6 @@ implementation = normal_sample_stage name = sample_stage optype = motion_axis [12tmagnet_oxford] -asyncqueue = sct desc = "12 Tesla Oxford Magnet" driver = "oxford_labview" imptype = magnetic_field @@ -130,6 +129,7 @@ desc = "Function Generator" driver = agilent_33220A imptype = function_generator ip = 10.157.205.16 +name = pulser port = 5025 [eularian_cradle] @@ -185,7 +185,7 @@ asyncqueue = sct desc = "Lakeshore 336 temperature controller" driver = "ls336" imptype = temperature -ip = 137.157.201.21 +ip = 10.157.205.30 port = 7777 terminator = \r\n tol1 = 1.0 @@ -290,10 +290,41 @@ port = 4001 desc = "Load the small omega configuration" imptype = motion_axis -[west4100] -desc = "Blue furnace temperature controller" +[vf1_west4100] +asyncqueue = sct +desc = "VF1 Blue furnace temperature controller" dev_id = 1 driver = "west4100" imptype = temperature -ip = 10.157.205.19 +ip = 10.157.205.24 +port = 502 + +[vf1_west6100] +asyncprotocol = modbus_ap +desc = "VF1 Blue furnace 6100 temperature controller" +dev_id = 1 +driver = "west_6100" +imptype = temperature +ip = 10.157.205.24 +port = 502 +timeout = 2000 + +[vf2_west4100] +asyncqueue = sct +desc = "VF2 Blue furnace temperature controller" +dev_id = 1 +driver = "west4100" +imptype = temperature +ip = 10.157.205.25 +port = 502 + +[vf2_west6100] +asyncprotocol = modbus_ap +desc = "VF2 Blue furnace 6100 temperature controller" +dev_id = 1 +driver = "west_6100" +imptype = temperature +ip = 10.157.205.25 +port = 502 +timeout = 2000 diff --git a/site_ansto/instrument/hipd/wombat_configuration.tcl b/site_ansto/instrument/hipd/wombat_configuration.tcl index 210c4308..3f174235 100644 --- a/site_ansto/instrument/hipd/wombat_configuration.tcl +++ b/site_ansto/instrument/hipd/wombat_configuration.tcl @@ -56,12 +56,14 @@ fileeval $cfPath(environment)/magneticField/sct_oxford_labview.tcl fileeval $cfPath(environment)/magneticField/oxford12tlv_sct.tcl fileeval $cfPath(environment)/he3/sct_he3.tcl fileeval $cfPath(environment)/magneticField/sct_green_magnet.tcl +fileeval $cfPath(environment)/magneticField/sct_green_magnet_labview.tcl fileeval $cfPath(hmm)/hmm_configuration.tcl fileeval $cfPath(nexus)/nxscripts.tcl fileeval $cfPath(scan)/scan.tcl fileeval $cfPath(commands)/commands.tcl fileeval $cfPath(commands)/pulser.tcl fileeval $cfPath(commands)/hvcommands.tcl +fileeval $cfPath(commands)/vactex.tcl fileeval $cfPath(commands)/eulerscan.tcl fileeval $cfPath(anticollider)/anticollider.tcl fileeval $cfPath(hmm)/hmm_rapid.tcl @@ -81,7 +83,7 @@ SetVoltScale 2000.0 # Eurotherm # add_et2000 name IP PORT MODBUS_ADDR TOL # add_et2000 et2000 10.157.205.19 502 1 5 -# add tcf1 west400 10.157.205.19 502 +# add_west400 tcf1 157.205.25 502 # Using a Keithley 2700 mulitimeter to read pressure # add_k2700 pressure 137.157.201.86 4004 "\r" diff --git a/site_ansto/instrument/hrpd/MANIFEST.TXT b/site_ansto/instrument/hrpd/MANIFEST.TXT index edd6fa3e..b6c6a16e 100644 --- a/site_ansto/instrument/hrpd/MANIFEST.TXT +++ b/site_ansto/instrument/hrpd/MANIFEST.TXT @@ -7,3 +7,4 @@ config util hostport_config.tcl hostport_config_test.tcl +sics_simulation.tcl diff --git a/site_ansto/instrument/hrpd/echidna_configuration.tcl b/site_ansto/instrument/hrpd/echidna_configuration.tcl index 8b9c4234..975afd82 100644 --- a/site_ansto/instrument/hrpd/echidna_configuration.tcl +++ b/site_ansto/instrument/hrpd/echidna_configuration.tcl @@ -25,19 +25,37 @@ source $cfPath(hipadaba)/hipadaba_configuration.tcl fileeval $cfPath(motors)/positmotor_configuration.tcl fileeval $cfPath(plc)/plc.tcl fileeval $cfPath(counter)/counter.tcl -#TODO Provide method for choosing environment controller +fileeval $cfPath(environment)/sct_agilent_33220A.tcl +fileeval $cfPath(environment)/sct_hiden_xcs.tcl +fileeval $cfPath(environment)/sct_huber_pilot.tcl +fileeval $cfPath(environment)/sct_isotech_ps.tcl fileeval $cfPath(environment)/temperature/sct_eurotherm_2000.tcl +fileeval $cfPath(environment)/temperature/sct_eurotherm_m2000.tcl fileeval $cfPath(environment)/sct_keithley_2700.tcl -fileeval $cfPath(environment)/magneticField/sct_green_magnet.tcl -fileeval $cfPath(environment)/magneticField/sct_oxford_labview.tcl -fileeval $cfPath(environment)/magneticField/oxford12tlv_sct.tcl -fileeval $cfPath(environment)/sct_keithley_2700.tcl +fileeval $cfPath(environment)/sct_keithley_m2700.tcl +fileeval $cfPath(environment)/temperature/sct_lakeshore_218.tcl fileeval $cfPath(environment)/temperature/sct_lakeshore_336.tcl +fileeval $cfPath(environment)/temperature/sct_ls336.tcl fileeval $cfPath(environment)/temperature/sct_lakeshore_340.tcl -fileeval $cfPath(environment)/temperature/sct_oxford_mercury.tcl -fileeval $cfPath(environment)/temperature/mercury_scpi_sct.tcl +fileeval $cfPath(environment)/temperature/sct_ls340.tcl +fileeval $cfPath(environment)/temperature/sct_lakeshore_370.tcl +fileeval $cfPath(environment)/temperature/sct_lakeshore_m370.tcl +fileeval $cfPath(environment)/temperature/sct_mercury_base.tcl +fileeval $cfPath(environment)/temperature/sct_mercury_level.tcl +fileeval $cfPath(environment)/temperature/sct_mercury_pres.tcl +fileeval $cfPath(environment)/temperature/sct_mercury_scpi.tcl +fileeval $cfPath(environment)/temperature/sct_mercury_temp.tcl +fileeval $cfPath(environment)/temperature/sct_mercury_valve.tcl +fileeval $cfPath(environment)/sct_protek_common.tcl +fileeval $cfPath(environment)/sct_protekmm.tcl fileeval $cfPath(environment)/temperature/west400.tcl +fileeval $cfPath(environment)/temperature/sct_west4100.tcl fileeval $cfPath(environment)/temperature/sct_watlow_pm.tcl +fileeval $cfPath(environment)/magneticField/sct_oxford_labview.tcl +fileeval $cfPath(environment)/magneticField/sct_oxford12tlv.tcl +fileeval $cfPath(environment)/he3/sct_he3.tcl +fileeval $cfPath(environment)/magneticField/sct_green_magnet.tcl +fileeval $cfPath(environment)/magneticField/sct_green_magnet_labview.tcl fileeval $cfPath(hmm)/hmm_configuration.tcl fileeval $cfPath(nexus)/nxscripts.tcl fileeval $cfPath(scan)/scan.tcl @@ -47,6 +65,7 @@ fileeval $cfPath(commands)/commands.tcl fileeval $cfPath(anticollider)/anticollider.tcl #fileeval $cfPath(environment)/robby_configuration.tcl fileeval $cfPath(robots)/sct_pickandplace.tcl +fileeval $cfPath(robots)/sct_epson_pandp.tcl source gumxml.tcl diff --git a/site_ansto/instrument/hrpd/sics_simulation.tcl b/site_ansto/instrument/hrpd/sics_simulation.tcl new file mode 100644 index 00000000..15f7173b --- /dev/null +++ b/site_ansto/instrument/hrpd/sics_simulation.tcl @@ -0,0 +1,23 @@ +# Simulation flags, possible values = true or false +# true: The simulated driver will be used. +# false: The real driver will be used. +# icsval column = settings when running on the Instrument Control Server (ie SICS_SIMULATION not defined) +# fakedev column = settings for test platforms (ie SICS_SIMULATION=fakedev) +foreach {simflag icsval fakedev} { + opal_simulation false true + detector_simulation false true + hmm_simulation false true + environment_simulation false true + counter_simulation false false + motor_simulation false false + chopper_simulation false false + velsel_simulation false false + plc_simulation false true + rfgen_simulation false false + goniometer_simulation false true + magnetic_simulation false true +} { + dict set SIMFLAG_VAL $simflag ICSVAL $icsval + dict set SIMFLAG_VAL $simflag FAKEDEV $fakedev + VarMake $simflag Text internal +} diff --git a/site_ansto/instrument/hrpd/util/sics_config.ini b/site_ansto/instrument/hrpd/util/sics_config.ini index 3a98c09f..41b97e48 100644 --- a/site_ansto/instrument/hrpd/util/sics_config.ini +++ b/site_ansto/instrument/hrpd/util/sics_config.ini @@ -94,6 +94,11 @@ id = 2 implementation = none name = volts2 optype = multimeter +[robot] +enabled = True +implementation = robbie +name = robot +optype = pickandplace [sample_stage] enabled = Always implementation = normal_sample_stage @@ -241,6 +246,14 @@ terminator = \r\n tol1 = 1.0 tol2 = 1.0 +[ls370_1] +desc = "Lakeshore 370 Resistance Bridge" +driver = "lakeshore_m370" +imptype = temperature +ip = 10.157.205.42 +port = 4001 +tol = 1.0 + [mercury_scpi_01] desc = "Oxford Mercury temperature controller in Mercury mode" driver = "mercury_scpi" @@ -283,6 +296,24 @@ imptype = multimeter ip = 10.157.205.37 port = 4001 +[robbie] +asyncqueue = sct +desc = "Robbie: Epson Pick and Place Robot" +driver = epson_pandp +imptype = pickandplace +ip = 137.157.201.26 +port = 6000 +robot_name = robbie + +[rosie] +asyncqueue = sct +desc = "Rosie: Epson Six Axis Robot in Pick and Place Mode" +driver = epson_pandp +imptype = pickandplace +ip = 137.157.201.26 +port = 6000 +robot_name = rosie + [small_omega] desc = "Load the small omega configuration" imptype = motion_axis diff --git a/site_ansto/instrument/kookaburra/MANIFEST.TXT b/site_ansto/instrument/kookaburra/MANIFEST.TXT index 7a061e4e..6040e6af 100644 --- a/site_ansto/instrument/kookaburra/MANIFEST.TXT +++ b/site_ansto/instrument/kookaburra/MANIFEST.TXT @@ -6,3 +6,4 @@ config util hostport_config.tcl hostport_config_test.tcl +sics_simulation.tcl diff --git a/site_ansto/instrument/kookaburra/config/motors/motor_configuration.tcl b/site_ansto/instrument/kookaburra/config/motors/motor_configuration.tcl index dafbb1ae..3a3cc835 100644 --- a/site_ansto/instrument/kookaburra/config/motors/motor_configuration.tcl +++ b/site_ansto/instrument/kookaburra/config/motors/motor_configuration.tcl @@ -232,7 +232,8 @@ Motor m1chi $motor_driver_type [params \ stepsPerX -$m1chiSetRate\ absEnc 1\ absEncHome $m1chi_Home\ - cntsPerX [expr 131072*100.0/68.681] ] + cntsPerX [expr 131072*100.0/68.681]\ + nopowersave 1] m1chi precision 0.001 m1chi speed 0.200 m1chi part crystal @@ -317,7 +318,7 @@ Motor ss1u $motor_driver_type [params \ axis D\ units mm\ hardlowerlim -33.5\ - hardupperlim 37.8\ + hardupperlim 35.9\ maxSpeed [expr $maxSpeedSlit/$ss1uSetRate]\ maxAccel [expr 5000.0/$ss1uSetRate/0.5]\ maxDecel [expr 5000.0/$ss1uSetRate/0.5]\ @@ -440,7 +441,8 @@ samz long_name samz samz softlowerlim 0 samz softupperlim 660 samz home 0 - +samz positions 33.5 178.5 323.5 468.5 613.5 +samz position_names 1 2 3 4 5 ############################ # Motor Controller 3 @@ -585,7 +587,8 @@ Motor m2chi $motor_driver_type [params \ stepsPerX -$m2chiSetRate\ absEnc 1\ absEncHome $m2chi_Home\ - cntsPerX [expr 131072*100.0/68.681]] + cntsPerX [expr 131072*100.0/68.681]\ + nopowersave 1] m2chi precision 0.001 m2chi speed 0.200 m2chi part crystal @@ -686,6 +689,12 @@ m2y softupperlim 355 m2y home 0 +make_gap_motors ss1vg ss1vg ss1vo ss1vo ss1u ss1d mm gaps +make_gap_motors ss1hg ss1hg ss1ho ss1ho ss1r ss1l mm gaps + +make_gap_motors ss2vg ss2vg ss2vo ss2vo ss2u ss2d mm gaps +make_gap_motors ss2hg ss2hg ss2ho ss2ho ss2r ss2l mm gaps + proc motor_set_sobj_attributes {} { } diff --git a/site_ansto/instrument/kookaburra/config/parameters/parameters.tcl b/site_ansto/instrument/kookaburra/config/parameters/parameters.tcl index 4c0ba7f2..6ee343e6 100644 --- a/site_ansto/instrument/kookaburra/config/parameters/parameters.tcl +++ b/site_ansto/instrument/kookaburra/config/parameters/parameters.tcl @@ -8,14 +8,14 @@ # Note EndFacePosY and RotApPosY are surveyed positions foreach {var lname type priv units klass} { wavelength wavelength float user Angstrom crystal + dOmega dOmega float user degrees crystal + gDQv gDQv float user none crystal MainDeadTime MainDeadTime float user s detector TransDeadTime TransDeadTime float user s detector TransmissionTube TransmissionTube int user none detector bkgLevel bkgLevel float user 1 experiment deg2QConv deg2QConv float user none experiment - dOmega dOmega float user degrees experiment empLevel empLevel float user none experiment - gDQv gDQv float user none experiment level level float user none experiment thickness thickness float user mm sample defaultMCR defaultMCR float user count/sec monitor diff --git a/site_ansto/instrument/kookaburra/hostport_config.tcl b/site_ansto/instrument/kookaburra/hostport_config.tcl index 42f63978..84ec2936 100644 --- a/site_ansto/instrument/kookaburra/hostport_config.tcl +++ b/site_ansto/instrument/kookaburra/hostport_config.tcl @@ -12,9 +12,7 @@ foreach {mc host port} { # BEAM MONITOR HOST AND PORT foreach {bm host port} { - MONITOR_1 das1-kookaburra 30000 - MONITOR_2 das1-kookaburra 30001 - MONITOR_3 das1-kookaburra 30002 + MONITOR_1 137.157.205.24 30000 } { dict set MONITOR_HOSTPORT $bm HOST $host dict set MONITOR_HOSTPORT $bm PORT $port diff --git a/site_ansto/instrument/kookaburra/sics_simulation.tcl b/site_ansto/instrument/kookaburra/sics_simulation.tcl new file mode 100644 index 00000000..429a24b8 --- /dev/null +++ b/site_ansto/instrument/kookaburra/sics_simulation.tcl @@ -0,0 +1,23 @@ +# Simulation flags, possible values = true or false +# true: The simulated driver will be used. +# false: The real driver will be used. +# icsval column = settings when running on the Instrument Control Server (ie SICS_SIMULATION not defined) +# fakedev column = settings for test platforms (ie SICS_SIMULATION=fakedev) +foreach {simflag icsval fakedev} { + opal_simulation true true + detector_simulation false true + hmm_simulation false true + environment_simulation false false + counter_simulation false true + motor_simulation false false + chopper_simulation false true + velsel_simulation false true + plc_simulation true true + rfgen_simulation false true + goniometer_simulation false true + magnetic_simulation false true +} { + dict set SIMFLAG_VAL $simflag ICSVAL $icsval + dict set SIMFLAG_VAL $simflag FAKEDEV $fakedev + VarMake $simflag Text internal +} diff --git a/site_ansto/instrument/lyrebird/MANIFEST.TXT b/site_ansto/instrument/lyrebird/MANIFEST.TXT index e7b7eb2e..79f965e4 100644 --- a/site_ansto/instrument/lyrebird/MANIFEST.TXT +++ b/site_ansto/instrument/lyrebird/MANIFEST.TXT @@ -6,3 +6,4 @@ config util hostport_config.tcl hostport_config_test.tcl +sics_simulation.tcl diff --git a/site_ansto/instrument/pelican/MANIFEST.TXT b/site_ansto/instrument/pelican/MANIFEST.TXT index f5807a59..0ae5a1d1 100644 --- a/site_ansto/instrument/pelican/MANIFEST.TXT +++ b/site_ansto/instrument/pelican/MANIFEST.TXT @@ -6,3 +6,4 @@ config util hostport_config.tcl hostport_config_test.tcl +sics_simulation.tcl diff --git a/site_ansto/instrument/pelican/config/chopper/fermimot.tcl b/site_ansto/instrument/pelican/config/chopper/fermimot.tcl index be3d6648..ba5aae80 100644 --- a/site_ansto/instrument/pelican/config/chopper/fermimot.tcl +++ b/site_ansto/instrument/pelican/config/chopper/fermimot.tcl @@ -423,13 +423,16 @@ namespace eval ::chopper { set catch_status [ catch { if [hgetpropval $hpath/$node abort] { hsetprop $hpath/$node abort 0 - clientput "ERROR: User requested stop. Aborting operation" + set errStr "ERROR: User requested stop. Aborting operation" + clientput $errStr + hsetprop $hpath/$node errmsg $errStr return $SCode(HWFault) } set devErr [hval $hpath/$node/control/device_error] if {$devErr != ""} { - clientput "ERROR: Drive request failed. Aborting operation" - clientput $devErr + set errStr "ERROR: Drive request failed. Aborting operation: device_error = $devErr" + clientput $errStr + hsetprop $hpath/$node errmsg $errStr return $SCode(HWFault) } if [hpropexists $hpath geterror] { @@ -458,6 +461,8 @@ namespace eval ::chopper { return $SCode(HWBusy) } elseif {[expr $readtime - $timecheck] > $timeout} { return $SCode(HWIdle) + } else { + return $SCode(HWBusy) } } else { if {$timecheck != -1} { @@ -498,6 +503,9 @@ namespace eval ::chopper { proc imot_PhRun {hpath node addr name target} { global SCode + if {[hval $hpath/$node/control/device_error] != ""} { + hset $hpath/$node/control/device_error "" + } hset $hpath/$node/control/set_ref_delay $target hsetprop $hpath/$node/control timecheck -1 set readtime [hgetpropval $hpath read_time] diff --git a/site_ansto/instrument/pelican/config/hmm/sct_hv.tcl b/site_ansto/instrument/pelican/config/hmm/sct_hv.tcl index 2aa761c7..8e21185e 100644 --- a/site_ansto/instrument/pelican/config/hmm/sct_hv.tcl +++ b/site_ansto/instrument/pelican/config/hmm/sct_hv.tcl @@ -418,7 +418,7 @@ publish set_data_record user MakeAsyncProtocol std -MakeAsyncQueue hvport std 10.157.205.10 4001 +MakeAsyncQueue hvport std 137.157.202.215 55011 # Main process call to create the driver ::scobj::hv::mkHV { name "hv" @@ -427,9 +427,3 @@ MakeAsyncQueue hvport std 10.157.205.10 4001 tuning 1 interval 5 } - - - - - - diff --git a/site_ansto/instrument/pelican/config/plc/plc.tcl b/site_ansto/instrument/pelican/config/plc/plc.tcl index 10635f3f..16245347 100644 --- a/site_ansto/instrument/pelican/config/plc/plc.tcl +++ b/site_ansto/instrument/pelican/config/plc/plc.tcl @@ -1,7 +1,11 @@ +#FIXME Does pelican have a PLC interface? +plc_simulation true + set sim_mode [SplitReply [plc_simulation]] + if {$sim_mode == "false"} { -# MakeAsyncQueue plc_chan SafetyPLC 137.157.204.79 31001 -# MakeSafetyPLC plc plc_chan 0 + MakeAsyncQueue plc_chan SafetyPLC IP? PORT? + MakeSafetyPLC plc plc_chan 0 } source $cfPath(plc)/plc_common_1.tcl diff --git a/site_ansto/instrument/pelican/sics_simulation.tcl b/site_ansto/instrument/pelican/sics_simulation.tcl new file mode 100644 index 00000000..25fdc9a7 --- /dev/null +++ b/site_ansto/instrument/pelican/sics_simulation.tcl @@ -0,0 +1,23 @@ +# Simulation flags, possible values = true or false +# true: The simulated driver will be used. +# false: The real driver will be used. +# icsval column = settings when running on the Instrument Control Server (ie SICS_SIMULATION not defined) +# fakedev column = settings for test platforms (ie SICS_SIMULATION=fakedev) +foreach {simflag icsval fakedev} { + opal_simulation false true + detector_simulation false true + hmm_simulation false true + environment_simulation false false + counter_simulation false true + motor_simulation false false + chopper_simulation false true + velsel_simulation false true + plc_simulation true true + rfgen_simulation false true + goniometer_simulation false true + magnetic_simulation false true +} { + dict set SIMFLAG_VAL $simflag ICSVAL $icsval + dict set SIMFLAG_VAL $simflag FAKEDEV $fakedev + VarMake $simflag Text internal +} diff --git a/site_ansto/instrument/pelican/util/sics_config.ini b/site_ansto/instrument/pelican/util/sics_config.ini index 53dfc3e2..e2576474 100644 --- a/site_ansto/instrument/pelican/util/sics_config.ini +++ b/site_ansto/instrument/pelican/util/sics_config.ini @@ -8,7 +8,7 @@ enabled = False cascade = T1:ls336_01,T2:ls340_11,sample_stage:normal_sample_stage enabled = False [Default] -cascade = sample_stage:normal_sample_stage +cascade = sample_stage:normal_sample_stage,T1:ls340_pelican enabled = True [OC1] cascade = T1:OC1_ls340,sample_stage:normal_sample_stage @@ -43,9 +43,9 @@ name = curr2 optype = multimeter [T1] datype = T -enabled = False +enabled = True id = 1 -implementation = none +implementation = ls340_pelican name = tc1 optype = temperature [T2] @@ -83,6 +83,11 @@ id = 2 implementation = none name = volts2 optype = multimeter +[ls218] +enabled = Always +implementation = ls218-01 +name = ls218 +optype = lakeshore_218 [sample_stage] enabled = Always implementation = normal_sample_stage @@ -120,6 +125,13 @@ imptype = function_generator ip = 10.157.205.16 port = 5025 +[ls218-01] +desc = "Lakeshore 218 Temperature Monitor" +driver = "lakeshore_218" +imptype = lakeshore_218 +ip = ca2-pelican +port = 4002 + [ls336_01] asyncqueue = sct desc = "Lakeshore 336 temperature controller" diff --git a/site_ansto/instrument/qld/MANIFEST.TXT b/site_ansto/instrument/qld/MANIFEST.TXT index 386c1f4f..80d4dd24 100644 --- a/site_ansto/instrument/qld/MANIFEST.TXT +++ b/site_ansto/instrument/qld/MANIFEST.TXT @@ -6,3 +6,4 @@ koala.hdd troubleshoot_setup.tcl extraconfig.tcl InstXML.xml +sics_simulation.tcl diff --git a/site_ansto/instrument/reflectometer/MANIFEST.TXT b/site_ansto/instrument/reflectometer/MANIFEST.TXT index c48c7d9a..4e5b24ad 100644 --- a/site_ansto/instrument/reflectometer/MANIFEST.TXT +++ b/site_ansto/instrument/reflectometer/MANIFEST.TXT @@ -7,3 +7,4 @@ config util hostport_config.tcl hostport_config_test.tcl +sics_simulation.tcl diff --git a/site_ansto/instrument/reflectometer/sics_simulation.tcl b/site_ansto/instrument/reflectometer/sics_simulation.tcl new file mode 100644 index 00000000..e940d6ae --- /dev/null +++ b/site_ansto/instrument/reflectometer/sics_simulation.tcl @@ -0,0 +1,23 @@ +# Simulation flags, possible values = true or false +# true: The simulated driver will be used. +# false: The real driver will be used. +# icsval column = settings when running on the Instrument Control Server (ie SICS_SIMULATION not defined) +# fakedev column = settings for test platforms (ie SICS_SIMULATION=fakedev) +foreach {simflag icsval fakedev} { + opal_simulation true true + detector_simulation false true + hmm_simulation false true + environment_simulation false true + counter_simulation false false + motor_simulation false false + chopper_simulation false false + velsel_simulation false false + plc_simulation false true + rfgen_simulation false false + goniometer_simulation false true + magnetic_simulation false true +} { + dict set SIMFLAG_VAL $simflag ICSVAL $icsval + dict set SIMFLAG_VAL $simflag FAKEDEV $fakedev + VarMake $simflag Text internal +} diff --git a/site_ansto/instrument/rsd/MANIFEST.TXT b/site_ansto/instrument/rsd/MANIFEST.TXT index 47be8e1a..23eab905 100644 --- a/site_ansto/instrument/rsd/MANIFEST.TXT +++ b/site_ansto/instrument/rsd/MANIFEST.TXT @@ -7,3 +7,4 @@ config util hostport_config.tcl hostport_config_test.tcl +sics_simulation.tcl diff --git a/site_ansto/instrument/rsd/sics_simulation.tcl b/site_ansto/instrument/rsd/sics_simulation.tcl new file mode 100644 index 00000000..15f7173b --- /dev/null +++ b/site_ansto/instrument/rsd/sics_simulation.tcl @@ -0,0 +1,23 @@ +# Simulation flags, possible values = true or false +# true: The simulated driver will be used. +# false: The real driver will be used. +# icsval column = settings when running on the Instrument Control Server (ie SICS_SIMULATION not defined) +# fakedev column = settings for test platforms (ie SICS_SIMULATION=fakedev) +foreach {simflag icsval fakedev} { + opal_simulation false true + detector_simulation false true + hmm_simulation false true + environment_simulation false true + counter_simulation false false + motor_simulation false false + chopper_simulation false false + velsel_simulation false false + plc_simulation false true + rfgen_simulation false false + goniometer_simulation false true + magnetic_simulation false true +} { + dict set SIMFLAG_VAL $simflag ICSVAL $icsval + dict set SIMFLAG_VAL $simflag FAKEDEV $fakedev + VarMake $simflag Text internal +} diff --git a/site_ansto/instrument/runsics.py b/site_ansto/instrument/runsics.py index 0b88a947..68102463 100755 --- a/site_ansto/instrument/runsics.py +++ b/site_ansto/instrument/runsics.py @@ -64,7 +64,7 @@ def start_cmd(server, args): 'none': '', 'fullsim': 'SICS_SIMULATION=full%s' % soffset, 'fakedev': 'SICS_SIMULATION=fakedev%s' % soffset, - 'scriptval': 'SICS_SIMULATION=script_validator%s' % soffset + 'scriptval': 'SICS_INIT_LOGPATH="../script_validator/log" SICS_SIMULATION=script_validator%s' % soffset } # Set SICS_SIMULATION environment variable if (server == 'scriptval'): diff --git a/site_ansto/instrument/sans/MANIFEST.TXT b/site_ansto/instrument/sans/MANIFEST.TXT index 92a3f6d5..930f85a3 100644 --- a/site_ansto/instrument/sans/MANIFEST.TXT +++ b/site_ansto/instrument/sans/MANIFEST.TXT @@ -7,3 +7,4 @@ config util hostport_config.tcl hostport_config_test.tcl +sics_simulation.tcl diff --git a/site_ansto/instrument/sans/config/commands/growfile.tcl b/site_ansto/instrument/sans/config/commands/growfile.tcl new file mode 100644 index 00000000..b92c8703 --- /dev/null +++ b/site_ansto/instrument/sans/config/commands/growfile.tcl @@ -0,0 +1,96 @@ +# \file Implements 'dsc actime interval' command. +set GROWFILE_STATE "DISABLED" +set growfileSaveIndex 0 + + +proc doGrowFile {} { + global GROWFILE_STATE + global growfileSaveIndex + +# Reset the GROWFILE_STATE variable in case some naughty user sets it directly + set GROWFILE_STATE "ENABLED" + set HMSTATE [SplitReply [hmm configure daq]] + set FSTATE [SplitReply [file_status]] +# broadcast CALLED: [info level 0], HMSTATE = $HMSTATE, FSTATE = $FSTATE + if { $FSTATE != "UNKNOWN" && $FSTATE != "OPEN" && $HMSTATE == "Started"} { +# broadcast growfile $growfileSaveIndex + save $growfileSaveIndex "growfile" + incr growfileSaveIndex + } else { + if {$growfileSaveIndex == 0} { + broadcast ERROR: GROWFILE HMSTATE = $HMSTATE, FSTATE = $FSTATE. The histmem must be running and you must create a newfile before calling "growfile" + } else { + broadcast STOP GROWFILE Acquisition finished. HMSTATE = $HMSTATE, FSTATE = $FSTATE. + save $growfileSaveIndex "growfile" + newfile clear + broadcast Saved [hval /experiment/file_name] + } + set growfileSaveIndex 0 + sicspoll del doGrowFile + set GROWFILE_STATE "DISABLED" + hsetprop /instrument/detector/hmm mutable true + } +} +publish doGrowFile user + + +proc growfile { {interval 300} } { + global GROWFILE_STATE + global growfileSaveIndex + + set GROWFILE_STATE "DISABLED" + set growfileSaveIndex 0 + + set as_error 0 + + set myrights [set_rights manager] + if {$myrights == -1} { + return -code error "ERROR: You are not authorized for this operation" + } + set interval [string tolower $interval] + if {$interval == "check" || $interval == "status"} { + if { $GROWFILE_STATE == "ENABLED" } { + return "GROWFILE $GROWFILE_STATE [sicspoll intervall doGrowFile]" + } else { + return "GROWFILE $GROWFILE_STATE" + } + } elseif {[string is integer $interval]} { + if {$interval <= 0} { + if { $GROWFILE_STATE == "ENABLED" } { + sicspoll del doGrowFile + set GROWFILE_STATE "DISABLED" + } + } else { + if {$GROWFILE_STATE == "DISABLED"} { + sicspoll add doGrowFile script $interval doGrowFile +# sicspoll listen # WARNING:When the listening client exits it leaves SICSPOLL task with a corrupt connection object. + set GROWFILE_STATE "ENABLED" + } else { + sicspoll intervall doGrowFile $interval + } + } + } else { + set as_error 1 + } + + set_rights $myrights + + if {$as_error} { + return -code error "ERROR: Invalid argument in '[info level 0]', should be an integer or 'check'" + } +} +publish growfile user + +# \brief Run histogram for the specified time and save XY binned data at the given interval. +# \param actime Acquisition time in seconds. +# \param saveint Save interval in seconds. +proc dsc {actime saveint} { + hsetprop /instrument/detector/hmm mutable false + newfile HISTOGRAM_XY + histmem mode time + histmem preset $actime + histmem start + growfile $saveint +} + +publish dsc user diff --git a/site_ansto/instrument/sans/quokka_configuration.tcl b/site_ansto/instrument/sans/quokka_configuration.tcl index 930196c7..d558d904 100644 --- a/site_ansto/instrument/sans/quokka_configuration.tcl +++ b/site_ansto/instrument/sans/quokka_configuration.tcl @@ -26,35 +26,35 @@ fileeval $cfPath(parameters)/parameters.tcl fileeval $cfPath(plc)/plc.tcl fileeval $cfPath(optics)/optics.tcl fileeval $cfPath(counter)/counter.tcl -fileeval $cfPath(environment)/agilent_33220A_sct.tcl -fileeval $cfPath(environment)/hiden_xcs_sct.tcl -fileeval $cfPath(environment)/huber_pilot_sct.tcl -fileeval $cfPath(environment)/isotech_ps_sct.tcl +fileeval $cfPath(environment)/sct_agilent_33220A.tcl +fileeval $cfPath(environment)/sct_hiden_xcs.tcl +fileeval $cfPath(environment)/sct_huber_pilot.tcl +fileeval $cfPath(environment)/sct_isotech_ps.tcl fileeval $cfPath(environment)/temperature/sct_eurotherm_2000.tcl -fileeval $cfPath(environment)/temperature/eurotherm_m2000_sct.tcl +fileeval $cfPath(environment)/temperature/sct_eurotherm_m2000.tcl fileeval $cfPath(environment)/sct_keithley_2700.tcl -fileeval $cfPath(environment)/keithley_m2700_sct.tcl -fileeval $cfPath(environment)/temperature/lakeshore_218_sct.tcl +fileeval $cfPath(environment)/sct_keithley_m2700.tcl +fileeval $cfPath(environment)/temperature/sct_lakeshore_218.tcl fileeval $cfPath(environment)/temperature/sct_lakeshore_336.tcl -fileeval $cfPath(environment)/temperature/ls336_sct.tcl +fileeval $cfPath(environment)/temperature/sct_ls336.tcl fileeval $cfPath(environment)/temperature/sct_lakeshore_340.tcl -fileeval $cfPath(environment)/temperature/ls340_sct.tcl +fileeval $cfPath(environment)/temperature/sct_ls340.tcl fileeval $cfPath(environment)/temperature/sct_lakeshore_370.tcl -fileeval $cfPath(environment)/temperature/lakeshore_m370_sct.tcl -fileeval $cfPath(environment)/temperature/mercury_scpi_sct.tcl -fileeval $cfPath(environment)/nhq_200_sct.tcl -fileeval $cfPath(environment)/omron_hldc_sct.tcl -fileeval $cfPath(environment)/temperature/pfeiffer_hg_sct.tcl +fileeval $cfPath(environment)/temperature/sct_lakeshore_m370.tcl +fileeval $cfPath(environment)/temperature/sct_mercury_scpi.tcl +fileeval $cfPath(environment)/sct_nhq_200.tcl +fileeval $cfPath(environment)/sct_omron_hldc.tcl +fileeval $cfPath(environment)/temperature/sct_pfeiffer_hg.tcl fileeval $cfPath(environment)/sct_protek_common.tcl -fileeval $cfPath(environment)/protekmm_sct.tcl +fileeval $cfPath(environment)/sct_protekmm.tcl fileeval $cfPath(environment)/temperature/sct_rvasm2.tcl -fileeval $cfPath(environment)/temperature/nprvasm2_sct.tcl +fileeval $cfPath(environment)/temperature/sct_nprvasm2.tcl fileeval $cfPath(environment)/temperature/sct_watlow_pm.tcl -fileeval $cfPath(environment)/temperature/watlow_mpm_sct.tcl +fileeval $cfPath(environment)/temperature/sct_watlow_mpm.tcl fileeval $cfPath(environment)/temperature/sct_watlow_rm.tcl -fileeval $cfPath(environment)/temperature/watlow_mrm_sct.tcl +fileeval $cfPath(environment)/temperature/sct_watlow_mrm.tcl fileeval $cfPath(environment)/temperature/sct_watlow_st4.tcl -fileeval $cfPath(environment)/temperature/watlow_mst4_sct.tcl +fileeval $cfPath(environment)/temperature/sct_watlow_mst4.tcl fileeval $cfPath(hmm)/hmm_configuration.tcl fileeval $cfPath(nexus)/nxscripts.tcl fileeval $cfPath(hmm)/detector.tcl @@ -63,7 +63,7 @@ fileeval $cfPath(commands)/commands.tcl fileeval $cfPath(anticollider)/anticollider.tcl fileeval $cfPath(environment)/temperature/sct_julabo_lh45.tcl fileeval $cfPath(environment)/temperature/sct_qlink.tcl -fileeval $cfPath(environment)/magneticField/tsi_smc_sct.tcl +fileeval $cfPath(environment)/magneticField/sct_tsi_smc.tcl fileeval $cfPath(environment)/temperature/sct_oxford_itc.tcl fileeval $cfPath(environment)/magneticField/oxford_labview.tcl fileeval $cfPath(environment)/magneticField/sct_bruker_BEC1.tcl @@ -73,6 +73,7 @@ fileeval $cfPath(environment)/sct_antonparr_MCR500.tcl fileeval $cfPath(beamline)/spin_flipper.tcl fileeval $cfPath(commands)/pulser.tcl fileeval $cfPath(commands)/hvcommands.tcl +fileeval $cfPath(commands)/growfile.tcl source gumxml.tcl diff --git a/site_ansto/instrument/sans/sics_simulation.tcl b/site_ansto/instrument/sans/sics_simulation.tcl new file mode 100644 index 00000000..20a84063 --- /dev/null +++ b/site_ansto/instrument/sans/sics_simulation.tcl @@ -0,0 +1,23 @@ +# Simulation flags, possible values = true or false +# true: The simulated driver will be used. +# false: The real driver will be used. +# icsval column = settings when running on the Instrument Control Server (ie SICS_SIMULATION not defined) +# fakedev column = settings for test platforms (ie SICS_SIMULATION=fakedev) +foreach {simflag icsval fakedev} { + opal_simulation true true + detector_simulation false true + hmm_simulation false true + environment_simulation false false + counter_simulation false true + motor_simulation false false + chopper_simulation false true + velsel_simulation false true + plc_simulation false true + rfgen_simulation false true + goniometer_simulation false true + magnetic_simulation false true +} { + dict set SIMFLAG_VAL $simflag ICSVAL $icsval + dict set SIMFLAG_VAL $simflag FAKEDEV $fakedev + VarMake $simflag Text internal +} diff --git a/site_ansto/instrument/sans/util/dsc.py b/site_ansto/instrument/sans/util/dsc.py new file mode 100755 index 00000000..379900f2 --- /dev/null +++ b/site_ansto/instrument/sans/util/dsc.py @@ -0,0 +1,94 @@ +#!/usr/bin/env python +# vim: ft=python ts=8 sts=4 sw=4 expandtab autoindent smartindent +""" Find the trigger time for Differenctial Scanning Calorimetry data in nx.hdf files. """ + +import sys +import os +import h5py +import argparse +import time +from collections import defaultdict + +class SkipFile(BaseException): + """This exception should be raised to skip processing a file""" + pass + +PARSER = argparse.ArgumentParser( + description = """Report the time offset for the start of the DSC profile relative to the start time of the histogram data. + This program can process multiple hdf files by specifying the path to the first file and the number of files to process. + You can also speficy a list of 'file_path numfile' pairs.""", + usage='dsc file_path numfile {file_path numfile}' +) +PARSER.add_argument('files', nargs='+', help = 'List of "file_path numfile" pairs') +ARGS = PARSER.parse_args() + +FAILS = defaultdict(list) +for startfile, num in zip(ARGS.files[0::2], ARGS.files[1::2]): + numfiles = int(num) + hfdir = os.path.dirname(startfile) + hfbase = os.path.basename(startfile) + idx = hfbase.find('.') + startFID = hfbase[:idx] + ext = hfbase[idx:] + idnum = int(startFID[3:]) + inst_abname = hfbase[:3] + + hfval = {} + print + for i in range(numfiles): + try: + currid = idnum + i + fileID = inst_abname + '%07d' % currid + if (hfdir == ''): + nxfile = fileID + ext + else: + nxfile = hfdir + '/' + fileID + ext + + try: + hf = h5py.File(nxfile, 'r') + except: + FAILS['badfile'].append(nxfile) + continue + + if (hfbase.startswith('QKK')): + rootpath = fileID + '/' + else: + rootpath = 'entry1/' + + for dpath in ['time_stamp', 'instrument/detector/start_time', 'sample/dsc_val']: + dscpath = rootpath + dpath + if dscpath in hf: + hfval[dpath] = hf[dscpath][:] + else: + FAILS['badpath:{0}'.format(dpath)].append(nxfile) + hf.close() + raise SkipFile + + print fileID + datiter = {} + dat_hasnext = 0 + time_tuple = time.strptime(hf[rootpath + 'start_time'][0], '%Y-%m-%d %H:%M:%S') + hfval['time_stamp'] += time.mktime(time_tuple) + hfval['time_stamp'] -= hfval['instrument/detector/start_time'] + dsc0 = hfval['sample/dsc_val'][0] + no_transition = True + for i in range(1, len(hfval['sample/dsc_val'][1:])): + dsc1 = hfval['sample/dsc_val'][i] + if abs(dsc1 - dsc0) > 1.9: + no_transition = False + msg = 'dsc_val transition from {dsc0} to {dsc1} volts at {time} seconds from detector start time, array index = {index}' + print msg.format(dsc0=dsc0, dsc1=dsc1, time=hfval['time_stamp'][i], index=i) + dsc0 = dsc1 + + if no_transition: + print 'dsc_val no transition' + + print + hf.close() + except SkipFile: + continue + +for k in FAILS.keys(): + if (len(FAILS[k])): + print >> sys.stderr, 'Skipped following files. Reason = ', k + print >> sys.stderr, FAILS[k] diff --git a/site_ansto/instrument/sans/util/sics_config.ini b/site_ansto/instrument/sans/util/sics_config.ini index 7257c7a3..2f4734ef 100644 --- a/site_ansto/instrument/sans/util/sics_config.ini +++ b/site_ansto/instrument/sans/util/sics_config.ini @@ -4,6 +4,9 @@ enabled = False [12Tmagnet_setup] cascade = B1:12tmagnet_oxford,sample_stage:Oxford_12tmagnet_sample_insert,T1:mercury_scpi_01 enabled = False +[20_position_pulser] +cascade = T1:julabo_lh45,Function_Generator:agilent_33220A,High_Voltage:protek_02,sample_stage:20_pos_sample_stage +enabled = False [20_position_setup] cascade = T1:julabo_lh45,sample_stage:20_pos_sample_stage enabled = False @@ -70,6 +73,13 @@ id = 2 implementation = none name = curr2 optype = multimeter +[Power Supply] +datype = V +enabled = False +id = 1 +implementation = none +name = isops +optype = power_supply [Rheometry] enabled = False implementation = none @@ -155,11 +165,19 @@ optype = motion_axis desc = "Load the ten position sample changer configuration" imptype = motion_axis +[11tmagnet_oxford] +desc = "11/10 Tesla Oxford Magnet" +driver = "oxford_labview" +imptype = magnetic_field +interval = 5 +ip = 10.157.205.44 +port = 55001 + [12tmagnet_oxford] -asyncqueue = sct desc = "12 Tesla Oxford Magnet" driver = "oxford_labview" imptype = magnetic_field +interval = 5 ip = 10.157.205.3 port = 55001 @@ -217,6 +235,13 @@ ip = 10.157.205.13 port = 4444 type = B +[isotech_ps] +desc = "Isotech Power Supply:Baud=2400,Data=8,Stop=1,Parity=None,Flow=None" +driver = "isotech_ps" +imptype = power_supply +ip = 137.157.202.79 +port = 4001 + [julabo_lh45] ctrl_sensor = "bath" desc = "Julabo temperature controller" @@ -315,6 +340,16 @@ terminator = \r\n tol1 = 1.0 tol2 = 1.0 +[ls340_09] +desc = "Lakeshore 340 temperature controller" +driver = "ls340" +imptype = temperature +ip = 137.157.202.79 +port = 4002 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + [ls340_11] desc = "Lakeshore 340 temperature controller" driver = "ls340" diff --git a/site_ansto/instrument/server_config.tcl b/site_ansto/instrument/server_config.tcl index f01d4d6a..d4a3230d 100644 --- a/site_ansto/instrument/server_config.tcl +++ b/site_ansto/instrument/server_config.tcl @@ -15,23 +15,27 @@ set quieckport 60004 # false: The real driver will be used. # icsval column = settings when running on the Instrument Control Server (ie SICS_SIMULATION not defined) # fakedev column = settings for test platforms (ie SICS_SIMULATION=fakedev) -foreach {simflag icsval fakedev} { - opal_simulation false true - detector_simulation false true - hmm_simulation false true - environment_simulation false false - counter_simulation false true - motor_simulation false false - chopper_simulation false true - velsel_simulation false true - plc_simulation false true - rfgen_simulation false true - goniometer_simulation false true - magnetic_simulation false true -} { - dict set SIMFLAG_VAL $simflag ICSVAL $icsval - dict set SIMFLAG_VAL $simflag FAKEDEV $fakedev - VarMake $simflag Text internal +if [file exists ./sics_simulation.tcl] { + source ./sics_simulation.tcl +} else { + foreach {simflag icsval fakedev} { + opal_simulation false true + detector_simulation false true + hmm_simulation false true + environment_simulation false false + counter_simulation false true + motor_simulation false false + chopper_simulation false true + velsel_simulation false true + plc_simulation false true + rfgen_simulation false true + goniometer_simulation false true + magnetic_simulation false true + } { + dict set SIMFLAG_VAL $simflag ICSVAL $icsval + dict set SIMFLAG_VAL $simflag FAKEDEV $fakedev + VarMake $simflag Text internal + } } VarMake sics_simulation Text internal @@ -120,7 +124,9 @@ if {[info exists env(SICS_SIMULATION)] != 1} { } fileeval util/config_reader.tcl -if [file exists ../sics_config.ini] { +if [file exists ./sics_config.ini] { + set config_dict [config_reader::parse_file ./sics_config.ini] +} elseif [file exists ../sics_config.ini] { set config_dict [config_reader::parse_file ../sics_config.ini] } @@ -198,6 +204,9 @@ SicsDataPath lock ::utility::mkVar Email Text user email true user true true ::utility::mkVar Phone Text user phone true user true true ::utility::mkVar starttime Text user start true experiment true true +::utility::mkVar gumtree_version Text user gumtree_version true experiment true true +::utility::mkVar gumtree_status Text user gumtree_status true experiment true false +::utility::mkVar gumtree_time_estimate float user gumtree_time_estimate true experiment true false exe batchpath ../batch exe syspath ../batch @@ -245,25 +254,20 @@ proc waitaction {obj action args} { publish waitaction user proc server_set_sobj_attributes {} { - if [ catch { - motor_set_sobj_attributes - ::utility::set_motor_attributes -#XXX::utility::set_histomem_attributes - ::utility::set_sobj_attributes - ::utility::set_envcontrol_attributes - ::plc::set_sobj_attributes - ::counter::set_sobj_attributes - ::nexus::set_sobj_attributes - ::histogram_memory::set_sobj_attributes - ::utility::set_chopper_attributes - ::utility::set_sct_object_attributes -## TODO move the following to the new ansto gumxml.tcl - sicslist setatt getgumtreexml privilege internal - clientput "serverport $::serverport" - } message ] { - if {$::errorCode=="NONE"} {return $message} - return -code error $message - } + if [ catch { motor_set_sobj_attributes } msg ] { puts $msg } + if [ catch { ::utility::set_motor_attributes } msg ] { puts $msg } + #XXX::utility::set_histomem_attributes + if [ catch { ::utility::set_sobj_attributes } msg ] { puts $msg } + if [ catch { ::utility::set_envcontrol_attributes } msg ] { puts $msg } + if [ catch { ::plc::set_sobj_attributes } msg ] { puts $msg } + if [ catch { ::counter::set_sobj_attributes } msg ] { puts $msg } + if [ catch { ::nexus::set_sobj_attributes } msg ] { puts $msg } + if [ catch { ::histogram_memory::set_sobj_attributes } msg ] { puts $msg } + if [ catch { ::utility::set_chopper_attributes } msg ] { puts $msg } + if [ catch { ::utility::set_sct_object_attributes } msg ] { puts $msg } + ## TODO move the following to the new ansto gumxml.tcl + if [ catch { sicslist setatt getgumtreexml privilege internal } msg ] { puts $msg } + clientput "serverport $::serverport" } proc server_init {} { diff --git a/site_ansto/instrument/tas/MANIFEST.TXT b/site_ansto/instrument/tas/MANIFEST.TXT index d223330f..7c1d3315 100644 --- a/site_ansto/instrument/tas/MANIFEST.TXT +++ b/site_ansto/instrument/tas/MANIFEST.TXT @@ -6,3 +6,4 @@ config util hostport_config.tcl hostport_config_test.tcl +sics_simulation.tcl diff --git a/site_ansto/instrument/tas/config/motors/motor_configuration.tcl b/site_ansto/instrument/tas/config/motors/motor_configuration.tcl index 1268994e..6e89389b 100644 --- a/site_ansto/instrument/tas/config/motors/motor_configuration.tcl +++ b/site_ansto/instrument/tas/config/motors/motor_configuration.tcl @@ -4,9 +4,6 @@ # FastShutter is currently set on Quokka only #::utility::mkVar FastShutter text manager FastShutter false instrument true false -# SET TO 1 TO USE THE TILT STAGE ie sample phi and chi -set use_tiltstage 0 - set animal taipan set sim_mode [SplitReply [motor_simulation]] @@ -93,6 +90,42 @@ set move_count 100 ############################ # +# CHOOSE HERE for sample stage configuration +########################################## +# Set axis_config as follows to use different axis configurations +# 0: normal stage configuration +# 1: Oxford magnet sample stick +set axis_config 0 + +if { [ info exists ::config_dict ] } { + if { [ dict exists $::config_dict sample_stage implementation ] } { + set implementation [ dict get $::config_dict sample_stage implementation ] + if {$implementation == "normal_sample_stage"} { + set axis_config 0 + } elseif {$implementation == "12tmagnet_sample_insert"} { + set axis_config 1 + } else { + set axis_config 0 + } + } +} + +switch $axis_config { + 0 { + set use_normal_config "true" + set tilt_motor_driver_type $motor_driver_type + } + 1 { + set magmot s1 + set magmot_aq "mc2" + set magmot_axis "A" + set use_normal_config "false" + set tilt_motor_driver_type asim + fileeval $cfPath(motors)/magnet_configuration.tcl + } +} + + # Dummy translation motor, useful for testing scans Motor dummy_motor asim [params \ @@ -138,36 +171,6 @@ dummy_s1 softupperlim 180 dummy_s1 precision 0.02 dummy_s1 home 0 -if { [ info exists ::config_dict ] && [ dict get $::config_dict s1_sample_insert enabled ] } { - set samp_stage_name "s1ss" - set tilt_motor_driver_type asim - - Motor s1 $motor_driver_type [params \ - asyncqueue mc2\ - host mc2-taipan\ - port pmc2-taipan\ - axis A\ - units degrees\ - hardlowerlim -1440\ - hardupperlim 1440\ - maxSpeed 1\ - maxAccel 1\ - maxDecel 1\ - stepsPerX [expr 67.0 * 25000 / 360]\ - absEnc 1\ - absEncHome 31275743\ - cntsPerX [expr 67.0 * 8192 / 360]] - s1 part sample - s1 long_name s1 - s1 softlowerlim -180 - s1 softupperlim 180 - s1 home 0 -} else { - set samp_stage_name "s1" - set tilt_motor_driver_type $motor_driver_type -} - -#if $use_tiltstage { # mc1: Monochromator crystal selection rotation/Tilt Motor mtilt $motor_driver_type [params \ asyncqueue mc1\ @@ -182,16 +185,14 @@ Motor mtilt $motor_driver_type [params \ maxDecel 1\ stepsPerX 25000\ absEnc 1\ - absEncHome 79650\ + absEncHome 27115\ cntsPerX 4096] mtilt part crystal mtilt long_name mtilt mtilt softlowerlim -5 mtilt softupperlim 5 mtilt home 0 -#} -set atest mtilt # mc1: Monochromator Linear (Translate) Motor mtrans $motor_driver_type [params \ @@ -207,7 +208,7 @@ Motor mtrans $motor_driver_type [params \ maxDecel 1\ stepsPerX 25000\ absEnc 1\ - absEncHome 469388\ + absEncHome 859242\ cntsPerX 4096] mtrans part crystal mtrans long_name mtrans @@ -229,7 +230,7 @@ Motor m2 $motor_driver_type [params \ port pmc1-taipan\ axis F\ units degrees\ - precision 0.01\ + precision 0.001\ hardlowerlim 17\ hardupperlim 80\ maxSpeed 0.414\ @@ -246,9 +247,9 @@ m2 softupperlim 80 m2 home 20 m2 motOnDelay 0 m2 motOffDelay 0 -m2 backlash_offset -0.1 +m2 backlash_offset -0.5 m2 creep_offset 0.1 -m2 creep_precision 0.005 +m2 creep_precision 0.0 m2 speed 0.4 m2 accel 0.04 m2 decel 0.04 @@ -384,27 +385,29 @@ stl home 0.0 stl backlash_offset -0.2 # mc2: Sample Rotate -Motor $samp_stage_name $motor_driver_type [params \ - asyncqueue mc2\ - host mc2-taipan\ - port pmc2-taipan\ - axis E\ - units degrees\ - hardlowerlim -194\ - hardupperlim 134\ - maxSpeed 4\ - maxAccel 2\ - maxDecel 2\ - stepsPerX 12495\ - absEnc 1\ - absEncHome 10695068\ - cntsPerX 4096] -$samp_stage_name part sample -$samp_stage_name long_name $samp_stage_name -$samp_stage_name softlowerlim -170 -$samp_stage_name softupperlim 120 -$samp_stage_name home 35.997 -$samp_stage_name backlash_offset -0.2 +if {$use_normal_config == "true"} { + Motor s1 $motor_driver_type [params \ + asyncqueue mc2\ + host mc2-taipan\ + port pmc2-taipan\ + axis E\ + units degrees\ + hardlowerlim -194\ + hardupperlim 134\ + maxSpeed 4\ + maxAccel 2\ + maxDecel 2\ + stepsPerX 12495\ + absEnc 1\ + absEncHome 10695068\ + cntsPerX 4096] + s1 part sample + s1 long_name s1 + s1 softlowerlim -170 + s1 softupperlim 120 + s1 home 35.997 + s1 backlash_offset -0.2 +} # mc2: Analyser Detector Rotate -- Sample Scattering Angle # absEncHome 20728908\ at -50 diff --git a/site_ansto/instrument/tas/sics_simulation.tcl b/site_ansto/instrument/tas/sics_simulation.tcl new file mode 100644 index 00000000..6fb592b5 --- /dev/null +++ b/site_ansto/instrument/tas/sics_simulation.tcl @@ -0,0 +1,23 @@ +# Simulation flags, possible values = true or false +# true: The simulated driver will be used. +# false: The real driver will be used. +# icsval column = settings when running on the Instrument Control Server (ie SICS_SIMULATION not defined) +# fakedev column = settings for test platforms (ie SICS_SIMULATION=fakedev) +foreach {simflag icsval fakedev} { + opal_simulation true true + detector_simulation false true + hmm_simulation false true + environment_simulation false true + counter_simulation false false + motor_simulation false false + chopper_simulation false false + velsel_simulation false false + plc_simulation true true + rfgen_simulation false false + goniometer_simulation false true + magnetic_simulation false true +} { + dict set SIMFLAG_VAL $simflag ICSVAL $icsval + dict set SIMFLAG_VAL $simflag FAKEDEV $fakedev + VarMake $simflag Text internal +} diff --git a/site_ansto/instrument/tas/taipan_configuration.tcl b/site_ansto/instrument/tas/taipan_configuration.tcl index 18809bd1..a1ec54a1 100644 --- a/site_ansto/instrument/tas/taipan_configuration.tcl +++ b/site_ansto/instrument/tas/taipan_configuration.tcl @@ -61,9 +61,21 @@ source gumxml.tcl # init for the tasUB #make mcv mch acv ach into mvfocus mhfocus avfocus ahfocus when it works puts "doing tasub" -MakeTasUB tasub m1 m2 mcv mch s1 s2 sgu sgl a1 a2 acv ach +MakeTasUB tasub m1 m2 mvfocus mhfocus s1 s2 sgu sgl a1 a2 avfocus ahfocus tasub mono dd 3.35416 tasub ana dd 3.35416 +tasub mono vb1 102.2 +tasub mono vb2 1.78 +tasub mono hb1 184.42 +tasub mono hb2 -60.1 +tasub mono hb3 0.951 +tasub ana vb1 115 +tasub ana vb2 2.13 +tasub ana hb1 45.68 +tasub ana hb2 105.7 +tasub ana hb3 0.945 +tasub focusfn energy +tasub autofocus 0 tasub updatetargets puts "done tasub" diff --git a/site_ansto/instrument/tas/util/sics_config.ini b/site_ansto/instrument/tas/util/sics_config.ini index a6d20e29..2051ff37 100644 --- a/site_ansto/instrument/tas/util/sics_config.ini +++ b/site_ansto/instrument/tas/util/sics_config.ini @@ -1,156 +1,304 @@ -[12tmagnet] -desc = "12 Tesla Oxford Magnet" -driver = "12tmagnet" -enabled = False -group = environment:magnet -id = 11 -ip = 10.157.205.3 -name = magnetic -port = 55001 -type = B - [12tmagnet_setup] -cascade = 12tmagnet,s1_sample_insert,mercury_scpi +cascade = B1:12tmagnet_oxford,sample_stage:12tmagnet_sample_insert,T1:mercury_scpi_01 enabled = False -group = 0setup - -[ls336_1] -desc = "tc1: Lakeshore 336 temperature controller" -driver = "ls336" +[CF1] +cascade = T1:CF1_ls340,sample_stage:normal_sample_stage +enabled = False +[Default] +cascade = sample_stage:normal_sample_stage +enabled = True +[B1] +datype = B enabled = False -group = environment:temperature id = 1 -ip = 10.157.205.28 -name = tc1 -port = 7777 -terminator = \r\n -tol1 = 1.0 -tol2 = 1.0 -type = T - -[ls336_12] -desc = "tc6: Lakeshore 336 temperature controller" -driver = "ls336" +implementation = none +name = magnet1 +optype = magnetic_field +[Function_Generator] +datype = V enabled = False -group = environment:temperature -id = 6 -ip = 10.157.205.31 -name = tc6 -port = 7777 -terminator = \r\n -tol1 = 1.0 -tol2 = 1.0 -type = T - -[ls336_2] -desc = "tc2: Lakeshore 336 temperature controller" -driver = "ls336" +id = 1 +implementation = none +name = pulser +optype = function_generator +[I1] +datype = I +enabled = False +id = 1 +implementation = none +name = curr1 +optype = multimeter +[I2] +datype = I enabled = False -group = environment:temperature id = 2 -ip = 10.157.205.29 +implementation = none +name = curr2 +optype = multimeter +[T1] +datype = T +enabled = False +id = 1 +implementation = none +name = tc1 +optype = temperature +[T2] +datype = T +enabled = False +id = 2 +implementation = none name = tc2 -port = 7777 -terminator = \r\n -tol1 = 1.0 -tol2 = 1.0 -type = T - -[ls336_4] -desc = "tc3: Lakeshore 336 temperature controller" -driver = "ls336" +optype = temperature +[T3] +datype = T enabled = False -group = environment:temperature id = 3 -ip = 10.157.205.30 +implementation = none name = tc3 -port = 7777 -terminator = \r\n -tol1 = 1.0 -tol2 = 1.0 -type = T - -[ls336_5] -desc = "tc4: Lakeshore 336 temperature controller" -driver = "ls336" +optype = temperature +[T4] +datype = T enabled = False -group = environment:temperature id = 4 -ip = 137.157.201.21 +implementation = none name = tc4 -port = 7777 -terminator = \r\n -tol1 = 1.0 -tol2 = 1.0 -type = T - -[ls336_6] -desc = "tc5: Lakeshore 336 temperature controller" -driver = "ls336" +optype = temperature +[V1] +datype = V enabled = False -group = environment:temperature -id = 5 -ip = 137.157.201.21 -name = tc5 -port = 7777 -terminator = \r\n -tol1 = 1.0 -tol2 = 1.0 -type = T +id = 1 +implementation = none +name = volts1 +optype = multimeter +[V2] +datype = V +enabled = False +id = 2 +implementation = none +name = volts2 +optype = multimeter +[sample_stage] +enabled = Always +implementation = normal_sample_stage +name = sample_stage +optype = motion_axis +[12tmagnet_oxford] +asyncqueue = sct +desc = "12 Tesla Oxford Magnet" +driver = "oxford12tlv" +imptype = magnetic_field +interval = 5 +ip = 10.157.205.3 +port = 55001 -[ls340_1] -desc = "tc13: Lakeshore 340 temperature controller" +[12tmagnet_sample_insert] +desc = "s1 will be redefined as the magnet sample insert rotation." +imptype = motion_axis + +[CF1_ls340] +desc = "cf1: Bottom loading cryofurnace" driver = "ls340" -enabled = False -group = environment:temperature -id = 13 -ip = 137.157.203.137 -name = tc13 +imptype = temperature +ip = 10.157.205.43 port = 4001 terminator = \r\n tol1 = 1.0 tol2 = 1.0 -type = T -[ls370] -desc = "tc8: Lakeshore 370 temperature controller" -driver = "ls370" -enabled = False -group = environment:temperature -id = 8 -ip = 137.157.203.137 -name = tc8 -port = 4003 +[agilent_33220A] +asyncqueue = sct +desc = "Function Generator" +driver = agilent_33220A +imptype = function_generator +ip = 10.157.205.16 +name = pulser +port = 5025 + +[ls336_01] +asyncqueue = sct +desc = "Lakeshore 336 temperature controller" +driver = "ls336" +imptype = temperature +ip = 10.157.205.28 +port = 7777 terminator = \r\n -tol = 2.0 -type = T +tol1 = 1.0 +tol2 = 1.0 -[mercury_scpi] -desc = "tc9: Oxford Mercury temperature controller in Mercury mode" -driver = "mercury_scpi" -enabled = False -group = environment:temperature -id = 9 +[ls336_02] +asyncqueue = sct +desc = "Lakeshore 336 temperature controller" +driver = "ls336" +imptype = temperature +ip = 10.157.205.29 +port = 7777 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[ls336_04] +asyncqueue = sct +desc = "Lakeshore 336 temperature controller" +driver = "ls336" +imptype = temperature +ip = 10.157.205.30 +port = 7777 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[ls336_05] +asyncqueue = sct +desc = "Lakeshore 336 temperature controller" +driver = "ls336" +imptype = temperature +ip = 137.157.201.21 +port = 7777 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[ls336_06] +asyncqueue = sct +desc = "Lakeshore 336 temperature controller" +driver = "ls336" +imptype = temperature +ip = 10.157.205.30 +port = 7777 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[ls336_11] +desc = "Lakeshore 336 temperature controller" +driver = "ls336" +imptype = temperature +ip = 10.157.205.27 +port = 7777 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[ls336_12] +asyncqueue = sct +desc = "Lakeshore 336 temperature controller" +driver = "ls336" +imptype = temperature +ip = 10.157.205.31 +port = 7777 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[ls340_01] +asyncqueue = sct +desc = "Lakeshore 340 temperature controller" +driver = "ls340" +imptype = temperature +ip = 137.157.201.86 +port = 4001 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[ls340_02] +asyncqueue = sct +desc = "Lakeshore 340 temperature controller" +driver = "ls340" +imptype = temperature +ip = 137.157.201.86 +port = 4002 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[ls340_11] +desc = "Lakeshore 340 temperature controller" +driver = "ls340" +imptype = temperature +ip = 137.157.201.86 +port = 4001 +terminator = \r\n +tol1 = 1.0 +tol2 = 1.0 + +[mercury_scpi_01] +desc = "Oxford Mercury temperature controller with three temperature loops." +driver = "mercury_base" +imptype = temperature ip = 10.157.205.5 -name = tc9 -offifon = mercury_itc500 +permlink = LT port = 7020 -terminator = \r -tol = 2.0 -type = T +terminator = \r\n +tol = 1.0 +valve_tol = 2 -[s1_sample_insert] -desc = "s1 will be defined as the sample insert rotation. Sample stage will be renamed to s1ss and sgu and sgl will be simulated" -enabled = False -group = motors +[mercury_scpi_02] +desc = "Oxford Mercury temperature controller with four temperature loops and needle valve control" +driver = "mercury_scpi" +imptype = temperature +ip = 10.157.205.47 +permlink = LT +port = 7020 +terminator = \r\n +tol = 1.0 +valve_tol = 2 -[west4100] -desc = "tc10: Blue furnace temperature controller" +[normal_sample_stage] +desc = "This is the default sample stage configuration" +imptype = motion_axis + +[protek_01] +asyncqueue = sct +desc = "Protek Multimeter" +driver = "protekmm" +imptype = multimeter +ip = 10.157.205.36 +port = 4001 + +[protek_02] +asyncqueue = sct +desc = "Protek Multimeter" +driver = "protekmm" +imptype = multimeter +ip = 10.157.205.37 +port = 4001 + +[vf1_west4100] +asyncqueue = sct +desc = "VF1 Blue furnace temperature controller" +dev_id = 1 driver = "west4100" -enabled = False -group = environment:temperature -id = 10 -ip = 10.157.205.19 -name = tc10 -type = T +imptype = temperature +ip = 10.157.205.24 +port = 502 + +[vf1_west6100] +asyncprotocol = modbus_ap +desc = "VF1 Blue furnace 6100 temperature controller" +dev_id = 1 +driver = "west_6100" +imptype = temperature +ip = 10.157.205.24 +port = 502 +timeout = 2000 + +[vf2_west4100] +asyncqueue = sct +desc = "VF2 Blue furnace temperature controller" +dev_id = 1 +driver = "west4100" +imptype = temperature +ip = 10.157.205.25 +port = 502 + +[vf2_west6100] +asyncprotocol = modbus_ap +desc = "VF2 Blue furnace 6100 temperature controller" +dev_id = 1 +driver = "west_6100" +imptype = temperature +ip = 10.157.205.25 +port = 502 +timeout = 2000 diff --git a/site_ansto/instrument/util/gen_sct.py b/site_ansto/instrument/util/gen_sct.py index 7a454ae4..3381f3dd 100755 --- a/site_ansto/instrument/util/gen_sct.py +++ b/site_ansto/instrument/util/gen_sct.py @@ -1364,14 +1364,16 @@ def put_group(MyDriver, MyGroup): txt += [' hsetprop ${scobj_hpath} %s "%s"' % (key, MyGroup['GroupProperty'][key])] if readable_or_writeable: txt += [''] - txt += [' if {[string equal -nocase [SplitReply [%s]] "false"]} {' % MyDriver['simulation_group']] + txt += [' if {[string equal -nocase "${simulation_flag}" "false"]} {'] for var in sorted(MyGroup['Vars']): MyVar = MyGroup['Vars'][var] nodename = groupname + MyVar['name'] if MyVar['readable'] > 0: poll_period = MyVar['readable'] - if poll_period < 1 or poll_period > 300: - poll_period = 5 + if poll_period < 1: + poll_period = 1 + if poll_period > 3600: + poll_period = 3600 txt += [' ${sct_controller} poll ${scobj_hpath}/%s %s' % (nodename, poll_period)] for var in sorted(MyGroup['Vars']): MyVar = MyGroup['Vars'][var] @@ -1383,7 +1385,7 @@ def put_group(MyDriver, MyGroup): driveable = '${name}_' + make_path(MyVar) MyDriver['Deferred'] += ['ansto_makesctdrive %s ${scobj_hpath}/%s ${scobj_hpath}/%s ${sct_controller}' % (driveable, nodename, MyVar['driveable'])] txt += [' } else {'] - txt += [' %s::sics_log 9 "[%s] => No poll/write for %s"' % (MyDriver['namespace'], MyDriver['simulation_group'], MyDriver['name'])] + txt += [' %s::sics_log 9 "simulation_flag=${simulation_flag} => No poll/write for %s"' % (MyDriver['namespace'], MyDriver['name'])] txt += [' }'] for grp in sorted(MyGroup['Groups']): txt += put_group(MyDriver, MyGroup['Groups'][grp]) @@ -1392,15 +1394,15 @@ def put_group(MyDriver, MyGroup): def put_mkDriver(MyDriver): txt = [''] if 'make_args' in MyDriver: - line = 'proc %s::mkDriver { sct_controller name ip_address tcp_port %s } {' % (MyDriver['namespace'], MyDriver['make_args']) + line = 'proc %s::mkDriver { sct_controller name device_class simulation_flag ip_address tcp_port %s } {' % (MyDriver['namespace'], MyDriver['make_args']) else: - line = 'proc %s::mkDriver { sct_controller name ip_address tcp_port } {' % (MyDriver['namespace']) + line = 'proc %s::mkDriver { sct_controller name device_class simulation_flag ip_address tcp_port } {' % (MyDriver['namespace']) txt += [line] if 'make_args' in MyDriver: make_args = ' '.join(["${%s}"%arg for arg in MyDriver['make_args'].split()]) - txt += [' %s::sics_log 9 "%s::mkDriver ${sct_controller} ${name} ${ip_address} ${tcp_port} %s"' % (MyDriver['namespace'], MyDriver['namespace'], make_args)] + txt += [' %s::sics_log 9 "%s::mkDriver ${sct_controller} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} %s"' % (MyDriver['namespace'], MyDriver['namespace'], make_args)] else: - txt += [' %s::sics_log 9 "%s::mkDriver ${sct_controller} ${name} ${ip_address} ${tcp_port}"' % (MyDriver['namespace'], MyDriver['namespace'])] + txt += [' %s::sics_log 9 "%s::mkDriver ${sct_controller} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}"' % (MyDriver['namespace'], MyDriver['namespace'])] txt += [' set ns "[namespace current]"'] txt += [' set catch_status [ catch {'] txt += [''] @@ -1423,7 +1425,7 @@ def put_mkDriver(MyDriver): ms_line = ' MakeSICSObj ${name} SCT_OBJECT' txt += [ms_line] txt += [''] - txt += [' sicslist setatt ${name} klass %s' % MyDriver['class']] + txt += [' sicslist setatt ${name} klass ${device_class}'] txt += [' sicslist setatt ${name} long_name ${name}'] if 'DriverProperty' in MyDriver: for key in MyDriver['DriverProperty']: @@ -1434,11 +1436,11 @@ def put_mkDriver(MyDriver): for group in sorted(MyDriver['Groups']): txt += put_group(MyDriver, MyDriver['Groups'][group]) - txt += [' hsetprop ${scobj_hpath} klass %s' % MyDriver['class']] + txt += [' hsetprop ${scobj_hpath} klass ${device_class}'] txt += [' hsetprop ${scobj_hpath} data true'] txt += [' hsetprop ${scobj_hpath} debug_threshold %s' % str(MyDriver['debug_threshold'])] if len(MyDriver['Deferred']) > 0: - txt += [' if {[string equal -nocase [SplitReply [%s]] "false"]} {' % MyDriver['simulation_group']] + txt += [' if {[string equal -nocase "${simulation_flag}" "false"]} {'] for line in MyDriver['Deferred']: txt += [' ' + line] txt += [' }'] @@ -1456,28 +1458,21 @@ def put_mkDriver(MyDriver): def put_postamble(MyDriver): txt = [''] - txt += ['namespace eval %s {' % MyDriver['namespace']] - txt += [' namespace export debug_threshold'] - txt += [' namespace export debug_log'] - txt += [' namespace export sics_log'] - txt += [' namespace export mkDriver'] - txt += ['}'] - txt += [''] if 'add_args' in MyDriver: - line = 'proc add_%s {name ip_address tcp_port %s} {' % (MyDriver['name'], MyDriver['add_args']) + line = 'proc %s::add_driver {name device_class simulation_flag ip_address tcp_port %s} {' % (MyDriver['namespace'], MyDriver['add_args']) else: - line = 'proc add_%s {name ip_address tcp_port} {' % MyDriver['name'] + line = 'proc %s::add_driver {name device_class simulation_flag ip_address tcp_port} {' % (MyDriver['namespace']) txt += [line] txt += [' set catch_status [ catch {'] if 'make_args' in MyDriver: make_args = ' '.join(["${%s}"%arg for arg in MyDriver['make_args'].split()]) - txt += [' %s::sics_log 9 "add_%s ${name} ${ip_address} ${tcp_port} %s"' % (MyDriver['namespace'], MyDriver['name'], make_args)] + txt += [' %s::sics_log 9 "%s::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} %s"' % (MyDriver['namespace'], MyDriver['namespace'], make_args)] else: - txt += [' %s::sics_log 9 "add_%s ${name} ${ip_address} ${tcp_port}"' % (MyDriver['namespace'], MyDriver['name'])] + txt += [' %s::sics_log 9 "%s::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}"' % (MyDriver['namespace'], MyDriver['namespace'])] if ('WrapperProperty' in MyDriver) and ('nosctcontroller' in MyDriver['WrapperProperty']): txt += [' %s::sics_log 9 "No sctcontroller for %s"' % (MyDriver['namespace'], MyDriver['name'])] else: - txt += [' if {[string equal -nocase [SplitReply [%s]] "false"]} {' % MyDriver['simulation_group']] + txt += [' if {[string equal -nocase "${simulation_flag}" "false"]} {'] txt += [' if {[string equal -nocase "aqadapter" "${ip_address}"]} {'] txt += [' %s::sics_log 9 "makesctcontroller sct_${name} aqadapter ${tcp_port}"' % MyDriver['namespace']] txt += [' makesctcontroller sct_${name} aqadapter ${tcp_port}'] @@ -1491,17 +1486,17 @@ def put_postamble(MyDriver): txt += [' makesctcontroller sct_${name} %s ${ip_address}:${tcp_port}' % MyDriver['protocol']] txt += [' }'] txt += [' } else {'] - txt += [' %s::sics_log 9 "[%s] => Null sctcontroller for %s"' % (MyDriver['namespace'], MyDriver['simulation_group'], MyDriver['name'])] + txt += [' %s::sics_log 9 "simulation_flag=${simulation_flag} => Null sctcontroller for %s"' % (MyDriver['namespace'], MyDriver['name'])] txt += [' %s::sics_log 9 "makesctcontroller sct_${name} aqadapter NULL"' % MyDriver['namespace']] txt += [' makesctcontroller sct_${name} aqadapter NULL'] txt += [' }'] if 'make_args' in MyDriver: make_args = ' '.join(["${%s}"%arg for arg in MyDriver['make_args'].split()]) - txt += [' %s::sics_log 1 "%s::mkDriver sct_${name} ${name} ${ip_address} ${tcp_port} %s"' % (MyDriver['namespace'], MyDriver['namespace'], make_args)] - txt += [' %s::mkDriver sct_${name} ${name} ${ip_address} ${tcp_port} %s' % (MyDriver['namespace'], make_args)] + txt += [' %s::sics_log 1 "%s::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} %s"' % (MyDriver['namespace'], MyDriver['namespace'], make_args)] + txt += [' %s::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} %s' % (MyDriver['namespace'], make_args)] else: - txt += [' %s::sics_log 1 "%s::mkDriver sct_${name} ${name} ${ip_address} ${tcp_port}"' % (MyDriver['namespace'], MyDriver['namespace'])] - txt += [' %s::mkDriver sct_${name} ${name} ${ip_address} ${tcp_port}' % (MyDriver['namespace'])] + txt += [' %s::sics_log 1 "%s::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}"' % (MyDriver['namespace'], MyDriver['namespace'])] + txt += [' %s::mkDriver sct_${name} ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}' % (MyDriver['namespace'])] # TODO #txt += [' %s::sics_log "makesctemon ${name} /sics/${name}/emon/monmode /sics/${name}/emon/isintol /sics/${name}/emon/errhandler"' % (MyDriver['namespace'])] # txt += [' makesctemon ${name} /sics/${name}/emon/monmode /sics/${name}/emon/isintol /sics/${name}/emon/errhandler'] @@ -1509,8 +1504,29 @@ def put_postamble(MyDriver): txt += [' handle_exception ${catch_status} ${catch_message}'] txt += ['}'] txt += [''] - txt += ['clientput "file evaluation of %s"' % MyDriver['filename']] - txt += ['%s::sics_log 9 "file evaluation of %s"' % (MyDriver['namespace'], MyDriver['filename'])] + txt += ['namespace eval %s {' % MyDriver['namespace']] + txt += [' namespace export debug_threshold'] + txt += [' namespace export debug_log'] + txt += [' namespace export sics_log'] + txt += [' namespace export mkDriver'] + txt += [' namespace export add_driver'] + txt += ['}'] + txt += [''] + if 'add_args' in MyDriver: + line = 'proc add_%s {name ip_address tcp_port %s} {' % (MyDriver['name'], MyDriver['add_args']) + else: + line = 'proc add_%s {name ip_address tcp_port} {' % MyDriver['name'] + txt += [line] + txt += [' set simulation_flag "[string tolower [SplitReply [%s]]]"' % MyDriver['simulation_group']] + line = ' %s::add_driver ${name} "%s" "${simulation_flag}" ${ip_address} ${tcp_port}' % (MyDriver['namespace'], MyDriver['class']) + if 'add_args' in MyDriver: + for arg in MyDriver['add_args'].split(): + line += ' "${%s}"' % arg + txt += [line] + txt += ['}'] + txt += [''] + txt += ['clientput "file evaluation of sct_%s.tcl"' % MyDriver['name']] + txt += ['%s::sics_log 9 "file evaluation of sct_%s.tcl"' % (MyDriver['namespace'], MyDriver['name'])] emit(txt) def put_read_config(MyDriver): @@ -1520,6 +1536,8 @@ def put_read_config(MyDriver): txt += [' set ns "%s"' % MyDriver['namespace']] txt += [' dict for {k u} $::config_dict {'] txt += [' if { [dict exists $u "implementation"] } {'] + txt += [' set simulation_flag "[string tolower [SplitReply [%s]]]"' % MyDriver['simulation_group']] + txt += [' set device_class "%s"' % MyDriver['class']] txt += [' if { !([dict exists $u "name"] && [dict exists $u "enabled"]) } {'] txt += [' continue'] txt += [' }'] @@ -1527,6 +1545,12 @@ def put_read_config(MyDriver): txt += [' if { ! ([string equal -nocase $enabled "true" ] || [string equal -nocase $enabled "always"]) } {'] txt += [' continue'] txt += [' }'] + txt += [' if { [dict exists $u "simulation_group"] } {'] + txt += [' set simulation_flag [SplitReply [[string tolower [dict get $u "simulation_group"]]]]'] + txt += [' }'] + txt += [' if { [dict exists $u "device_class"] } {'] + txt += [' set device_class "[dict get $u "device_class"]"'] + txt += [' }'] txt += [' set name [dict get $u name]'] txt += [' set implementation [dict get $u "implementation"]'] txt += [' if { !([dict exists $::config_dict $implementation]) } {'] @@ -1537,9 +1561,9 @@ def put_read_config(MyDriver): txt += [' continue'] txt += [' }'] txt += [' if { [string equal -nocase [dict get $v "driver"] "%s"] } {' % MyDriver['name']] - txt += [' if { ![string equal -nocase [SplitReply [%s]] "false"] } {' % MyDriver['simulation_group']] + txt += [' if { ![string equal -nocase "${simulation_flag}" "false"] } {'] txt += [' set asyncqueue "null"'] - txt += [' ${ns}::sics_log 9 "[%s] => using null asyncqueue"' % MyDriver['simulation_group']] + txt += [' ${ns}::sics_log 9 "simulation_flag=${simulation_flag} => using null asyncqueue"'] txt += [' } elseif { [dict exists $v "asyncqueue"] } {'] txt += [' set asyncqueue [dict get $v "asyncqueue"]'] txt += [' if { [string equal -nocase ${asyncqueue} "sct"] } {'] @@ -1582,15 +1606,15 @@ def put_read_config(MyDriver): txt += [' error "$name is missing configuration values $missing_list"'] txt += [' }'] txt += [' if { [string equal -nocase ${asyncqueue} "sct"] } {'] - txt += [' add_%s ${name} ${ip_address} ${tcp_port} {*}$arg_list' % MyDriver['name']] + txt += [' ${ns}::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port} {*}$arg_list'] txt += [' } else {'] - txt += [' add_%s ${name} "aqadapter" ${asyncqueue} {*}$arg_list' % MyDriver['name']] + txt += [' ${ns}::add_driver ${name} ${device_class} ${simulation_flag} "aqadapter" ${asyncqueue} {*}$arg_list'] txt += [' }'] else: txt += [' if { [string equal -nocase ${asyncqueue} "sct"] } {'] - txt += [' add_%s ${name} ${ip_address} ${tcp_port}' % MyDriver['name']] + txt += [' ${ns}::add_driver ${name} ${device_class} ${simulation_flag} ${ip_address} ${tcp_port}'] txt += [' } else {'] - txt += [' add_%s ${name} "aqadapter" ${asyncqueue}' % MyDriver['name']] + txt += [' ${ns}::add_driver ${name} ${device_class} ${simulation_flag} "aqadapter" ${asyncqueue}'] txt += [' }'] txt += [' }'] txt += [' }'] diff --git a/site_ansto/instrument/util/gitloader.py b/site_ansto/instrument/util/gitloader.py old mode 100644 new mode 100755 diff --git a/site_ansto/instrument/util/gitrefer.py b/site_ansto/instrument/util/gitrefer.py old mode 100644 new mode 100755 diff --git a/statusfile.c b/statusfile.c index ba3915af..8c2e78d4 100644 --- a/statusfile.c +++ b/statusfile.c @@ -52,6 +52,9 @@ #include "lld.h" #include "exebuf.h" +#define CLEAN_LOCKED 1 +#define CLEAN_MISSING 2 + static int parameterChange = 0; /*-----------------------------------------------------------------------*/ int StatusFileTask(void *data) @@ -217,6 +220,94 @@ static int listRestoreErr(pRestoreObj self, SConnection * pCon) return 1; } +/*-----------------------------------------------------------------------*/ +static int cleanRestoreErr(pRestoreObj self, SConnection * pCon, int hard) +{ + char command[1024]; + char message[1024]; + char *errMsg = NULL; + int status; + int newErrList; + pDynString data = NULL; + pStringDict dict; + int count_in = 0; + int count_ex = 0; + + if (!self->errList) + return 1; + + data = CreateDynString(256,256); + if (data == NULL) { + SCWrite(pCon,"ERROR: out of memory cleaning errors",eError); + return 0; + } + dict = CreateStringDict(); + if (dict == NULL) { + SCWrite(pCon,"ERROR: out of memory cleaning errors",eError); + DeleteDynString(data); + return 0; + } + /* create new list */ + newErrList = LLDstringCreate(); + if (newErrList < 0) { + SCWrite(pCon,"ERROR: out of blobs cleaning errors",eError); + DeleteDynString(data); + DeleteStringDict(dict); + return 0; + } + status = LLDnodePtr2First(self->errList); + while (status == 1) { + LLDstringData(self->errList, command); + status = LLDnodePtr2Next(self->errList); + if (status != 1) { + /* Error */ + errMsg = "ERROR: unpaired error cleaning errors"; + break; + } + LLDstringData(self->errList, message); + if (command[0] == '#' || message[0] != '#') { + /* Error */ + errMsg = "ERROR: sequence error cleaning errors"; + break; + } + DynStringClear(data); + DynStringConcat(data, command); + DynStringConcat(data, message); + status = LLDnodePtr2Next(self->errList); + ++count_in; + /* Skip duplicate messages */ + if (StringDictExists(dict, GetCharArray(data))) + continue; + /* Skip "configured locked!" messages */ + if (hard == CLEAN_LOCKED && + strstr(message, "#ERR: ERROR: variable ") && + strstr(message, " is configured locked!")) + continue; + /* Skip "not found" messages */ + if (hard == CLEAN_MISSING && + strstr(message, "#ERR: Object ") && + strstr(message, "not found")) + continue; + /* add to dictionary and new list */ + StringDictAddPair(dict, GetCharArray(data), ""); + LLDstringAppend(newErrList, command); + LLDstringAppend(newErrList, message); + ++count_ex; + } + if (errMsg) { + SCWrite(pCon, errMsg, eError); + LLDstringDelete(newErrList); + } else { + /* swap lists */ + LLDstringDelete(self->errList); + self->errList = newErrList; + SCPrintf(pCon, eLog, "CleanErr: %d pairs in, %d pairs out", count_in, count_ex); + } + DeleteDynString(data); + DeleteStringDict(dict); + return 1; +} + /*-----------------------------------------------------------------------*/ int RestoreStatus(SConnection * pCon, SicsInterp * pSics, void *pData, int argc, char *argv[]) @@ -245,6 +336,13 @@ int RestoreStatus(SConnection * pCon, SicsInterp * pSics, void *pData, } else { if (strcasecmp(argv[1], "listerr") == 0) { return listRestoreErr(self, pCon); + } else if (strcasecmp(argv[1], "cleanerr") == 0) { + if (argc > 2 && strcasecmp(argv[2], "locked") == 0) + return cleanRestoreErr(self, pCon, CLEAN_LOCKED); + else if (argc > 2 && strcasecmp(argv[2], "missing") == 0) + return cleanRestoreErr(self, pCon, CLEAN_MISSING); + else + return cleanRestoreErr(self, pCon, 0); } else if (strcasecmp(argv[1], "killerr") == 0) { if (self->errList >= 0) { LLDdeleteBlob(self->errList); diff --git a/tasub.c b/tasub.c index 45992104..0d476173 100644 --- a/tasub.c +++ b/tasub.c @@ -370,14 +370,14 @@ int TasUBFactory(SConnection * pCon, SicsInterp * pSics, void *pData, /* curvature motors may be missing, anything else is a serious problem */ - status += testMotor(pNew, pCon, "a1", A1); - status += testMotor(pNew, pCon, "a2", A2); - status += testMotor(pNew, pCon, "a3", A3); - status += testMotor(pNew, pCon, "a4", A4); - status += testMotor(pNew, pCon, "sgu", SGU); - status += testMotor(pNew, pCon, "sgl", SGL); - status += testMotor(pNew, pCon, "a5", A5); - status += testMotor(pNew, pCon, "a6", A6); + status += testMotor(pNew, pCon, pNew->motname[A1], A1); + status += testMotor(pNew, pCon, pNew->motname[A2], A2); + status += testMotor(pNew, pCon, pNew->motname[A3], A3); + status += testMotor(pNew, pCon, pNew->motname[A4], A4); + status += testMotor(pNew, pCon, pNew->motname[SGU], SGU); + status += testMotor(pNew, pCon, pNew->motname[SGL], SGL); + status += testMotor(pNew, pCon, pNew->motname[A5], A5); + status += testMotor(pNew, pCon, pNew->motname[A6], A6); if (status != 8) { SCWrite(pCon, "ERROR: a required motor is missing, tasub NOT installed", eError);