/*2013-01-18T16:22:41-01:00*/

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

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

#include "bande_transporteuse.h"

#include<math.h> 	/* pour fonction fabs */

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

CB_Index bande_transporteuse__num = 0;
CB_Mem_Float *bande_transporteuse_volumeEntree;
CB_Mem_Float *bande_transporteuse_positionDepose;
CB_Mem_Float *bande_transporteuse_vitesse;
CB_Mem_Bool *bande_transporteuse_ouvertureVanne;
CB_Mem_Float *bande_transporteuse_volumeSortieAv;
CB_Mem_Float *bande_transporteuse_volumeSortieAr;
CB_Mem_Bool *bande_transporteuse_controleurRot;
CB_Mem_Float *bande_transporteuse_volumeSortieVanne;
CB_Mem_Float *bande_transporteuse_teteDeMatiere;
CB_Mem_Float *bande_transporteuse_queueDeMatiere;
CB_Mem_Float *bande_transporteuse_ecart;
CB_Mem_Float *bande_transporteuse_volumeMatiereSurBande;
CB_Mem_Float *bande_transporteuse_increment;
CB_Mem_Float *bande_transporteuse_longEffective;
CB_Mem_Bool *bande_transporteuse_logiqueControleur;
CB_Mem_Float *bande_transporteuse_longueurBande;
CB_Mem_Float *bande_transporteuse_seuilControleurRot;
CB_Mem_Float *bande_transporteuse_vitesseNominale;
CB_Mem_Float *bande_transporteuse_positionMesurePoids;
CB_Mem_Float *bande_transporteuse_positionVanne;
CB_Mem_Bool *bande_transporteuse_d_collageCtrlRot;
CB_Mem_Bool *bande_transporteuse_v_d_collageCtrlRot;

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

#define volumeEntree (bande_transporteuse_volumeEntree->CB_current_value)
#define positionDepose (bande_transporteuse_positionDepose->CB_current_value)
#define vitesse (bande_transporteuse_vitesse->CB_current_value)
#define ouvertureVanne (bande_transporteuse_ouvertureVanne->CB_current_value)
#define volumeSortieAv (bande_transporteuse_volumeSortieAv->CB_current_value)
#define volumeSortieAr (bande_transporteuse_volumeSortieAr->CB_current_value)
#define controleurRot (bande_transporteuse_controleurRot->CB_current_value)
#define volumeSortieVanne (bande_transporteuse_volumeSortieVanne->CB_current_value)
#define teteDeMatiere (bande_transporteuse_teteDeMatiere->CB_current_value)
#define queueDeMatiere (bande_transporteuse_queueDeMatiere->CB_current_value)
#define ecart (bande_transporteuse_ecart->CB_current_value)
#define volumeMatiereSurBande (bande_transporteuse_volumeMatiereSurBande->CB_current_value)
#define increment (bande_transporteuse_increment->CB_current_value)
#define longEffective (bande_transporteuse_longEffective->CB_current_value)
#define logiqueControleur (bande_transporteuse_logiqueControleur->CB_current_value)
#define longueurBande (bande_transporteuse_longueurBande->CB_current_value)
#define seuilControleurRot (bande_transporteuse_seuilControleurRot->CB_current_value)
#define vitesseNominale (bande_transporteuse_vitesseNominale->CB_current_value)
#define positionMesurePoids (bande_transporteuse_positionMesurePoids->CB_current_value)
#define positionVanne (bande_transporteuse_positionVanne->CB_current_value)
#define d_collageCtrlRot (bande_transporteuse_d_collageCtrlRot->CB_current_value)
#define v_d_collageCtrlRot (bande_transporteuse_v_d_collageCtrlRot->CB_current_value)


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


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

