/*2011-01-03T15:22:47-01:00*/

/********************************************************************
 * vanne_tor_cov.c
 * 
 * generated by: plcgen 2.1.201
 ********************************************************************/

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

#include "vanne_tor.h"



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

CB_Index vanne_tor__num = 0;
CB_Mem_Bool *vanne_tor_energie380;
CB_Mem_Bool *vanne_tor_tensionCmd;
CB_Mem_Bool *vanne_tor_tensionCpt;
CB_Mem_Bool *vanne_tor_cmdFerm;
CB_Mem_Bool *vanne_tor_cmdOuv;
CB_Mem_Float *vanne_tor_debitEntree;
CB_Mem_Bool *vanne_tor_cptFerm;
CB_Mem_Bool *vanne_tor_cptOuv;
CB_Mem_Float *vanne_tor_debitSortie;
CB_Mem_Float *vanne_tor_pourcentOuverture;
CB_Mem_Float *vanne_tor_increment;
CB_Mem_Bool *vanne_tor_memoOuv;
CB_Mem_Bool *vanne_tor_memoFerm;
CB_Mem_Bool *vanne_tor_etatOuv;
CB_Mem_Bool *vanne_tor_etatFerm;
CB_Mem_Float *vanne_tor_valeurOuverture;
CB_Mem_Float *vanne_tor_unite;
CB_Mem_Float *vanne_tor_tempsOuverture;
CB_Mem_Bool *vanne_tor_logiqueCptOuv;
CB_Mem_Bool *vanne_tor_logiqueCptFerm;
CB_Mem_Float *vanne_tor_debitMaxi;
CB_Mem_Bool *vanne_tor_debitEnHeure;
CB_Mem_Bool *vanne_tor_debitEnMinute;
CB_Mem_Bool *vanne_tor_d_electrique;
CB_Mem_Bool *vanne_tor_v_d_electrique;
CB_Mem_Bool *vanne_tor_d_blocage;
CB_Mem_Float *vanne_tor_v_d_blocage;
CB_Mem_Bool *vanne_tor_d_FdcOuv;
CB_Mem_Bool *vanne_tor_v_d_FdcOuv;
CB_Mem_Bool *vanne_tor_d_FdcFerm;
CB_Mem_Bool *vanne_tor_v_d_FdcFerm;
CB_Mem_Bool *vanne_tor_d_debit;
CB_Mem_Float *vanne_tor_v_d_debit;

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

#define energie380 (vanne_tor_energie380->CB_current_value)
#define tensionCmd (vanne_tor_tensionCmd->CB_current_value)
#define tensionCpt (vanne_tor_tensionCpt->CB_current_value)
#define cmdFerm (vanne_tor_cmdFerm->CB_current_value)
#define cmdOuv (vanne_tor_cmdOuv->CB_current_value)
#define debitEntree (vanne_tor_debitEntree->CB_current_value)
#define cptFerm (vanne_tor_cptFerm->CB_current_value)
#define cptOuv (vanne_tor_cptOuv->CB_current_value)
#define debitSortie (vanne_tor_debitSortie->CB_current_value)
#define pourcentOuverture (vanne_tor_pourcentOuverture->CB_current_value)
#define increment (vanne_tor_increment->CB_current_value)
#define memoOuv (vanne_tor_memoOuv->CB_current_value)
#define memoFerm (vanne_tor_memoFerm->CB_current_value)
#define etatOuv (vanne_tor_etatOuv->CB_current_value)
#define etatFerm (vanne_tor_etatFerm->CB_current_value)
#define valeurOuverture (vanne_tor_valeurOuverture->CB_current_value)
#define unite (vanne_tor_unite->CB_current_value)
#define tempsOuverture (vanne_tor_tempsOuverture->CB_current_value)
#define logiqueCptOuv (vanne_tor_logiqueCptOuv->CB_current_value)
#define logiqueCptFerm (vanne_tor_logiqueCptFerm->CB_current_value)
#define debitMaxi (vanne_tor_debitMaxi->CB_current_value)
#define debitEnHeure (vanne_tor_debitEnHeure->CB_current_value)
#define debitEnMinute (vanne_tor_debitEnMinute->CB_current_value)
#define d_electrique (vanne_tor_d_electrique->CB_current_value)
#define v_d_electrique (vanne_tor_v_d_electrique->CB_current_value)
#define d_blocage (vanne_tor_d_blocage->CB_current_value)
#define v_d_blocage (vanne_tor_v_d_blocage->CB_current_value)
#define d_FdcOuv (vanne_tor_d_FdcOuv->CB_current_value)
#define v_d_FdcOuv (vanne_tor_v_d_FdcOuv->CB_current_value)
#define d_FdcFerm (vanne_tor_d_FdcFerm->CB_current_value)
#define v_d_FdcFerm (vanne_tor_v_d_FdcFerm->CB_current_value)
#define d_debit (vanne_tor_d_debit->CB_current_value)
#define v_d_debit (vanne_tor_v_d_debit->CB_current_value)


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


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

int _bibliotheque_epo__vanne_tor_init(void)
{
	(vanne_tor_energie380)->CB_current_value = 1; /*energie380*/
	(vanne_tor_tensionCmd)->CB_current_value = 1; /*tensionCmd*/
	(vanne_tor_tensionCpt)->CB_current_value = 1; /*tensionCpt*/
	(self.Float+3)->CB_current_value = 2.0; /*tempsOuverture*/
	(self.Bool+4)->CB_current_value = 1; /*logiqueCptOuv*/
	(self.Bool+5)->CB_current_value = 1; /*logiqueCptFerm*/
	(self.Float+4)->CB_current_value = 10000.0; /*debitMaxi*/
	(self.Bool+6)->CB_current_value = 1; /*debitEnHeure*/
	self.Bool+=16;
	self.Float+=7;


	return 0;
}


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

