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

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

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

#include "vanne_simple_effet.h"



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

CB_Index vanne_simple_effet__num = 0;
CB_Mem_Bool *vanne_simple_effet_energie380;
CB_Mem_Bool *vanne_simple_effet_tensionCmd;
CB_Mem_Bool *vanne_simple_effet_tensionCpt;
CB_Mem_Bool *vanne_simple_effet_cmdOuv;
CB_Mem_Float *vanne_simple_effet_debitEntree;
CB_Mem_Bool *vanne_simple_effet_cptFerm;
CB_Mem_Bool *vanne_simple_effet_cptOuv;
CB_Mem_Float *vanne_simple_effet_debitSortie;
CB_Mem_Float *vanne_simple_effet_pourcentOuverture;
CB_Mem_Float *vanne_simple_effet_increment;
CB_Mem_Bool *vanne_simple_effet_etatOuv;
CB_Mem_Bool *vanne_simple_effet_etatFerm;
CB_Mem_Float *vanne_simple_effet_valeurOuverture;
CB_Mem_Float *vanne_simple_effet_unite;
CB_Mem_Float *vanne_simple_effet_tempsOuverture;
CB_Mem_Bool *vanne_simple_effet_logiqueCptOuv;
CB_Mem_Bool *vanne_simple_effet_logiqueCptFerm;
CB_Mem_Float *vanne_simple_effet_debitMaxi;
CB_Mem_Bool *vanne_simple_effet_debitEnHeure;
CB_Mem_Bool *vanne_simple_effet_debitEnMinute;
CB_Mem_Bool *vanne_simple_effet_d_electrique;
CB_Mem_Bool *vanne_simple_effet_v_d_electrique;
CB_Mem_Bool *vanne_simple_effet_d_blocage;
CB_Mem_Float *vanne_simple_effet_v_d_blocage;
CB_Mem_Bool *vanne_simple_effet_d_FdcOuv;
CB_Mem_Bool *vanne_simple_effet_v_d_FdcOuv;
CB_Mem_Bool *vanne_simple_effet_d_FdcFerm;
CB_Mem_Bool *vanne_simple_effet_v_d_FdcFerm;
CB_Mem_Bool *vanne_simple_effet_d_debit;
CB_Mem_Float *vanne_simple_effet_v_d_debit;

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

#define energie380 (vanne_simple_effet_energie380->CB_current_value)
#define tensionCmd (vanne_simple_effet_tensionCmd->CB_current_value)
#define tensionCpt (vanne_simple_effet_tensionCpt->CB_current_value)
#define cmdOuv (vanne_simple_effet_cmdOuv->CB_current_value)
#define debitEntree (vanne_simple_effet_debitEntree->CB_current_value)
#define cptFerm (vanne_simple_effet_cptFerm->CB_current_value)
#define cptOuv (vanne_simple_effet_cptOuv->CB_current_value)
#define debitSortie (vanne_simple_effet_debitSortie->CB_current_value)
#define pourcentOuverture (vanne_simple_effet_pourcentOuverture->CB_current_value)
#define increment (vanne_simple_effet_increment->CB_current_value)
#define etatOuv (vanne_simple_effet_etatOuv->CB_current_value)
#define etatFerm (vanne_simple_effet_etatFerm->CB_current_value)
#define valeurOuverture (vanne_simple_effet_valeurOuverture->CB_current_value)
#define unite (vanne_simple_effet_unite->CB_current_value)
#define tempsOuverture (vanne_simple_effet_tempsOuverture->CB_current_value)
#define logiqueCptOuv (vanne_simple_effet_logiqueCptOuv->CB_current_value)
#define logiqueCptFerm (vanne_simple_effet_logiqueCptFerm->CB_current_value)
#define debitMaxi (vanne_simple_effet_debitMaxi->CB_current_value)
#define debitEnHeure (vanne_simple_effet_debitEnHeure->CB_current_value)
#define debitEnMinute (vanne_simple_effet_debitEnMinute->CB_current_value)
#define d_electrique (vanne_simple_effet_d_electrique->CB_current_value)
#define v_d_electrique (vanne_simple_effet_v_d_electrique->CB_current_value)
#define d_blocage (vanne_simple_effet_d_blocage->CB_current_value)
#define v_d_blocage (vanne_simple_effet_v_d_blocage->CB_current_value)
#define d_FdcOuv (vanne_simple_effet_d_FdcOuv->CB_current_value)
#define v_d_FdcOuv (vanne_simple_effet_v_d_FdcOuv->CB_current_value)
#define d_FdcFerm (vanne_simple_effet_d_FdcFerm->CB_current_value)
#define v_d_FdcFerm (vanne_simple_effet_v_d_FdcFerm->CB_current_value)
#define d_debit (vanne_simple_effet_d_debit->CB_current_value)
#define v_d_debit (vanne_simple_effet_v_d_debit->CB_current_value)


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


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

