/*2013-01-18T16:21:52-01:00*/

/********************************************************************
 * variateur.c
 * 
 * generated by: plcgen 2.3.253
 ********************************************************************/

#include "cb_comp.h"
#include "iec_1131.h"

#include "variateur.h"



/**************************** Variables *****************************/

CB_Index variateur__num = 0;
CB_Mem_Bool *variateur_energie380;
CB_Mem_Bool *variateur_tensionCmd;
CB_Mem_Bool *variateur_tensionCpt;
CB_Mem_Bool *variateur_cmdAv;
CB_Mem_Float *variateur_consigne;
CB_Mem_Bool *variateur_retourAv;
CB_Mem_Bool *variateur_thermique;
CB_Mem_Float *variateur_valeurVitesse;
CB_Mem_Float *variateur_pourcentVitesse;
CB_Mem_Float *variateur_increment;
CB_Mem_Bool *variateur_memoAv;
CB_Mem_Bool *variateur_etatAv;
CB_Mem_Float *variateur_vitesseVisee;
CB_Mem_Float *variateur_vitNominale;
CB_Mem_Float *variateur_tempsNominale;
CB_Mem_Bool *variateur_logiqueThermique;
CB_Mem_Bool *variateur_logiqueRetourAv;
CB_Mem_Bool *variateur_d_electrique;
CB_Mem_Bool *variateur_v_d_electrique;
CB_Mem_Bool *variateur_d_RetourAv;
CB_Mem_Bool *variateur_v_d_RetourAv;
CB_Mem_Bool *variateur_d_blocage;
CB_Mem_Float *variateur_v_d_blocage;

/**************************** Variables *****************************/

#define energie380 (variateur_energie380->CB_current_value)
#define tensionCmd (variateur_tensionCmd->CB_current_value)
#define tensionCpt (variateur_tensionCpt->CB_current_value)
#define cmdAv (variateur_cmdAv->CB_current_value)
#define consigne (variateur_consigne->CB_current_value)
#define retourAv (variateur_retourAv->CB_current_value)
#define thermique (variateur_thermique->CB_current_value)
#define valeurVitesse (variateur_valeurVitesse->CB_current_value)
#define pourcentVitesse (variateur_pourcentVitesse->CB_current_value)
#define increment (variateur_increment->CB_current_value)
#define memoAv (variateur_memoAv->CB_current_value)
#define etatAv (variateur_etatAv->CB_current_value)
#define vitesseVisee (variateur_vitesseVisee->CB_current_value)
#define vitNominale (variateur_vitNominale->CB_current_value)
#define tempsNominale (variateur_tempsNominale->CB_current_value)
#define logiqueThermique (variateur_logiqueThermique->CB_current_value)
#define logiqueRetourAv (variateur_logiqueRetourAv->CB_current_value)
#define d_electrique (variateur_d_electrique->CB_current_value)
#define v_d_electrique (variateur_v_d_electrique->CB_current_value)
#define d_RetourAv (variateur_d_RetourAv->CB_current_value)
#define v_d_RetourAv (variateur_v_d_RetourAv->CB_current_value)
#define d_blocage (variateur_d_blocage->CB_current_value)
#define v_d_blocage (variateur_v_d_blocage->CB_current_value)


/************************ Components offsets ************************/


/********************* Initialization function **********************/

int _bibliotheque_epo__variateur_init(void)
{
	(variateur_energie380)->CB_current_value = 1; /*energie380*/
	(variateur_tensionCmd)->CB_current_value = 1; /*tensionCmd*/
	(variateur_tensionCpt)->CB_current_value = 1; /*tensionCpt*/
	(self.Float+2)->CB_current_value = 5000.0; /*vitNominale*/
	(self.Float+3)->CB_current_value = 0.5; /*tempsNominale*/
	(self.Bool+3)->CB_current_value = 1; /*logiqueRetourAv*/
	self.Bool+=9;
	self.Float+=5;


	return 0;
}


/************************ Behavior function *************************/

