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

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

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

#include "agitateur_1vit.h"



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

CB_Index agitateur_1vit__num = 0;
CB_Mem_Bool *agitateur_1vit_energie380;
CB_Mem_Bool *agitateur_1vit_tensionCpt;
CB_Mem_Bool *agitateur_1vit_tensionCmd;
CB_Mem_Bool *agitateur_1vit_cmd;
CB_Mem_Bool *agitateur_1vit_retour;
CB_Mem_Bool *agitateur_1vit_thermique;
CB_Mem_Float *agitateur_1vit_valeurVitesse;
CB_Mem_Float *agitateur_1vit_pourcentVitesse;
CB_Mem_Float *agitateur_1vit_increment;
CB_Mem_Bool *agitateur_1vit_memo;
CB_Mem_Bool *agitateur_1vit_etat;
CB_Mem_Float *agitateur_1vit_vitesseVisee;
CB_Mem_Int *agitateur_1vit_cpt;
CB_Mem_Bool *agitateur_1vit_flipflop;
CB_Mem_Float *agitateur_1vit_tempsNominale;
CB_Mem_Bool *agitateur_1vit_logiqueThermique;
CB_Mem_Bool *agitateur_1vit_logiqueRetour;
CB_Mem_Float *agitateur_1vit_vitesseNominale;
CB_Mem_Bool *agitateur_1vit_d_electrique;
CB_Mem_Bool *agitateur_1vit_v_d_electrique;
CB_Mem_Bool *agitateur_1vit_d_blocage;
CB_Mem_Float *agitateur_1vit_v_d_blocage;
CB_Mem_Bool *agitateur_1vit_d_Retour;
CB_Mem_Bool *agitateur_1vit_v_d_Retour;

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

#define energie380 (agitateur_1vit_energie380->CB_current_value)
#define tensionCpt (agitateur_1vit_tensionCpt->CB_current_value)
#define tensionCmd (agitateur_1vit_tensionCmd->CB_current_value)
#define cmd (agitateur_1vit_cmd->CB_current_value)
#define retour (agitateur_1vit_retour->CB_current_value)
#define thermique (agitateur_1vit_thermique->CB_current_value)
#define valeurVitesse (agitateur_1vit_valeurVitesse->CB_current_value)
#define pourcentVitesse (agitateur_1vit_pourcentVitesse->CB_current_value)
#define increment (agitateur_1vit_increment->CB_current_value)
#define memo (agitateur_1vit_memo->CB_current_value)
#define etat (agitateur_1vit_etat->CB_current_value)
#define vitesseVisee (agitateur_1vit_vitesseVisee->CB_current_value)
#define cpt (agitateur_1vit_cpt->CB_current_value)
#define flipflop (agitateur_1vit_flipflop->CB_current_value)
#define tempsNominale (agitateur_1vit_tempsNominale->CB_current_value)
#define logiqueThermique (agitateur_1vit_logiqueThermique->CB_current_value)
#define logiqueRetour (agitateur_1vit_logiqueRetour->CB_current_value)
#define vitesseNominale (agitateur_1vit_vitesseNominale->CB_current_value)
#define d_electrique (agitateur_1vit_d_electrique->CB_current_value)
#define v_d_electrique (agitateur_1vit_v_d_electrique->CB_current_value)
#define d_blocage (agitateur_1vit_d_blocage->CB_current_value)
#define v_d_blocage (agitateur_1vit_v_d_blocage->CB_current_value)
#define d_Retour (agitateur_1vit_d_Retour->CB_current_value)
#define v_d_Retour (agitateur_1vit_v_d_Retour->CB_current_value)


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


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

