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

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

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

#include "verin_electrique.h"



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

CB_Index verin_electrique__num = 0;
CB_Mem_Bool *verin_electrique_energie380;
CB_Mem_Bool *verin_electrique_tensionCmd;
CB_Mem_Bool *verin_electrique_tensionCpt;
CB_Mem_Bool *verin_electrique_electroRetour;
CB_Mem_Bool *verin_electrique_electroTravail;
CB_Mem_Bool *verin_electrique_cptRentre;
CB_Mem_Bool *verin_electrique_cptSorti;
CB_Mem_Bool *verin_electrique_retourFerm;
CB_Mem_Bool *verin_electrique_retourOuv;
CB_Mem_Bool *verin_electrique_thermique;
CB_Mem_Float *verin_electrique_positionTige;
CB_Mem_Float *verin_electrique_pourcentTige;
CB_Mem_Float *verin_electrique_valeurIncrement;
CB_Mem_Bool *verin_electrique_etatFerm;
CB_Mem_Bool *verin_electrique_etatOuv;
CB_Mem_Float *verin_electrique_increment;
CB_Mem_Bool *verin_electrique_memoFerm;
CB_Mem_Bool *verin_electrique_memoOuv;
CB_Mem_Bool *verin_electrique_logiqueCptRentre;
CB_Mem_Bool *verin_electrique_logiqueCptSorti;
CB_Mem_Bool *verin_electrique_logiqueRetourOuv;
CB_Mem_Bool *verin_electrique_logiqueRetourFerm;
CB_Mem_Bool *verin_electrique_logiqueThermique;
CB_Mem_Float *verin_electrique_longueurTige;
CB_Mem_Float *verin_electrique_tempsSortie;
CB_Mem_Bool *verin_electrique_d_blocage;
CB_Mem_Float *verin_electrique_v_d_blocage;
CB_Mem_Bool *verin_electrique_d_electrique;
CB_Mem_Bool *verin_electrique_v_d_electrique;
CB_Mem_Bool *verin_electrique_d_FdcRentre;
CB_Mem_Bool *verin_electrique_v_d_FdcRentre;
CB_Mem_Bool *verin_electrique_d_FdcSorti;
CB_Mem_Bool *verin_electrique_v_d_FdcSorti;
CB_Mem_Bool *verin_electrique_d_RetourFerm;
CB_Mem_Bool *verin_electrique_v_d_RetourFerm;
CB_Mem_Bool *verin_electrique_d_RetourOuv;
CB_Mem_Bool *verin_electrique_v_d_RetourOuv;

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

#define energie380 (verin_electrique_energie380->CB_current_value)
#define tensionCmd (verin_electrique_tensionCmd->CB_current_value)
#define tensionCpt (verin_electrique_tensionCpt->CB_current_value)
#define electroRetour (verin_electrique_electroRetour->CB_current_value)
#define electroTravail (verin_electrique_electroTravail->CB_current_value)
#define cptRentre (verin_electrique_cptRentre->CB_current_value)
#define cptSorti (verin_electrique_cptSorti->CB_current_value)
#define retourFerm (verin_electrique_retourFerm->CB_current_value)
#define retourOuv (verin_electrique_retourOuv->CB_current_value)
#define thermique (verin_electrique_thermique->CB_current_value)
#define positionTige (verin_electrique_positionTige->CB_current_value)
#define pourcentTige (verin_electrique_pourcentTige->CB_current_value)
#define valeurIncrement (verin_electrique_valeurIncrement->CB_current_value)
#define etatFerm (verin_electrique_etatFerm->CB_current_value)
#define etatOuv (verin_electrique_etatOuv->CB_current_value)
#define increment (verin_electrique_increment->CB_current_value)
#define memoFerm (verin_electrique_memoFerm->CB_current_value)
#define memoOuv (verin_electrique_memoOuv->CB_current_value)
#define logiqueCptRentre (verin_electrique_logiqueCptRentre->CB_current_value)
#define logiqueCptSorti (verin_electrique_logiqueCptSorti->CB_current_value)
#define logiqueRetourOuv (verin_electrique_logiqueRetourOuv->CB_current_value)
#define logiqueRetourFerm (verin_electrique_logiqueRetourFerm->CB_current_value)
#define logiqueThermique (verin_electrique_logiqueThermique->CB_current_value)
#define longueurTige (verin_electrique_longueurTige->CB_current_value)
#define tempsSortie (verin_electrique_tempsSortie->CB_current_value)
#define d_blocage (verin_electrique_d_blocage->CB_current_value)
#define v_d_blocage (verin_electrique_v_d_blocage->CB_current_value)
#define d_electrique (verin_electrique_d_electrique->CB_current_value)
#define v_d_electrique (verin_electrique_v_d_electrique->CB_current_value)
#define d_FdcRentre (verin_electrique_d_FdcRentre->CB_current_value)
#define v_d_FdcRentre (verin_electrique_v_d_FdcRentre->CB_current_value)
#define d_FdcSorti (verin_electrique_d_FdcSorti->CB_current_value)
#define v_d_FdcSorti (verin_electrique_v_d_FdcSorti->CB_current_value)
#define d_RetourFerm (verin_electrique_d_RetourFerm->CB_current_value)
#define v_d_RetourFerm (verin_electrique_v_d_RetourFerm->CB_current_value)
#define d_RetourOuv (verin_electrique_d_RetourOuv->CB_current_value)
#define v_d_RetourOuv (verin_electrique_v_d_RetourOuv->CB_current_value)


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


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

