Partage
  • Partager sur Facebook
  • Partager sur Twitter

Grafcet en C

    7 février 2012 à 10:03:39

    Bonjour,
    Voilà, j'ai un problème assez particulier.
    J'ai réalisé une procédure d'automate sur Unity Pro ( ou PL7) en langage Grafcet et Ladder.
    Ce programme comporte des régulateurs PID, des divergences en OU, des entrées sorties analogiques et binaires.
    On m'a annoncé que l'utilisation d'automate ne sera pas retenue.
    On utilisera une carte de contrôle.
    Tout se fait en langage C et je suis débutant.

    Mes questions sont les suivantes :
    Est-il possible de réaliser un programme en C comportant tous les éléments ci-dessus (regulation PID etc..) ? Si oui comment ?
    Dans Unity pro ou PL7 est-il possible de traduire automatiquement le langage SFC ou LD en langage littéral ?

    PS: carte de contrôle en interne, pas de limitation Hardware.

    Merci d'avance
    • Partager sur Facebook
    • Partager sur Twitter
      7 février 2012 à 11:18:26

      Bonjour :)

      Au sujet de tes questions :
      - Est-il possible de réaliser un programme en C comportant tous les éléments ci-dessus (regulation PID etc..) ? Si oui comment ?
      => Bien sûr que c'est possible, pour le comment j'en parle après.
      - Dans Unity pro ou PL7 est-il possible de traduire automatiquement le langage SFC ou LD en langage littéral ?
      => Malheureusement non, mais ça doit être possible de le faire en Assembleur. Peut-être une idée à creuser.
      - PS: carte de contrôle en interne, pas de limitation Hardware.
      => Bonne nouvelle !

      Quand tu va vouloir concevoir ton programme en C sur une carte de contrôle, tu auras forcément une doc. On ne peut pas deviner les contenus des registres d'un µC (même si on peut presque avec l'expérience :p).
      Premièrement, garde toi quelque part les entrées - sorties dont tu as besoin (la carte doit fournir des CAN / CNA pour l'analogique).

      Ensuite, un langage LADDER ou grafcet (c'est pareil au final) se traduis par une boucle infinie de traitements logiques de cette forme :

      while(1)
      {
          Acquisition_Entrees();
          Traitement_Entrees();
          Mise_a_jour_Sorties();
          Post_Traitements(); //pas obligatoire si tu n'en vois 
                              //pas l'utilite.
      }
      


      Attention : On serait tenté de fusionner les parties Traitement_Entrees et Mise_a_jour_Sorties, mais on entre vite dans des problèmes de synchronisation. Avec le procédural du C (une action après l'autre), tu peux gérer très facilement les priorités.

      Les PIDs : Une régulation, ça reste des maths. Il est souvent plus facile d'implémenter des formules de régulation à base de Transformées de Laplace qu'on ne croit :) Bien sûr, ça se passe dans la partie Traitement_Entrees.

      Point important : Tu as probablement des interruptions à gérer. Certaines sont facultatives (la boucle va tourner très vite, le temps à l'échelle humaine est donc ridiculement négligeable), tandis que d'autres sont obligatoires (WatchDog si inclus par exemple).
      Tout bon µC contient un moyen de gérer les interruptions. En général, c'est une ou plusieurs broches et un système de priorités des signaux fait le boulot. A toi de voir ça dans la doc, c'est différent en fonction des marques / modèles / capacités.

      Si tu as d'autres questions, n'hésite pas à les poser. Bon courage à toi ;)
      • Partager sur Facebook
      • Partager sur Twitter
        7 février 2012 à 14:36:42

        Merci pour ta réponse.
        Je me suis lancé, tant pis pour la conversion Grafcet.
        J'ai donc commencé mon programme par un Main qui prend en compte le grafcet suivant:

        Image utilisateur

        Voici le code, qui je pense ,le retranscrit
        While(1)
          {
        	If(X2_return==0)		//-- Si il n'y a pas de retour pour X2 on procéde à la phase X0 T7 X1 T8
        	{
        	
        	  while(T_Chart_7==0);			//-- On execute X0 jusque T7 active  
        	  {		
        		X_0();
        	  }									
        	  while(T_Chart_8==0);			//-- On execute X1 jusque T8 active
        	  {					
        		X_1();
        	  }									
        	} 
        	 
        	while ((T_Chart_3==0) && (T_Chart_13=0))			//-- On execute X2 jusque T3 ou T13 active
        	  {	
        		X_2();
        		X2_return=0; 		//-- init de la variable permettant le retour à X_2
        	  }			
        	
        	
        	  
        			if (T_Chart_3==1)		//-- Si c'est T3 active 
        			{					
        			while ((T_Chart_1==0) && (T_Chart_4==0) && (T_Chart_6==0))			//-- On execute X3 jusque T1 ou T4 ou T6  active 
        			{
        				X_3();
        			}
        				
        				if (T_Chart_1==1)			//-- Si c'est T1 active 
        				{
        					while (T_Chart_2==0)			//-- On execute X5 jusque T2 active 
        					{
        						X_5();
        					}
        				}
        				
        				if (T_Chart_4==1)			//-- Si c'est T4 active 
        				{
        					while (T_Chart_5==0)		//-- On execute X6 jusque T5 active 
        					{
        						X_6();
        					}	
        				}
        				
        				if (T_Chart_6==1)			//-- Si c'est T6 active 
        				{
        					X2_return=1;			//-- mise à 1 de la variable permettant le retour à X_2
        				}
        				
        			}
        			
        			if (T_Chart_13==1)			//--Sinon Si c'est T13 active 
        			{
        			while ((T_Chart_11=1) && (T_Chart_14=1) && (T_Chart_17=1)) //-- On execute X4 jusque T11 ou T14 ou T17  active 
        			{
        				X_4();
        			}
        			
        			
        					if (T_Chart_11==1)			//-- Si c'est T11 active 
        						{
        							while ((T_Chart_9==0) && (T_Chart_12))		//-- On execute X7 jusque T9 ou T12 active 
        							{
        								X_7();
        							}
        									If(T_Chart_9==1)			//-- Si c'est T9 active
        									{
        										while (T_Chart_10==0)	//-- On execute X9 jusque T10 active 
        										{
        											X9();
        											X2_return=1;			//-- mise à 1 de la variable permettant le retour à X_2
        										}
        									}
        						}
        						
        					if (T_Chart_14==1)			//-- Si c'est T14 active 
        						{
        							while ((T_Chart_15==0) && (T_Chart_18==0))		//-- On execute X8 jusque T15 active 
        							{
        								X_8();
        							}
        									If(T_chart_15==1)			//--  Si c'est T15 active
        									{
        										while (T_Chart_16==0)		//-- On execute X11 jusque T16 active 
        										{
        											X_11();
        											X2_return=1;			//-- mise à 1 de la variable permettant le retour à X_2
        										}
        									}
        						}
        						
        					if (T_Chart_17==1) 	//-- Si c'est T17 active 
        					{
        						X2_return=1;			//-- mise à 1 de la variable permettant le retour à X_2
        					}
        			
        			}
        	}
        	}
        


        Voila je ne sais pas si j'ai fait des fautes c'est la première fois que je programme en C.
        Y a t il des moyens pour simuler son code ou trouver des erreurs d'écritures ?

        Prochaine étape coder toutes les actions et transitions.
        • Partager sur Facebook
        • Partager sur Twitter
          7 février 2012 à 18:10:18

          Bonjour,

          Pour simuler ton code, il te faut un débuggeur, pour le vérifier vis-a-vis des erreurs de syntaxe, il te faut un compilateur. Unity Pro fait les deux.

          As-tu vraiment respecté l'ordonnancement de fonctions que je t'ai donné? Pour l'instant ça m'a l'air bon mais je vois que tu as des boucles dans des boucles dans des boucles avec un système de flag. Si le flag se met à jour après une exécution, il se peut que tu fasses une exécution de trop. Si tout est bon, hé bien tant mieux, sinon fais attention à ça :)

          gl
          • Partager sur Facebook
          • Partager sur Twitter
            10 mai 2017 à 14:29:45

            Merci pour vos éclaircissements et beaucoup de courage. 😊
            • Partager sur Facebook
            • Partager sur Twitter

            Grafcet en C

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown