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

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

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

#include "verin_double_effet_pmb.h"



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

CB_Index verin_double_effet_pmb__num = 0;
CB_Mem_Bool *verin_double_effet_pmb_energieAir;
CB_Mem_Bool *verin_double_effet_pmb_tensionCmd;
CB_Mem_Bool *verin_double_effet_pmb_tensionCpt;
CB_Mem_Bool *verin_double_effet_pmb_electroRetour;
CB_Mem_Bool *verin_double_effet_pmb_electroTravail;
CB_Mem_Bool *verin_double_effet_pmb_cptRentre;
CB_Mem_Bool *verin_double_effet_pmb_cptSorti;
CB_Mem_Float *verin_double_effet_pmb_positionTige;
CB_Mem_Float *verin_double_effet_pmb_pourcentTige;
CB_Mem_Float *verin_double_effet_pmb_valeurIncrement;
CB_Mem_Int *verin_double_effet_pmb_positionTiroir;
CB_Mem_Bool *verin_double_effet_pmb_flexibleTravail;
CB_Mem_Bool *verin_double_effet_pmb_flexibleRetour;
CB_Mem_Float *verin_double_effet_pmb_increment;
CB_Mem_Float *verin_double_effet_pmb_longueurTige;
CB_Mem_Float *verin_double_effet_pmb_tempsSortie;
CB_Mem_Bool *verin_double_effet_pmb_logiqueCptRentre;
CB_Mem_Bool *verin_double_effet_pmb_logiqueCptSorti;
CB_Mem_Bool *verin_double_effet_pmb_d_FdcSorti;
CB_Mem_Bool *verin_double_effet_pmb_v_d_FdcSorti;
CB_Mem_Bool *verin_double_effet_pmb_d_FdcRentre;
CB_Mem_Bool *verin_double_effet_pmb_v_d_FdcRentre;
CB_Mem_Bool *verin_double_effet_pmb_d_blocage;
CB_Mem_Float *verin_double_effet_pmb_v_d_blocage;

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

#define energieAir (verin_double_effet_pmb_energieAir->CB_current_value)
#define tensionCmd (verin_double_effet_pmb_tensionCmd->CB_current_value)
#define tensionCpt (verin_double_effet_pmb_tensionCpt->CB_current_value)
#define electroRetour (verin_double_effet_pmb_electroRetour->CB_current_value)
#define electroTravail (verin_double_effet_pmb_electroTravail->CB_current_value)
#define cptRentre (verin_double_effet_pmb_cptRentre->CB_current_value)
#define cptSorti (verin_double_effet_pmb_cptSorti->CB_current_value)
#define positionTige (verin_double_effet_pmb_positionTige->CB_current_value)
#define pourcentTige (verin_double_effet_pmb_pourcentTige->CB_current_value)
#define valeurIncrement (verin_double_effet_pmb_valeurIncrement->CB_current_value)
#define positionTiroir (verin_double_effet_pmb_positionTiroir->CB_current_value)
#define flexibleTravail (verin_double_effet_pmb_flexibleTravail->CB_current_value)
#define flexibleRetour (verin_double_effet_pmb_flexibleRetour->CB_current_value)
#define increment (verin_double_effet_pmb_increment->CB_current_value)
#define longueurTige (verin_double_effet_pmb_longueurTige->CB_current_value)
#define tempsSortie (verin_double_effet_pmb_tempsSortie->CB_current_value)
#define logiqueCptRentre (verin_double_effet_pmb_logiqueCptRentre->CB_current_value)
#define logiqueCptSorti (verin_double_effet_pmb_logiqueCptSorti->CB_current_value)
#define d_FdcSorti (verin_double_effet_pmb_d_FdcSorti->CB_current_value)
#define v_d_FdcSorti (verin_double_effet_pmb_v_d_FdcSorti->CB_current_value)
#define d_FdcRentre (verin_double_effet_pmb_d_FdcRentre->CB_current_value)
#define v_d_FdcRentre (verin_double_effet_pmb_v_d_FdcRentre->CB_current_value)
#define d_blocage (verin_double_effet_pmb_d_blocage->CB_current_value)
#define v_d_blocage (verin_double_effet_pmb_v_d_blocage->CB_current_value)


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


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

