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

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

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

#include "moteur2sens2vit.h"



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

CB_Index moteur2sens2vit__num = 0;
CB_Mem_Bool *moteur2sens2vit_energie380;
CB_Mem_Bool *moteur2sens2vit_tensionCmd;
CB_Mem_Bool *moteur2sens2vit_tensionCpt;
CB_Mem_Bool *moteur2sens2vit_cmdAv;
CB_Mem_Bool *moteur2sens2vit_cmdAr;
CB_Mem_Bool *moteur2sens2vit_cmdGv;
CB_Mem_Bool *moteur2sens2vit_cmdPv;
CB_Mem_Bool *moteur2sens2vit_retourAv;
CB_Mem_Bool *moteur2sens2vit_retourAr;
CB_Mem_Bool *moteur2sens2vit_retourGv;
CB_Mem_Bool *moteur2sens2vit_retourPv;
CB_Mem_Bool *moteur2sens2vit_thermique;
CB_Mem_Float *moteur2sens2vit_valeurVitesse;
CB_Mem_Float *moteur2sens2vit_pourcentVitesse;
CB_Mem_Float *moteur2sens2vit_increment;
CB_Mem_Bool *moteur2sens2vit_memoAv;
CB_Mem_Bool *moteur2sens2vit_memoAr;
CB_Mem_Bool *moteur2sens2vit_memoGv;
CB_Mem_Bool *moteur2sens2vit_memoPv;
CB_Mem_Bool *moteur2sens2vit_etatAvGv;
CB_Mem_Bool *moteur2sens2vit_etatAvPv;
CB_Mem_Bool *moteur2sens2vit_etatArGv;
CB_Mem_Bool *moteur2sens2vit_etatArPv;
CB_Mem_Float *moteur2sens2vit_vitesseVisee;
CB_Mem_Float *moteur2sens2vit_tempsNominale;
CB_Mem_Bool *moteur2sens2vit_logiqueThermique;
CB_Mem_Bool *moteur2sens2vit_logiqueRetourAv;
CB_Mem_Bool *moteur2sens2vit_logiqueRetourAr;
CB_Mem_Bool *moteur2sens2vit_logiqueRetourGv;
CB_Mem_Bool *moteur2sens2vit_logiqueRetourPv;
CB_Mem_Float *moteur2sens2vit_pVitesseNominale;
CB_Mem_Float *moteur2sens2vit_gVitesseNominale;
CB_Mem_Bool *moteur2sens2vit_d_electrique;
CB_Mem_Bool *moteur2sens2vit_v_d_electrique;
CB_Mem_Bool *moteur2sens2vit_d_RetourAv;
CB_Mem_Bool *moteur2sens2vit_v_d_RetourAv;
CB_Mem_Bool *moteur2sens2vit_d_RetourAr;
CB_Mem_Bool *moteur2sens2vit_v_d_RetourAr;
CB_Mem_Bool *moteur2sens2vit_d_RetourGv;
CB_Mem_Bool *moteur2sens2vit_v_d_RetourGv;
CB_Mem_Bool *moteur2sens2vit_d_RetourPv;
CB_Mem_Bool *moteur2sens2vit_v_d_RetourPv;
CB_Mem_Bool *moteur2sens2vit_d_blocage;
CB_Mem_Float *moteur2sens2vit_v_d_blocage;

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