int _bibliotheque_epo__agitateur_1vit_init(void)
{
	(agitateur_1vit_energie380)->CB_current_value = 1; /*energie380*/
	(agitateur_1vit_tensionCpt)->CB_current_value = 1; /*tensionCpt*/
	(agitateur_1vit_tensionCmd)->CB_current_value = 1; /*tensionCmd*/
	(self.Float+2)->CB_current_value = 0.5; /*tempsNominale*/
	(self.Bool+4)->CB_current_value = 1; /*logiqueRetour*/
	(self.Float+3)->CB_current_value = 5000.0; /*vitesseNominale*/
	self.Bool+=10;
	self.Int+=1;
	self.Float+=5;


	return 0;
}


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

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

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

		agitateur_1vit_increment = self.Float+0;
		agitateur_1vit_memo = self.Bool+0;
		agitateur_1vit_etat = self.Bool+1;
		agitateur_1vit_vitesseVisee = self.Float+1;
		agitateur_1vit_cpt = self.Int+0;
		agitateur_1vit_flipflop = self.Bool+2;
		agitateur_1vit_tempsNominale = self.Float+2;
		agitateur_1vit_logiqueThermique = self.Bool+3;
		agitateur_1vit_logiqueRetour = self.Bool+4;
		agitateur_1vit_vitesseNominale = self.Float+3;
		agitateur_1vit_d_electrique = self.Bool+5;
		agitateur_1vit_v_d_electrique = self.Bool+6;
		agitateur_1vit_d_blocage = self.Bool+7;
		agitateur_1vit_v_d_blocage = self.Float+4;
		agitateur_1vit_d_Retour = self.Bool+8;
		agitateur_1vit_v_d_Retour = self.Bool+9;

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

		/*no Pre-conditions*/

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

		{
			/* -----------------------------------------------------------------	*/
			/* Type : Modèle de Comportement Opératif					*/
			/* Catégorie :  Preactionneurs - batch					*/
			/* Auteur : Techniques Nouvelles d'Informatique				*/
			/* Date de révision : Octobre 2002						*/
			/* -----------------------------------------------------------------	*/
			/* Ce module représente le comportement d'un agitateur avec un 	*/
			/* moteur à 1 sens et 2 vitesses 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, 		*/
			/*         les contacteurs ne comprennent pas les ordres.		*/
			/*	les contacteurs ne sont pas liés mécaniquement.			*/
			/* -----------------------------------------------------------------	*/
			if (cmd && tensionCmd) memo = 1;
			if (!cmd || !tensionCmd || d_electrique) memo = 0;

			/* -----------------------------------------------------------------	*/
			/* Calcul de l'état passant des contacteurs				*/
			/* -----------------------------------------------------------------	*/
			etat=memo & energie380;

			/* -----------------------------------------------------------------	*/
			/* Calcul de la montée en vitesse						*/
			/* -----------------------------------------------------------------	*/
			if (d_blocage)  valeurVitesse = v_d_blocage;
			else {
				/* ----------------------------------------------------------	*/
				/* calcul de la vitesse à atteindre en fonction de l'état 	*/
				/* des contacteurs 							*/
				/* ----------------------------------------------------------	*/
				vitesseVisee = 0.0;
				if (etat) {
					vitesseVisee = vitesseNominale;
					if (tempsNominale > 0.0)
						increment = (vitesseNominale / tempsNominale) * (CLOCK_PERIOD/1000000.0);
				}

				/* ----------------------------------------------------------	*/
				/* Calcul de la montée en vitesse 					*/
				/* ----------------------------------------------------------	*/
				if ( valeurVitesse < vitesseVisee ) {
					valeurVitesse += increment;
					if ( valeurVitesse > vitesseVisee ) valeurVitesse = vitesseVisee;
				}
				if ( valeurVitesse > vitesseVisee ) {
					valeurVitesse -= increment;
					if (valeurVitesse < vitesseVisee) valeurVitesse = vitesseVisee;
				}
			}

			/* -----------------------------------------------------------------	*/
			/* Calcul du pourcentage entre vitesse courante et nominale		*/
			/* -----------------------------------------------------------------	*/
			if (vitesseNominale != 0.0)
				pourcentVitesse = ((valeurVitesse/vitesseNominale)*100);

			/* -----------------------------------------------------------------	*/
			/* Gestion du Thermique							*/
			/* -----------------------------------------------------------------	*/
			if (d_electrique) thermique=v_d_electrique;
			else
				if (tensionCpt) thermique= ! logiqueThermique;
				else thermique=0;

			/* -----------------------------------------------------------------	*/
			/* Gestion des retours vers la Partie Commande				*/
			/*     si un défaut est demandé, le retour contacteur prend la	*/
			/*         valeur du défaut.						*/
			/*	s'il n'y a pas présence de la tension d'alimentation des	*/
			/*         capteurs, le retour contacteur reste au repos.		*/
			/*     sinon, le retour contacteur renvoie la valeur de l'etat	*/
			/*         combiné avec sa logique de cablage.				*/
			/* -----------------------------------------------------------------	*/
			if (d_Retour) retour = v_d_Retour;
			else 	
				if (tensionCpt) retour = (memo ^ ! logiqueRetour);
				else retour=0;

			/* -----------------------------------------------------------------	*/
			/* Animation Palme : uniquement pour animatique (MAN)			*/
			/* -----------------------------------------------------------------	*/
			if (pourcentVitesse != 0.0) {
				if (! flipflop) cpt ++;
				else cpt --;
				if (cpt >4) {
					cpt = 4;
					flipflop = 1;
				}
				if (cpt <= 0) flipflop = 0;
			}


		}

		CB_post_bool(agitateur_1vit_retour);
		CB_post_bool(agitateur_1vit_thermique);
		CB_post_float(agitateur_1vit_valeurVitesse);
		CB_post_float(agitateur_1vit_pourcentVitesse);

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

		/*no Post-conditions*/
	}

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

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

	return 0;
}

