/*2011-01-03T15:23:16-01:00*/

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

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

#include "echelle_bornee.h"



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

CB_Index echelle_bornee__num = 0;
CB_Mem_Float *echelle_bornee_valeurEntree;
CB_Mem_Float *echelle_bornee_valeurSortie;
CB_Mem_Int *echelle_bornee_valeurEntiere;
CB_Mem_Float *echelle_bornee_a;
CB_Mem_Float *echelle_bornee_b;
CB_Mem_Float *echelle_bornee_k;
CB_Mem_Float *echelle_bornee_minEntree;
CB_Mem_Float *echelle_bornee_maxEntree;
CB_Mem_Float *echelle_bornee_minSortie;
CB_Mem_Float *echelle_bornee_maxSortie;
CB_Mem_Bool *echelle_bornee_d_echelle;
CB_Mem_Float *echelle_bornee_v_d_echelle;

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

#define valeurEntree (echelle_bornee_valeurEntree->CB_current_value)
#define valeurSortie (echelle_bornee_valeurSortie->CB_current_value)
#define valeurEntiere (echelle_bornee_valeurEntiere->CB_current_value)
#define a (echelle_bornee_a->CB_current_value)
#define b (echelle_bornee_b->CB_current_value)
#define k (echelle_bornee_k->CB_current_value)
#define minEntree (echelle_bornee_minEntree->CB_current_value)
#define maxEntree (echelle_bornee_maxEntree->CB_current_value)
#define minSortie (echelle_bornee_minSortie->CB_current_value)
#define maxSortie (echelle_bornee_maxSortie->CB_current_value)
#define d_echelle (echelle_bornee_d_echelle->CB_current_value)
#define v_d_echelle (echelle_bornee_v_d_echelle->CB_current_value)


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


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

int _bibliotheque_epo__echelle_bornee_init(void)
{
	(self.Float+4)->CB_current_value = 100.0; /*maxEntree*/
	(self.Float+6)->CB_current_value = 100.0; /*maxSortie*/
	self.Bool+=1;
	self.Float+=8;


	return 0;
}


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

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

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

		echelle_bornee_a = self.Float+0;
		echelle_bornee_b = self.Float+1;
		echelle_bornee_k = self.Float+2;
		echelle_bornee_minEntree = self.Float+3;
		echelle_bornee_maxEntree = self.Float+4;
		echelle_bornee_minSortie = self.Float+5;
		echelle_bornee_maxSortie = self.Float+6;
		echelle_bornee_d_echelle = self.Bool+0;
		echelle_bornee_v_d_echelle = self.Float+7;

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

		/*no Pre-conditions*/

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

		{
			/* -----------------------------------------------------------------	*/
			/* Type : Modèle de Comportement Opératif					*/
			/* Catégorie :  Boite à outils						*/
			/* Auteur : Techniques Nouvelles d'Informatique				*/
			/* Date de révision : Octobre 2002						*/
			/* -----------------------------------------------------------------	*/
			/* Ce module représente la mise à l'echelle de variables réelles	*/
			/*	par rapport à des entrées et des sorties bornées.		*/
			/* L'équation de mise à l'échelle est de la forme  y = k (ax + b) 	*/
			/* -----------------------------------------------------------------	*/
			
			if (d_echelle) valeurSortie = v_d_echelle;
			else {
				k = maxEntree-minEntree;
				if ( k != 0 ) {
					/* Calcul des coefficients de mise à l'échelle 		*/
					a = ( maxSortie - minSortie );
					b = (( minSortie * maxEntree ) - ( minEntree * maxSortie ));
			
					/* Mise à l'échelle						*/
					valeurSortie = 1/k * (( a * valeurEntree ) + b );
					if ( valeurEntree >= maxEntree ) valeurSortie = maxSortie;              
					if ( valeurEntree <= minEntree ) valeurSortie = minSortie;
					}
				else valeurSortie = k;
				}
			
			valeurEntiere = valeurSortie;
			
			
					}

		CB_post_float(echelle_bornee_valeurSortie);
		CB_post_int(echelle_bornee_valeurEntiere);

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

		/*no Post-conditions*/
	}

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

	self.Bool += 1;
	self.Float += 8;

	return 0;
}

