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

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

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

#include "tremie.h"



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

CB_Index tremie__num = 0;
CB_Mem_Float *tremie_volumeExtraction;
CB_Mem_Float *tremie_volumeRemplissage;
CB_Mem_Float *tremie_mvMatiereEntree;
CB_Mem_Float *tremie_niveauTremie;
CB_Mem_Float *tremie_mvMatiereSortie;
CB_Mem_Float *tremie_poids;
CB_Mem_Float *tremie_pourcentNiveau;
CB_Mem_Float *tremie_volumeSortie;
CB_Mem_Float *tremie_mvMatiere;
CB_Mem_Float *tremie_niveauReel;
CB_Mem_Float *tremie_debug;
CB_Mem_Float *tremie_contenance;
CB_Mem_Bool *tremie_d_niveau;
CB_Mem_Float *tremie_v_d_niveau;

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

#define volumeExtraction (tremie_volumeExtraction->CB_current_value)
#define volumeRemplissage (tremie_volumeRemplissage->CB_current_value)
#define mvMatiereEntree (tremie_mvMatiereEntree->CB_current_value)
#define niveauTremie (tremie_niveauTremie->CB_current_value)
#define mvMatiereSortie (tremie_mvMatiereSortie->CB_current_value)
#define poids (tremie_poids->CB_current_value)
#define pourcentNiveau (tremie_pourcentNiveau->CB_current_value)
#define volumeSortie (tremie_volumeSortie->CB_current_value)
#define mvMatiere (tremie_mvMatiere->CB_current_value)
#define niveauReel (tremie_niveauReel->CB_current_value)
#define debug (tremie_debug->CB_current_value)
#define contenance (tremie_contenance->CB_current_value)
#define d_niveau (tremie_d_niveau->CB_current_value)
#define v_d_niveau (tremie_v_d_niveau->CB_current_value)


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


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

int _bibliotheque_epo__tremie_init(void)
{
	(tremie_mvMatiereEntree)->CB_current_value = 1.0; /*mvMatiereEntree*/
	(self.Float+3)->CB_current_value = 250.0; /*contenance*/
	self.Bool+=1;
	self.Float+=5;


	return 0;
}


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

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

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

		tremie_mvMatiere = self.Float+0;
		tremie_niveauReel = self.Float+1;
		tremie_debug = self.Float+2;
		tremie_contenance = self.Float+3;
		tremie_d_niveau = self.Bool+0;
		tremie_v_d_niveau = self.Float+4;

		/********************* 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 represente la modelisation d'une tremie			*/
			/* la tremie calcule son poids et son volume de matiere en fonction	*/
			/* des volumes de matiere recus et soutires.  				*/
			/* -----------------------------------------------------------------	*/

			/* -----------------------------------------------------------------	*/
			/* gestion du niveauReel 							*/
			/* -----------------------------------------------------------------	*/
			if (mvMatiere == 0.0)
				mvMatiere = mvMatiereEntree;

			/* Niveau physique de matière après remplissage 			*/
			niveauReel += volumeRemplissage;   

			if (niveauReel > contenance)   niveauReel = contenance;
			if (niveauReel < 0.0) niveauReel = 0.0;
			if (d_niveau)   niveauTremie = v_d_niveau;
			else  niveauTremie += volumeRemplissage  - volumeExtraction;


			if (niveauTremie > contenance)  niveauTremie = contenance;
			if (niveauTremie < 0.0) niveauTremie = 0.0;

			/* -----------------------------------------------------------------	*/
			/* pourcentage du niveauReel 						*/
			/* -----------------------------------------------------------------	*/
			if ( contenance!=0.0) pourcentNiveau = niveauTremie / contenance * 100.0;


			if(volumeExtraction !=0.0) {
			         if( (volumeExtraction <=niveauReel)&&(niveauReel !=0.0))  {
			               volumeSortie=volumeExtraction;
			         }
			         else {
			                volumeSortie=niveauReel;
			         }
			}
			else volumeSortie=0.0;

			niveauReel -= volumeExtraction; /* niveau physique de matière après vidange */
			if (niveauReel < 0.0) niveauReel = 0.0;
			/* -----------------------------------------------------------------	*/
			/* gestion du poids/densite 	  					*/
			/* -----------------------------------------------------------------	*/
			poids = niveauTremie * mvMatiere;
			mvMatiereSortie = mvMatiere;

			if (niveauTremie == 0.0)
				mvMatiere = 0.0;



		}

		CB_post_float(tremie_niveauTremie);
		CB_post_float(tremie_mvMatiereSortie);
		CB_post_float(tremie_poids);
		CB_post_float(tremie_pourcentNiveau);
		CB_post_float(tremie_volumeSortie);

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

		/*no Post-conditions*/
	}

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

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

	return 0;
}

