// t: Time, passed from PSIM by value // delt: Time step, passed from PSIM by value // in: input array, passed from PSIM by reference // out: output array, sent back to PSIM (Note: the values of out[*] can // be modified in PSIM) // The maximum length of the input and output array "in" and "out" is 30. // Las entradas del sistema son // in[0]= fr; Entrada de referencia (Escalón o Rampa) // in[1]= Vref; Variable de salida de la planta a controlar // in[2]= fs; Frecuencia muestreo #include "dll.h" #include // Coeficientes del controlador PD aproximado por Backward // Periodo de muestreo T = 0.012 seg. // GcBW = (Kc*z - zPD*Kc)/z #define Kc 8.992633333333334 #define zPDKc -8.333333333333334 // delt es el paso de simulación definido en PSIM // t es el vector de tiempo total definido en PSIM // in define la variable Entradas y out la variable Salidas void __declspec(dllexport) simuser (double t, double delt, double *in, double *out) { static double y=0; // variable controlada: Posicion angular static double uk=0, ukm1=0, ukm2=0; static double ek=0, ekm1=0, ekm2=0; static double ref; static double Ts; // Periodo de muestreo static double Fm; // Frecuencia de muestreo static double muestra=0; // Variable que representa el instante de muestreo y poder graficarla // Variables enteras static int contador=0, Ncont, calculo_u=1, muestreo=1, direccion = 1; // Se calcula el numero de conteos en un periodo: Valor máximo del contador //---------------------------------------------------------------------------------- // CÁLCULOS INICIALES //---------------------------------------------------------------------------------- Ts = 0.0120000000; // Periodo de muestreo // delt = 2.4e-6 (paso de simulación impuesto por PSIM) // Ncont debe ser entero // Ncont=T/2.40214e-6 = 5000 // T = 0.012000000000 seg. y fm = 83.333333333333329 Hz Ncont=Ts/delt; // 0.012000000/2.4e-6 = 5000 conteos muestra=0; // El conversor AD interrumpe a la CPU para realizar el muestreo y conversión if(muestreo==1) { muestreo=0; // Se realiza el muestreo de la variable controlada y = in[0]; // Llama a rutina de cálculo de la acción de control calculo_u=1; } if (calculo_u==1) { calculo_u=0; ref = in[1]; // Toma la referencia de PSIM /*********************************************************************************/ /* Se calcula el error entre la salida de la planta y la referencia */ /*********************************************************************************/ ek = ref - y; /*********************************************************************************/ /* Cálculo de la acción de control */ /*********************************************************************************/ // Se calcula el controlador PD aproximado por Backward // u(k) = Kc*e(k) - zPD*Kc*e(k-1); uk = Kc*ek + zPDKc*ekm1; // Calcula acción de control PD // Se actualizan los variables anteriores ekm1 = ek; } //termina el calculo de la acción de control //**********************************************************// // Incrementamos o decrementamos el contador segun corresponda // para sincronizar el muestreo de la variable controlada contador = contador + direccion; if (contador == 0) { direccion=1; muestreo=1; muestra=1; } if (contador == Ncont/2) { direccion=-1; muestreo=0; muestra=0; } // Se actualizan los valores a las salidas out[0] = uk; out[1] = ref; out[2] = y; out[3] = ek; out[4] = contador; out[5] = muestra*500; }