#define energie380 (moteur2sens2vit_energie380->CB_current_value)
#define tensionCmd (moteur2sens2vit_tensionCmd->CB_current_value)
#define tensionCpt (moteur2sens2vit_tensionCpt->CB_current_value)
#define cmdAv (moteur2sens2vit_cmdAv->CB_current_value)
#define cmdAr (moteur2sens2vit_cmdAr->CB_current_value)
#define cmdGv (moteur2sens2vit_cmdGv->CB_current_value)
#define cmdPv (moteur2sens2vit_cmdPv->CB_current_value)
#define retourAv (moteur2sens2vit_retourAv->CB_current_value)
#define retourAr (moteur2sens2vit_retourAr->CB_current_value)
#define retourGv (moteur2sens2vit_retourGv->CB_current_value)
#define retourPv (moteur2sens2vit_retourPv->CB_current_value)
#define thermique (moteur2sens2vit_thermique->CB_current_value)
#define valeurVitesse (moteur2sens2vit_valeurVitesse->CB_current_value)
#define pourcentVitesse (moteur2sens2vit_pourcentVitesse->CB_current_value)
#define increment (moteur2sens2vit_increment->CB_current_value)
#define memoAv (moteur2sens2vit_memoAv->CB_current_value)
#define memoAr (moteur2sens2vit_memoAr->CB_current_value)
#define memoGv (moteur2sens2vit_memoGv->CB_current_value)
#define memoPv (moteur2sens2vit_memoPv->CB_current_value)
#define etatAvGv (moteur2sens2vit_etatAvGv->CB_current_value)
#define etatAvPv (moteur2sens2vit_etatAvPv->CB_current_value)
#define etatArGv (moteur2sens2vit_etatArGv->CB_current_value)
#define etatArPv (moteur2sens2vit_etatArPv->CB_current_value)
#define vitesseVisee (moteur2sens2vit_vitesseVisee->CB_current_value)
#define tempsNominale (moteur2sens2vit_tempsNominale->CB_current_value)
#define logiqueThermique (moteur2sens2vit_logiqueThermique->CB_current_value)
#define logiqueRetourAv (moteur2sens2vit_logiqueRetourAv->CB_current_value)
#define logiqueRetourAr (moteur2sens2vit_logiqueRetourAr->CB_current_value)
#define logiqueRetourGv (moteur2sens2vit_logiqueRetourGv->CB_current_value)
#define logiqueRetourPv (moteur2sens2vit_logiqueRetourPv->CB_current_value)
#define pVitesseNominale (moteur2sens2vit_pVitesseNominale->CB_current_value)
#define gVitesseNominale (moteur2sens2vit_gVitesseNominale->CB_current_value)
#define d_electrique (moteur2sens2vit_d_electrique->CB_current_value)
#define v_d_electrique (moteur2sens2vit_v_d_electrique->CB_current_value)
#define d_RetourAv (moteur2sens2vit_d_RetourAv->CB_current_value)
#define v_d_RetourAv (moteur2sens2vit_v_d_RetourAv->CB_current_value)
#define d_RetourAr (moteur2sens2vit_d_RetourAr->CB_current_value)
#define v_d_RetourAr (moteur2sens2vit_v_d_RetourAr->CB_current_value)
#define d_RetourGv (moteur2sens2vit_d_RetourGv->CB_current_value)
#define v_d_RetourGv (moteur2sens2vit_v_d_RetourGv->CB_current_value)
#define d_RetourPv (moteur2sens2vit_d_RetourPv->CB_current_value)
#define v_d_RetourPv (moteur2sens2vit_v_d_RetourPv->CB_current_value)
#define d_blocage (moteur2sens2vit_d_blocage->CB_current_value)
#define v_d_blocage (moteur2sens2vit_v_d_blocage->CB_current_value)


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


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

