void rt_fast::scan() { aproc_TimeStamp( scantime(), 5); for ( int i = 0; i < (int) objects.size(); i++) objects[i]->scan(); }
int main() { pwr_tStatus sts; rt_sysmon sysmon; int tmo; char mp[2000]; qcom_sQid qid = qcom_cNQid; qcom_sGet get; int swap = 0; bool first_scan = true; init( &qid); try { sysmon.open(); } catch ( co_error& e) { errh_Error( (char *)e.what().c_str()); errh_Fatal( "rt_sysmon aborting"); errh_SetStatus( PWR__SRVTERM); exit(0); } aproc_TimeStamp( sysmon.scantime(), 5); errh_SetStatus( PWR__SRUN); first_scan = true; for (;;) { if ( first_scan) { tmo = (int) (sysmon.scantime() * 1000 - 1); } get.maxSize = sizeof(mp); get.data = mp; qcom_Get( &sts, &qid, &get, tmo); if (sts == QCOM__TMO || sts == QCOM__QEMPTY) { if ( !swap) sysmon.scan(); } else { ini_mEvent new_event; qcom_sEvent *ep = (qcom_sEvent*) get.data; new_event.m = ep->mask; if (new_event.b.oldPlcStop && !swap) { errh_SetStatus( PWR__SRVRESTART); swap = 1; sysmon.close(); } else if (new_event.b.swapDone && swap) { swap = 0; sysmon.open(); errh_SetStatus( PWR__SRUN); } else if (new_event.b.terminate) { exit(0); } } first_scan = false; } }
void rt_post::scan() { pwr_tStatus sts = 1; while (ODD(sts)) sts = mh_OutunitReceive(); aproc_TimeStamp( scantime(), 5); }
void rt_sysmon::scan() { pwr_tStatus osts, sts; errh_eSeverity severity, oseverity; aproc_TimeStamp( scantime(), 5); // Find most severe status sts = PWR__SRUN; severity = errh_Severity( sts); for ( int i = 0; i < (int) objects.size(); i++) { objects[i]->scan(); osts = objects[i]->status(); oseverity = errh_Severity( osts); if ( oseverity > severity) { sts = osts; severity = oseverity; } } errh_SetStatus( sts); }
int main(int argc, char *argv[]) { remtrans_item *remtrans; unsigned char id[32]; unsigned char pname[32]; pwr_tStatus sts; struct timeval tv; int i; /* Read arg number 2, should be id for this instance */ if (argc >= 2) strcpy((char *)id, argv[1]); else strcpy((char *)id, "0"); /* Build process name with id */ sprintf((char *) pname, "rs_remudp_%s", id); /* Init of errh */ errh_Init((char *) pname, errh_eAnix_remote); errh_SetStatus(PWR__SRVSTARTUP); /* Init of gdh */ sts = gdh_Init((char *) pname); if ( EVEN(sts)) { errh_Error("gdh_Init, %m", sts); errh_SetStatus(PWR__SRVTERM); exit(sts); } /* Arg number 3 should be my remnodes objid in string representation, read it, convert to real objid and store in remnode_item */ sts = 0; if (argc >= 3) sts = cdh_StringToObjid(argv[2], &rn.objid); if ( EVEN(sts)) { errh_Error("cdh_StringToObjid, %m", sts); errh_SetStatus(PWR__SRVTERM); exit(sts); } /* Get pointer to RemnodeUDP object and store locally */ sts = gdh_ObjidToPointer(rn.objid, (pwr_tAddress *) &rn_udp); if ( EVEN(sts)) { errh_Error("cdh_ObjidToPointer, %m", sts); errh_SetStatus(PWR__SRVTERM); exit(sts); } /* Initialize some internal data and make standard remtrans init */ rn.next = NULL; rn.local = NULL; // We dont use local structure since we only have one remnode rn.retransmit_time = rn_udp->RetransmitTime; rn_udp->ErrCount = 0; sts = RemTrans_Init(&rn); /* Log that we will multicast */ if (rn.multicast) { errh_Info("Will send to dual address: %d.%d.%d.%d", rn.multicast->Address[0], rn.multicast->Address[1], rn.multicast->Address[2], rn.multicast->Address[3]); } if ( EVEN(sts)) { errh_Error("RemTrans_Init, %m", sts); errh_SetStatus(PWR__SRVTERM); exit(sts); } /* Store remtrans objects objid in remnode_udp object */ remtrans = rn.remtrans; i = 0; while(remtrans) { rn_udp->RemTransObjects[i++] = remtrans->objid; if ( i >= (int)(sizeof(rn_udp->RemTransObjects)/sizeof(rn_udp->RemTransObjects[0]))) break; remtrans = (remtrans_item *) remtrans->next; } /* Initialize no timeout value (poll) for select call */ tv.tv_sec = 0; tv.tv_usec = 0; /* Create UDP socket and init adress structures */ CreateSocket(); /* Wait for one cycle */ RemoteSleep(rn_udp->ScanTime); /* Set running status */ errh_SetStatus(PWR__SRUN); /* Set (re)start time in remnode object */ time_GetTime(&rn_udp->RestartTime); /* Loop forever */ while (!doomsday) { /* Check disable flag */ if (rn_udp->Disable == 1) { errh_Fatal("Disabled, exiting"); errh_SetStatus(PWR__SRVTERM); exit(0); } /* Timestamp */ aproc_TimeStamp(TIME_INCR, 5); RemoteSleep(TIME_INCR); /* Increase time counters in local remnode and prevent big counters */ time_since_scan += TIME_INCR; time_since_keepalive += TIME_INCR; time_since_rcv += TIME_INCR; time_since_scan = min(time_since_scan, rn_udp->ScanTime + 1.0); time_since_keepalive = min(time_since_keepalive, rn_udp->KeepaliveTime + 1.0); time_since_rcv = min(time_since_rcv, rn_udp->LinkTimeout + 1.0); /* Update retransmit time, could have been changed */ rn.retransmit_time = rn_udp->RetransmitTime; remtrans = rn.remtrans; while(remtrans) { remtrans->time_since_send += TIME_INCR; /* Prevent big counter */ remtrans->time_since_send = min(remtrans->time_since_send, rn.retransmit_time + 1.0); remtrans = (remtrans_item *) remtrans->next; } tv.tv_sec = 0; tv.tv_usec = 0; FD_ZERO(&fds); FD_SET(my_socket, &fds); sts = select(32, &fds, NULL, NULL, &tv); if (sts > 0) Receive(); if (sts < 0) { errh_Error("Select, %d", sts); errh_SetStatus(PWR__SRVTERM); exit(0); } if (time_since_scan >= rn_udp->ScanTime) { if (!rn_udp->Disable) RemTrans_Cyclic(&rn, &RemnodeSend); time_since_scan = 0; } if (time_since_keepalive >= rn_udp->KeepaliveTime) { if (!rn_udp->Disable && rn_udp->UseKeepalive) SendKeepalive(); time_since_keepalive = 0; } if (time_since_rcv >= rn_udp->LinkTimeout && rn_udp->LinkTimeout > 0) { if (rn_udp->LinkUp) { errh_Info("UDP link down %s", rn_udp->RemoteHostname); rn_udp->LinkUp = 0; } } } }
int main (int argc, char **argv) { pwr_tStatus sts; pwr_tObjid ObjId; pwr_sClass_DsTrendConf *TConfP; pwr_tBoolean InitOK; pwr_tTime CurrentTime, LastScan, NextScan; pwr_tDeltaTime ScanDeltaTime, WaitTime; qcom_sQid qini; qcom_sQattr qAttr; int tmo; char mp[2000]; qcom_sQid qid = qcom_cNQid; qcom_sGet get; int swap = 0; trend_tCtx ctx; errh_Init("pwr_trend", errh_eAnix_trend); errh_SetStatus( PWR__SRVSTARTUP); sts = gdh_Init("ds_trend"); If_Error_Log_Exit(sts, "gdh_Init"); if (!qcom_Init(&sts, 0, "pwr_trend")) { errh_Fatal("qcom_Init, %m", sts); exit(sts); } qAttr.type = qcom_eQtype_private; qAttr.quota = 100; if (!qcom_CreateQ(&sts, &qid, &qAttr, "events")) { errh_Fatal("qcom_CreateQ, %m", sts); exit(sts); } qini = qcom_cQini; if (!qcom_Bind(&sts, &qid, &qini)) { errh_Fatal("qcom_Bind(Qini), %m", sts); exit(-1); } ctx = (trend_tCtx) calloc( 1, sizeof(trend_sCtx)); /* Wait until local nethandler has started */ while(EVEN(gdh_NethandlerRunning())) sleep(1); /* Fetch ScanTime */ sts = gdh_GetClassList(pwr_cClass_DsTrendConf, &ObjId); if (EVEN(sts)) { errh_Info("Couldn't get the DsTrendConf object. Used ScanTime = 1 s"); ctx->scantime = 1; ctx->scantime_tc = 1.0; } else { gdh_ObjidToPointer(ObjId, (pwr_tAddress *)&TConfP); ctx->scantime = TConfP->ScanTime; if ( ctx->scantime > 3600) ctx->scantime = 3600; else if ( ctx->scantime < 1) ctx->scantime = 1; ctx->scantime_tc = TConfP->ScanTime; if ( ctx->scantime_tc > 3600) ctx->scantime_tc = 3600; } ctx->dstrend_multiple = (int) (ctx->scantime / ctx->scantime_tc + 0.5); aproc_RegisterObject( ObjId); InitOK = FALSE; sts = InitTrendList( ctx); if ( EVEN(sts)) { /* This should be removed when we can wait for init messages. */ errh_SetStatus(0); errh_Info("No DsTrend objects configured"); exit(0); } /* If even sts, just wait for init message */ time_GetTimeMonotonic(&LastScan); time_FloatToD( &ScanDeltaTime, ctx->scantime_tc); aproc_TimeStamp( ctx->scantime, 5.0); errh_SetStatus( PWR__SRUN); for (;;) { time_GetTimeMonotonic(&CurrentTime); time_Aadd(&NextScan, &LastScan, &ScanDeltaTime); if (time_Acomp(&CurrentTime, &NextScan) < 0) { time_Adiff(&WaitTime, &NextScan, &CurrentTime); tmo = 1000 * time_DToFloat( 0, &WaitTime); get.maxSize = sizeof(mp); get.data = mp; qcom_Get( &sts, &qid, &get, tmo); if (sts == QCOM__TMO || sts == QCOM__QEMPTY) { if ( !swap) StoreData( ctx); } else { ini_mEvent new_event; qcom_sEvent *ep = (qcom_sEvent*) get.data; new_event.m = ep->mask; if (new_event.b.oldPlcStop && !swap) { swap = 1; errh_SetStatus( PWR__SRVRESTART); CloseTrendList( ctx); } else if (new_event.b.swapDone && swap) { swap = 0; sts = InitTrendList( ctx); errh_SetStatus( PWR__SRUN); errh_Info("Warm restart completed"); } else if (new_event.b.terminate) { exit(0); } } } else if ( !swap) StoreData( ctx); LastScan = NextScan; aproc_TimeStamp( ctx->scantime, 5.0); } return 1; }
int main (int argc, char ** argv) { pwr_tStatus sts; qcom_sQid my_q = qcom_cNQid; qcom_sGet get; errh_Init("pwr_linksup", errh_eAnix_linksup); errh_SetStatus( PWR__SRVSTARTUP); if (!qcom_Init(&sts, NULL, "pwr_linksup")) { errh_Error("qcom_Init, %m", sts); errh_SetStatus( PWR__SRVTERM); exit(sts); } sts = gdh_Init("pwr_linksup"); if (EVEN(sts)) { errh_Fatal("gdh_Init, %m", sts); errh_SetStatus( PWR__SRVTERM); exit(sts); } if (!qcom_CreateQ(&sts, &my_q, NULL, "events")) { errh_Fatal("qcom_CreateQ, %m", sts); errh_SetStatus( PWR__SRVTERM); exit(sts); } if (!qcom_Bind(&sts, &my_q, &qcom_cQini)) { errh_Fatal("qcom_Bind(Qini), %m", sts); errh_SetStatus( PWR__SRVTERM); exit(-1); } /* Wait for local nethandler to start */ while (EVEN(gdh_NethandlerRunning())) sleep(1); plc_UtlWaitForPlc(); LstIni(&node_l); LstIni(&timer_l); init_nodes(); if (!LstEmp(&node_l)) { list_state = eListState_Scan; } else { errh_Info("No nodes to supervise, exiting"); errh_SetStatus( pwr_cNStatus); exit(0); } errh_SetStatus( PWR__SRUN); for (;;) { scan_timers(); scan_nodes(); get.data = NULL; if (qcom_Get(&sts, &my_q, &get, cTimerTimeScan) != NULL) { if (get.type.b == qcom_eBtype_event) { event(&get); } else { errh_Info("unexpected message type, type: %d", get.type.b); } qcom_Free(&sts, get.data); } aproc_TimeStamp(((float)cTimerTimeScan)/1000, 5); } }
int main(int argc, char *argv[]) { remtrans_item *remtrans; unsigned char id[32]; unsigned char pname[32]; pwr_tStatus sts; int i; float time_since_scan = 0.0; /* Read arg number 2, should be id for this instance and id is our queue number */ if (argc >= 2) strcpy((char *)id, argv[1]); else strcpy((char *)id, "0"); /* Build process name with id */ sprintf((char *) pname, "rs_remwmq_%s", id); /* Init of errh */ errh_Init((char *) pname, errh_eAnix_remote); errh_SetStatus(PWR__SRVSTARTUP); /* Init of gdh */ if (debug) printf("Before gdh_init\n"); sts = gdh_Init((char *) pname); if ( EVEN(sts)) { errh_Fatal("gdh_Init, %m", sts); errh_SetStatus(PWR__SRVTERM); exit(sts); } /* Arg number 3 should be my remnodes objid in string representation, read it, convert to real objid and store in remnode_item */ sts = 0; if (argc >= 3) sts = cdh_StringToObjid(argv[2], &rn.objid); if ( EVEN(sts)) { errh_Fatal("cdh_StringToObjid, %m", sts); errh_SetStatus(PWR__SRVTERM); exit(sts); } /* Get pointer to RemnodeWMQ object and store locally */ sts = gdh_ObjidToPointer(rn.objid, (pwr_tAddress *) &rn_wmq); if ( EVEN(sts)) { errh_Fatal("cdh_ObjidToPointer, %m", sts); errh_SetStatus(PWR__SRVTERM); exit(sts); } /* Initialize some internal data and make standard remtrans init */ rn.next = NULL; rn.local = NULL; // We dont use local structure since we only have one remnode rn_wmq->ErrCount = 0; if (debug) printf("Before remtrans_init\n"); sts = RemTrans_Init(&rn); if ( EVEN(sts)) { errh_Fatal("RemTrans_Init, %m", sts); errh_SetStatus(PWR__SRVTERM); exit(sts); } /* Store remtrans objects objid in remnode_mq object */ remtrans = rn.remtrans; i = 0; while(remtrans) { rn_wmq->RemTransObjects[i++] = remtrans->objid; if ( i >= (int)(sizeof(rn_wmq->RemTransObjects) / sizeof(rn_wmq->RemTransObjects[0]))) break; remtrans = (remtrans_item *) remtrans->next; } /* Variables for MQ calls */ strncpy(mgr_name, rn_wmq->QueueManager, MQ_Q_MGR_NAME_LENGTH); // strncpy(mgr_name, "hejsanqqq", sizeof(MQ_Q_MGR_NAME_LENGTH)); /* Open queue for receiving messages */ strncpy(rcv_que_name, rn_wmq->RcvQueue, MQ_Q_NAME_LENGTH); // strncpy(rcv_que_name, "hejsanqqq", sizeof(MQ_Q_NAME_LENGTH)); /* Initialize object descriptor control block */ strncpy(RcvObjDesc.ObjectName, rcv_que_name, MQ_Q_NAME_LENGTH); /* open queue for input but not if MQM stopping */ RcvOpenOptions = MQOO_INPUT_AS_Q_DEF | MQOO_FAIL_IF_QUIESCING; /* Open queue for sending messages */ strncpy(snd_que_name, rn_wmq->SndQueue, MQ_Q_NAME_LENGTH); // strncpy(snd_que_name, "hejsanqqq", sizeof(MQ_Q_NAME_LENGTH)); /* Initialize object descriptor control block */ strncpy(SndObjDesc.ObjectName, snd_que_name, MQ_Q_NAME_LENGTH); /* open queue for output but not if MQM stopping */ SndOpenOptions = MQOO_OUTPUT | MQOO_FAIL_IF_QUIESCING; errh_SetStatus(PWR__SRUN); /* Connect and open */ sts = wmq_connectandopen(); /* Set (re)start time in remnode object */ time_GetTime(&rn_wmq->RestartTime); /* Loop forever */ while (!doomsday) { if (rn_wmq->Disable == 1) { errh_Fatal("Disabled, exiting"); errh_SetStatus(PWR__SRVTERM); exit(0); } aproc_TimeStamp(TIME_INCR, 5); RemoteSleep(TIME_INCR); time_since_scan += TIME_INCR; if (!connected) sts = wmq_connectandopen(); if (connected) { sts = wmq_receive(); if (time_since_scan >= rn_wmq->ScanTime) { sts = RemTrans_Cyclic(&rn, &wmq_send); time_since_scan = 0.0; } } } }
int main ( int argc, char **argv ) { pwr_tStatus sts; time_tClock wait_clock; qcom_sQid my_q = qcom_cNQid; qcom_sGet get; int tmo_ms = 0; // mcheck(memCheck); init(); if (!qcom_CreateQ(&sts, &my_q, NULL, "events")) { exit(sts); } if (!qcom_Bind(&sts, &my_q, &qcom_cQini)) { exit(-1); } gdbroot->db->log.b.tmon = 0; for (wait_clock = 0;;) { if (wait_clock != 0) { waitClock(wait_clock, &tmo_ms); } else { tmo_ms = 0; } #if defined OS_POSIX aproc_TimeStamp( ((float)tmo_ms)/1000, 5); get.data = NULL; qcom_Get(&sts, &my_q, &get, tmo_ms); if (sts != QCOM__TMO && sts != QCOM__QEMPTY) { if (get.type.b == qcom_eBtype_event) { event(&get); } qcom_Free(&sts, get.data); } #endif now_clock = time_Clock(NULL, NULL); if (now_clock < last_clock) { errh_Info("The uptime clock has wrapped"); toggleWrapped(); executeExpired(&wrap_lh, 1); } getNewTimers(); executeExpired(&timer_lh, 0); last_clock = now_clock; now_clock = time_Clock(NULL, NULL); getWaitClock(&wait_clock, last_clock); } }
int main(int argc, char** argv) { pwr_tStatus sts; io_tCtx io_ctx; float ctime = 1; pwr_sClass_EplHandler* plhp; pwr_tOid oid; int tmo; char mp[2000]; qcom_sGet get; qcom_sQattr qAttr; qcom_sQid qini; qcom_sQid qid = qcom_cNQid; if (argc > 1) { if (streq(argv[1], "-m")) { io_methods_print(); exit(0); } if (streq(argv[1], "-h")) { usage(); exit(0); } } // Make connection to error handler errh_Init("pwr_powerlink", errh_eAnix_powerlink); errh_SetStatus(PWR__SRVSTARTUP); if (!qcom_Init(&sts, 0, "pwr_powerlink")) { errh_Fatal("qcom_Init, %m", sts); exit(sts); } qAttr.type = qcom_eQtype_private; qAttr.quota = 100; if (!qcom_CreateQ(&sts, &qid, &qAttr, "events")) { errh_Fatal("qcom_CreateQ, %m", sts); exit(sts); } qini = qcom_cQini; if (!qcom_Bind(&sts, &qid, &qini)) { errh_Fatal("qcom_Bind(Qini), %m", sts); exit(-1); } // Make connection to realtime database sts = gdh_Init("rt_powerlink"); if (EVEN(sts)) { errh_Fatal("rt_powerlink aborted, gdh_Init failed\n%m", sts); errh_SetStatus(PWR__SRVTERM); exit(sts); } sts = gdh_GetClassList(pwr_cClass_Epl_CNServer, &oid); if (ODD(sts)) { system("rt_powerlink_cn &"); exit(0); } // Get Powerlink handler object sts = io_get_plhandler_object(&plhp, &oid); if (EVEN(sts)) { errh_SetStatus(0); errh_Info("rt_powerlink terminated, no EplHandler object found"); exit(sts); } // Create context and call init functions of all agent, // rack and cardobjects sts = io_init(io_mProcess_Powerlink, pwr_cNObjid, &io_ctx, 1, ctime); if (EVEN(sts)) { errh_SetStatus(PWR__SRVTERM); errh_Fatal("rt_powerlink aborted, io_init() failed\n%m", sts); exit(sts); } tmo = (plhp->CycleTime) * 1000; aproc_TimeStamp(plhp->CycleTime, 5.0); errh_SetStatus(PWR__SRUN); aproc_RegisterObject(oid); // Call IoAgentRead() IoAgentWrite() IoCardRead() IoCardWrite() // IoModuleRead() IoModuleWrite() forever for (;;) { get.maxSize = sizeof(mp); get.data = mp; qcom_Get(&sts, &qid, &get, tmo); if (sts == QCOM__TMO || sts == QCOM__QEMPTY) { sts = io_read(io_ctx); sts = io_write(io_ctx); aproc_TimeStamp(plhp->CycleTime, 5.0); } else { ini_mEvent new_event; qcom_sEvent* ep = (qcom_sEvent*)get.data; new_event.m = ep->mask; if (new_event.b.oldPlcStop) { // TODO } else if (new_event.b.swapDone) { // TODO } else if (new_event.b.terminate) { // io_close(io_ctx); exit(0); } } } }
int main () { pwr_tStatus sts; pwr_tObjid oid; qcom_sQid my_q = qcom_cNQid; qcom_sGet get; pwr_tBoolean firstTime = TRUE; pwr_tUInt32 nrOfEvents = 0; pwr_tUInt32 nrOfKeys = 0; errh_Init("pwr_elog", errh_eAnix_elog); errh_SetStatus( PWR__SRVSTARTUP); memset(&lHelCB, 0, sizeof(lHelCB)); /* Declare process */ sts = gdh_Init("pwr_elog"); If_Error_Log_Exit(sts, "gdh_Init"); Init(); /* Create queue for receival of events */ if (!qcom_CreateQ(&sts, &my_q, NULL, "events")) { errh_Fatal("qcom_CreateQ, %m", sts); errh_SetStatus( PWR__APPLTERM); exit(sts); } if (!qcom_Bind(&sts, &my_q, &qcom_cQini)) { errh_Fatal("qcom_Bind(Qini), %m", sts); errh_SetStatus( PWR__APPLTERM); exit(-1); } oid.vid = lHelCB.Nid; oid.oix = pwr_cNVolumeId; sts = mh_OutunitConnect( oid, mh_eOutunitType_Logger, mh_mOutunitFlags_ReadWait, (mh_cbOutunitAck)Insert, (mh_cbOutunitAlarm)Insert, (mh_cbOutunitBlock)Insert, (mh_cbOutunitCancel)Insert, NULL, NULL, (mh_cbOutunitInfo)Insert, (mh_cbOutunitReturn)Insert, NULL ); If_Error_Log_Exit(sts, "mh_OutunitConnect"); sts = mh_OutunitSetTimeout(lHelCB.ScanTime); errh_SetStatus( PWR__SRUN); for (;;) { sts = mh_OutunitReceive(); if (EVEN(sts) && sts != MH__TMO) Log_Error(sts, "mh_OutunitReceive"); Store(&firstTime, &nrOfEvents, &nrOfKeys); get.data = NULL; qcom_Get(&sts, &my_q, &get, 0); if (sts != QCOM__TMO && sts != QCOM__QEMPTY) { if (get.type.b == qcom_eBtype_event) { qcom_sEvent *ep = (qcom_sEvent*) get.data; ini_mEvent new_event; if (get.type.s == qcom_cIini) { new_event.m = ep->mask; if (new_event.b.terminate) { errh_SetStatus( PWR__APPLTERM); exit(0); } } } qcom_Free(&sts, get.data); } aproc_TimeStamp( lHelCB.ScanTime/1000, 5.0); } }
int main(int argc, char* argv[]) { remtrans_item* remtrans; unsigned char id[32]; unsigned char pname[32]; pwr_tStatus sts; int i; float time_since_scan = 0.0; /* Read arg number 2, should be id for this instance and id is our queue * number */ if (argc >= 2) strcpy((char*)id, argv[1]); else strcpy((char*)id, "0"); /* Build process name with id */ sprintf((char*)pname, "rs_remrabbitmq_%s", id); /* Init of errh */ errh_Init((char*)pname, errh_eAnix_remote); errh_SetStatus(PWR__SRVSTARTUP); /* Init of gdh */ if (debug) printf("Before gdh_init\n"); sts = gdh_Init((char*)pname); if (EVEN(sts)) { errh_Fatal("gdh_Init, %m", sts); errh_SetStatus(PWR__SRVTERM); exit(sts); } /* Arg number 3 should be my remnodes objid in string representation, read it, convert to real objid and store in remnode_item */ sts = 0; if (argc >= 3) sts = cdh_StringToObjid(argv[2], &rn.objid); if (EVEN(sts)) { errh_Fatal("cdh_StringToObjid, %m", sts); errh_SetStatus(PWR__SRVTERM); exit(sts); } /* Get pointer to RemnodeRabbitMQ object and store locally */ sts = gdh_ObjidToPointer(rn.objid, (pwr_tAddress*)&rn_rmq); if (EVEN(sts)) { errh_Fatal("cdh_ObjidToPointer, %m", sts); errh_SetStatus(PWR__SRVTERM); exit(sts); } if (streq(rn_rmq->ReceiveQueue, "") && streq(rn_rmq->SendQueue, "")) { errh_Fatal( "Process terminated, neither send or receive queue configured, %s", id); errh_SetStatus(PWR__SRVTERM); exit(sts); } /* Create context */ ctx = calloc(1, sizeof(*ctx)); ctx->op = rn_rmq; if (!streq(rn_rmq->ReceiveQueue, "")) ctx->is_consumer = 1; if (!streq(rn_rmq->SendQueue, "")) ctx->is_producer = 1; /* Initialize some internal data and make standard remtrans init */ rn.next = NULL; rn.local = NULL; // We dont use local structure since we only have one remnode rn_rmq->ErrCount = 0; if (debug) printf("Before remtrans_init\n"); sts = RemTrans_Init(&rn); if (EVEN(sts)) { errh_Fatal("RemTrans_Init, %m", sts); errh_SetStatus(PWR__SRVTERM); exit(sts); } /* Store remtrans objects objid in remnode_qcom object */ remtrans = rn.remtrans; i = 0; while (remtrans) { rn_rmq->RemTransObjects[i++] = remtrans->objid; if (i >= (int)(sizeof(rn_rmq->RemTransObjects) / sizeof(rn_rmq->RemTransObjects[0]))) break; remtrans = (remtrans_item*)remtrans->next; } /* Connect to rabbitmq broker */ sts = rmq_connect(); if (EVEN(sts)) { rmq_close(1); errh_Fatal("Process terminated, unable to connect to RabbitMQ, %s", id); errh_SetStatus(PWR__SRVTERM); exit(sts); } /* Set running status */ errh_SetStatus(PWR__SRUN); /* Set (re)start time in remnode object */ time_GetTime(&rn_rmq->RestartTime); /* Loop forever */ while (!doomsday) { if (rn_rmq->Disable == 1) { errh_Fatal("Disabled, exiting"); errh_SetStatus(PWR__SRVTERM); exit(0); } aproc_TimeStamp(TIME_INCR, 5); if (ctx->is_consumer) sts = rmq_receive(); else RemoteSleep(TIME_INCR); time_since_scan += TIME_INCR; if (time_since_scan >= rn_rmq->ScanTime) { if (ctx->is_producer) sts = RemTrans_Cyclic(&rn, &rmq_send); time_since_scan = 0.0; } } }
int main (int argc, char **argv) { pwr_tStatus sts = 1; io_tCtx io_ctx; io_tCtx io_ctx_swap; pwr_sClass_IOHandler *ihp; int swap_io; int close_io; int init_io; qcom_sQid qid = qcom_cNQid; int tmo; char mp[2000]; qcom_sGet get; pwr_tTime now; pwr_tTime next; pwr_tTime after; pwr_tDeltaTime cycle; lst_sEntry *csup_lh; int delay_action = 0; pwr_sNode *nodep; pwr_tBoolean old_emergency_break = 0; if ( argc > 1) { if ( strcmp( argv[1], "-m") == 0) { io_methods_print(); exit(0); } if ( strcmp( argv[1], "-h") == 0) { usage(); exit(0); } } ihp = init(&qid, &csup_lh, &nodep); plc_UtlWaitForPlc(); /* Prepare the swap context */ sts = io_init_swap(io_mProcess_IoComm, pwr_cNObjid, &io_ctx_swap, 1, ihp->CycleTimeBus); for (close_io = swap_io = 0, init_io = 1;;) { if (init_io) { double f; sts = io_init(io_mProcess_IoComm, pwr_cNObjid, &io_ctx, 1, ihp->CycleTimeBus); if ( ODD(sts)) errh_SetStatus( PWR__SRUN); #if defined(OS_ELN) ker$clear_event( &sts, io_comm_terminate); io_dioc_init(); io_dioc_start(); #endif init_io = 0; tmo = ihp->CycleTimeBus * 1000.; f = floor(ihp->CycleTimeBus); cycle.tv_sec = f; cycle.tv_nsec = (ihp->CycleTimeBus - f) * 1.0e9; cycle.tv_nsec++; time_GetTimeMonotonic(&next); time_Aadd(NULL, &next, &cycle); } get.maxSize = sizeof(mp); get.data = mp; qcom_Get(&sts,&qid, &get, tmo); if (sts == QCOM__TMO || sts == QCOM__QEMPTY) { if ( nodep->EmergBreakTrue && !old_emergency_break) sts = io_swap(io_ctx_swap, io_eEvent_IoCommEmergencyBreak); sts = io_read(io_ctx); if (EVEN(sts)) { ihp->IOReadWriteFlag = FALSE; errh_Error("IO read, %m", sts); } sts = io_write(io_ctx); if (EVEN(sts)) { ihp->IOReadWriteFlag = FALSE; errh_Error("IO write, %m", sts); } if ( nodep->EmergBreakTrue && !old_emergency_break) sts = io_swap(io_ctx, io_eEvent_EmergencyBreak); old_emergency_break = nodep->EmergBreakTrue; if (swap_io) { sts = io_swap(io_ctx_swap, io_eEvent_IoCommSwap); } io_ScanSupLst( io_ctx->SupCtx); time_GetTime(&now); time_GetTimeMonotonic(&after); next = after; time_Aadd(NULL, &next, &cycle); delay_action = csup_Exec(&sts, csup_lh, (pwr_tDeltaTime *) &next, (pwr_tDeltaTime *) &after, &now); if (delay_action == 2) ihp->IOReadWriteFlag = FALSE; aproc_TimeStamp(ihp->CycleTimeBus, 5); } else { ini_mEvent new_event; qcom_sEvent *ep = (qcom_sEvent*) get.data; new_event.m = ep->mask; if (new_event.b.oldPlcStop && !swap_io) { swap_io = 1; close_io = 1; errh_SetStatus(PWR__SRVRESTART); } else if (new_event.b.swapDone && swap_io) { swap_io = 0; init_io = 1; } else if (new_event.b.terminate) { exit(0); } if (close_io) { io_close(io_ctx); #if defined(OS_ELN) ker$signal( &sts, io_comm_terminate); #endif close_io = 0; } } } }