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

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

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

#include "vanne_motorisee.h"



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

CB_Index vanne_motorisee__num = 0;
CB_Mem_Bool *vanne_motorisee_energie380;
CB_Mem_Bool *vanne_motorisee_tensionCmd;
CB_Mem_Bool *vanne_motorisee_tensionCpt;
CB_Mem_Bool *vanne_motorisee_cmdOuv;
CB_Mem_Bool *vanne_motorisee_cmdFerm;
CB_Mem_Float *vanne_motorisee_debitEntree;
CB_Mem_Bool *vanne_motorisee_retourOuv;
CB_Mem_Bool *vanne_motorisee_retourFerm;
CB_Mem_Bool *vanne_motorisee_thermique;
CB_Mem_Bool *vanne_motorisee_cptOuv;
CB_Mem_Bool *vanne_motorisee_cptFerm;
CB_Mem_Float *vanne_motorisee_debitSortie;
CB_Mem_Float *vanne_motorisee_pourcentOuverture;
CB_Mem_Float *vanne_motorisee_increment;
CB_Mem_Bool *vanne_motorisee_memoOuv;
CB_Mem_Bool *vanne_motorisee_memoFerm;
CB_Mem_Bool *vanne_motorisee_etatOuv;
CB_Mem_Bool *vanne_motorisee_etatFerm;
CB_Mem_Float *vanne_motorisee_valeurOuverture;
CB_Mem_Float *vanne_motorisee_unite;
CB_Mem_Float *vanne_motorisee_tempsOuverture;
CB_Mem_Bool *vanne_motorisee_logiqueThermique;
CB_Mem_Bool *vanne_motorisee_logiqueRetourOuv;
CB_Mem_Bool *vanne_motorisee_logiqueRetourFerm;
CB_Mem_Bool *vanne_motorisee_logiqueCptOuv;
CB_Mem_Bool *vanne_motorisee_logiqueCptFerm;
CB_Mem_Float *vanne_motorisee_debitMaxi;
CB_Mem_Bool *vanne_motorisee_debitEnHeure;
CB_Mem_Bool *vanne_motorisee_debitEnMinute;
CB_Mem_Bool *vanne_motorisee_d_electrique;
CB_Mem_Bool *vanne_motorisee_v_d_electrique;
CB_Mem_Bool *vanne_motorisee_d_blocage;
CB_Mem_Float *vanne_motorisee_v_d_blocage;
CB_Mem_Bool *vanne_motorisee_d_RetourOuv;
CB_Mem_Bool *vanne_motorisee_v_d_RetourOuv;
CB_Mem_Bool *vanne_motorisee_d_RetourFerm;
CB_Mem_Bool *vanne_motorisee_v_d_RetourFerm;
CB_Mem_Bool *vanne_motorisee_d_FdcOuv;
CB_Mem_Bool *vanne_motorisee_v_d_FdcOuv;
CB_Mem_Bool *vanne_motorisee_d_FdcFerm;
CB_Mem_Bool *vanne_motorisee_v_d_FdcFerm;
CB_Mem_Bool *vanne_motorisee_d_debit;
CB_Mem_Float *vanne_motorisee_v_d_debit;

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

#define energie380 (vanne_motorisee_energie380->CB_current_value)
#define tensionCmd (vanne_motorisee_tensionCmd->CB_current_value)
#define tensionCpt (vanne_motorisee_tensionCpt->CB_current_value)
#define cmdOuv (vanne_motorisee_cmdOuv->CB_current_value)
#define cmdFerm (vanne_motorisee_cmdFerm->CB_current_value)
#define debitEntree (vanne_motorisee_debitEntree->CB_current_value)
#define retourOuv (vanne_motorisee_retourOuv->CB_current_value)
#define retourFerm (vanne_motorisee_retourFerm->CB_current_value)
#define thermique (vanne_motorisee_thermique->CB_current_value)
#define cptOuv (vanne_motorisee_cptOuv->CB_current_value)
#define cptFerm (vanne_motorisee_cptFerm->CB_current_value)
#define debitSortie (vanne_motorisee_debitSortie->CB_current_value)
#define pourcentOuverture (vanne_motorisee_pourcentOuverture->CB_current_value)
#define increment (vanne_motorisee_increment->CB_current_value)
#define memoOuv (vanne_motorisee_memoOuv->CB_current_value)
#define memoFerm (vanne_motorisee_memoFerm->CB_current_value)
#define etatOuv (vanne_motorisee_etatOuv->CB_current_value)
#define etatFerm (vanne_motorisee_etatFerm->CB_current_value)
#define valeurOuverture (vanne_motorisee_valeurOuverture->CB_current_value)
#define unite (vanne_motorisee_unite->CB_current_value)
#define tempsOuverture (vanne_motorisee_tempsOuverture->CB_current_value)
#define logiqueThermique (vanne_motorisee_logiqueThermique->CB_current_value)
#define logiqueRetourOuv (vanne_motorisee_logiqueRetourOuv->CB_current_value)
#define logiqueRetourFerm (vanne_motorisee_logiqueRetourFerm->CB_current_value)
#define logiqueCptOuv (vanne_motorisee_logiqueCptOuv->CB_current_value)
#define logiqueCptFerm (vanne_motorisee_logiqueCptFerm->CB_current_value)
#define debitMaxi (vanne_motorisee_debitMaxi->CB_current_value)
#define debitEnHeure (vanne_motorisee_debitEnHeure->CB_current_value)
#define debitEnMinute (vanne_motorisee_debitEnMinute->CB_current_value)
#define d_electrique (vanne_motorisee_d_electrique->CB_current_value)
#define v_d_electrique (vanne_motorisee_v_d_electrique->CB_current_value)
#define d_blocage (vanne_motorisee_d_blocage->CB_current_value)
#define v_d_blocage (vanne_motorisee_v_d_blocage->CB_current_value)
#define d_RetourOuv (vanne_motorisee_d_RetourOuv->CB_current_value)
#define v_d_RetourOuv (vanne_motorisee_v_d_RetourOuv->CB_current_value)
#define d_RetourFerm (vanne_motorisee_d_RetourFerm->CB_current_value)
#define v_d_RetourFerm (vanne_motorisee_v_d_RetourFerm->CB_current_value)
#define d_FdcOuv (vanne_motorisee_d_FdcOuv->CB_current_value)
#define v_d_FdcOuv (vanne_motorisee_v_d_FdcOuv->CB_current_value)
#define d_FdcFerm (vanne_motorisee_d_FdcFerm->CB_current_value)
#define v_d_FdcFerm (vanne_motorisee_v_d_FdcFerm->CB_current_value)
#define d_debit (vanne_motorisee_d_debit->CB_current_value)
#define v_d_debit (vanne_motorisee_v_d_debit->CB_current_value)


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


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

