static pwr_tStatus InitTrendList( trend_tCtx ctx) { pwr_tStatus sts; pwr_tUInt32 dummy; pwr_tTypeId type; int tix; pwr_tAttrRef aref; pwr_tAttrRef oaref; pwr_tAName name; pwr_tDisableAttr disabled; /* Init DsTrend objects */ /* Scan through typelist and insert valid objects in list and initiate */ /* the DsTrend objects. */ for ( sts = gdh_GetClassListAttrRef(pwr_cClass_DsTrend, &aref); ODD(sts); sts = gdh_GetNextAttrRef( pwr_cClass_DsTrend, &aref, &aref) ) { trend_sListEntry *ep; pwr_sClass_DsTrend *o; sts = gdh_AttrrefToName( &aref, name, sizeof(name), cdh_mNName); if (EVEN(sts)) continue; /* Check if parent object is disabled */ sts = gdh_AttrArefToObjectAref( &aref, &oaref); if ( ODD(sts)) { sts = gdh_ArefDisabled( &oaref, &disabled); if ( ODD(sts) && disabled) continue; } ep = calloc(1, sizeof(*ep)); if (ep == NULL) { errh_CErrLog(DS__ERRALLOC, NULL); errh_SetStatus( PWR__SRVTERM); exit(DS__ERRALLOC); } sts = gdh_RefObjectInfo(name, (pwr_tAddress *)&ep->o, &ep->o_subid, sizeof(*ep->o)); if (EVEN(sts)) { errh_Error("Couldn't get subscription for '%s'\n%m", name, sts); free(ep); continue; } o = ep->o; /* Set init values */ o->BufferStatus[0] = 1; o->BufferStatus[1] = 1; o->NoOfBuffers = 2; o->NoOfBufElement = 239; /* Initiate DsTrend object, sampled attribute must be on local node */ sts = gdh_DLRefObjectInfoAttrref((pwr_sAttrRef *)&o->DataName, (pwr_tAddress *)&o->DataPointer, &o->DataSubId); if (EVEN(sts)) { if ( sts == GDH__RTDBNULL && IsDisabled( &o->DataName)) continue; errh_Error("Couldn't get direct link to %s's attribute DataName\n%m", name, sts); gdh_UnrefObjectInfo(ep->o_subid); free(ep); continue; } sts = gdh_GetAttributeCharAttrref((pwr_sAttrRef *)&o->DataName, &type, &dummy, &dummy, &dummy); if (EVEN(sts)) { errh_Error("Couldn't get datatype for %s's attribute DataName\n%m", name, sts); gdh_UnrefObjectInfo(ep->o_subid); free(ep); continue; } tix = cdh_TypeIdToIndex(type); if (!IsValidType(tix)) { errh_Error("No valid datatype for %s's attribute DataName\n%m", name, DS__ERRTYPE); gdh_UnrefObjectInfo(ep->o_subid); free(ep); continue; } o->DataType = tix; if ( o->Multiple == 0) o->Multiple = 1; o->NoOfSample = (o->StorageTime * ctx->scantime) / o->Multiple; if(o->NoOfSample > o->NoOfBufElement) o->NoOfSample = o->NoOfBufElement; o->ScanTime = ctx->scantime; ep->next = ctx->o_list; ctx->o_list = ep; } /* Init DsTrendCurve objects */ /* Scan through typelist and insert valid objects in list and initiate the DsTrend objects. */ for (sts = gdh_GetClassListAttrRef(pwr_cClass_DsTrendCurve, &aref); ODD(sts); sts = gdh_GetNextAttrRef( pwr_cClass_DsTrendCurve, &aref, &aref) ) { trend_sListEntryTC *ep; pwr_sClass_DsTrendCurve *o; int i; int found; sts = gdh_AttrrefToName( &aref, name, sizeof(name), cdh_mNName); if (EVEN(sts)) continue; /* Check if parent object is disabled */ sts = gdh_AttrArefToObjectAref( &aref, &oaref); if ( ODD(sts)) { sts = gdh_ArefDisabled( &oaref, &disabled); if ( ODD(sts) && disabled) continue; } ep = calloc(1, sizeof(*ep)); if (ep == NULL) { errh_CErrLog(DS__ERRALLOC, NULL); errh_SetStatus( PWR__SRVTERM); exit(DS__ERRALLOC); } ep->first_scan = 1; sts = gdh_RefObjectInfo(name, (pwr_tAddress *)&ep->o, &ep->o_subid, sizeof(*ep->o)); if (EVEN(sts)) { errh_Error("Couldn't get subscription for '%s'\n%m", name, sts); free(ep); continue; } o = ep->o; if ( o->Function & 1) { /* Data stored by user */ gdh_UnrefObjectInfo(ep->o_subid); free(ep); continue; } ep->multiple = (int) (o->ScanTime / ctx->scantime_tc + 0.5); o->NoOfSample = (int) (o->StorageTime / ctx->scantime_tc * ep->multiple + 0.5); /* Initiate DsTrendCuve object, sampled attribute must be on local node */ found = 0; for ( i = 0; i < 10; i++) { if ( cdh_ObjidIsNull( o->Attribute[i].Objid)) continue; /* Link to attribute */ sts = gdh_DLRefObjectInfoAttrref((pwr_sAttrRef *)&o->Attribute[i], (pwr_tAddress *)&ep->datap[i], &ep->data_subid[i]); if (EVEN(sts)) { if ( sts == GDH__RTDBNULL && IsDisabled( &o->Attribute[i])) continue; errh_Error("Couldn't get direct link to %s's attribute %d, %m", name, i+1, sts); ep->datap[i] = 0; continue; } sts = gdh_GetAttributeCharAttrref((pwr_sAttrRef *)&o->Attribute[i], &type, &dummy, &dummy, &dummy); if (EVEN(sts)) { errh_Error("Couldn't get datatype for %s's attribute DataName\n%m", name, sts); gdh_UnrefObjectInfo(ep->data_subid[i]); ep->datap[i] = 0; continue; } tix = cdh_TypeIdToIndex(type); ep->data_size[i] = cdh_TypeToSize( type); if (!IsValidType(tix)) { errh_Error("No valid datatype for %s's attribute DataName\n%m", name, DS__ERRTYPE); gdh_UnrefObjectInfo(ep->data_subid[i]); ep->datap[i] = 0; continue; } o->AttributeType[i] = type; /* Link to buffer */ sts = gdh_DLRefObjectInfoAttrref((pwr_sAttrRef *)&o->Buffers[i], (pwr_tAddress *)&ep->buffheadp[i], &ep->buff_subid[i]); if (EVEN(sts)) { errh_Error("Couldn't get direct link to %s's buffer %d, %m", name, i+1, sts); gdh_UnrefObjectInfo(ep->data_subid[i]); ep->datap[i] = 0; continue; } ep->buffp[i] = (char *)ep->buffheadp[i] + pwr_AlignLW(sizeof(pwr_sClass_CircBuffHeader)); /* Get buffer size */ sts = gdh_GetAttributeCharAttrref( &o->Buffers[i], 0, &ep->buff_size[i], 0, 0); if ( EVEN(sts)) return sts; ep->buff_size[i] -= pwr_AlignLW(sizeof(pwr_sClass_CircBuffHeader)); found = 1; } if ( !found) { errh_Error("No valid attributes for %s", name); gdh_UnrefObjectInfo(ep->o_subid); free(ep); continue; } /* Link to time buffer */ if ( cdh_ObjidIsNotNull( o->TimeBuffer.Objid)) { sts = gdh_DLRefObjectInfoAttrref((pwr_sAttrRef *)&o->TimeBuffer, (pwr_tAddress *)&ep->timeheadp, &ep->timebuff_subid); if (EVEN(sts)) { errh_Error("Couldn't get direct link to %s's time buffer, %m", name, sts); ep->timeheadp = 0; ep->timebuffp = 0; } else ep->timebuffp = (char *)ep->timeheadp + pwr_AlignLW(sizeof(pwr_sClass_CircBuffHeader)); if ( o->TimeResolution == pwr_eTimeResolutionEnum_Nanosecond) ep->time_size = 8; else ep->time_size = 4; /* Get buffer size */ sts = gdh_GetAttributeCharAttrref( &o->TimeBuffer, 0, &ep->timebuff_size, 0, 0); if ( EVEN(sts)) return sts; ep->timebuff_size -= pwr_AlignLW(sizeof(pwr_sClass_CircBuffHeader)); } /* Calculate number of samples */ for ( i = 0; i < 10; i++) { if ( !ep->datap[i]) continue; if ( o->NoOfSample > ep->buff_size[i] / ep->data_size[i]) o->NoOfSample = ep->buff_size[i] / ep->data_size[i]; } if ( ep->timebuffp) { if ( o->NoOfSample > ep->timebuff_size / ep->time_size) o->NoOfSample = ep->timebuff_size / ep->time_size; } for ( i = 0; i < 10; i++) { if ( !ep->datap[i]) continue; ep->buffheadp[i]->Size = o->NoOfSample; ep->buffheadp[i]->ElementSize = ep->data_size[i]; } if ( ep->timebuffp) { ep->timeheadp->Size = o->NoOfSample; ep->timeheadp->ElementSize = ep->time_size; } ep->next = ctx->o_list_tc; ctx->o_list_tc = ep; } if ( ctx->o_list == NULL && ctx->o_list_tc == NULL) return DS__NOOBJECT; else return DS__SUCCESS; }
void CompOnOffBurnerFo_exec( plc_sThread *tp, pwr_sClass_CompOnOffBurnerFo *o) { pwr_sClass_CompOnOffBurner *co = (pwr_sClass_CompOnOffBurner *) o->PlcConnectP; pwr_sClass_CompOnOffZoneFo *zono; pwr_sClass_CompOnOffZone *zonco; pwr_tFloat32 Cnt; zono = (pwr_sClass_CompOnOffZoneFo *) ((char *)o->InP - (sizeof(pwr_sClass_CompOnOffZoneFo) - pwr_AlignLW(sizeof(pwr_tFloat32)))); zonco = (pwr_sClass_CompOnOffZone *)zono->PlcConnectP; if ( !co || !zonco) return; co->Executing = zonco->Executing; if ( !co->Executing) { o->Status = co->Status = 0; co->BrTime = 0; co->TrendStatus = (pwr_tFloat32) co->Number; return; } if ( zonco->CycleCount < 0.5) co->OnDetected = 0; if ( (co->PulseOn && co->BrTime < zonco->BurnerTimeMinOn) || (!co->PulseOn && co->BrTime < zonco->BurnerTimeMinOff)) { co->BrTime += *o->ScanTime; return; } if ( co->ManMode && co->OpMan) { if ( (o->Status && !co->ManStatus) || (!o->Status && co->ManStatus)) co->BrTime = 0; o->Status = co->Status = co->ManStatus; co->TrendStatus = (pwr_tFloat32) co->Number + 0.8 * (co->Status ? 1 : 0); co->BrTime += *o->ScanTime; return; } else co->ManStatus = 0; if ( zonco->PauseMode) co->PulseTime = zonco->BurnerTimeMinOff; else co->PulseTime = zonco->BurnerTimeMinOn; Cnt = zonco->CycleCount - 100.0 * co->Number / zonco->NumberOfBurners; if ( Cnt < 0) Cnt += 100; if ( zonco->PauseMode) co->OffCnt = co->PulseTime / zonco->CycleTime * 100; else co->OffCnt = (zonco->CycleTime - co->PulseTime) / zonco->CycleTime * 100; if ( Cnt >= 0 && Cnt < co->OffCnt && !co->Status) { // Turn on co->OnDetected = 1; co->Status = 1; co->BrTime = 0; } else if ( Cnt >= co->OffCnt && co->Status) { // Turn off co->Status = 0; co->BrTime = 0; } co->BrTime += *o->ScanTime; co->TrendStatus = (pwr_tFloat32) co->Number + 0.8 * (co->Status ? 1 : 0); o->Status = co->Status; }
static int graph_object_dx( Graph *graph, pwr_sAttrRef *arp) { int sts; graph_sObjectDx *od; pwr_tAttrRef aref, chanaref; pwr_tAName aname; pwr_tCid card_cid; od = (graph_sObjectDx *) calloc( 1, sizeof(graph_sObjectDx)); graph->graph_object_data = (void *) od; graph->graph_object_close = graph_object_dx_close; sts = gdh_GetAttrRefTid( arp, &od->cid); if ( EVEN(sts)) return sts; // Get channel object sts = gdh_ArefANameToAref( arp, "SigChanCon", &aref); if ( EVEN(sts)) { // Dv object, register scan function and return with success graph->graph_object_scan = graph_object_dx_scan; return 1; } sts = gdh_GetObjectInfoAttrref( &aref, &chanaref, sizeof(chanaref)); if ( EVEN(sts)) return sts; od->local_conv_p = (pwr_tBoolean *) graph->localdb_ref_or_create( "ConversionOn", pwr_eType_Boolean); od->local_inv_p = (pwr_tBoolean *) graph->localdb_ref_or_create( "InvertOn", pwr_eType_Boolean); od->local_test_p = (pwr_tBoolean *) graph->localdb_ref_or_create( "TestOn", pwr_eType_Boolean); // Get card object if ( chanaref.Flags.b.ObjectAttr) { sts = gdh_GetObjectClass( chanaref.Objid, &card_cid); if ( EVEN(sts)) return sts; } else card_cid = 0; switch ( card_cid) { case pwr_cClass_Ssab_DI32D: { pwr_tAName card_name; unsigned int chan_idx = (chanaref.Offset - pwr_AlignLW(sizeof(pwr_sClass_Ssab_BaseDiCard))) / pwr_AlignLW(sizeof(pwr_sClass_ChanDi)); sts = gdh_ObjidToName( chanaref.Objid, card_name, sizeof(card_name), cdh_mNName); if ( EVEN(sts)) return sts; if ( chan_idx < 16) { strcpy( aname, card_name); strcat( aname, ".ConvMask1"); graph->ref_object_info( glow_eCycle_Slow, aname, (void **)&od->conv_p, &od->conv_subid, sizeof(pwr_tBoolean), 0, true); strcpy( aname, card_name); strcat( aname, ".InvMask1"); graph->ref_object_info( glow_eCycle_Slow, aname, (void **)&od->inv_p, &od->inv_subid, sizeof(pwr_tBoolean), 0, true); od->mask = 1 << chan_idx; } else if ( chan_idx < 32) { strcpy( aname, card_name); strcat( aname, ".ConvMask2"); graph->ref_object_info( glow_eCycle_Slow, aname, (void **)&od->conv_p, &od->conv_subid, sizeof(pwr_tBoolean), 0, true); strcpy( aname, card_name); strcat( aname, ".InvMask2"); graph->ref_object_info( glow_eCycle_Slow, aname, (void **)&od->inv_p, &od->inv_subid, sizeof(pwr_tBoolean), 0, true); od->mask = 1 << (chan_idx - 16); } else return 0; break; } case pwr_cClass_Ssab_DO32DKS: case pwr_cClass_Ssab_DO32DKS_Stall: { pwr_tAName card_name; unsigned int chan_idx = (chanaref.Offset - pwr_AlignLW(sizeof(pwr_sClass_Ssab_BaseDoCard))) / pwr_AlignLW(sizeof(pwr_sClass_ChanDo)); sts = gdh_ObjidToName( chanaref.Objid, card_name, sizeof(card_name), cdh_mNName); if ( EVEN(sts)) return sts; if ( chan_idx < 16) { strcpy( aname, card_name); strcat( aname, ".TestMask1"); graph->ref_object_info( glow_eCycle_Slow, aname, (void **)&od->test_p, &od->test_subid, sizeof(pwr_tBoolean), 0, true); strcpy( aname, card_name); strcat( aname, ".InvMask1"); graph->ref_object_info( glow_eCycle_Slow, aname, (void **)&od->inv_p, &od->inv_subid, sizeof(pwr_tBoolean), 0, true); od->mask = 1 << chan_idx; } else if ( chan_idx < 32) { strcpy( aname, card_name); strcat( aname, ".TestMask2"); graph->ref_object_info( glow_eCycle_Slow, aname, (void **)&od->test_p, &od->test_subid, sizeof(pwr_tBoolean), 0, true); strcpy( aname, card_name); strcat( aname, ".InvMask2"); graph->ref_object_info( glow_eCycle_Slow, aname, (void **)&od->inv_p, &od->inv_subid, sizeof(pwr_tBoolean), 0, true); od->mask = 1 << (chan_idx - 16); } else return 0; if ( od->local_conv_p) *od->local_conv_p = 1; break; } default: { pwr_tAName chan_name; sts = gdh_AttrrefToName( &chanaref, chan_name, sizeof(chan_name), cdh_mNName); if ( ODD(sts)) { if ( od->cid == pwr_cClass_Di) { strcpy( aname, chan_name); strcat( aname, ".ConversionOn"); graph->ref_object_info( glow_eCycle_Slow, aname, (void **)&od->conv_p, &od->conv_subid, sizeof(pwr_tBoolean), 0, true); } strcpy( aname, chan_name); strcat( aname, ".InvertOn"); graph->ref_object_info( glow_eCycle_Slow, aname, (void **)&od->inv_p, &od->inv_subid, sizeof(pwr_tBoolean), 0, true); if ( od->cid == pwr_cClass_Do) { strcpy( aname, chan_name); strcat( aname, ".TestOn"); graph->ref_object_info( glow_eCycle_Slow, aname, (void **)&od->test_p, &od->test_subid, sizeof(pwr_tBoolean), 0, true); if ( od->local_conv_p) *od->local_conv_p = 1; } } } } // Register scan function graph->graph_object_scan = graph_object_dx_scan; return 1; }