Vai al contenuto
PLC Forum


Linguaggio St -Sintassi Ed Esempi-


homeira

Messaggi consigliati


zanellatofabio

Per step-80

Credo che sei interessato al linguaggio ST per SoMachine, vero ?

Io ti consiglio di scaricarti dal sito http://www.oscat.de/downloadmanager2.html

il pdf OSCAT Basic Docu. English Version:3.33

e il file di testo oscat-basic-text

sono una marea di librerie da spulciare per capire l' ST e poi che un copia incolla dal file di testo al' editor di programma puoi crearti le tue funzioni .

Come già detto in passato anche io dal mondo Siemens sono passato ad esplorare il mondo codesys.

Anche se trovi poco su questo forum non scoraggiarti, io finora ho fatto quasi un centinaio di quadri con l'M238, quindi c'è anche chi, magari non facendo un gran fracasso ..... oltre alle marche più blasonate usa plc con codesys.

Ciao

Link al commento
Condividi su altri siti

Ciao( immagino Fabio)

Ti ringrazio del link e soprattutto della solidarietà.

Per le tue applicazioni che linguaggio di programmazione usi?

Ho provato a giocherellare un po coi vari linguaggi. Oltre al classico ladder mi trovo abbastanza bene col CFC .

Io mi occupo di macchinari per il packaging.

Per chi usa il linguaggio ST: ok per la programmazione, ma quando vado online, cosa vedo?

Link al commento
Condividi su altri siti

zanellatofabio

per un lavoro del genere( intendo i due cilindri ecc) è meglio usare altri linguaggi

Va a gusti.

Io che non sono un gran che come programmatore preferisco il ladder.

Dopo il cfc e alla fine l'st.

Ma per realizzare semplici movimenti direi che il ladder va piu che bene, l'st lo lascio per le funzioni potenti.

Per l'uso del TON nella guida di SoMachine cerca TON e hai l'esempio in IL, FBD e ST.

Se dichiari il TON come variabile "locale" del blocco che stai scrivendo allora sarà visibile solo dentro a quel blocco, se lo dichiari nelle GVL allora avrà visibilità globale nell'intero programma .

in codesys non si usa U E0.0 tipo simatic ma si dichiarano le variabili per esempio dichiarandole nelle GVL

VAR_GLOBAL

TONInst: TON;

VarBOOL1: BOOL;

END_VAR

e poi si usano nella scrittura del codice

Link al commento
Condividi su altri siti

Ma solitamente(parlo da perfetto ignorante in materia) si usa prima dichiarare le variabili e poi andarle a richiamare,oppure le creo nel momento stesso in cui le inserisco?

Link al commento
Condividi su altri siti

anch'io come Fabio vengo dal Ladder .. però con SoMachine ho scoperto l'acqua calda! :smile:

quale linguaggio usare? .. semplice .. tutti! ... ovviamente grazie alla caratteristica di SoMachine,

già perché ti permette di usarli tutti all'interno della stessa applicazione,

io per esempio uso quasi esclusivamente il CFC ma per impostare/scrivere dei valori meglio ST

in una schermata a video vedi una quantità di dati impensabile in ladder e quindi in fase di test è decisamente meglio

il ladder ormai non lo uso più ... mentre ho trovato veramente interessante SFC anche se nel mio caso serve a poco

insomma il bello di SoMachine è che puoi utilizzare il linguaggio che vuoi dove vuoi

ciao

Link al commento
Condividi su altri siti

Se devo essere sincero, l' idea di usare un linguaggio che non sia ladder non mi ha mai nemmeno sfiorato. Almeno sino a quando non ho scoperto somachine..

Ora sto giocherellando con i vari linguaggi, e devo dire che cosi a pelle IL non mi attira per nulla. SFC nemmeno, ma questo probabilmente perchè non ho mai amato i diagrammi di flusso.

Mi sta invece intrigando parecchio ST, che sto praticamente riscoprendo dopo averlo usato per programmare arduino qualche anno fa, quando ero agli albori della mia curiosità verso i controllori programmabili. In seguito lo misi da parte, un po perchè cominciai ad approcciarmi coi primi relè programmabili, un po per la "poca praticità" nel senso che molte funzioni che su uno zelio per esempio si trovano bell'e pronte( temporizzatore ad impulsi, fronti di salita/discesa, toggle ecc) col linguaggio c te le devi creare da zero.

Una domanda, forse stupida, ma che mi faccio spesso mentre giocattolo:

Se scrivo

IF puls_a THEN

FAI QUESTO ;

End_if;

IF puls_b THEN

FAI QUEST'ALTRO;

End_if;

Equivale a scrivere:

IF puls_a THEN

FAI QUESTO ;

ELSE IF

puls_b THEN

FAI QUEST'ALTRO;

End_if;

Sono equivalenti le due scritture?

