/////////////////////////////////////////////////////////// // // _tpcWatchdog.ctl // Simple watchdog to force running scripts to answer: // checks if a value of (opc-) driver is updated within the time value // // J.Mercado $v.120307 // /////////////////////////////////////////////////////////// trdWd_watchdog(string dp, string script) { dyn_string dpts = dpTypes (); if(dynContains(dpts,"_AliTRD_HEART")<=0) trdWd_createHeartBeatType(); dp ="AliTRD_wd_"+dp; if(!dpExists(dp)){ dpCreate(dp,"_AliTRD_HEART"); DebugN("Created Fsmdp: "+dp); } dpSet(dp+".Script",script); dpSet(dp+".ManagerNummer",myManNum()); dpSet(dp+".System",getSystemName()); dpConnect("trdWd_watchbeat",dp+".Beep"); } trdWd_watchbeat(string dp,bool val) { if(val) return; dpSet(dpSubStr(dp,DPSUB_SYS_DP_EL),true); } trdWd_createHeartBeatType() { // Name string reftype = "_AliTRD_HEART"; dyn_dyn_string dpe; dyn_dyn_int dpt; int n=1; trdLib_deleteTypeWithRef(reftype); trdLib_deleteType(reftype); // Create dptype dpe[n] = makeDynString (reftype,""); dpt[n++] = makeDynInt (DPEL_STRUCT,0); dpe[n] = makeDynString ("","Running"); dpt[n++] = makeDynInt (0,DPEL_BOOL); dpe[n] = makeDynString ("","Beep"); dpt[n++] = makeDynInt (0,DPEL_BOOL); dpe[n] = makeDynString ("","Script"); dpt[n++] = makeDynInt (0,DPEL_STRING); dpe[n] = makeDynString ("","ManagerNummer"); dpt[n++] = makeDynInt (0,DPEL_INT); dpe[n] = makeDynString ("","System"); dpt[n++] = makeDynInt (0,DPEL_STRING); dpTypeCreate(dpe,dpt); DebugN("Created FsmType: "+reftype); } trdWd_createWatchDogType() { // Name string reftype = "_AliTRD_WATCH"; dyn_dyn_string dpe; dyn_dyn_int dpt; int n=1; trdLib_deleteTypeWithRef(reftype); trdLib_deleteType(reftype); // Create dptype dpe[n] = makeDynString (reftype,""); dpt[n++] = makeDynInt (DPEL_STRUCT,0); dpe[n] = makeDynString ("","Beep"); dpt[n++] = makeDynInt (0,DPEL_BOOL); dpe[n] = makeDynString ("","ThreadId"); dpt[n++] = makeDynInt (0,DPEL_INT); dpe[n] = makeDynString ("","ManagerNummer"); dpt[n++] = makeDynInt (0,DPEL_INT); dpe[n] = makeDynString ("","System"); dpt[n++] = makeDynInt (0,DPEL_STRING); dpTypeCreate(dpe,dpt); DebugN("Created FsmType: "+reftype); } trdWd_heartBeat(float wait) { int i; const string type = "_AliTRD_HEART"; const string wtype = "_AliTRD_WATCH"; const string dpname="AliTRD_wd_watchdog"; float sleep; float sec,msec; bool val; bool beat=true; dyn_string dpnames; dyn_string scripts; dyn_string dpts = dpTypes (); if(dynContains(dpts,wtype)<=0) trdWd_createWatchDogType(); if(!dpExists(dpname)){ dpCreate(dpname,wtype); DebugN("Created Fsmdp: "+dpname); } dpSet("AliTRD_wd_watchdog.ThreadId",getThreadId()); dpSet("AliTRD_wd_watchdog.ManagerNummer",myManNum ()); dpSet("AliTRD_wd_watchdog.System",getSystemName()); // DebugN("ThreadID: "+getThreadId()+" started"); if(dynContains(dpts,type)>0) dpnames = dpNames("*",type); else dynClear(dpnames); if(dynlen(dpnames)>0){ sleep = wait/dynlen(dpnames); sec=floor(sleep); msec=fmod(sleep,1)*1000; for(i=1;i<=dynlen(dpnames);i++) dpSetWait(dpnames[i]+".Beep",false); delay(1); while(dynlen(dpnames)==dynlen(dpNames("*",type))){ for(i=1;i<=dynlen(dpnames);i++){ dpGet(dpnames[i]+".Beep",val); dpSet(dpnames[i]+".Running",val); dpSet(dpnames[i]+".Beep",false); delay(sec,msec); } dpSet(dpname+".Beep",beat); beat =!beat; } } else{ sec=floor(wait); msec=fmod(wait,1)*1000; while(dynlen(dpnames)<=0){ dpSet(dpname+".Beep",beat); beat =!beat; dpts = dpTypes (); if(dynContains(dpts,type)>0) dpnames = dpNames("*",type); delay(sec,msec); } } startThread("trdWd_heartBeat",wait); // DebugN("ThreadID: "+getThreadId()+" terminated"); } dyn_string trdOpc_dps; dyn_string trdOpc_items; dyn_int trdOpc_id; int trdOpc_sec,trdOpc_msec; trdOpc_watchdog(string dp, string item) { dyn_string dpts = dpTypes (); if(dynContains(dpts,"_AliTRD_OPC_HEART")<=0) trdOpc_createHeartBeatType(); dp ="AliTRD_opc_"+dp; if(!dpExists(dp)){ dpCreate(dp,"_AliTRD_OPC_HEART"); DebugN("Created Fsmdp: "+dp); } dpSet(dp+".Item",item); dpSet(dp+".ManagerNummer",-1); dpSet(dp+".OPCGroup","..."); dpSet(dp+".OPCGroupUpdate",-1); dpSet(dp+".OPCServer","..."); dpSet(dp+".System",getSystemName()); } trdOpc_createHeartBeatType() { // Name string reftype = "_AliTRD_OPC_HEART"; dyn_dyn_string dpe; dyn_dyn_int dpt; int n=1; trdLib_deleteTypeWithRef(reftype); trdLib_deleteType(reftype); // Create dptype dpe[n] = makeDynString (reftype,""); dpt[n++] = makeDynInt (DPEL_STRUCT,0); dpe[n] = makeDynString ("","Running"); dpt[n++] = makeDynInt (0,DPEL_BOOL); dpe[n] = makeDynString ("","Item"); dpt[n++] = makeDynInt (0,DPEL_STRING); dpe[n] = makeDynString ("","OPCGroup"); dpt[n++] = makeDynInt (0,DPEL_STRING); dpe[n] = makeDynString ("","OPCGroupUpdate"); dpt[n++] = makeDynInt (0,DPEL_INT); dpe[n] = makeDynString ("","OPCServer"); dpt[n++] = makeDynInt (0,DPEL_STRING); dpe[n] = makeDynString ("","ManagerNummer"); dpt[n++] = makeDynInt (0,DPEL_INT); dpe[n] = makeDynString ("","System"); dpt[n++] = makeDynInt (0,DPEL_STRING); dpTypeCreate(dpe,dpt); DebugN("Created FsmType: "+reftype); } trdOpc_createWatchDogType() { // Name string reftype = "_AliTRD_OPC_WATCH"; dyn_dyn_string dpe; dyn_dyn_int dpt; int n=1; trdLib_deleteTypeWithRef(reftype); trdLib_deleteType(reftype); // Create dptype dpe[n] = makeDynString (reftype,""); dpt[n++] = makeDynInt (DPEL_STRUCT,0); dpe[n] = makeDynString ("","Beep"); dpt[n++] = makeDynInt (0,DPEL_BOOL); dpe[n] = makeDynString ("","ThreadId"); dpt[n++] = makeDynInt (0,DPEL_INT); dpe[n] = makeDynString ("","ManagerNummer"); dpt[n++] = makeDynInt (0,DPEL_INT); dpe[n] = makeDynString ("","System"); dpt[n++] = makeDynInt (0,DPEL_STRING); dpTypeCreate(dpe,dpt); DebugN("Created FsmType: "+reftype); } trdOpc_watchbeat(string dp, time stime) { int pos = dynContains(trdOpc_items,dpSubStr(dp,DPSUB_SYS_DP_EL)); if(trdOpc_id[pos]>=0) stopThread(trdOpc_id[pos]); dpSet(trdOpc_dps[pos]+".Running",true); trdOpc_id[pos]=startThread("trdOpc_wait",pos); } trdOpc_wait(int pos) { delay(trdOpc_sec,trdOpc_msec); dpSet(trdOpc_dps[pos]+".Running",false); trdOpc_id[pos]=-2; delay(0,200); } trdOpc_heartBeat(float wait) { const string type = "_AliTRD_OPC_HEART"; const string wtype = "_AliTRD_OPC_WATCH"; const string dpname="AliTRD_opc_watchdog"; bool beat=true; trdOpc_sec=floor(wait); trdOpc_msec=fmod(wait,1)*1000; dyn_string dpts = dpTypes(); if(dynContains(dpts,wtype)<=0) trdOpc_createWatchDogType(); if(!dpExists(dpname)){ dpCreate(dpname,wtype); DebugN("Created Fsmdp: "+dpname); } dpSet("AliTRD_opc_watchdog.ThreadId",getThreadId()); dpSet("AliTRD_opc_watchdog.ManagerNummer",myManNum ()); dpSet("AliTRD_opc_watchdog.System",getSystemName()); // DebugN("ThreadID: "+getThreadId()+" started"); if(dynContains(dpts,type)>0) trdOpc_dps = dpNames("*",type); else dynClear(trdOpc_dps); if(dynlen(trdOpc_dps)>0){ for(int i=1;i<=dynlen(trdOpc_dps);i++) dpSetWait(trdOpc_dps[i]+".Running",false); delay(1); for(int i=1;i<=dynlen(trdOpc_dps);i++){ dpGet(trdOpc_dps[i]+".Item",trdOpc_items[i]); trdOpc_id[i]=-2; string server; dpGet(trdOpc_items[i]+":_address.._reference",server); dpSet(trdOpc_dps[i]+".OPCServer",server); dpConnect("trdOpc_watchbeat",trdOpc_items[i]+":_original.._stime"); } while(dynlen(trdOpc_dps)==dynlen(dpNames("*",type))){ dpSet(dpname+".Beep",beat); beat =!beat; delay(trdOpc_sec,trdOpc_msec); } for(int i=1;i<=dynlen(trdOpc_dps);i++){ dpDisconnect("trdOpc_watchbeat",trdOpc_items[i]+":_original.._stime"); if(trdOpc_id[pos]>=0) stopThread(trdOpc_id[pos]); } } else{ while(dynlen(trdOpc_dps)<=0){ dpSet(dpname+".Beep",beat); beat =!beat; dpts = dpTypes(); delay(trdOpc_sec,trdOpc_msec); if(dynContains(dpts,type)>0) trdOpc_dps = dpNames("*",type); } } startThread("trdOpc_heartBeat",wait); // DebugN("ThreadID: "+getThreadId()+" terminated"); }