int _bibliotheque_epo__moteur2sens2vit_init(void)
{
	(moteur2sens2vit_energie380)->CB_current_value = 1; /*energie380*/
	(moteur2sens2vit_tensionCmd)->CB_current_value = 1; /*tensionCmd*/
	(moteur2sens2vit_tensionCpt)->CB_current_value = 1; /*tensionCpt*/
	(self.Float+2)->CB_current_value = 0.5; /*tempsNominale*/
	(self.Bool+9)->CB_current_value = 1; /*logiqueRetourAv*/
	(self.Bool+10)->CB_current_value = 1; /*logiqueRetourAr*/
	(self.Bool+11)->CB_current_value = 1; /*logiqueRetourGv*/
	(self.Bool+12)->CB_current_value = 1; /*logiqueRetourPv*/
	(self.Float+3)->CB_current_value = 2500.0; /*pVitesseNominale*/
	(self.Float+4)->CB_current_value = 5000.0; /*gVitesseNominale*/
	self.Bool+=24;
	self.Float+=6;


	return 0;
}


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

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

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

		moteur2sens2vit_increment = self.Float+0;
		moteur2sens2vit_memoAv = self.Bool+0;
		moteur2sens2vit_memoAr = self.Bool+1;
		moteur2sens2vit_memoGv = self.Bool+2;
		moteur2sens2vit_memoPv = self.Bool+3;
		moteur2sens2vit_etatAvGv = self.Bool+4;
		moteur2sens2vit_etatAvPv = self.Bool+5;
		moteur2sens2vit_etatArGv = self.Bool+6;
		moteur2sens2vit_etatArPv = self.Bool+7;
		moteur2sens2vit_vitesseVisee = self.Float+1;
		moteur2sens2vit_tempsNominale = self.Float+2;
		moteur2sens2vit_logiqueThermique = self.Bool+8;
		moteur2sens2vit_logiqueRetourAv = self.Bool+9;
		moteur2sens2vit_logiqueRetourAr = self.Bool+10;
		moteur2sens2vit_logiqueRetourGv = self.Bool+11;
		moteur2sens2vit_logiqueRetourPv = self.Bool+12;
		moteur2sens2vit_pVitesseNominale = self.Float+3;
		moteur2sens2vit_gVitesseNominale = self.Float+4;
		moteur2sens2vit_d_electrique = self.Bool+13;
		moteur2sens2vit_v_d_electrique = self.Bool+14;
		moteur2sens2vit_d_RetourAv = self.Bool+15;
		moteur2sens2vit_v_d_RetourAv = self.Bool+16;
		moteur2sens2vit_d_RetourAr = self.Bool+17;
		moteur2sens2vit_v_d_RetourAr = self.Bool+18;
		moteur2sens2vit_d_RetourGv = self.Bool+19;
		moteur2sens2vit_v_d_RetourGv = self.Bool+20;
		moteur2sens2vit_d_RetourPv = self.Bool+21;
		moteur2sens2vit_v_d_RetourPv = self.Bool+22;
		moteur2sens2vit_d_blocage = self.Bool+23;
		moteur2sens2vit_v_d_blocage = self.Float+5;

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

		/*no Pre-conditions*/

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

		{
			/* -----------------------------------------------------------------	*/
			/* Type : Modèle de Comportement Opératif					*/
			/* Catégorie :  Preactionneurs - moteurs					*/
			/* Auteur : Techniques Nouvelles d'Informatique				*/
			/* Date de révision : Octobre 2002						*/
			/* -----------------------------------------------------------------	*/
			/* Ce module représente le comportement d'un moteur à 2 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 peuvent pas être actionnés en même		*/
			/*	   temps. La sécurité est mécanique.				*/
			/* -----------------------------------------------------------------	*/
			if (cmdAv && !memoAr && tensionCmd) memoAv = 1;
			if (!cmdAv || !tensionCmd || d_electrique) memoAv = 0;
			if (!memoAv && cmdAr && tensionCmd) memoAr = 1;
			if (!cmdAr || !tensionCmd || d_electrique) memoAr = 0;

			if (!memoGv && cmdPv && tensionCmd) memoPv = 1;
			if (!cmdPv || !tensionCmd || d_electrique) memoPv = 0;
			if (cmdGv && !memoPv && tensionCmd) memoGv = 1;
			if (!cmdGv || !tensionCmd || d_electrique) memoGv = 0;

			/* -----------------------------------------------------------------	*/
			/* Calcul de l'état passant des contacteurs				*/
			/* -----------------------------------------------------------------	*/
			etatAvGv = memoAv & memoGv & energie380;
			etatAvPv = memoAv & memoPv & energie380;
			etatArGv = memoAr & memoGv & energie380;
			etatArPv = memoAr & memoPv & energie380;

			/* -----------------------------------------------------------------	*/
			/* Gestion de la montée en vitesse						*/
			/* -----------------------------------------------------------------	*/
			if (d_blocage)  valeurVitesse = v_d_blocage;
			else {
				/* ----------------------------------------------------------	*/
				/* calcul de la vitesse a atteindre en fonction des commandes */
				/* ----------------------------------------------------------	*/
				if (etatAvGv) {
					vitesseVisee = gVitesseNominale;
					if (tempsNominale > 0.0)
						increment=(gVitesseNominale/tempsNominale)*(CLOCK_PERIOD/1000000.0);
				}
				else if (etatAvPv) {
					vitesseVisee = pVitesseNominale;
					if (tempsNominale > 0.0)
						increment=(pVitesseNominale/tempsNominale)*(CLOCK_PERIOD/1000000.0);
				}
				if (etatArGv) {
					vitesseVisee = gVitesseNominale * -1.0;
					increment=(gVitesseNominale/tempsNominale)*(CLOCK_PERIOD/1000000.0);
				}
				else if (etatArPv) {
					vitesseVisee = pVitesseNominale * -1.0;
					increment=(pVitesseNominale/tempsNominale)*(CLOCK_PERIOD/1000000.0);
				}
				 if (! etatAvGv && ! etatAvPv && ! etatArGv && ! etatArPv) vitesseVisee = 0.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 (gVitesseNominale != 0.0)
				pourcentVitesse = ((valeurVitesse/gVitesseNominale)*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'état	*/
			/*         combiné avec sa logique de cablage.				*/
			/* -----------------------------------------------------------------	*/
			if (d_RetourAv) retourAv = v_d_RetourAv;
			else
				if (tensionCpt) retourAv=(memoAv ^ ! logiqueRetourAv);
				else retourAv = 0;

			if (d_RetourAr) retourAr = v_d_RetourAr;
			else
				if (tensionCpt) retourAr = (memoAr ^ ! logiqueRetourAr);
				else retourAr = 0;

			if (d_RetourGv) retourGv = v_d_RetourGv;
			else
				if (tensionCpt) retourGv = (memoGv ^ ! logiqueRetourGv);
				else retourGv = 0;

			if (d_RetourPv) retourPv = v_d_RetourPv;
			else
				if (tensionCpt) retourPv = (memoPv ^ ! logiqueRetourPv);
				else retourPv = 0;


		}

		CB_post_bool(moteur2sens2vit_retourAv);
		CB_post_bool(moteur2sens2vit_retourAr);
		CB_post_bool(moteur2sens2vit_retourGv);
		CB_post_bool(moteur2sens2vit_retourPv);
		CB_post_bool(moteur2sens2vit_thermique);
		CB_post_float(moteur2sens2vit_valeurVitesse);
		CB_post_float(moteur2sens2vit_pourcentVitesse);

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

		/*no Post-conditions*/
	}

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

	self.Bool += 24;
	self.Float += 6;

	return 0;
}