int _bibliotheque_epo__verin_electrique_init(void)
{
	(verin_electrique_energie380)->CB_current_value = 1; /*energie380*/
	(verin_electrique_tensionCmd)->CB_current_value = 1; /*tensionCmd*/
	(verin_electrique_tensionCpt)->CB_current_value = 1; /*tensionCpt*/
	(self.Bool+4)->CB_current_value = 1; /*logiqueCptRentre*/
	(self.Bool+5)->CB_current_value = 1; /*logiqueCptSorti*/
	(self.Bool+6)->CB_current_value = 1; /*logiqueRetourOuv*/
	(self.Bool+7)->CB_current_value = 1; /*logiqueRetourFerm*/
	(self.Float+1)->CB_current_value = 1000.0; /*longueurTige*/
	(self.Float+2)->CB_current_value = 2.0; /*tempsSortie*/
	self.Bool+=20;
	self.Float+=4;


	return 0;
}


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

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

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

		verin_electrique_etatFerm = self.Bool+0;
		verin_electrique_etatOuv = self.Bool+1;
		verin_electrique_increment = self.Float+0;
		verin_electrique_memoFerm = self.Bool+2;
		verin_electrique_memoOuv = self.Bool+3;
		verin_electrique_logiqueCptRentre = self.Bool+4;
		verin_electrique_logiqueCptSorti = self.Bool+5;
		verin_electrique_logiqueRetourOuv = self.Bool+6;
		verin_electrique_logiqueRetourFerm = self.Bool+7;
		verin_electrique_logiqueThermique = self.Bool+8;
		verin_electrique_longueurTige = self.Float+1;
		verin_electrique_tempsSortie = self.Float+2;
		verin_electrique_d_blocage = self.Bool+9;
		verin_electrique_v_d_blocage = self.Float+3;
		verin_electrique_d_electrique = self.Bool+10;
		verin_electrique_v_d_electrique = self.Bool+11;
		verin_electrique_d_FdcRentre = self.Bool+12;
		verin_electrique_v_d_FdcRentre = self.Bool+13;
		verin_electrique_d_FdcSorti = self.Bool+14;
		verin_electrique_v_d_FdcSorti = self.Bool+15;
		verin_electrique_d_RetourFerm = self.Bool+16;
		verin_electrique_v_d_RetourFerm = self.Bool+17;
		verin_electrique_d_RetourOuv = self.Bool+18;
		verin_electrique_v_d_RetourOuv = self.Bool+19;

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

		/*no Pre-conditions*/

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

		{
			/* -----------------------------------------------------------------	*/
			/* Type : Modèle de Comportement Opératif					*/
			/* Catégorie :  Preactionneurs - verins					*/
			/* Auteur : Techniques Nouvelles d'Informatique				*/
			/* Date de révision : Octobre 2002						*/
			/* -----------------------------------------------------------------	*/
			/* Ce module représente le comportement d'un verin electrique 	*/
			/*	 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 (electroTravail && !memoFerm && tensionCmd) memoOuv = 1;
			if (!electroTravail || !tensionCmd) memoOuv = 0;
			if (!memoOuv && electroRetour && tensionCmd) memoFerm = 1;
			if (!electroRetour || !tensionCmd) memoFerm = 0;
			
			/* -----------------------------------------------------------------	*/
			/* Calcul de l'état passant des contacteurs				*/
			/* -----------------------------------------------------------------	*/
			etatOuv = memoOuv & energie380 & ! d_electrique;
			etatFerm = memoFerm & energie380 & ! d_electrique;
			
			/* -----------------------------------------------------------------	*/
			/* Gestion de l'évolution de la tige					*/
			/*    la tige reste dans sa position courante s'il n'y a plus de 	*/
			/*	pression dans les deux chambres.					*/
			/* -----------------------------------------------------------------	*/
			valeurIncrement = 0;
			if (! d_blocage)  {
				if (tempsSortie > 0.0)
					increment = (longueurTige/tempsSortie)*(CLOCK_PERIOD/1000000);
				if (etatOuv && ! etatFerm ) {
					if ( positionTige < longueurTige ) {
						(positionTige) += increment;
						valeurIncrement = increment;
					}
					if ( positionTige > longueurTige ) {
						valeurIncrement -= positionTige - longueurTige;
						positionTige = longueurTige;
					}
				}
				if (etatFerm && ! etatOuv ) {
					if ( positionTige > 0 ) {
						(positionTige) -= increment;
						valeurIncrement = increment * -1.0;
					}
					if ( positionTige < 0.0 ) {
						valeurIncrement -= positionTige;
						positionTige = 0.0;
					}
				}
			}
			
			/* -----------------------------------------------------------------	*/
			/* Calcul du pourcentage de sortie de la tige du vérin			*/
			/* -----------------------------------------------------------------	*/
			if (longueurTige != 0.0)
				pourcentTige = ((positionTige/longueurTige)*100);
			
			/* -----------------------------------------------------------------	*/
			/* 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_FdcSorti ) cptSorti = v_d_FdcSorti;
			else
				if ( tensionCpt ) 
					cptSorti = (positionTige >= longueurTige) ^ ! logiqueCptSorti;
				else cptSorti = 0;
			
			if (d_FdcRentre ) cptRentre = v_d_FdcRentre;
			else
				if ( tensionCpt ) 
					cptRentre = (positionTige <= 0) ^ ! logiqueCptRentre;
				else cptRentre = 0;
			
			
			
					}

		CB_post_bool(verin_electrique_cptRentre);
		CB_post_bool(verin_electrique_cptSorti);
		CB_post_bool(verin_electrique_retourFerm);
		CB_post_bool(verin_electrique_retourOuv);
		CB_post_bool(verin_electrique_thermique);
		CB_post_float(verin_electrique_positionTige);
		CB_post_float(verin_electrique_pourcentTige);
		CB_post_float(verin_electrique_valeurIncrement);

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

		/*no Post-conditions*/
	}

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

	self.Bool += 20;
	self.Float += 4;

	return 0;
}

