diff --git a/.gitattributes b/.gitattributes index 4e16495bcdea605fb4c7fa41efaa121684a1f2fe..3f8de2cfdac7b848312080af4f95e3c072bb2627 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3346,6 +3346,7 @@ MAC/Navigator2/scripts/monitorStateReset.ctl -text MAC/Navigator2/scripts/monitorStationAlarms.ctl -text MAC/Navigator2/scripts/readStationBGPconnections.ctl -text MAC/Navigator2/scripts/readStationConfigs.ctl -text +MAC/Navigator2/scripts/transferMPs.ctl -text MAC/Test/APL/PVSSproject/colorDB/Lofar[!!-~]colors -text svneol=native#application/octet-stream MAC/Test/APL/PVSSproject/colorDB/colorDB_de -text svneol=native#application/octet-stream MAC/Test/APL/PVSSproject/config/config -text svneol=native#application/octet-stream diff --git a/MAC/Navigator2/scripts/transferMPs.ctl b/MAC/Navigator2/scripts/transferMPs.ctl new file mode 100644 index 0000000000000000000000000000000000000000..0da05938483c635ccca59878273df119878cc19d --- /dev/null +++ b/MAC/Navigator2/scripts/transferMPs.ctl @@ -0,0 +1,158 @@ +#uses "da.ctl" + +// To copy all _mp defined functionality (archives , dp_fct etc to the real DP's +// we use this script after setup (or each time that the scriptInfo.paramDone is set to false) +// we run this script +// +bool bDebug=false; + +void main() +{ + // connect to debugflag to be able to switch debug on/off during run + if (dpExists("scriptInfo.transferMPs.debug")) { + dpConnect("debugCB",true,"scriptInfo.transferMPs.debug"); + } else { + DebugTN("transferMPs.ctl:main|scriptInfo.transferMPs.runDone point not found in Database"); + } + + if (dpExists("scriptInfo.transferMPs.runDone")) { + dpConnect("startTransferMP",true,"scriptInfo.transferMPs.runDone"); + } else { + DebugTN("transferMPs.ctl:main|scriptInfo.transferMPs.runDone point not found in Database"); + } + + //Check all .state and .childState points in the database if they are invalid, invalid points mean that they never have been initialised and thus are new + // in the database. These will be set to operational initialy + if (setOperational()) { + DebugTN("transferMPs.ctl:main|set new points to Operational done"); + } else { + DebugTN("transferMPs.ctl:main|set new points to Operational failed"); + } +} + +private void debugCB(string dp1, bool debug) { + if (bDebug != debug) bDebug=debug; +} + +// Transfer all _mp_settings to all DP's +private void startTransferMP(string dp1, bool done ) { + int i, j, k, l, ll, l1, iError; + dyn_float df; + dyn_string dsConfigs, ds; + string sDestinationDPE; + + if (done) return; + + DebugTN("transferMPs.ctl:main|start transfer of MPconfigs to all DP's"); + + + string query="SELECT '_original.._value' FROM '_mp_*'"; + dyn_dyn_anytype tab; + dyn_string dps; + dpQuery(query,tab); + string olddp=""; + for(int z=2;z<=dynlen(tab);z++) { + string dp = dpSubStr(tab[z][1],DPSUB_DP); + if (olddp != dp) { + olddp=dp; + if (!skipDP(dp)) { + dynAppend(dps,dp); + } + } + } + + for (k=1;k <= dynlen(dps); k++) { + string dpstr = dps[k]; + dyn_string dsDpes = dpNames( dpstr + ".**"), + dsDps = dpNames("*",dpTypeName(dpstr)); + + // no datapoints found + if ( dynlen(dsDps) > 1 ) { + + l = dynlen(dsDpes); + l1 = dynlen(dsDps); + ll = l * (l1 - 1); + // !!! dynlen(dsDpes) * dynlen(dsDps) verwenden mit der 2-Sek-Verz�gerung + + for ( i = 1; i <= l; i++ ) { + if ( strpos(dsDpes[i],".") < 1 ) dsDpes[i] += "."; + dsConfigs = dpNames( dsDpes[i] + ":*" ); + for ( j = dynlen(dsConfigs); j > 0; j--) { + strreplace(dsConfigs[j], dsDpes[i] + ":", ""); + } + if ( dynlen(dsConfigs) < 1 ) continue; + + for ( j = 1; j <= dynlen(dsDps); j++ ) { + + if ( dpSubStr(dsDps[j],DPSUB_DP) == dpSubStr(dsDpes[i],DPSUB_DP) ) { + continue; + } + sDestinationDPE = dsDpes[i]; + strreplace( sDestinationDPE, dpSubStr(dsDpes[i], DPSUB_DP), dpSubStr(dsDps[j], DPSUB_DP)); + daCheckDPE(sDestinationDPE); + + dpCopyConfig(dsDpes[i], sDestinationDPE, dsConfigs, iError); + } + } + } + } + dpSet("scriptInfo.transferMPs.runDone",true); + DebugTN("MPTransfer Done."); +} + +private bool setOperational() { + + dyn_dyn_anytype tab; + string dp=""; + string query=""; + int z; + int aVal; + int err; + + query = "SELECT '_online.._invalid' FROM '{**.**.status.childState,**.**.status.state}' WHERE '_online.._invalid' == 1"; + + if (bDebug) DebugN("transferMPs.ctl:setOperational|Query: ",query); + err = dpQuery(query, tab); + + if (err < 0) { + if (bDebug) DebugN("transferMPs.ctl:setOperational|Error " + err + " while getting query."); + return false; + } + + for(z=2;z<=dynlen(tab);z++) { + + dp = tab[z][1]; + // filter out the _mp_ points + if (strpos(dp,"_mp_") < 0) { + dpSet(dp,10); + } + } + return true; +} + +bool skipDP(string dp) { +// We only want to look at our own DB points that have a _mp_ sadly enough PVSS +// keeps some of their own datapoints in the database, and there is no way to +// determine what are theirs and what are or own points, other then a hard compare. + if (strpos(dp,"_mp__") > -1) return true; + if (strpos(dp,"WH_SC_SUB") > -1) return true; + if (strpos(dp,"WH_SC1") > -1) return true; + if (strpos(dp,"ANALOG1") > -1) return true; + if (strpos(dp,"ANALOG2") > -1) return true; + if (strpos(dp,"DRIVE1") > -1) return true; + if (strpos(dp,"DRIVE2") > -1) return true; + if (strpos(dp,"SETPOINT") > -1) return true; + if (strpos(dp,"SLIDE_VALVE1") > -1) return true; + if (strpos(dp,"SLIDE_VALVE2") > -1) return true; + if (strpos(dp,"PUMP2") > -1) return true; + if (strpos(dp,"PUMP1") > -1) return true; + if (strpos(dp,"BIT_CONDITION") > -1) return true; + if (strpos(dp,"COUNTER1") > -1) return true; + if (strpos(dp,"COUNTER_SUB") > -1) return true; + if (strpos(dp,"LABOR_ANALOG") > -1) return true; + if (strpos(dp,"LABOR_COUNTER") > -1) return true; + if (strpos(dp,"SLIDE_VALVE_HAND1") > -1) return true; + if (strpos(dp,"WH_SC_SERVICE") > -1) return true; + if (strpos(dp,"MODE_CMD") > -1) return true; + return false; +}