Il comando else if serve solo a non ripetere un altro if?

Grazie a tutti coloro mi illumineranno

Link al commento
Condividi su altri siti

Non credo proprio. basta l'analisi logica per vedere la differenza.

Nel primo caso lo stato del puslante B viene comunque testato, nel secondo caso viene testato solo se non è vera la condizione dle pulsante A.

In tutti il linguaggi che lo ammenttono la condizione "ElseIf" dipende sempre dallo "if" primario. Euovale a scrivere:

If (condizione)
        esegui;
  else
     If (condizione)
           esegui
     endif
endif
Link al commento
Condividi su altri siti

La ringrazio Livio della pronta risposta.

Quindi se ho capito bene, nel secondo caso la condizione del pulsante b viene testata SE E SOLO SE non è vera la prima condizione, cioè solo se il pulsante a si trova nella condizione logica 0.

Sbaglio?

Link al commento
Condividi su altri siti

Giuseppe Signorella

Si, è corretto.
Essi sono due costrutti uno dentro l'altro.

Il costrutto if -then - else lo puoi "interpretare" nel seguente modo:

If (condizione) Se la condizione è soddisfatta

eseguo le istruzioni sottostante fino a raggiungere l'istruzione else e poi esco dal costrutto.
Se la condizione non è soddisfatta faccio un salto fino all'istruzione

else

Se dopo l'istruzione else, non ho altre condizioni eseguo direttamente le istruzioni fino alla fine del costrutto.
Altrimenti (come sopra) verifico la condizione, se è soddisfatta proseguo, altrimenti faccio un salto fino alla fine del costrutto. (o se presente al successivo else del secondo costrutto).

Modificato: da Giuseppe Signorella
Link al commento
Condividi su altri siti

Chiaro. Gentilissimi.

Si puó affermare secondo voi che il costrutto if-then-è la base di tutto?

Voglio dire, prendiamo in considerazione un segmento ladder del genere:

----I I-------------------------( )

Dove il contatto si chiama M1 e la bobina Q1,

che differenza c'è nello scrivere in ST:

M1:=Q1;

e scrivere invece

If M1 then

Q1:=1

Else

Q1:=0

End_if

Secondo me dovrebbe essere uguale, sbaglio?

Grazie

Link al commento
Condividi su altri siti

Giuseppe Signorella

Stai facendo un pò di confusione.

In primo luogo il costrutto IF-THEN-ELSE non è alla base di tutto.

Esistono diversi tipi di costrutti.

Il SELECT CASE, il ciclo FOR-TO-NEXT,

Anche i salti, sia condizionati che incondizionati, possono essere considerati dei costrutti ecc.

Ritornando al tuo esempio, se tu scrivi:

M1:=Q1

Non fai altro che assegnare ad M1 il valore o la condizione di Q1

Se invece scrivi:

If M1 then
Q1:=1
Else
Q1:=0
End_if

Premesso che ad M1 manca la condizione, ad esempio M1=true,

Avresti che Q1 sarebbe vero se lo è M1 , altrimenti Q1 è falso.

Le cose si invertono se invece scriveresti M1=false.

Avresti che Q1 sarebbe vero se M1 non lo è , altrimenti se M1 diventa vero Q1 è falso

Link al commento
Condividi su altri siti