int _bibliotheque_epo__bande_transporteuse_init(void)
{
	(self.Bool+0)->CB_current_value = 1; /*logiqueControleur*/
	(self.Float+6)->CB_current_value = 20.0; /*longueurBande*/
	(self.Float+7)->CB_current_value = 50.0; /*seuilControleurRot*/
	(self.Float+8)->CB_current_value = 1.0; /*vitesseNominale*/
	(self.Float+9)->CB_current_value = 5.0; /*positionMesurePoids*/
	(self.Float+10)->CB_current_value = 10.0; /*positionVanne*/
	self.Bool+=3;
	self.Float+=11;


	return 0;
}


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

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

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

		bande_transporteuse_teteDeMatiere = self.Float+0;
		bande_transporteuse_queueDeMatiere = self.Float+1;
		bande_transporteuse_ecart = self.Float+2;
		bande_transporteuse_volumeMatiereSurBande = self.Float+3;
		bande_transporteuse_increment = self.Float+4;
		bande_transporteuse_longEffective = self.Float+5;
		bande_transporteuse_logiqueControleur = self.Bool+0;
		bande_transporteuse_longueurBande = self.Float+6;
		bande_transporteuse_seuilControleurRot = self.Float+7;
		bande_transporteuse_vitesseNominale = self.Float+8;
		bande_transporteuse_positionMesurePoids = self.Float+9;
		bande_transporteuse_positionVanne = self.Float+10;
		bande_transporteuse_d_collageCtrlRot = self.Bool+1;
		bande_transporteuse_v_d_collageCtrlRot = self.Bool+2;

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

		/*no Pre-conditions*/

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

		{
			/* -----------------------------------------------------------------	*/
			/* Type : Modèle de Comportement Opératif					*/
			/* Catégorie :  Batch							*/
			/* Auteur : Techniques Nouvelles d'Informatique				*/
			/* Date de révision : Octobre 2002						*/
			/* -----------------------------------------------------------------	*/
			/* Ce module représente le comportement d'une bande           	*/
			/*	transporteuse recevant en entree une consigne de 		*/
			/*	vitesse analogique                                         	*/
			/* -----------------------------------------------------------------	*/


			/* -----------------------------------------------------------------	*/
			/* On utilise des variables flottantes de type  double 		*/
			/* pour obtenir une bonne précision des calculs.       		*/
			/* -----------------------------------------------------------------	*/
			double tete=0.0;  /* Contient la position de la tete de matière 	*/
			double queue=0.0; /* Contient la position de la queue de matière 	*/
			double incr=0.0;  /* Contient la valeur de l' incrément de position 	*/
			                  /* que devra avoir la tete et/ou la queue      	*/
			double diff=0.0;  /* Contient la longueur de matière expulsée  	*/
			                  /* par la bande transporteuse            		*/


			tete = teteDeMatiere;
			queue = queueDeMatiere;

			/* -----------------------------------------------------------------	*/
			/* Gestion du controleur de rotation					*/
			/* -----------------------------------------------------------------	*/
			if (d_collageCtrlRot) controleurRot = v_d_collageCtrlRot;
			else
				controleurRot = (fabs(vitesse) >= seuilControleurRot) ^ !logiqueControleur;

			/* -----------------------------------------------------------------	*/
			/* Détermination de la position de sortie de la matière 		*/
			/* -----------------------------------------------------------------	*/
			if(ouvertureVanne)
			{
			    longEffective=positionVanne;
			}
			else longEffective=longueurBande;

			/* -----------------------------------------------------------------	*/
			/* Calcul de la position de la matiere  					*/
			/* -----------------------------------------------------------------	*/
			incr=vitesseNominale * vitesse / 100.0 * (CLOCK_PERIOD / 1000000);
			increment =incr;

			if  (volumeMatiereSurBande==0.0)
			{
			                tete=queue=positionDepose;
				teteDeMatiere = positionDepose;
			                queueDeMatiere =positionDepose;
			}
			if((volumeEntree ==0.0)&&(teteDeMatiere!=positionDepose))
			{
			                 tete+=incr;
			                 teteDeMatiere=tete;
			              
				              
			 } 
			 if(volumeEntree !=0.0)
			{
			                  tete+=incr;
				  teteDeMatiere =tete;    
			               
			 }          
			if ((volumeEntree == 0.0) && (teteDeMatiere!=positionDepose))
			{
			                 queue+=incr;
			                 queueDeMatiere = queue;
			               
			}
			else 
			{
			                  queue=positionDepose;
			                  queueDeMatiere = positionDepose;
			}
			   
			/* -----------------------------------------------------------------	*/
			/* Calcul du volume de matiere contenu sur la bande 			*/
			/* -----------------------------------------------------------------	*/
			if ((teteDeMatiere-queueDeMatiere !=0) || (vitesse==0.0))
			{
			          volumeMatiereSurBande += volumeEntree;
			}
			if (volumeMatiereSurBande < 0.0) volumeMatiereSurBande = 0.0;

			/* -----------------------------------------------------------------	*/
			/* calcul du volume de matiere sorti vers AR				*/
			/* -----------------------------------------------------------------	*/
			volumeSortieAr = 0.0;
			if (teteDeMatiere < 0.0)
			{
			                diff =  - tete;
				ecart = diff;
			                
				if (queue - tete< 0.0)
			                {
			                     if(queue>0.0)  volumeSortieAr = diff * volumeMatiereSurBande / (queue - tete);
			                     else volumeSortieAr=volumeMatiereSurBande;
			                }
			                tete=0.0;
			                teteDeMatiere=0.0;
			}

			/* -----------------------------------------------------------------	*/
			/* calcul du volume de matiere sorti vers AV 				*/
			/* -----------------------------------------------------------------	*/
			volumeSortieAv = 0.0;
			volumeSortieVanne=0.0;
			if (teteDeMatiere > longEffective) 
			{
				diff = tete - longEffective ;
			                ecart=diff;
				if (tete - queue > 0.0)
			                {
			                   if(ouvertureVanne)
			                   {
			                       if(queue < longEffective) volumeSortieVanne = diff * volumeMatiereSurBande /(tete - queue);
			                       else volumeSortieVanne=volumeMatiereSurBande;
			                       volumeSortieAv=0.0;
			                   }
			                   else
			                   {
			                       if(queue < longEffective) volumeSortieAv = diff * volumeMatiereSurBande /(tete - queue);
			                       else volumeSortieAv=volumeMatiereSurBande;
			                       volumeSortieVanne=0.0;
			                    }
			                }
			                tete=longEffective;
				teteDeMatiere = longEffective;
			}

			/* -----------------------------------------------------------------	*/
			/* calcul du volume encore présent sur la bande 			*/
			/* -----------------------------------------------------------------	*/
			 volumeMatiereSurBande +=  - (volumeSortieAr+volumeSortieAv+volumeSortieVanne);



		}

		CB_post_float(bande_transporteuse_volumeSortieAv);
		CB_post_float(bande_transporteuse_volumeSortieAr);
		CB_post_bool(bande_transporteuse_controleurRot);
		CB_post_float(bande_transporteuse_volumeSortieVanne);

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

		/*no Post-conditions*/
	}

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

	self.Bool += 3;
	self.Float += 11;

	return 0;
}

