diff --git a/.gitignore b/.gitignore index d5e3e9dca83e2583b6cbf12fe7ca104a141a8bf5..f078348b6b678cd8f29616782b0c4a83964e38b1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ O.* /bin /db -/dbd \ No newline at end of file +/dbd +.vscode \ No newline at end of file diff --git a/cmds/st.cmd b/cmds/st.cmd index 8253611325024d1a6337722cdbea9046ea912582..36d7252b0d5c120ca0bc5a56a2e81e1fd4735ba3 100644 --- a/cmds/st.cmd +++ b/cmds/st.cmd @@ -2,8 +2,8 @@ require rheometermcr702e,dev # require essioc -epicsEnvSet("PREFIX", "TEST:") -epicsEnvSet("DEVICE", "RHEO:") +epicsEnvSet("PREFIX", "SE-SEE:") +epicsEnvSet("DEVICE", "SE-RHEO-001:") epicsEnvSet("IPADDR", "172.30.32.60") epicsEnvSet("PORT", "1025") diff --git a/rheometerApp/Db/read_data.db b/rheometerApp/Db/read_data.db index 7f7e645e542454c6c5c8035739a9f86537871555..799038f4ffe1906e3f9729597d05a2eae50dbdfc 100644 --- a/rheometerApp/Db/read_data.db +++ b/rheometerApp/Db/read_data.db @@ -12,7 +12,7 @@ record(longin, "$(P)$(R)MeasNumb-R") { field(DESC, "Measurement") field(DTYP, "stream") - field(INP, "@rheo_comm.proto getWaveform($(P)$(R)MeasInterval-R, $(P)$(R)meas_data) rheo") + field(INP, "@rheo_comm.proto getWaveform($(P)$(R)MeasInterval-R, $(P)$(R)#meas_data) rheo") field(SCAN, "I/O Intr") field(PRIO, "HIGH") } @@ -40,31 +40,32 @@ record(aSub, "$(P)$(R)#split_waveform") { field(NOB, "20") field(INPC, "$(P)$(R)MeasInterval-R") field(FTC, "LONG") - field(OUTA, "$(P)$(R)Temp-R") + field(OUTA, "$(P)$(R)Temp-R PP") field(NOVA, "1") field(FTVA, "FLOAT") - field(OUTB, "$(P)$(R)Torque-R") + field(OUTB, "$(P)$(R)Torque-R PP") field(FTVB, "FLOAT") field(NOVB, "1") - field(OUTC, "$(P)$(R)RotSpeed-R") + field(OUTC, "$(P)$(R)RotSpeed-R PP") field(FTVC, "FLOAT") field(NOVC, "1") - field(OUTD, "$(P)$(R)PhaseAng-R") + field(OUTD, "$(P)$(R)PhaseAng-R PP") field(FTVD, "FLOAT") field(NOVD, "1") - field(OUTE, "$(P)$(R)Strain1-R") + field(OUTE, "$(P)$(R)Strain1-R PP") field(FTVE, "FLOAT") field(NOVE, "1") - field(OUTF, "$(P)$(R)#MeasState.SELN") + field(OUTF, "$(P)$(R)MeasState.SELN") field(FTVF, "USHORT") field(NOVF, "1") - field(FLNK, "$(P)$(R)#MeasState") + field(FLNK, "$(P)$(R)MeasState.PROC") + field(EFLG, "ALWAYS") } -record(fanout, "$(P)$(R)#MeasState") { +record(fanout, "$(P)$(R)MeasState") { field(SELM, "Specified") - field(LNK0, "$(P)$(R)Viscosity") - field(LNK1, "$(P)$(R)TotModulus-RB") + field(LNK0, "$(P)$(R)Viscosity.PROC") + field(LNK1, "$(P)$(R)TotModulus.PROC") } record(waveform, "$(P)$(R)MeasHeader-R") { @@ -84,36 +85,35 @@ record(ai, "$(P)$(R)PhaseAng-R") { field(DESC, "Phase angle") field(EGU, "rad") field(TSE, "-2") - field(TSEL, "$(P)$(R)MeasNumb-R.TIME NPP") + field(TSEL, "$(P)$(R)#meas_data.TIME NPP") } record(ai, "$(P)$(R)Strain1-R") { field(DESC, "Strain") field(TSE, "-2") - field(TSEL, "$(P)$(R)MeasNumb-R.TIME NPP") - field(FLNK, "$(P)$(R)ShearStrain-RB.PROC") + field(TSEL, "$(P)$(R)#meas_data.TIME NPP") + } record(ai, "$(P)$(R)Temp-R"){ field(DESC, "Temperature in control system") field(EGU, "K") field(TSE, "-2") - field(TSEL, "$(P)$(R)MeasNumb-R.TIME NPP") + field(TSEL, "$(P)$(R)#meas_data.TIMEE NPP") } record(ai, "$(P)$(R)Torque-R"){ field(DESC, "Torque") field(EGU, "Nm") field(TSE, "-2") - field(TSEL, "$(P)$(R)MeasNumb-R.TIME NPP") + field(TSEL, "$(P)$(R)#meas_data.TIME NPP") } record(ai, "$(P)$(R)RotSpeed-R"){ field(DESC, "Rotational speed") field(EGU, "Hz") - field(FLNK, "$(P)$(R)ShearRate-RB.PROC") field(TSE, "-2") - field(TSEL, "$(P)$(R)MeasNumb-R.TIME NPP") + field(TSEL, "$(P)$(R)#meas_data.TIME NPP") } # -------------------------------------------------------------------------------- @@ -132,7 +132,7 @@ record(ai, "$(P)$(R)CSSfactor") { record(ai, "$(P)$(R)CSRfactor") { field(DESC, "Defined by the measuring system") field(VAL, "149.382") - field(EGU, "s/s") + field(EGU, "1") field(PINI, "YES") } @@ -143,7 +143,7 @@ record(calc, "$(P)$(R)ShearStress") { field(CALC, "A*B") field(EGU, "Pa") field(TSE, "-2") - field(TSEL, "$(P)$(R)MeasNumb-R.TIME NPP") + field(TSEL, "$(P)$(R)#meas_data.TIME NPP") } record(calc, "$(P)$(R)ShearRate") { @@ -151,9 +151,9 @@ record(calc, "$(P)$(R)ShearRate") { field(INPA, "$(P)$(R)RotSpeed-R.VAL NPP") field(INPB, "$(P)$(R)CSRfactor.VAL NPP") field(CALC, "A*B") - field(EGU, "Hz") + field(EGU, "1/s") field(TSE, "-2") - field(TSEL, "$(P)$(R)MeasNumb-R.TIME NPP") + field(TSEL, "$(P)$(R)#meas_data.TIME NPP") } record(calc, "$(P)$(R)ShearStrain") { @@ -161,7 +161,7 @@ record(calc, "$(P)$(R)ShearStrain") { field(INPA, "$(P)$(R)Strain1-R.VAL NPP") field(INPB, "$(P)$(R)CSRfactor.VAL NPP") field(CALC, "A*B/(2*PI)") - field(EGU, "Pa") + field(EGU, "1") } record(calc, "$(P)$(R)Viscosity") { @@ -171,7 +171,7 @@ record(calc, "$(P)$(R)Viscosity") { field(CALC, "A/B") field(EGU, "Pa*s") field(TSE, "-2") - field(TSEL, "$(P)$(R)MeasNumb-R.TIME NPP") + field(TSEL, "$(P)$(R)#meas_data.TIME NPP") } record(calc, "$(P)$(R)TotModulus") { @@ -179,7 +179,7 @@ record(calc, "$(P)$(R)TotModulus") { field(INPA, "$(P)$(R)ShearStress.VAL PP") field(INPB, "$(P)$(R)ShearStrain.VAL PP") field(CALC, "A/B") - field(EGU, "?") + field(EGU, "1") field(TSE, "-2") - field(TSEL, "$(P)$(R)MeasNumb-R.TIME NPP") + field(TSEL, "$(P)$(R)#meas_data.TIME NPP") } \ No newline at end of file diff --git a/rheometerApp/Db/rheo_comm.db b/rheometerApp/Db/rheo_comm.db index dd9e827031239bbc11a7c4a2f5591d250f1725da..f4f4def5900522c4c5ad76bdf06e3815c5e64196 100644 --- a/rheometerApp/Db/rheo_comm.db +++ b/rheometerApp/Db/rheo_comm.db @@ -8,11 +8,11 @@ record(ai, "$(P)$(R)InError-RB"){ field(DTYP, "stream") field(INP, "@rheo_comm.proto ErrorMsg rheo") field(SCAN, "I/O Intr") - field(FLNK, "$(P)$(R)CheckAirPressure") + field(FLNK, "$(P)$(R)CheckAirPressure.PROC") } record(calc, "$(P)$(R)#CheckAirPressure") { - field(INPA, "$(P)$(R)InError-RG NPP") + field(INPA, "$(P)$(R)InError-RB NPP") field(CALC, "(A = 9311) ? 1 : 0") field(FLNK, "$(P)(R)ErrorAirPres.PROC") } @@ -69,7 +69,7 @@ record(int64in, "$(P)$(R)InitDevice") { field(DTYP, "stream") field(INP, "@rheo_comm.proto initRheo($(P)$(R)errMessage) rheo") field(SCAN, "Passive") - field(FLNK, "$(P)$(R)TempeSetting-S") + field(FLNK, "$(P)$(R)TempSetting-S") } record(stringin, "$(P)$(R)TempSetting-S") { @@ -147,7 +147,7 @@ record(lso, "$(P)$(R)LoadMeasConfig-S") { field(OMSL, "supervisory") field(OUT, "@rheo_comm.proto set_config($(P)$(R)LoadMeasConfig-RB) rheo") field(SCAN, "Passive") - field(FLNK, "$(P)$(R)MeasHeader-R.PROC") + #field(FLNK, "$(P)$(R)MeasHeader-R.PROC") } record(lsi, "$(P)$(R)LoadMeasConfig-RB") { @@ -158,7 +158,7 @@ record(stringin, "$(P)$(R)Debug"){ field(SCAN, "Passive") } -record(stringin, "$(P)$(R)MeasSystemVisco-S") { +record(stringin, "$(P)$(R)LoadMeasSystem-S") { field(DTYP, "stream") field(INP, "@rheo_comm.proto Kconfig_viscometry($(P)$(R)errMessage) rheo") } @@ -206,4 +206,31 @@ record(stringout, "$(P)$(R)TestRun") { field(DESC, "") field(DTYP, "stream") field(OUT, "@rheo_comm.proto testrun rheo" ) +} + + +# Status message + +record(mbbi, "$(P)$(R)MeasStatus"){ + field(SCAN, "Passive") + field(ZRVL, "0") + field(ZRST, "Idle") + field(ONVL, "1") + field(ONST, "Busy") + field(TWVL, "2") + field(TWST, "Error") + field(INP, "$(P)$(R)#CalcStatus") +} + +record(longin, "$(P)$(R)#ReadPart"){ + field(DTYP, "stream") + field(SCAN, "I/O Intr") + field(INP, "@rheo_comm.proto measurement_status rheo") + field(FLNK, "$(P)$(R)#CalcStatus.PROC") +} + +record(calc, "$(P)$(R)#CalcStatus"){ + field(INPA, "$(P)$(R)#MeasStatus.VAL") + field(CALC, "(A > 0) ? 1 : 0") + field(FLNK, "$(P)$(R)Status.PROC") } \ No newline at end of file diff --git a/rheometerApp/Db/rheo_comm.proto b/rheometerApp/Db/rheo_comm.proto index b11517891e47841325a50ea46c2d9adf09d20269..db6a8b8c86efc48afc200e0733a9836ecee2e996 100644 --- a/rheometerApp/Db/rheo_comm.proto +++ b/rheometerApp/Db/rheo_comm.proto @@ -120,6 +120,7 @@ Kconfig_amp_sweep { getWaveform { Separator = ','; InTerminator = ")]",SUB; + # InTerminator = ")]",LF; in ":MEAS[%d,%(\$1)i,%*f,%*f,%*i,(),(%(\$2)[^,]"; } @@ -177,6 +178,7 @@ MoveToLoadPos { ###################################################### set_config { + ReplyTimeout = 2000; out "%s"; in "%(\$1)#s"; } @@ -198,3 +200,8 @@ get_meas_head { testrun { out ":RUN[]"; } + + +measurement_status { + in ":PART[%i,%d]"; +} diff --git a/rheometerApp/src/split_data.cpp b/rheometerApp/src/split_data.cpp index 6acd978f12e8e123deda2f7af080a39726d71d65..cd6578f96d56d949ed83e61cb28523d278bb7684 100644 --- a/rheometerApp/src/split_data.cpp +++ b/rheometerApp/src/split_data.cpp @@ -15,11 +15,6 @@ static int split_routine(aSubRecord *precord) { string mdef; - // Definition of different measurement modes - string visc = "DAPT[TEMP[2,??T]],DAPT[TORQ[1,??T]],DAPT[SPEE[1,??T]],DAPT[EXCU[1,??T]]"; - string osc1 = "VALF[STRA[1,?&]],DAPT[TEMP[2,??T]],COMP[MODU[1,??F],1,PHAS]"; - string osc2 = "VALF[TORQ[1,?&]],DAPT[TEMP[2,??T]],COMP[MODU[1,??F],1,PHAS]"; - cout << "get input" << endl; int n = precord->noa; @@ -42,8 +37,8 @@ static int split_routine(aSubRecord *precord) { *(float*)precord->vala = stof(inp[0]); *(float*)precord->valb = stof(inp[1]); *(float*)precord->valc = stof(inp[2]); - *(float*)precord->valf = state; - } else if ((state == 1) || (state == 2)) { + *(int*)precord->valf = 0; + } else if ((state == 1) || (state == 2) || (state == 3)) { // Amp. Sweep // cout << inp[0] << " " << inp[2] << " "; cout << inp[4] << " " << inp[8] << endl; @@ -51,7 +46,7 @@ static int split_routine(aSubRecord *precord) { *(float*)precord->vald = stof(inp[2]); *(float*)precord->valb = stof(inp[4]); *(float*)precord->vale = stof(inp[8]); - *(float*)precord->valf = state; + *(int*)precord->valf = 1; } else { cout << "Unknown measurement mode" << endl; } @@ -75,17 +70,33 @@ string read_meas_header(aSubRecord *precord) { return a; } +bool checkIfStringsExist(const std::string& input, const std::string predefinedStrings[], size_t size) { + + // Check if each pre-defined string exists in the input + for (size_t i = 0; i < size; ++i) { + if (input.find(predefinedStrings[i]) == std::string::npos) { + // If any pre-defined string is not found, return false + return false; + } + std::cout << predefinedStrings[i] << "exist." << std::endl; + } + + // All pre-defined strings were found, return true + return true; +} + + int id_intervals(string mdef, long interval) { cout << "---id_intervals start---" << endl; // Preset measurement modes - string visc = "DAPT[TEMP[2,??T]],DAPT[TORQ[1,??T]],DAPT[SPEE[1,??T]],DAPT[EXCU[1,??T]]"; - string osc1 = "VALF[STRA[1,?&]],DAPT[TEMP[2,??T]],COMP[MODU[1,??F],1,PHAS]"; - string osc2 = "VALF[TORQ[1,?&]],DAPT[TEMP[2,??T]],COMP[MODU[1,??F],1,PHAS]"; - + string visc[] = {"DAPT[TEMP[2,??T]]","DAPT[TORQ[1,??T]]","DAPT[SPEE[1,??T]]","DAPT[EXCU[1,??T]]"}; + string osc1[] = {"VALF[STRA[1,?&]]","DAPT[TEMP[2,??T]]","COMP[MODU[1,??F],1,PHAS]"}; + string osc2[] = {"VALF[TORQ[1,?&]]","DAPT[TEMP[2,??T]]","COMP[MODU[1,??F],1,PHAS]"}; + string osc3[] = {"VALF[STRE[1,?&]]","DAPT[TEMP[2,??T]]","COMP[MODU[1,??F],1,PHAS]"}; size_t pos = 0; int bracketLevel = 0; int ipos = 0; - int state; + int state = -1; int current_interval = 0; string element; @@ -100,8 +111,8 @@ int id_intervals(string mdef, long interval) { bracketLevel--; if (bracketLevel == 0) { // Extract the entire element and compare to - element = mdef.substr(ipos, (pos + 1) - ipos); if (current_interval == interval) { + element = mdef.substr(ipos, (pos + 1) - ipos); cout << "element:" << element << endl; break; } @@ -111,17 +122,20 @@ int id_intervals(string mdef, long interval) { pos++; } - if (element.find(visc) != std::string::npos) { + if (checkIfStringsExist(element, visc, sizeof(visc)/sizeof(visc[0]))) { std::cout << "VISC mode found!" << std::endl; state = 0; - } else if (element.find(osc1) != std::string::npos) { - std::cout << "OSC mode 1 found!" << std::endl; + } else if (checkIfStringsExist(element, osc1, sizeof(osc1)/sizeof(osc1[0]))) { + std::cout << "OSC mode STRA found!" << std::endl; state = 1; - } else if (element.find(osc2) != std::string::npos) { - std::cout << "OSC mode 2 found!" << std::endl; + } else if (checkIfStringsExist(element, osc2, sizeof(osc2)/sizeof(osc2[0]))) { + std::cout << "OSC mode TORQ found!" << std::endl; state = 2; + } else if (checkIfStringsExist(element, osc3, sizeof(osc3)/sizeof(osc3[0]))){ + std::cout << "OSC mode STRE found!" << std::endl; + state = 3; } else { - cout << "Mode not found!" << endl; + std::cout << "Mode not found!" << endl; state = -1; } @@ -138,6 +152,7 @@ int id_intervals(string mdef, long interval) { } + epicsRegisterFunction(split_routine); // epicsRegisterFunction(measHead); // epicsRegisterFunction(id_intervals); \ No newline at end of file