/*2013-01-18T16:22:01-01:00*/

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

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

#include "pompe_ana.h"



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

CB_Index pompe_ana__num = 0;
CB_Mem_Bool *pompe_ana_energie380;
CB_Mem_Bool *pompe_ana_tensionCmd;
CB_Mem_Bool *pompe_ana_tensionCpt;
CB_Mem_Bool *pompe_ana_cmdMarche;
CB_Mem_Float *pompe_ana_consigne;
CB_Mem_Float *pompe_ana_debitEntree;
CB_Mem_Bool *pompe_ana_retourMarche;
CB_Mem_Bool *pompe_ana_thermique;
CB_Mem_Float *pompe_ana_valeurVitesse;
CB_Mem_Float *pompe_ana_debitSortie;
CB_Mem_Float *pompe_ana_increment;
CB_Mem_Bool *pompe_ana_etatAv;
CB_Mem_Float *pompe_ana_unite;
CB_Mem_Float *pompe_ana_vitesseVisee;
CB_Mem_Float *pompe_ana_tempsNominal;
CB_Mem_Bool *pompe_ana_logiqueThermique;
CB_Mem_Bool *pompe_ana_logiqueRetourMarche;
CB_Mem_Float *pompe_ana_vitNominale;
CB_Mem_Float *pompe_ana_debitMaxi;
CB_Mem_Bool *pompe_ana_debitEnHeure;
CB_Mem_Bool *pompe_ana_debitEnMinute;
CB_Mem_Bool *pompe_ana_d_electrique;
CB_Mem_Bool *pompe_ana_v_d_electrique;
CB_Mem_Bool *pompe_ana_d_retourContacteur;
CB_Mem_Bool *pompe_ana_v_d_retourContacteur;
CB_Mem_Bool *pompe_ana_d_blocage;
CB_Mem_Float *pompe_ana_v_d_blocage;
CB_Mem_Bool *pompe_ana_d_debit;
CB_Mem_Float *pompe_ana_v_d_debit;

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

#define energie380 (pompe_ana_energie380->CB_current_value)
#define tensionCmd (pompe_ana_tensionCmd->CB_current_value)
#define tensionCpt (pompe_ana_tensionCpt->CB_current_value)
#define cmdMarche (pompe_ana_cmdMarche->CB_current_value)
#define consigne (pompe_ana_consigne->CB_current_value)
#define debitEntree (pompe_ana_debitEntree->CB_current_value)
#define retourMarche (pompe_ana_retourMarche->CB_current_value)
#define thermique (pompe_ana_thermique->CB_current_value)
#define valeurVitesse (pompe_ana_valeurVitesse->CB_current_value)
#define debitSortie (pompe_ana_debitSortie->CB_current_value)
#define increment (pompe_ana_increment->CB_current_value)
#define etatAv (pompe_ana_etatAv->CB_current_value)
#define unite (pompe_ana_unite->CB_current_value)
#define vitesseVisee (pompe_ana_vitesseVisee->CB_current_value)
#define tempsNominal (pompe_ana_tempsNominal->CB_current_value)
#define logiqueThermique (pompe_ana_logiqueThermique->CB_current_value)
#define logiqueRetourMarche (pompe_ana_logiqueRetourMarche->CB_current_value)
#define vitNominale (pompe_ana_vitNominale->CB_current_value)
#define debitMaxi (pompe_ana_debitMaxi->CB_current_value)
#define debitEnHeure (pompe_ana_debitEnHeure->CB_current_value)
#define debitEnMinute (pompe_ana_debitEnMinute->CB_current_value)
#define d_electrique (pompe_ana_d_electrique->CB_current_value)
#define v_d_electrique (pompe_ana_v_d_electrique->CB_current_value)
#define d_retourContacteur (pompe_ana_d_retourContacteur->CB_current_value)
#define v_d_retourContacteur (pompe_ana_v_d_retourContacteur->CB_current_value)
#define d_blocage (pompe_ana_d_blocage->CB_current_value)
#define v_d_blocage (pompe_ana_v_d_blocage->CB_current_value)
#define d_debit (pompe_ana_d_debit->CB_current_value)
#define v_d_debit (pompe_ana_v_d_debit->CB_current_value)


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


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