int bibliotheque_epo__variateur(void)
{
	if (exec_term_node(self_num)) {

		/*********************** Internals variables ************************/

		variateur_increment = self.Float+0;
		variateur_memoAv = self.Bool+0;
		variateur_etatAv = self.Bool+1;
		variateur_vitesseVisee = self.Float+1;
		variateur_vitNominale = self.Float+2;
		variateur_tempsNominale = self.Float+3;
		variateur_logiqueThermique = self.Bool+2;
		variateur_logiqueRetourAv = self.Bool+3;
		variateur_d_electrique = self.Bool+4;
		variateur_v_d_electrique = self.Bool+5;
		variateur_d_RetourAv = self.Bool+6;
		variateur_v_d_RetourAv = self.Bool+7;
		variateur_d_blocage = self.Bool+8;
		variateur_v_d_blocage = self.Float+4;

		/********************* Pre-conditions execution *********************/

		/*no Pre-conditions*/

		/************************ Behavior execution ************************/

		{
			/* -----------------------------------------------------------------	*/
			/* Type : Modèle de Comportement Opératif					*/
			/* Catégorie :  Preactionneurs - moteurs					*/
			/* Auteur : Techniques Nouvelles d'Informatique				*/
			/* Date de révision : Octobre 2002						*/
			/* -----------------------------------------------------------------	*/
			/* Ce module représente le comportement d'un moteur avec variateur	*/
			/*	 avec sa logique électrique de commande.				*/
			/* La consigne passée varie de -100% à +100 % 				*/
			/* -----------------------------------------------------------------	*/

			/* -----------------------------------------------------------------	*/
			/* Gestion des ordres de la Partie Commande				*/
			/*	s'il n'y a pas présence de la tension de commande, 		*/
			/*         les contacteurs ne comprennent pas les ordres.		*/
			/*	les contacteurs ne peuvent pas être actionnés en même		*/
			/*	   temps. La sécurite est mécanique.				*/
			/* -----------------------------------------------------------------	*/
			if (cmdAv && tensionCmd) memoAv = 1;
			if (!cmdAv || !tensionCmd || d_electrique) memoAv = 0;

			/* -----------------------------------------------------------------	*/
			/* Calcul de l'état passant des contacteurs				*/
			/* -----------------------------------------------------------------	*/
			etatAv= memoAv & energie380;

			/* -----------------------------------------------------------------	*/
			/* Gestion de la montée en vitesse						*/
			/* -----------------------------------------------------------------	*/
			if (d_blocage)  valeurVitesse = v_d_blocage;
			else {
				/* ----------------------------------------------------------	*/
				/* calcul de l'incrément de rotation en fonction de 		*/
				/* l'horloge de simulation 						*/
				/* ----------------------------------------------------------	*/
				if (tempsNominale > 0.0)
					increment = (vitNominale / tempsNominale) * (CLOCK_PERIOD/1000000.0);

				/* ----------------------------------------------------------	*/
				/* calcul du point a atteindre en fonction de la consigne 	*/
				/* ----------------------------------------------------------	*/
				if (etatAv && (consigne >= -100.0) &&  (consigne <= 100.0)) vitesseVisee = (consigne / 100.0) * vitNominale;
				if (! etatAv) vitesseVisee = 0.0;
				
				/* calcul de la valeur de la rampe */
				if ( valeurVitesse < vitesseVisee ) {
					valeurVitesse += increment;
					if (valeurVitesse > vitesseVisee)  valeurVitesse = vitesseVisee;
				}
				if ( valeurVitesse > vitesseVisee ) {
					valeurVitesse -= increment;
					if (valeurVitesse < vitesseVisee)  valeurVitesse = vitesseVisee;
				}
			}

			/* -----------------------------------------------------------------	*/
			/* Calcul du pourcentage entre vitesse courante et nominale		*/
			/* -----------------------------------------------------------------	*/
			if (vitNominale != 0.0) 
				pourcentVitesse = ((valeurVitesse/vitNominale)*100);

			/* -----------------------------------------------------------------	*/
			/* Gestion du Thermique							*/
			/* -----------------------------------------------------------------	*/
			if (d_electrique) thermique=v_d_electrique;
			else
				if (tensionCpt) thermique= ! logiqueThermique;
				else thermique=0;

			/* -----------------------------------------------------------------	*/
			/* Gestion des retours vers la Partie Commande				*/
			/*     si un défaut est demand'e, le retour contacteur prend la	*/
			/*         valeur du défaut.						*/
			/*	s'il n'y a pas présence de la tension d'alimentation des	*/
			/*         capteurs, le retour contacteur reste au repos.		*/
			/*     sinon, le retour contacteur renvoie la valeur de l'état	*/
			/*         combiné avec sa logique de cablage.				*/
			/* -----------------------------------------------------------------	*/
			if (d_RetourAv) retourAv=v_d_RetourAv;
			else
				if (tensionCpt) retourAv=(memoAv ^ ! logiqueRetourAv);
				else retourAv=0;


		}

		CB_post_bool(variateur_retourAv);
		CB_post_bool(variateur_thermique);
		CB_post_float(variateur_valeurVitesse);
		CB_post_float(variateur_pourcentVitesse);

		/******************** Post-conditions execution *********************/

		/*no Post-conditions*/
	}

	/*************************** self update ****************************/

	self.Bool += 9;
	self.Float += 5;

	return 0;
}