int bibliotheque_epo__vanne_tor(void)
{
	static char *__comp_name = "bibliotheque_epo.vanne_tor";
	if (exec_term_node(self_num)) {

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

		vanne_tor_increment = self.Float+0;
		vanne_tor_memoOuv = self.Bool+0;
		vanne_tor_memoFerm = self.Bool+1;
		vanne_tor_etatOuv = self.Bool+2;
		vanne_tor_etatFerm = self.Bool+3;
		vanne_tor_valeurOuverture = self.Float+1;
		vanne_tor_unite = self.Float+2;
		vanne_tor_tempsOuverture = self.Float+3;
		vanne_tor_logiqueCptOuv = self.Bool+4;
		vanne_tor_logiqueCptFerm = self.Bool+5;
		vanne_tor_debitMaxi = self.Float+4;
		vanne_tor_debitEnHeure = self.Bool+6;
		vanne_tor_debitEnMinute = self.Bool+7;
		vanne_tor_d_electrique = self.Bool+8;
		vanne_tor_v_d_electrique = self.Bool+9;
		vanne_tor_d_blocage = self.Bool+10;
		vanne_tor_v_d_blocage = self.Float+5;
		vanne_tor_d_FdcOuv = self.Bool+11;
		vanne_tor_v_d_FdcOuv = self.Bool+12;
		vanne_tor_d_FdcFerm = self.Bool+13;
		vanne_tor_v_d_FdcFerm = self.Bool+14;
		vanne_tor_d_debit = self.Bool+15;
		vanne_tor_v_d_debit = self.Float+6;

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

		/*no Pre-conditions*/

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

		{
			/* -----------------------------------------------------------------	*/
			/* Type : Modèle de Comportement Opératif					*/
			/* Catégorie :  Preactionneurs - batch					*/
			/* Auteur : Techniques Nouvelles d'Informatique				*/
			/* Date de révision : Octobre 2002						*/
			/* -----------------------------------------------------------------	*/
			/* Ce module représente le comportement d'une vanne TOR		*/
			/*	 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.			*/
			/* -----------------------------------------------------------------	*/
			if (cmdOuv && !memoFerm && tensionCmd) memoOuv = 1;
			if (!cmdOuv || !tensionCmd) memoOuv = 0;
			if (!memoOuv && cmdFerm && tensionCmd) memoFerm = 1;
			if (!cmdFerm || !tensionCmd) memoFerm = 0;
			
			/* -----------------------------------------------------------------	*/
			/* Calcul de l'état passant des contacteurs				*/
			/* -----------------------------------------------------------------	*/
			etatOuv = memoOuv & energie380 & ! d_electrique;
			etatFerm = memoFerm & energie380 & ! d_electrique;
			
			/* -----------------------------------------------------------------	*/
			/* Gestion de l'ouverture 							*/
			/* -----------------------------------------------------------------	*/
			
			/* -----------------------------------------------------------------	*/
			/* calcul de l'incrément de translation en fonction de   		*/
			/* l'horloge de simulation 							*/
			/* -----------------------------------------------------------------	*/
			increment =  (CLOCK_PERIOD/1000000);
			
			/* -----------------------------------------------------------------	*/
			/* calcul de l'ouverture 							*/
			/* -----------------------------------------------------------------	*/
			if (! d_blocage) {
				if (etatOuv) {
					valeurOuverture += increment;
					if (valeurOuverture > tempsOuverture)
						valeurOuverture = tempsOuverture;
				}
				if (etatFerm) {
					valeurOuverture -= increment;
					if (valeurOuverture < 0.0)
						valeurOuverture = 0.0;
				}
			}
			
			/* -----------------------------------------------------------------	*/
			/* Calcul du pourcentage d'ouverture					*/
			/* -----------------------------------------------------------------	*/
			if (tempsOuverture != 0.0)
				pourcentOuverture = ((valeurOuverture / tempsOuverture) * 100);
			
			/* -----------------------------------------------------------------	*/
			/* Gestion du débit 	 							*/
			/* -----------------------------------------------------------------	*/
			if (d_debit)
				debitSortie = v_d_debit;
			else {
				debitSortie = pourcentOuverture / 100.0 * 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) * (pourcentOuverture / 100.0);
			}
			
			/* -----------------------------------------------------------------	*/
			/* Gestion de l'état des capteurs						*/
			/* -----------------------------------------------------------------	*/
			if (d_FdcOuv ) cptOuv = v_d_FdcOuv;
			else
				if ( tensionCpt ) 
					cptOuv = (valeurOuverture >= tempsOuverture) ^ ! logiqueCptOuv;
				else cptOuv = 0;
			
			if (d_FdcFerm ) cptFerm = v_d_FdcFerm;
			else
				if ( tensionCpt ) 
					cptFerm = (valeurOuverture == 0.0) ^ ! logiqueCptFerm;
				else cptFerm = 0;
			
			
			
					}

		CB_post_bool(vanne_tor_cptFerm);
		CB_post_bool(vanne_tor_cptOuv);
		CB_post_float(vanne_tor_debitSortie);
		CB_post_float(vanne_tor_pourcentOuverture);

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

		/*no Post-conditions*/
	}

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

	self.Bool += 16;
	self.Float += 7;

	return 0;
}