int _bibliotheque_epo__pompe_ana_init(void)
{
	(pompe_ana_energie380)->CB_current_value = 1; /*energie380*/
	(pompe_ana_tensionCmd)->CB_current_value = 1; /*tensionCmd*/
	(pompe_ana_tensionCpt)->CB_current_value = 1; /*tensionCpt*/
	(self.Float+3)->CB_current_value = 2.0; /*tempsNominal*/
	(self.Bool+2)->CB_current_value = 1; /*logiqueRetourMarche*/
	(self.Float+4)->CB_current_value = 3600.0; /*vitNominale*/
	(self.Float+5)->CB_current_value = 10000.0; /*debitMaxi*/
	(self.Bool+3)->CB_current_value = 1; /*debitEnHeure*/
	self.Bool+=11;
	self.Float+=8;


	return 0;
}


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

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

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

		pompe_ana_increment = self.Float+0;
		pompe_ana_etatAv = self.Bool+0;
		pompe_ana_unite = self.Float+1;
		pompe_ana_vitesseVisee = self.Float+2;
		pompe_ana_tempsNominal = self.Float+3;
		pompe_ana_logiqueThermique = self.Bool+1;
		pompe_ana_logiqueRetourMarche = self.Bool+2;
		pompe_ana_vitNominale = self.Float+4;
		pompe_ana_debitMaxi = self.Float+5;
		pompe_ana_debitEnHeure = self.Bool+3;
		pompe_ana_debitEnMinute = self.Bool+4;
		pompe_ana_d_electrique = self.Bool+5;
		pompe_ana_v_d_electrique = self.Bool+6;
		pompe_ana_d_retourContacteur = self.Bool+7;
		pompe_ana_v_d_retourContacteur = self.Bool+8;
		pompe_ana_d_blocage = self.Bool+9;
		pompe_ana_v_d_blocage = self.Float+6;
		pompe_ana_d_debit = self.Bool+10;
		pompe_ana_v_d_debit = self.Float+7;

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

		/*no Pre-conditions*/

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

		{
			/* -----------------------------------------------------------------	*/
			/* Type : Modèle de Comportement Opératif					*/
			/* Catégorie :  Associations - batch					*/
			/* Auteur : Techniques Nouvelles d'Informatique				*/
			/* Date de révision : Octobre 2002						*/
			/* -----------------------------------------------------------------	*/
			/* Ce module représente le comportement d'une pompe			*/
			/*	analogique  avec sa logique électrique de commande.		*/
			/* -----------------------------------------------------------------	*/

			/* -----------------------------------------------------------------	*/
			/* Gestion des ordres de la Partie Commande				*/
			/*	s'il n'y a pas présence de la tension de commande, 		*/
			/*         le contacteur ne comprend pas l'ordre.			*/
			/* La consigne passée varie de 0% à +100 % 				*/
			/* -----------------------------------------------------------------	*/
			if (d_electrique) 
				etatAv=v_d_electrique;
			else
				etatAv = cmdMarche & tensionCmd & energie380;

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

				/* ----------------------------------------------------------	*/
				/* calcul du point a atteindre en fonction de la consigne 	*/
				/* ----------------------------------------------------------	*/
				if (etatAv && (consigne >=0.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;
				}
			}

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

			/* -----------------------------------------------------------------	*/
			/* Gestion du retour vers la Partie Commande				*/
			/*     si un défaut est demandé, 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_retourContacteur) retourMarche = v_d_retourContacteur;
			else
				if (tensionCpt) retourMarche = (cmdMarche ^ ! logiqueRetourMarche);
				else retourMarche = 0;

			/* -----------------------------------------------------------------	*/
			/* Gestion du débit 	en sortie de pompe					*/
			/* Le débit est calculé en fonction de la vitesse de rotation de la	*/
			/*    pompe et du débit en entrée de pompe.				*/
			/* Le débit théorique est limité au débit constructeur (debitMaxi).	*/
			/* -----------------------------------------------------------------	*/
			if (d_debit)
				debitSortie = v_d_debit;
			else {
				if ((vitNominale != 0.0) && (debitEntree != 0.0)) 
					debitSortie = valeurVitesse / vitNominale * debitEntree;
				if (debitSortie > debitEntree) debitSortie = debitEntree;
				if (debitEnHeure) unite = 3600.0;
				else if (debitEnMinute) unite = 60.0;
					else unite = 1.0;
				if (debitSortie > (debitMaxi * CLOCK_PERIOD / 1000000) / unite)
					debitSortie = ((debitMaxi * CLOCK_PERIOD / 1000000)  / unite) * (valeurVitesse/vitNominale);
			}

		}

		CB_post_bool(pompe_ana_retourMarche);
		CB_post_bool(pompe_ana_thermique);
		CB_post_float(pompe_ana_valeurVitesse);
		CB_post_float(pompe_ana_debitSortie);

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

		/*no Post-conditions*/
	}

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

	self.Bool += 11;
	self.Float += 8;

	return 0;
}

