Vai al contenuto
PLC Forum


Imparare Scl


zoz

Messaggi consigliati

Ciao a tutti.

Mi sono messo in testa di imparare SCL. Secondo la mia teoria, il modo migliore di capire come funziona un linguaggio è quello di leggere il codice.

Sapete dove posso trovare un po' di esempi di SCL? Quelli nella guida sono abbastanza penosi e poco chiari.

Grazie.

Link al commento
Condividi su altri siti

  • 7 months later...

  • 1 year later...

secondo me il modo miglior ee' quello di provare e riprovare scrivendo cosic ee lanciarlo nel simulatore del plc

Vedrai che una volta imparato avrai uno strumento potentissimo per lavorare con dati e calcoli

FUNCTION FC56 : INT //Inserimento , modifica , elimazione .........
VAR_TEMP
  i:INT;
  j:INT;
  app1:STRING[26];
  app2:string[26];
END_VAR

VAR_INPUT
 Inserisci_Capo:BOOL;    // Inserimento ....o in magazzino
 Elimina_Capo:BOOL;      // Elimina ...o dal magazzino
 Elimina_Tutto:BOOL;     // Elimina tutto il magazzino
 Cerca_Capo:bool;        // Cerca un ... nel magazzino    
 Num_Fila:INT;           // Fila dove inserire , modifica o eliminare il ....
 Num_Posizione:INT;      // Posizione dove inserire , modifica o eliminare il ...
  Capo_Sel:ARRAY[1..1] OF STRUCT
    Nome:STRING[26];
    Dato1:INT;
    Dato2:INT;
    Dato3:INT;
END_STRUCT;  

 Capo_Ricercato:ARRAY[1..1] OF STRUCT
    Nome:STRING[26];
    Dato1:INT;
    Dato2:INT;
    Dato3:INT;
  END_STRUCT;  



END_VAR

VAR_IN_OUT
    
  Fila:ARRAY[1..6] OF STRUCT
      
      Posizione:ARRAY[1..6] OF STRUCT
        NOME:STRING[26];
        Stringa:STRING[26];
        Dato1:INT;
        Dato2:INT;
        Dato3:INT;
        Word1:WORD;
        
       END_STRUCT;
       
     Dato1:INT;
     Dato2:INT;
     Dato3:INT;
     Word1:WORD;  
       
 END_STRUCT   
 ;

Stato_Ricerca:INT;
Fila_Trovata:INT;
Posizione_Trovata:INT;

 END_VAR

VAR_OUTPUT

 
 END_VAR

LABEL
salta;    
end_label

                                                               BEGIN
 
                              IF ( Inserisci_Capo = true ) THEN
                                
                                Fila[Num_Fila].Posizione[Num_Posizione].NOME:=Capo_Sel[1].NOME;
                               // Fila[Num_Fila].Posizione[Num_Posizione].Dato1:=Capo_Sel[1].Dato1;
                                Fila[Num_Fila].Posizione[Num_Posizione].Dato1:=1;
                                Fila[Num_Fila].Posizione[Num_Posizione].Dato2:=Capo_Sel[1].Dato2;
                                Fila[Num_Fila].Posizione[Num_Posizione].Dato3:=Capo_Sel[1].Dato3;

                                              
                              END_IF;  
   
                              IF ( Elimina_Capo = true ) THEN
                                
                                Fila[Num_Fila].Posizione[Num_Posizione].NOME:='VUOTO                     ';
                                Fila[Num_Fila].Posizione[Num_Posizione].Dato1:=0;
                                Fila[Num_Fila].Posizione[Num_Posizione].Dato2:=0;
                                Fila[Num_Fila].Posizione[Num_Posizione].Dato3:=0;

                                              
                              END_IF;  

                             IF ( Elimina_Tutto = true ) THEN
                                
                                FOR i:=1 TO 6 BY 1 DO
                                      
                                      FOR j:=1 TO 6 BY 1 DO
                                         
                                         Fila[i].Posizione[j].NOME:='VUOTO                     ';
                                         Fila[i].Posizione[j].Dato1:=0;
                                         Fila[i].Posizione[j].Dato2:=0;
                                         Fila[i].Posizione[j].Dato3:=0;
                                      
                                      END_FOR;
                                   
                                END_FOR;
                                              
                              END_IF;  
                              

                               IF ( Cerca_Capo = true ) THEN
                                
                                Stato_Ricerca:=0;
                                Fila_Trovata:=0;
                                Posizione_Trovata:=0;
                                app1:=Capo_Ricercato[1].Nome;
                                                               
                                FOR i:=1 TO 6 BY 1 DO
                                      
                                      FOR j:=1 TO 6 BY 1 DO
                                         
                                         app2:= Fila[i].Posizione[j].NOME;
                                         IF ( app2 = app1) THEN
                                        
                                               Fila_Trovata:=i;
                                               Posizione_Trovata:=j;
                                               Stato_Ricerca:=1;
                                               GOTO salta;
                                        
                                         END_IF ;     
                                                                     
                                      END_FOR;
                                   
                                END_FOR;
                                              
                              END_IF;  


                              salta:                            
                  
    ;
  FC56 := 1;
END_FUNCTION


Modificato: da walterword
Link al commento
Condividi su altri siti

prima addentrarti nell aprogrammazione con SCL , devi avere ben chiaro le strutture dati , array di strutture, strutture di strutture di array . array di strutture di array ect , prima devi saper progettare le strutture dati e poi manipolarle

Link al commento
Condividi su altri siti

  • 1 month later...

Bello l'esempio è scritto in maniera chiara ed è molto leggibile, complimenti

Però non è moto ortodosso usare l'istruzione Goto.

Lo standard ST IEC 6113 e in pascal è un istruzione non desiderata.

Link al commento
Condividi su altri siti

  • 5 months later...

dipende tutto dal compilatore , dopo piu di 10 anni posso dire il GOTO di SCL funziona e senza problemi .

Il codice compilato in awl alla fine usa i salti che esistono nel linguaggio awl , considerato il linguaggio macchina Zimenz :D

Se non usci la GOTO non ci sono altre istruzioni simili.Dovresti usare il ciclo Do -while ma con troppi controlli .Scl e' tendente al pascal ma non e' pascal , non gira su framework o su pc , e' considerato un linguaggio di scripting per plc siemens , ST piu in generale per tutti gli altri .

Tra l'altro , queste funzioni speciali di gestione dati e strutture complesse non vengono richiamate sempre ad ogni ciclo di scansione ma solo su richiesta , di solito un fronte

ciao

p.s. la progettazione di un magazzino robotizzato , con questo sistema l'ho tirato in piedi in poche ore , certo prima devi progettare l'area dati e studiare come gestire il sistema .Ma se al posto di scl avessi usato awl sarei ancora li a debuggare e non ne uscirei piu .....

Modificato: da walterword
Link al commento
Condividi su altri siti

  • 2 months later...

scusate ma io non riesco nemmeno ad aprire un file nuovo in SCL, ho Step7 versione 5.5 SP4. Aprendo il programma S7SCL - Programming S7 Blocks non si apre nessun editor. Che devo fare?

Grazie

Link al commento
Condividi su altri siti

Primo accodarsi ad altra discussione, secialmente se ferma da mesi, è autolesionistico perchè il rischio di non ricevere risposte è molto elevato; inoltre questa pratica è vietata dal regolamento perchè crea confusione nelle risposte.

Se vuoi apri una discussione sull'argomento di tuo interesse.

Link al commento
Condividi su altri siti

Ospite
Questa discussione è chiusa alle risposte.
×
×
  • Crea nuovo/a...