/* ----------------------------------------------------------------------------- * applications.c * * iPDC - Phasor Data Concentrator * * Copyright (C) 2011-2012 Nitesh Pandit * Copyright (C) 2011-2012 Kedar V. Khandeparkar * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Authors: * Kedar V. Khandeparkar * * ----------------------------------------------------------------------------- */ #include #include #include #include /* fabs */ #include "parser.h" #include "global.h" #include "dallocate.h" #include "applications.h" /* ---------------------------------------------------------------------------- */ /* FUNCTION averageFrequency(): */ /* Computes average of frequency from all PMUs */ /* ---------------------------------------------------------------------------- */ float averageFrequency(struct data_frame *df) { //struct data_frame *df = TSB[index].first_data_frame; struct cfg_frame *temp_cfg = cfgfirst; struct data_frame *temp_df; float tempFreq = 0,avgFrequency; int noOfPMU,i,j,count = 0; pthread_mutex_lock(&mutex_cfg); while(temp_cfg != NULL){ noOfPMU = to_intconvertor(temp_cfg->num_pmu); count += noOfPMU; temp_cfg = temp_cfg->cfgnext; } for(i = 0;i<(count*10-100);i++) { temp_df = df; temp_cfg = cfgfirst; //printf("count = %d\n",count); while(temp_cfg != NULL){ noOfPMU = to_intconvertor(temp_cfg->num_pmu); if(temp_df != NULL) { for(j = 0;j < noOfPMU; j++) { //printf("a\n"); if(temp_cfg->pmu[j]->fmt->freq == '1') { tempFreq += decode_ieee_single(temp_df->dpmu[j]->freq); } else { tempFreq += to_intconvertor(temp_df->dpmu[j]->freq); } } temp_df = temp_df->dnext; } temp_cfg = temp_cfg->cfgnext; } } pthread_mutex_unlock(&mutex_cfg); avgFrequency = tempFreq/count; return avgFrequency; } /* ---------------------------------------------------------------------------- */ /* FUNCTION frequencyInstability(): */ /* Computes weighted average of frequency from some PMUs */ /* ---------------------------------------------------------------------------- */ /*int frequencyInstability(struct data_frame *df) { //struct data_frame *df = TSB[index].first_data_frame; struct cfg_frame *temp_cfg = cfgfirst; float tempFreq = 0,tempFc=0,totalFreq =0,totalHi=0; float timeDiff = 20*1e-3; float deltaFreq = 0; int noOfPMUs = 0,totalPMUs=0,j; while(temp_cfg != NULL){ totalPMUs += to_intconvertor(temp_cfg->num_pmu); temp_cfg = temp_cfg->cfgnext; } int generatorPMUs = (totalPMUs*ratio) + 2; // Considered 1/5*noofPMUs+2 frequencies int x = 0,*Hi; Hi = randomGenerator(minHi,maxHi,generatorPMUs); temp_cfg = cfgfirst; while(temp_cfg != NULL) { noOfPMUs = to_intconvertor(temp_cfg->num_pmu); if(df != NULL) { for(j=0;jpmu[j]->fmt->freq == '1') { if(x == generatorPMUs) break; tempFreq = decode_ieee_single(df->dpmu[j]->freq); totalFreq += Hi[x]*tempFreq; // Sum of Hi*fi (numerator) totalHi += Hi[x]; // Sum of Hi (denominator) x++; } else { if(x == generatorPMUs) break; tempFreq = to_intconvertor(df->dpmu[j]->freq); totalFreq += Hi[x]*tempFreq; // Sum of Hi*fi (numerator) totalHi += Hi[x]; // Sum of Hi (denominator) x++; } } df = df->dnext; } temp_cfg = temp_cfg->cfgnext; } free(Hi); if(fc == 0) { fc = totalFreq/totalHi; return 0; } else { tempFc = totalFreq/totalHi; deltaFreq = fabs(fc-tempFc)/timeDiff; /// Need to check deltaFreq < Threshold fc = tempFc; if(deltaFreq>delFThreshold) return 1; else return 0; } } */ /* ---------------------------------------------------------------------------- */ /* FUNCTION angleInstability(): */ /* Computes angular deviations from center of inertia */ /* ---------------------------------------------------------------------------- */ /*int angleInstability(struct data_frame *df) { //struct data_frame *df = TSB[index].first_data_frame struct cfg_frame *temp_cfg = cfgfirst; float totalPi,totalTheta,localAreaPi,*localAreaTheta; int totalPMUs,noOfPMU,noOfAreas,noOfPMUsInOneArea,tempTotalPMUs,*localAreaPowerSchedule,*individualPowerSchedule; noOfPMUsInOneArea = 5; totalPi= totalTheta =localAreaPi = 0; while(temp_cfg != NULL){ totalPMUs += to_intconvertor(temp_cfg->num_pmu); temp_cfg = temp_cfg->cfgnext; } tempTotalPMUs = totalPMUs; float tt; tt = (float)(totalPMUs*ratio)+2; // Number of areas eg 200*1/5+2 = 42 noOfAreas = nearbyint(tt/noOfPMUsInOneArea); // 42/5 = 8.4 int tt1 = (int)(noOfAreas); // 8 int rem = nearbyint(tt%noOfPMUsInOneArea); if(fabs(tt-tt1) >0) { //8.4 - 8 =0.4 noOfAreas++; // noOfAreas = 9 } localAreaTheta = malloc((noOfAreas + 1)*sizeof(float)); localAreaPowerSchedule = malloc((noOfAreas + 1)*sizeof(int)); individualPowerSchedule = randomGenerator(minPi,maxPi,tt); temp_cfg = cfgfirst; float tempAreaAngle,tempAreaPower; unsigned int phnmr,noOfPMUs,pType; int x,y,z,i,j; // x to track no of areas and y to track no of generators in those areas z for individual generator schedule i = j = x = y = z = 0; tempAreaPower = tempAreaAngle = 0; unsigned char *d,*fp_left,*fp_right,*fx_left,*fx_right,*phasorType,polar; fp_left = malloc(5*sizeof(unsigned char)); fp_right = malloc(5*sizeof(unsigned char)); fx_left = malloc(3*sizeof(unsigned char)); fx_right = malloc(3*sizeof(unsigned char)); phasorType = malloc(1*sizeof(unsigned char)); while(temp_cfg != NULL) { // Main Loop starts if(df != NULL) { noOfPMUs = to_intconvertor(temp_cfg->num_pmu); for(j = 0;j < noOfPMUs;j++) { phnmr = to_intconvertor(temp_cfg->pmu[j]->phnmr); if(phnmr != 0) { if(temp_cfg->pmu[j]->fmt->phasor == 1) { // Floating for(i = 0;ipmu[j]->phunit[i],1); pType = to_intconvertor1(phasorType); if((pType == 0)&&(i%3 ==0)) { // pTYpe = 0 indicates V and only phase I is chosen with the assumption that 3 phase data is sent d = df->dpmu[j]->phasors[i]; polar = temp_cfg->pmu[j]->fmt->polar; tempAreaAngle += (getVoltagePhasorAngle(1,fp_left,fp_right,d,polar,temp_cfg,i,j)) * individualPowerSchedule[z]; // 1 -> floating pt tempAreaPower += individualPowerSchedule[z]; z++; y++; if(y == rem && (x == noOfAreas - 1)) { localAreaTheta[x] = tempAreaAngle/tempAreaPower; x++; break; } else if(y == noOfPMUsInOneArea) { localAreaTheta[x] = tempAreaAngle/tempAreaPower; y = 0; x++; } } } } else { // fixed point for(i = 0;i < phnmr; i++){ copy_cbyc (phasorType,(unsigned char *)temp_cfg->pmu[j]->phunit[i],1); pType = to_intconvertor1(phasorType); if((pType == 0)&&(i%3 ==0)) { d = df->dpmu[j]->phasors[i]; polar = temp_cfg->pmu[j]->fmt->polar; tempAreaAngle += getVoltagePhasorAngle(0,fp_left,fp_right,d,polar,temp_cfg,i,j)* individualPowerSchedule[z]; // 0 -> fixed pt tempAreaPower += individualPowerSchedule[z]; z++; y++; if(y == rem && (x == noOfAreas - 1)) { localAreaTheta[x] = tempAreaAngle/tempAreaPower; localAreaPowerSchedule[x] = tempAreaPower; x++; break; } else if(y == noOfPMUsInOneArea) { localAreaTheta[x] = tempAreaAngle/tempAreaPower; localAreaPowerSchedule[x] = tempAreaPower; y = 0; x++; } } } } } } // if df ends df = df->dnext; } temp_cfg = temp_cfg->cfgnext; } // Main loop ends float centerAngle,totalPower; centerAngle = totalPower = 0; for (i = 0;i angleThreshold) violation[i] = '1'; else violation[i] = '0'; } free(violation); free(localAreaTheta); free(localAreaPowerSchedule); free(individualPowerSchedule); free(fp_right); free(fp_left); free(fx_right); free(fx_left); } */ /* ---------------------------------------------------------------------------- */ /* FUNCTION voltagePhasorAggregation(): */ /* Computes voltage phasor phasorAggregation */ /* ---------------------------------------------------------------------------- */ /*float voltagePhasorAggregation(struct data_frame *df) { //struct data_frame *df = TSB[index].first_data_frame; struct cfg_frame *temp_cfg = cfgfirst; int i,j,noOfPMUs,totalPMUs; totalPMUs = i = j = 0; while(temp_cfg != NULL){ totalPMUs += to_intconvertor(temp_cfg->num_pmu); temp_cfg = temp_cfg->cfgnext; } int generatorPMUs = (totalPMUs*ratio) + 4; temp_cfg = cfgfirst; unsigned int phnmr; char polar; float avgVoltageMagnitude = 0; unsigned char *d; int x = 0; unsigned char *fp_left,*fp_right,*fx_left,*fx_right,*phasorType; fp_left = malloc(5*sizeof(unsigned char)); fp_right = malloc(5*sizeof(unsigned char)); fx_left = malloc(3*sizeof(unsigned char)); fx_right = malloc(3*sizeof(unsigned char)); phasorType = malloc(1*sizeof(unsigned char)); int pType; while(temp_cfg != NULL){ // Main Loop starts if(df != NULL) { noOfPMUs = to_intconvertor(temp_cfg->num_pmu); for(j=0;jpmu[j]->phnmr); if(phnmr != 0) { if(temp_cfg->pmu[j]->fmt->phasor == 1) { // Floating for(i = 0;ipmu[j]->phunit[i],1); pType = to_intconvertor1(phasorType); if((pType == 0) && (i%3 == 0)) { d = df->dpmu[j]->phasors[i]; polar = temp_cfg->pmu[j]->fmt->polar; avgVoltageMagnitude += getPhasorVolageMagnitude(1,fp_left,fp_right,d,polar,temp_cfg,i,j); // 1 -> floating pt } } x++; if(x == generatorPMUs) break; } else { // fixed point for(i = 0;i < phnmr; i++){ copy_cbyc (phasorType,(unsigned char *)temp_cfg->pmu[j]->phunit[i],1); pType = to_intconvertor1(phasorType); if((pType == 0) && (i%3 == 0)) { d = df->dpmu[j]->phasors[i]; polar = temp_cfg->pmu[j]->fmt->polar; avgVoltageMagnitude += getPhasorVolageMagnitude(0,fp_left,fp_right,d,polar,temp_cfg,i,j); // 0 -> fixed pt } } x++; if(x == generatorPMUs) break; } } } df = df->dnext; } temp_cfg = temp_cfg->cfgnext; } // Main loop ends free(fp_right); free(fp_left); free(fx_right); free(fx_left); return avgVoltageMagnitude; } */ /* ---------------------------------------------------------------------------- */ /* FUNCTION randomGenerator(): */ /* num random numbers array generated between min to max */ /* ---------------------------------------------------------------------------- */ int * randomGenerator(int max,int min,int num) { int c =0,n,*coeff; coeff = malloc((num+1)*sizeof(int)); while(1) { n = rand()%max + min; if(n>=min && n<= max) { coeff[c] = n; c++; if(c == num) break; } } return coeff; } /* ---------------------------------------------------------------------------- */ /* FUNCTION getVoltagePhasorAngle(): */ /* get the phase angle */ /* ---------------------------------------------------------------------------- */ /*float getVoltagePhasorAngle(int format,char left[],char right[],unsigned char *d,char polar,struct cfg_frame *temp_cfg,int i,int j) { float fp_r,fp_i,fp_angle; unsigned int f_r,f_i; if(format == 1) { // format indicates fixed or floating point memset(left,'\0',5); memset(right,'\0',5); //d = df->dpmu[j]->phasors[i]; copy_cbyc (left,d,4); left[4] = '\0'; d += 4; copy_cbyc(right,d,4); right[4] = '\0'; d += 4; fp_r = decode_ieee_single(left); fp_i = decode_ieee_single(right); if(polar == '1') { // POLAR fp_angle = fp_i; } else { // rectangular fp_angle = atan2f(fp_i, fp_r); } } else { memset(left,'\0',3); memset(right,'\0',3); copy_cbyc (left,d,2); left[2] = '\0'; d += 2; copy_cbyc(right,d,2); right[2] = '\0'; d += 2; f_r = to_intconvertor(left); f_i = to_intconvertor(right); if(polar == '1') { // POLAR fp_angle = f_i*1e-4; // Angle is in 10^4 radians } else // RECTANGULAR { unsigned char *s = (unsigned char *)temp_cfg->pmu[j]->phunit[i]; s++; unsigned char *buf = malloc(4*sizeof(unsigned char)); copy_cbyc (buf,(unsigned char *)s,3); buf[3] = '\0'; unsigned long int l_phunit; l_phunit = to_long_int_convertor1(buf); l_phunit = l_phunit * 1e-5; fp_r = l_phunit *f_r; fp_i = l_phunit *f_i; fp_angle = atan2f(fp_i, fp_r); free(buf); } } return fp_angle; } */ /* ---------------------------------------------------------------------------- */ /* FUNCTION getPhasorVolageMagnitude(): */ /* get the phasor volage magnitude */ /* ---------------------------------------------------------------------------- */ /*float getPhasorVolageMagnitude(int format,char left[],char right[],unsigned char *d,char polar,struct cfg_frame *temp_cfg,int i,int j) { float fp_r,fp_i,fp_magnitude; unsigned int f_r,f_i; if(format == 1) { // format indicates fixed or floating point memset(left,'\0',5); memset(right,'\0',5); //d = df->dpmu[j]->phasors[i]; copy_cbyc (left,d,4); left[4] = '\0'; d += 4; copy_cbyc(right,d,4); right[4] = '\0'; d += 4; fp_r = decode_ieee_single(left); fp_i = decode_ieee_single(right); if(polar == '1') { // POLAR fp_magnitude = fp_r; } else { // rectangular fp_magnitude = sqrt(fp_i*fp_i + fp_r*fp_r); } } else { memset(left,'\0',3); memset(right,'\0',3); copy_cbyc (left,d,2); left[2] = '\0'; d += 2; copy_cbyc(right,d,2); right[2] = '\0'; d += 2; f_r = to_intconvertor(left); f_i = to_intconvertor(right); unsigned char *s = (unsigned char *)temp_cfg->pmu[j]->phunit[i]; s++; unsigned char *buf = malloc(4*sizeof(unsigned char)); copy_cbyc (buf,(unsigned char *)s,3); buf[3] = '\0'; unsigned long int l_phunit; l_phunit = to_long_int_convertor1(buf); l_phunit = l_phunit * 1e-5; free(buf); if(polar == '1') { // POLAR fp_magnitude = f_r*l_phunit; } else // RECTANGULAR { fp_r = l_phunit *f_r; fp_i = l_phunit *f_i; fp_magnitude = sqrt(fp_i*fp_i + fp_r*fp_r); } } return fp_magnitude; } */ /* ---------------------------------------------------------------------------- */ /* FUNCTION outOfStepDetection(): */ /* angle deviations */ /* ---------------------------------------------------------------------------- */ /*float outOfStepDetection(struct data_frame *df) { //struct data_frame *df = TSB[index].first_data_frame; struct cfg_frame *temp_cfg = cfgfirst; int i,j,noOfPMUs,totalPMUs; totalPMUs = i = j = 0; while(temp_cfg != NULL){ totalPMUs += to_intconvertor(temp_cfg->num_pmu); temp_cfg = temp_cfg->cfgnext; } int generatorPMUs = (totalPMUs*ratio); if(generatorPMUs%2 == 1) generatorPMUs +=1; temp_cfg = cfgfirst; if(OOSTD == '0') { delta = malloc((generatorPMUs+1)*sizeof(float)); if(delta == NULL) printf("no memory for delta\n"); slipFreuency = malloc((generatorPMUs+1)*sizeof(float)); if(slipFreuency == NULL) printf("no memory for slipFreuency\n"); OOSTD = '1'; } unsigned int phnmr; char polar; float phasorAngle = 0; unsigned char *d; int x = 0; unsigned char *fp_left,*fp_right,*fx_left,*fx_right,*phasorType; fp_left = malloc(5*sizeof(unsigned char)); fp_right = malloc(5*sizeof(unsigned char)); fx_left = malloc(3*sizeof(unsigned char)); fx_right = malloc(3*sizeof(unsigned char)); phasorType = malloc(1*sizeof(unsigned char)); int pType; while(temp_cfg != NULL){ // Main Loop starts if(df != NULL) { noOfPMUs = to_intconvertor(temp_cfg->num_pmu); for(j=0;jpmu[j]->phnmr); if(phnmr != 0) { if(temp_cfg->pmu[j]->fmt->phasor == 1) { // Floating for(i = 0;ipmu[j]->phunit[i],1); pType = to_intconvertor1(phasorType); if((pType == 0) && (i%3 == 0)) { d = df->dpmu[j]->phasors[i]; polar = temp_cfg->pmu[j]->fmt->polar; phasorAngle = getVoltagePhasorAngle(1,fp_left,fp_right,d,polar,temp_cfg,i,j); // 1 -> floating pt } } x++; if(x == generatorPMUs) break; } else { // fixed point for(i = 0;i < phnmr; i++){ copy_cbyc (phasorType,(unsigned char *)temp_cfg->pmu[j]->phunit[i],1); pType = to_intconvertor1(phasorType); if((pType == 0) && (i%3 == 0)) { d = df->dpmu[j]->phasors[i]; polar = temp_cfg->pmu[j]->fmt->polar; phasorAngle = getVoltagePhasorAngle(0,fp_left,fp_right,d,polar,temp_cfg,i,j); // 0 -> fixed pt } } x++; if(x == generatorPMUs) break; } } } df = df->dnext; } temp_cfg = temp_cfg->cfgnext; } // Main loop ends free(fp_right); free(fp_left); free(fx_right); free(fx_left); return 0; }*/