int _bibliotheque_epo__vanne_simple_effet_init(void)
{
	(vanne_simple_effet_energie380)->CB_current_value = 1; /*energie380*/
	(vanne_simple_effet_tensionCmd)->CB_current_value = 1; /*tensionCmd*/
	(vanne_simple_effet_tensionCpt)->CB_current_value = 1; /*tensionCpt*/
	(self.Float+3)->CB_current_value = 2.0; /*tempsOuverture*/
	(self.Bool+2)->CB_current_value = 1; /*logiqueCptOuv*/
	(self.Bool+3)->CB_current_value = 1; /*logiqueCptFerm*/
	(self.Float+4)->CB_current_value = 10000.0; /*debitMaxi*/
	(self.Bool+4)->CB_current_value = 1; /*debitEnHeure*/
	self.Bool+=14;
	self.Float+=7;


	return 0;
}


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

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

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

		vanne_simple_effet_increment = self.Float+0;
		vanne_simple_effet_etatOuv = self.Bool+0;
		vanne_simple_effet_etatFerm = self.Bool+1;
		vanne_simple_effet_valeurOuverture = self.Float+1;
		vanne_simple_effet_unite = self.Float+2;
		vanne_simple_effet_tempsOuverture = self.Float+3;
		vanne_simple_effet_logiqueCptOuv = self.Bool+2;
		vanne_simple_effet_logiqueCptFerm = self.Bool+3;
		vanne_simple_effet_debitMaxi = self.Float+4;
		vanne_simple_effet_debitEnHeure = self.Bool+4;
		vanne_simple_effet_debitEnMinute = self.Bool+5;
		vanne_simple_effet_d_electrique = self.Bool+6;
		vanne_simple_effet_v_d_electrique = self.Bool+7;
		vanne_simple_effet_d_blocage = self.Bool+8;
		vanne_simple_effet_v_d_blocage = self.Float+5;
		vanne_simple_effet_d_FdcOuv = self.Bool+9;
		vanne_simple_effet_v_d_FdcOuv = self.Bool+10;
		vanne_simple_effet_d_FdcFerm = self.Bool+11;
		vanne_simple_effet_v_d_FdcFerm = self.Bool+12;
		vanne_simple_effet_d_debit = self.Bool+13;
		vanne_simple_effet_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 (d_electrique) 
				etatOuv=v_d_electrique;
			else
				etatOuv = cmdOuv & tensionCmd & energie380;
				
			etatFerm = !etatOuv;

			/* -----------------------------------------------------------------	*/
			/* 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_simple_effet_cptFerm);
		CB_post_bool(vanne_simple_effet_cptOuv);
		CB_post_float(vanne_simple_effet_debitSortie);
		CB_post_float(vanne_simple_effet_pourcentOuverture);

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

		/*no Post-conditions*/
	}

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

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

	return 0;
}

