Skip to main content

Exemple CNC 17 : lire le code G à partir de chaînes

Consultez les CNC17_ReadGCodeFromStrings.project exemple de projet dans le répertoire d'installation de CODESYS sous ..\CODESYS SoftMotion\Examples.

L'exemple de projet montre comment utiliser SMC_StringStream 2 pour lire le code G à partir d'une chaîne.

Cet exemple peut être considéré comme un point de départ et utilisé pour lire le code G à partir d'autres sources, par exemple via une communication réseau (sockets). Dans ce cas, un bloc fonctionnel doit être implémenté qui implémente le SMC_ITextStream interface et lit le texte (par exemple, à partir d'un socket). Ceci est similaire à la façon dont SMC_StringStream2 implémente cette interface pour lire le code G à partir d'une chaîne.

Structure de la demande

La structure est typique des applications CNC. Le code G est lu dans la tâche d'arrière-planPathTask), et le prétraitement des chemins a également lieu ici. L'interpolation est effectuée dans la tâche du bus

Dans le Path programme, le SMC_ReadNCFromStream bloc fonctionnel est utilisé pour lire le code G. Pour des raisons techniques, pas seulement un flux de type SMC_StringStream2 est passé à ce bloc de fonction, mais également à un tableau dont la taille dépend du paramètre SMC_CNC_LibParams.MAX_SUBPROGRAM_NESTING_DEPTH. Le premier flux du tableau est utilisé pour le programme principal, tandis que les autres flux sont utilisés pour d'éventuels appels de sous-programmes

Au début, le programme principal est chargé dans le premier flux du tableau :

// Load G-Code into first stream
aStringStream[0].Init(sProgramName) ;
aStringStream[0].AppendData(sGCode) ;
aStringStream[0].SetEndOfData() ;

Ensuite, tout est prêt pour la lecture des programmes de code G habituels. L'exemple montre également comment les appels de sous-programmes peuvent être pris en charge

Pour cela, il est nécessaire de créer un bloc fonctionnel qui implémente le SMC_INCLookup interface. Ce bloc fonctionnel est chargé de renvoyer le code G d'un sous-programme lorsqu'il est lu SMC_ReadNCFromStream. Lookup La méthode reçoit le nom du sous-programme et initialise un flux entrant avec le code G :

METHOD LookUp : SMC_ERROR
VAR_IN_OUT CONSTANT
    programName : STRING;
END_VAR
VAR_INPUT
    stream : SMC_ITextStream;
END_VAR
VAR
    i : UDINT ;
    pStringStream : POINTER TO SMC_StringStream2 ;
END_VAR

Cet exemple permet d'effectuer une recherche dans un tableau de sous-programmes. Le tableau est défini dans Path programme en tant que VAR_INPUT:

   // The table of subprograms.
   aSubs : ARRAY[0..0] OF SubProgram := [
            (stName := 'SUB1',
             stContent := '
SUBPROGRAM SUB1{#p1 : LREAL, #p2 : LREAL, #p3 : LREAL}
N10 G1 X#p1
N20 G1 X#p2
N30 G1 X#p3
END_SUBPROGRAM')
        ] ;

Dans Lookup, le tableau est itéré jusqu'à ce qu'un sous-programme portant le même nom soit trouvé :

i := 0 ;
WHILE i < nNumSPs DO
    IF psp[i].stName = programName THEN
        IF NOT __QUERYPOINTER(stream, pStringStream) OR_ELSE
           pStringStream = 0
        THEN
            // A stream of the wrong type has been passed by SMC_ReadNCFromStream.
            LookUp := SMC_CNC_INTERNAL_ERROR ;
        ELSE
            pStringStream^.Init(sName := psp[i].stName) ;
            LookUp := pStringStream^.AppendData(psp[i].stContent) ;
            pStringStream^.SetEndOfData() ;
        END_IF
        RETURN ;
    END_IF

    i := i + 1 ;
END_WHILE
 
// No subprogram with name programName has been found in the array psp.
LookUp := SMC_RNCF_SUBPROGRAM_FILE_NOT_FOUND ;

Mise en service

  1. Créez l'application et téléchargez-la sur une manette.

  2. Ouvrez la visualisation.

  3. Presse Commencer pour démarrer le traitement du code G.