int _bibliotheque_epo__vanne_motorisee_init(void)
{
	(vanne_motorisee_energie380)->CB_current_value = 1; /*energie380*/
	(vanne_motorisee_tensionCmd)->CB_current_value = 1; /*tensionCmd*/
	(vanne_motorisee_tensionCpt)->CB_current_value = 1; /*tensionCpt*/
	(self.Float+3)->CB_current_value = 2.0; /*tempsOuverture*/
	(self.Bool+5)->CB_current_value = 1; /*logiqueRetourOuv*/
	(self.Bool+6)->CB_current_value = 1; /*logiqueRetourFerm*/
	(self.Bool+7)->CB_current_value = 1; /*logiqueCptOuv*/
	(self.Bool+8)->CB_current_value = 1; /*logiqueCptFerm*/
	(self.Float+4)->CB_current_value = 10000.0; /*debitMaxi*/
	(self.Bool+9)->CB_current_value = 1; /*debitEnHeure*/
	self.Bool+=23;
	self.Float+=7;


	return 0;
}


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

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

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

		vanne_motorisee_increment = self.Float+0;
		vanne_motorisee_memoOuv = self.Bool+0;
		vanne_motorisee_memoFerm = self.Bool+1;
		vanne_motorisee_etatOuv = self.Bool+2;
		vanne_motorisee_etatFerm = self.Bool+3;
		vanne_motorisee_valeurOuverture = self.Float+1;
		vanne_motorisee_unite = self.Float+2;
		vanne_motorisee_tempsOuverture = self.Float+3;
		vanne_motorisee_logiqueThermique = self.Bool+4;
		vanne_motorisee_logiqueRetourOuv = self.Bool+5;
		vanne_motorisee_logiqueRetourFerm = self.Bool+6;
		vanne_motorisee_logiqueCptOuv = self.Bool+7;
		vanne_motorisee_logiqueCptFerm = self.Bool+8;
		vanne_motorisee_debitMaxi = self.Float+4;
		vanne_motorisee_debitEnHeure = self.Bool+9;
		vanne_motorisee_debitEnMinute = self.Bool+10;
		vanne_motorisee_d_electrique = self.Bool+11;
		vanne_motorisee_v_d_electrique = self.Bool+12;
		vanne_motorisee_d_blocage = self.Bool+13;
		vanne_motorisee_v_d_blocage = self.Float+5;
		vanne_motorisee_d_RetourOuv = self.Bool+14;
		vanne_motorisee_v_d_RetourOuv = self.Bool+15;
		vanne_motorisee_d_RetourFerm = self.Bool+16;
		vanne_motorisee_v_d_RetourFerm = self.Bool+17;
		vanne_motorisee_d_FdcOuv = self.Bool+18;
		vanne_motorisee_v_d_FdcOuv = self.Bool+19;
		vanne_motorisee_d_FdcFerm = self.Bool+20;
		vanne_motorisee_v_d_FdcFerm = self.Bool+21;
		vanne_motorisee_d_debit = self.Bool+22;
		vanne_motorisee_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 			*/
			/*	motorisee 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 du Thermique							*/
			/* -----------------------------------------------------------------	*/
			if (d_electrique) thermique = v_d_electrique;
			else
				if (tensionCpt) thermique = ! logiqueThermique;
				else thermique = 0;

			/* -----------------------------------------------------------------	*/
			/* Gestion des retours contacteurs						*/
			/* -----------------------------------------------------------------	*/
			if (d_RetourOuv) retourOuv = v_d_RetourOuv;
			else
				if (tensionCpt) retourOuv = (memoOuv ^ ! logiqueRetourOuv);
				else retourOuv = 0;

			if (d_RetourFerm) retourFerm = v_d_RetourFerm;
			else
				if (tensionCpt) retourFerm = (memoFerm ^ ! logiqueRetourFerm);
				else retourFerm = 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_motorisee_retourOuv);
		CB_post_bool(vanne_motorisee_retourFerm);
		CB_post_bool(vanne_motorisee_thermique);
		CB_post_bool(vanne_motorisee_cptOuv);
		CB_post_bool(vanne_motorisee_cptFerm);
		CB_post_float(vanne_motorisee_debitSortie);
		CB_post_float(vanne_motorisee_pourcentOuverture);

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

		/*no Post-conditions*/
	}

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

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

	return 0;
}