Non ho specificato la condizione di m1 perchè mi sembra di aver capito ( almeno nell'ST di schneider) che se scrivo

If M1 then....

La condizione di M1 si presume voglia essere testata se vera.

Nel caso voglia testare la falsa, dovrei specificare

If m1=0 then....

Almeno questo ho letto dal manuale, ed in compilazione non vengono rilevati errori.

Scusa Giuseppe ma non capisco proprio...

In un programma non si fa altro che testare condizioni ed eseguire azioni in base ai risultati... Quindi ho dedotto che il costrutto if -then fosse praticamente la base del programma. Ma magari sbaglio.

Non capisco invece a livello di programma che differenza faccia scrivere

M1:=Q1 ;

(Come hai detto tu in questo caso si assegna lo stato di M1 a Q1 e questo significa che se M1 va ad 1 pure Q1 ci va, e se M1 torna a zero Q1 la segue.)

Ed invece scrivere

If m1 then

Q1:=1;

Else

Q1:=0;

End_if

Se lo volessi in ladder, sarebbe uguale a:

M1 Q1

---I R I-----------------------( S )

M1 Q1

---I F I-----------------------( R )

R ed F stanno per Rising e Falling edge, cioè fronte di salita e discesa.

Dove sto sbagliando??

Ps iphone non mi fa distanziare M1-Q1 sopra i segmenti ladder ma credo che il concetto sia chiaro

Modificato: da step-80
Link al commento
Condividi su altri siti

Giuseppe Signorella

Io non conosco ST, pertanto ti parlo in modo generico. In ogni caso le regole fondamentali della programmazione testuali sono uguali per tutti i linguaggi, poi la sintassi può cambiare da un ambiente di sviluppo ad un'altro. Due PLC di marche differenti, anche se si programmano con il medesimo linguaggio, ad esempio Basic possono avere differenze di sintassi.

La medesima cosa vale per il ladder. Il ladder è uguale per tutti i PLC che si programmano in ladder, ma poi ogni marca e spesso ogni famiglia di PLC anche se della stessa marca, hanno una "sintassi" di Ladder differente uno dall'altro.

M1:=Q1 ;
(Come hai detto tu in questo caso si assegna lo stato di M1 a Q1 e questo significa che se M1 va ad 1 pure Q1 ci va, e se M1 torna a zero Q1 la segue.)

No è il contrario, M1 assume lo stato di Q1.

E come se tu volessi scrivere:

A= 3+2

A assume il valore dell'addizione.

Modificato: da Giuseppe Signorella
Link al commento
Condividi su altri siti

È vero hai ragione: è m1 che assume lo stato di q1, secondo quello che ho scritto. Pertanto la scrittura esatta sarebbe:

Q1:=M1;

Questo peró non risponde alla mia domanda: è o non è ( intendo a livello di programma, perchè siamo tutti d'accordo che concettualmente sono due cose diverse) equivalente a scrivere

If M1 then

Q1:=1;

Else

Q1:=0;

End_if

Grazie

Link al commento
Condividi su altri siti

sì è la stessa cosa

come tutti i linguaggi, puoi arrivare allo stesso risultato percorrendo strade diverse,

l'uso dell'IF però ti permette di implementare/aggiungere/costruire altre cose

per esempio la gestione degli errori con l'utilizzo dell'Else

se il valore fosse una variabile numerica e non boleana, l'uso dell'IF con ELSE

ti permetterebbe di "cogliere" questa problematica

Sì in SoMachine se scrivi IF M1 THEN, è implicito che vuol dire se M1 è vero,

nota: meglio usate TRUE o FALSE piuttosto che 0 oppure 1

ciao

Link al commento
Condividi su altri siti

sì è la stessa cosa

come tutti i linguaggi, puoi arrivare allo stesso risultato percorrendo strade diverse,

l'uso dell'IF però ti permette di implementare/aggiungere/costruire altre cose

per esempio la gestione degli errori con l'utilizzo dell'Else

se il valore fosse una variabile numerica e non boleana, l'uso dell'IF con ELSE

ti permetterebbe di "cogliere" questa problematica

Sì in SoMachine se scrivi IF M1 THEN, è implicito che vuol dire se M1 è vero,

nota: meglio usate TRUE o FALSE piuttosto che 0 oppure 1

ciao

Grazie proprio ció che immaginavo.

L'altro mio dubbio è relativo alle chiamate di blocchi funzione: qual'è la sequenza corretta?

Mi spiego: se voglio partire col mio programma rilevando il fronte di salita di un pulsante collegato ad un ingresso fisico per settare il bit M1, è giusto richiamare il blocco in questo modo?

Db_fronte1( clk:=puls_1; Q:=(M1:=1) );

Altra domanda:quando vado a premere F2>accesso facilitato> scorro fino a trovare il blocco che mi interessa e lo seleziono mi appare un editor per la dichiarazione dove mi chiede che nome voglio dare al db. Ora, sia in ladder che in CFC ed FBD mi appariva un aiuto che mi mostrava tutti gli altri db da me dichiarati e mi aiutava a ricordare ad esempio a che numero di db ero arrivato, per non nominare 2 fronti con lo stesso db. In ST non vedo questa possibilità.... Chiedo a voi piu esperti: c'è un modo per aggirare tutto questo?

Ovviamente parlo sempre del linguaggio ST riferito a soMachine.

Grazie a tutti e buona domenica

Link al commento
Condividi su altri siti

È tutta la sera che provo, ma sembra proprio che somachine non accetti sintassi ELSE IF.

Volevo scrivere un codice cosi composto:

IF PLS1 THEN

ESEGUI AZIONE 1;

ELSE IF PLS2 THEN

ESEGUI AZIONE 2;

END_IF

Compilando peró sembra proprio non accettare la sintassi else if, sembra che accetti solamente degli if, al limite annidati. Vi risulta tutto ció?

Link al commento
Condividi su altri siti

Giuseppe Signorella

No!.

Ogni costrutto deve avere una sua struttura ben identificata. Un inizio ed una fine. E devi necessariamente chiudere per primo sempre l'ultimo costrutto aperto.

In tal modo il sistema sa esattamente dove iniziano e dove terminano le istruzioni da eseguire ed appartenenti a quel determinato costrutto.

Vedi anche l'esempio postato da Livio Orsini al post n° 22.

ciao

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...