int _bibliotheque_epo__verin_double_effet_pmb_init(void)
{
	(verin_double_effet_pmb_energieAir)->CB_current_value = 1; /*energieAir*/
	(verin_double_effet_pmb_tensionCmd)->CB_current_value = 1; /*tensionCmd*/
	(verin_double_effet_pmb_tensionCpt)->CB_current_value = 1; /*tensionCpt*/
	(self.Float+1)->CB_current_value = 1000.0; /*longueurTige*/
	(self.Float+2)->CB_current_value = 2.0; /*tempsSortie*/
	(self.Bool+2)->CB_current_value = 1; /*logiqueCptRentre*/
	(self.Bool+3)->CB_current_value = 1; /*logiqueCptSorti*/
	self.Bool+=9;
	self.Int+=1;
	self.Float+=4;


	return 0;
}


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

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

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

		verin_double_effet_pmb_positionTiroir = self.Int+0;
		verin_double_effet_pmb_flexibleTravail = self.Bool+0;
		verin_double_effet_pmb_flexibleRetour = self.Bool+1;
		verin_double_effet_pmb_increment = self.Float+0;
		verin_double_effet_pmb_longueurTige = self.Float+1;
		verin_double_effet_pmb_tempsSortie = self.Float+2;
		verin_double_effet_pmb_logiqueCptRentre = self.Bool+2;
		verin_double_effet_pmb_logiqueCptSorti = self.Bool+3;
		verin_double_effet_pmb_d_FdcSorti = self.Bool+4;
		verin_double_effet_pmb_v_d_FdcSorti = self.Bool+5;
		verin_double_effet_pmb_d_FdcRentre = self.Bool+6;
		verin_double_effet_pmb_v_d_FdcRentre = self.Bool+7;
		verin_double_effet_pmb_d_blocage = self.Bool+8;
		verin_double_effet_pmb_v_d_blocage = self.Float+3;

		/********************* 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 un vérin à double effet piloté par un		*/
			 /*	distributeur de type 5/3 (à Point Milieu Bloqué ou à 		*/
			/*	Point Milieu Libre).							*/
			/* -----------------------------------------------------------------	*/
			
			/* -----------------------------------------------------------------	*/
			/* Gestion des ordres de la Partie Commande				*/
			/*     Hypothèse de base : si les électrovannes sont excitées en	*/
			/*       même temps, le tiroir se positionne au centre.		*/
			/* -----------------------------------------------------------------	*/
			if (tensionCmd && electroTravail && ! electroRetour) positionTiroir=1;
			else
				if (tensionCmd &&  ! electroTravail && electroRetour) positionTiroir=2;
				else positionTiroir=0;
			
			/* -----------------------------------------------------------------	*/
			/* Calcul de l'état passant de l'énergie dans les flexibles		*/
			/*     s'il n'y a pas présence de l'énergie d'entrainement, les	*/
			/*	   flexibles ne sont pas sous pression.				*/
			/* -----------------------------------------------------------------	*/
			flexibleTravail = (positionTiroir==1) & energieAir;
			flexibleRetour = (positionTiroir==2) & energieAir;
			
			/* -----------------------------------------------------------------	*/
			/* 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 (flexibleTravail && ! flexibleRetour) {
					if ( positionTige < longueurTige ) {
						(positionTige) += increment;
						valeurIncrement = increment;
					}
					if ( positionTige > longueurTige ) {
						valeurIncrement -= positionTige - longueurTige;
						positionTige = longueurTige;
					}
				}
				if (flexibleRetour && ! flexibleTravail) {
					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 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_double_effet_pmb_cptRentre);
		CB_post_bool(verin_double_effet_pmb_cptSorti);
		CB_post_float(verin_double_effet_pmb_positionTige);
		CB_post_float(verin_double_effet_pmb_pourcentTige);
		CB_post_float(verin_double_effet_pmb_valeurIncrement);

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

		/*no Post-conditions*/
	}

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

	self.Bool += 9;
	self.Int += 1;
	self.Float += 4;

	return 0;
}

