Vai al contenuto
PLC Forum


Basi di programmazione ambiente siemens


Giovanni Segreto

Messaggi consigliati

Giovanni Segreto

Buonasera a tutti, 

 

 

E corretto dire che l immagine di processo delle uscite è accessibile dal sistema operativo sia in lettura che in scrittura? 

 

Nella fase di elaborazione del programma utente il sistema operativo esegue le istruzioni  accedendo in lettura sia al immagine di processo degli ingressi che l immagine di processo delle uscite? 

 

Ad esempio se ho realizzato un autoritenuta ladder di q0.0 il suo funzionamento è garantito dalla lettura dello stato precedente di QO.0? 

 

Quando il sistema operativo scrive un uscita fisica la sua ipu rimane dello stesso valore scritto anche per la lettura del ipu nel ciclo di scansione successivo corretto? 

 

 

Grazie 

 

 

Modificato: da Giovanni Segreto
Link al commento
Condividi su altri siti


Al termine del programma utente il sistema operativo copia la tabella immagine delle uscite nelle uscite fisiche, legge gli ingressi fisici e ne copia lo stato nella tabella immagine.

Le uscite fisiche rimangono immutate sino alla seguente scrittura e la tabella immagine degli ingressi non cambia di stato sino alla prossima lettura.

 

Se si vuole conoscere il reale stato di un in gresso, durante l'esecuzione dle programma utente, si deve effettuare una lettura diretta della periferia interessata. Idem se sivuole scrivere fisicamente un'uscita.

Link al commento
Condividi su altri siti

5 ore fa, Livio Orsini ha scritto:

Al termine del programma utente il sistema operativo copia la tabella immagine delle uscite nelle uscite fisiche, legge gli ingressi fisici e ne copia lo stato nella tabella immagine.

Probabilmente su SIEMENS oggi è ancora così, tuttavia parecchio PLC e RUNTIME odierni che permettono di definire cicliche a tempo differenziate aggiornano le variabili mappate sulla ciclica legata al BUS di campo. Questo comporta che se per esempio ho una ciclica su BUS a 1ms e una meno prioritaria a 10ms, la quale dura più di 1ms, tale ciclica viene interrotta più volte dalla ciclica più veloce e questo comporta che una variabile potrebbe cambiare valore prima che una scansione sia completa. Se poi usiamo i runtime multicore come Beckoff e Codesys tali cicliche possono anche girare su processi paralleli portando a tutti i problemi che conosce benissimo chi è abituato a multitasking e multithreading. In quest'ultimo caso un valore potrebbe cambiare se letto su due righe adiacenti e garantire un crash del runtime se scritte accidentalmente il parallelo.

Link al commento
Condividi su altri siti

1 ora fa, Marco Mondin ha scritto:

Probabilmente su SIEMENS oggi è ancora così, tuttavia parecchio PLC

 

Titolo della discussione: "Basi di programmazione ambiente siemens", quindi come sono organizzati altri PLC non è influente.

Questo è l'ambiente classico di molti PLC, oltre che di Siemens.

Però anche in Siemenes è da sempre possibile sia leggere e scrivere direttamente la periferia, sia legare un'interruzione ad un fronte o ad uno stato di alcuni ingressi specifici.

Poi l'uso di periferia decentrata interfacciata con bus di campo permette anche altre schedulazioni.

 

Non so se è una linea di prodotti ancora attuale di Siemens ma, a fine secolo scorso, introdussero una linea di PLC, di cui il modello base aveva un a CPU basata sullo 80386 ex, il cui sistema operativo altro non era che lo RTOS di concezione Intel, quindi con tutte le funzionalità di sistema operativo real time multitaskig.

Non ebbe una gran diffusione perchè costi a parte, la difficoltà di programamzione era enorme per chi avesse dimestichezza solo con i PLC.

Il costo base era elevato, ma diventava molto conveniente su alcuni apparati.

Link al commento
Condividi su altri siti

3 ore fa, Marco Mondin ha scritto:

Probabilmente su SIEMENS oggi è ancora così, tuttavia parecchio PLC e RUNTIME odierni che permettono di definire cicliche a tempo differenziate aggiornano le variabili mappate sulla ciclica legata al BUS di campo.

Anche in Siemens si possono avere task diverse, e i moduli di I/O possono essere associati, uno per uno, a task diverse.
L'associazione di un modulo di I/O a un ciclo diverso da quello principale, si fa però solo per scopi particolari. Nella quasi totalità dei casi, sarebbe solo volersi complicare inutilmente la vita.

Nel motion, soprattutto se c'è bisogno di elevate prestazioni, l'OB MC-Servo è sincronizzato con la rete, e la gestione dei drive è sincronizzata con l'MC-Servo.

 

La domanda però, come fatto già notare da Livio, si riferiva ad una situazione "classica" e, in questo caso, è come descritto da Livio.
Che poi, come detto, per i normali I/O, è anche il modo più comodo e razionale di lavorare. E nulla toglie che, se necessario, si può in qualunque momento accedere in modo immediato agli I/O.

 

Link al commento
Condividi su altri siti

Giovanni Segreto
20 ore fa, Giovanni Segreto ha scritto:

Nella fase di elaborazione del programma utente il sistema operativo esegue le istruzioni  accedendo in lettura sia al immagine di processo degli ingressi che l immagine di processo delle uscite? 

 

Grazie a tutti per le risposte, è corretto quello che ho scritto qui sopra ? 

Link al commento
Condividi su altri siti

12 ore fa, Giovanni Segreto ha scritto:

è corretto quello che ho scritto qui sopra ? 

 

Se hai letto quello che ho scritto hai già la risposta.

Link al commento
Condividi su altri siti

Giovanni Segreto

 

@Livio Orsini

 

 

 

 

 

---[  I0.0 ]------- —¦-------------(Q0.0) 

                           ¦ 

   [Q0.0 ]-----------¦

 

Per risolvere questa operazione nel ciclo di scansione il sistema operativo accede in lettura al immagine di processo delle uscite?

 

 

Se si, questo significa che il sistema operativo nella fase di elaborazione delle istruzioni per scrivere la tabella delle uscite può accedere in lettura (dei contatti) sia del immagine di processo degli ingressi che in quella delle uscite? 

 

Si ho letto il messaggio precedente, solo che vorrei fare chiarezza ai miei dubbi , mi scuso se non mi sono spiegato correttamente.

 

Grazie @Livio Orsini

 

 

Modificato: da Giovanni Segreto
Link al commento
Condividi su altri siti

7 minuti fa, Giovanni Segreto ha scritto:

Per risolvere questa operazione nel ciclo di scansione il sistema operativo accede in lettura al immagine di processo delle uscite?

SI

7 minuti fa, Giovanni Segreto ha scritto:

Se si, questo significa che il sistema operativo nella fare di elaborazione delle istruzioni per scrivere la tabella delle uscite può accedere in lettura (dei contatti) sia del immagine di processo degli ingressi che in quella delle uscite? 

Il sistema operativo del plc può accedere in lettura e scrittura sia all'immagine di processo degli ingressi sia all'immagine di processo delle uscite.

Link al commento
Condividi su altri siti

3 ore fa, Giovanni Segreto ha scritto:

---[  I0.0 ]------- —¦-------------(Q0.0) 

                           ¦ 

   [Q0.0 ]-----------¦

 

Per risolvere questa operazione nel ciclo di scansione il sistema operativo accede in lettura al immagine di processo delle uscite?


La sequenza interna in un PLC è:

//Parte nascosta
0 - Copio gli ingressi fisici nell'area di memoria dell'immagine di processo ingressi
//Fine parte nascosta
1 ....
2 ....
...
N
N + 1 - Carico I0.0 dall'immagine di processo letta sopra (L'ingresso fisico potrebbe non essere già più così)
N + 2 - Faccio la somma booleana con cosa contiene Q0.0 (Dall'area di memoria in cui c'è l'immagine di processo)
N + 3 - Scrivo il risultato della somma nella stessa area di memoria letta sopra.
...
//Parte nascosta che non si vede alla fine della sequenza
M - Copio l'area di memoria delle uscite sulle uscite fisiche
M + 1 - Vado eventualmente in sleep per un certo tempo
M + 2 - Salto a 0

Qualunque cosa tu faccia tra N + 3 e M  avrai Q0.0 aggiornato internamente per il programma, ma non fisicamente in uscita, l'aggiornamento fisico avviene solo a M

Modificato: da Marco Mondin
Link al commento
Condividi su altri siti

Giovanni Segreto
1 ora fa, Marco Mondin ha scritto:

1 ....
2 ....

È per la sequenza esatta delle operazioni? 

 

In "1" qualsiasi sia il numero degli ingressi lui li carica tutti? 

 

In "2" esegue le operazioni di somme logiche e le altre operazioni richieste? 

Le esegue  dalla primo segmento al ultimo da sinistra a destra e dal alto al basso

 

1 ora fa, Marco Mondin ha scritto:

N

N=fase di scansione programma utente? 

 

M= fase finale di scrittura uscite fisiche e salto a zero ovvero riparo a capo. 

Link al commento
Condividi su altri siti

6 minuti fa, Giovanni Segreto ha scritto:

È per la sequenza esatta delle operazioni? 

 

In "1" qualsiasi sia il numero degli ingressi lui li carica tutti? 

 

In "2" esegue le operazioni di somme logiche e le altre operazioni richieste? 

Le esegue  dalla primo segmento al ultimo da sinistra a destra e dal alto al basso

 

N=fase di scansione programma utente? 

 

M= fase finale di scrittura uscite fisiche e salto a zero ovvero riparo a capo. 

Si i numeri 1, 2, ... N, ... M indicano la sequenza delle operazioni.

E si li carica tutti, si chiama immagine di processo anche per quello, fa una fotocopia dello stato degli ingressi in memoria.

Somiglia a cosa facevano le vecchie CPU in linguaggio macchina, oggi è molto più perverso.

Non è proprio sempre da destra a sinistra e dall'alto in basso, ma come prima semplificazione ti conviene pensarlo così.
Ci sono regole che traducono direttamente il ladder in IL, il primo è una trasposizione grafica del secondo.
Mentre passare da un LADDER a un IL è sempre possibile, non lo è sempre il contrario.

P.S. SIEMENS usa i suoi nomi KOP e AWL, ma alla fine sono sempre LADDER e IL.

I PLC lavorano con un sistema ciclico che ripete sempre le stesse cose. Almeno fino a quando non inizierà a diffondersi l'IEC61499.
 

Modificato: da Marco Mondin
Link al commento
Condividi su altri siti

Giovanni Segreto
2 ore fa, Marco Mondin ha scritto:

N + 2 

Se prima di passare a n+2

Carica tutti gli ingressi. 

Significa che non può passare a n+2 se non ha caricato tutti gli ingressi mappati dal utente? 

 

 

Quando è in fase n+2 e ha più somme da fare e come se appoggiasse da qualche parte il risultato della prima somma

Per fare la seconda? 

Nel senso che n+2 serve a procurarsi i risultati delle operazioni e senza tutti i risultati non passa alla n+3?

 

Alla n+3 li passa tutti in simultanea? 

 

 

 

 

Modificato: da Giovanni Segreto
Link al commento
Condividi su altri siti

Appoggia sempre il risultato ad un "registro" ogni produttore lo chiama come preferisce.

LD è un operazione che carica un valore da memoria e lo mette nel registro. Una semplificazione di quello che si fa in assembly.

L'operazione N+1 carica in quel registro il valore, N+2 fa la somma booleana del registro con Q0.0, il registro assumerà il valore del risultato. N+3 scarica dal registro il dato e lo mette in memoria su Q0.0 che non è altro che un alias di un indirizzo fisico di memoria in cui è mappato il dato.

Poi in realtà ci sono altre cose nascoste, ma ti confonderei solo.

Modificato: da Marco Mondin
Link al commento
Condividi su altri siti

Giovanni Segreto
25 minuti fa, Marco Mondin ha scritto:

, N+2 fa la somma booleana del registro con Q0.0, il registro assumerà il valore del risultato

 il risultato del l or logico viene scritto nel registro q0.0? Ma senza n+3 il dato del registro non sarebbe preso e messo in posizione fruibile da fase M? 

Link al commento
Condividi su altri siti

Giovanni se leggi un qualsiasi manuale di una qualsiasi CPU di PLC, in uno dei primi capitoli dovresti trovare il diagramma temporale, circolare, delle operazioni descritte da marco Mondin. Almeno sinio a qualche anno fa era sempre presente nei manuali.

Link al commento
Condividi su altri siti

15 ore fa, Giovanni Segreto ha scritto:

 il risultato del l or logico viene scritto nel registro q0.0? Ma senza n+3 il dato del registro non sarebbe preso e messo in posizione fruibile da fase M? 

No! Q0.0, non è un registro, puoi vederlo come una variabile che contiene l'indirizzo dell'area di memoria in cui è scritto il dato Q0.0.
Il registro è una cosa interna alla CPU(Fisica o simulata che sia da un softPLC) non in RAM.

passo n)        OR Q0.0  ---->> Prendo cosa c'è in Q0.0 faccio la somma boolena con quanto c'è nel mio registro riservato e la salvo su tale registro per l'operazione successiva 
passo n+1)    AND I0.0 ---->> Nel registo riservato ci sarà il risultato del passo n, leggo I0.0 e faccio il prodotto booleano con il registro riservato sul quale risalvo il risultato

Sono operazioni eseguite su due operandi, ma uno dei due è sempre implicito, mentre l'altro è esplicito.

e così via...

Indicare Q0.0 è per evitare di scrivere un indirizzo di RAM in cui risiede il dato (Cosa che sarebbe molto scomoda), Q, I etc non sono altro che pezzi di una mappa delle immagini di processo per poter sapere dove sono senza conoscerne le "coordinate"(indirizzo) a memoria.
Il registro che si usa in IL è implicito ed è un registro fisico della CPU in vecchi PLC, mentre oggi è una variabile di uno stack non accessibile direttamente in IL in tutti i softPLC.

Come dice @Livio Orsini è meglio se leggi un testo sui PLC, e se ti interessa veramente capire cosa fa sotto ti conviene un testo di assembly (Ti consiglierei di partire da uno di un vecchio processore MC68000 che è molto più semplice e snello di quello x86). "IL" era nato per mascherare un po' l'assembly delle CPU e poter compilare velocemente su vecchi processori con prestazioni ridicole il codice, che in realtà più che di una compilazione vera richiedeva una traduzione in cui le istruzioni venivano estese con le parti nascoste per semplificare non poco la vita a chi sviluppava per i PLC (Oggi è tutto simulato dai softPLC su un sistema operativo anche nelle CPU che non sembrano averlo). Se vuoi capire veramente bene quello che sta sotto devi capire la base di funzionamento di una CPU semplice e possibilmente vecchia.

Qua stiamo andando veramente troppo off topic, oltre a non parlare più nello specifico di funzionalità di un 1200 siamo fuori dal discorso legato solo a SIEMENS.

Modificato: da Marco Mondin
Link al commento
Condividi su altri siti

Giovanni Segreto

Pensavo fosse complicato il manuale siemens ma in confronto a quello che stai dicendo è una passeggiata 😅

 

L assembly che mi consigli è un linguaggio di programmazione il cui è codice e scritto per far girare l hardware del plc e quindi definire  il suo ciclo di scansione? 

 

 

 

 

 

 

Link al commento
Condividi su altri siti

19 minuti fa, Giovanni Segreto ha scritto:

Pensavo fosse complicato il manuale siemens ma in confronto a quello che stai dicendo è una passeggiata

Ma, scusami, cosa non ti è ancora chiaro?

1) Il PLC legge lo stato fisico degli ingressi, e lo copia nell'immagine (in realtà, alcuni PLC lo fanno alla fine dell'elaborazione del programma, che equivale all'inizio dell'elaborazione successiva, quindi, dal punto di vista della scrittura del programma, le cose non cambiano)

2) Il PLC elabora il programma. Se vengono interrogati degli ingressi, il PLC fa riferimento all'immagine copiata in precedenza (salvo istruzioni per accedere volutamente allo stato immediato dell'ingresso). Lo stato fisico di un ingresso, nel frattempo, potrebbe essere cambiato, ma l'immagine degli ingressi rimane fissa per tutta la scansione. Questo ti garantisce che se, all'interno della stessa scansione, interroghi più volte lo stesso ingresso, lo stato di questo ingresso sarà sempre uguale.

3) Il PLC elabora il programma, istruzione per istruzione, così come sono scritte (evitiamo di tirare in ballo interrupt od altro). Il ladder, in linea di massima, le istruzioni vengono interpretate da sinistra verso destra, e dall'alto in basso.
Se nell'elaborazione viene scritta un'uscita, in realtà viene aggiornata all'istante solo l'immagine delle uscite, ma non l'uiscita fisica. Se interroghi lo stato dell'uscita, interroghi sempre l'immagine.

4) Alla fine dell'elaborazione, l'immagine delle uscite viene copiata sulle uscite fisiche.

5) Il PLC, automaticamente, riparte dal punto 1.

 

Sinceramente, non capisco cosa ci sia di difficile, e quali siano, ancora, i tuoi dubbi.

Link al commento
Condividi su altri siti

3 ore fa, Giovanni Segreto ha scritto:

Pensavo fosse complicato il manuale siemens ma in confronto a quello che stai dicendo è una passeggiata 😅

 

Ma no.

Io ti consiglieri di leggere, se lo trovi ancora, il testo del Bergamaschi. Fa riferimento allo S7200, ma è comunque sempre valido per imparare a programmare un PLC con un minimo di rigore.

ti consiglio anche di leggere, se ne trovi una copia libera in rete, "Controllo automatico dei sistemi" Schmitt e Farwell, edito da Jacson. E in italiano ed è molto pratico.

 

3 ore fa, Giovanni Segreto ha scritto:

L assembly che mi consigli è un linguaggio di programmazione il cui è codice e scritto per far girare l hardware del plc e quindi definire  il suo ciclo di scansione? 

 

L'assembley o "asm" è un linguaggio 1 a 1; per ogni istruzione mnemonica corisponde un'istruzione "macchina", ovvero una serie di 1 e 0 che sono il codice che il processore riconoscerà come operazione da eseguire.

Quello che siemens definisce come AWL può essere considerato come una sorta di assembler.

 

Io sono del parere che prima di iniziare a programmare un nuovo PLC, specialmente se non si è mai programmato un PLC, bisogna leggerne il manuale.

Poi si inizia a provare con il manuale di fianco, si legge, si prova, si legge e si riprova ....

Pensare di risparmiare tempo saltando lo studio dei manuali è solo perdere tempo ed accumulare lacune che faranno perdere altro tempo.

 

Io ho sempre dovuto fare violenza al mio carattere, che vorrebbe passare subito all'azione, ma mni sono sempre inposto la regola 8parafrasando un massima latina): "primum legere, deinde laborare!"

Link al commento
Condividi su altri siti

Giovanni Segreto
3 ore fa, batta ha scritto:

Sinceramente, non capisco cosa ci sia di difficile, e quali siano, ancora, i tuoi dubbi.

 Mi è chiaro il concetto, ma faccio un altro tipo di lavoro e se mai dovessi scrivere un programma vorrei essere certo di quello che avviene, immagino un programmatore debba avere il controllo totale di ciò che scrive e avere il più possibile un analisi chiara di ciò che può accadere nel processo. 

Link al commento
Condividi su altri siti

35 minuti fa, Giovanni Segreto ha scritto:

 Mi è chiaro il concetto, ma faccio un altro tipo di lavoro e se mai dovessi scrivere un programma vorrei essere certo di quello che avviene, immagino un programmatore debba avere il controllo totale di ciò che scrive e avere il più possibile un analisi chiara di ciò che può accadere nel processo. 

Beh... Oggi in grandi aziende si tende a sviluppare con paradigmi che isolino le parti di un grosso applicativo e rendano slegate le une dalle altre dai rispettivi dettagli implementativi.
Ci sono molte figure. Gli analisti conoscono l'interfaccia di connessione tra i vari oggetti e la progettano, i progettisti che definiscono come devono essere i dettagli implementativi di ogni oggetto e gli sviluppatori che trasformano in codice le richieste dei progettisti.
Capita di frequente che gli ultimi non abbiano una visione globale di un progetto e sovente è voluto. Come ad un analista se le cose sono fatte bene non interessa minimamente come le hanno implementate dentro.
Infine soprattutto oggi gravitano altre figure intorno, per esempio i designers che sono sovente laureati in architettura e sanno disegnare interfacce inarrivabili da uno sviluppatore medio.
Quindi non è detto che lo sviluppatore debba avere il controllo totale. Anzi...

In piccole realtà, soprattutto individuale, soventi, capita ancora invece che per necessità debba avercelo.

Modificato: da Marco Mondin
Link al commento
Condividi su altri siti

Marco Mondin hai descritto la tipica organizzazione di progetto delle Software House. Un tempo si dedicavano solo allo sviluppo di progetti su mini computer e micro embedded, difficilmente si occupavano di Sw di PLC, a meno che fossero integrati in sistemi di grandi dimensioni.

Oggi, con l'evoluzione tecnologica dei PLC, che un tempo erano praticamente solo un grosso contenitore di relè virtuali, si può applicare la medesima metodologia anche allo sviluppo di Sw per PLC.

Link al commento
Condividi su altri siti

Caro Giovanni Segreto

nella discussione che ho riportato sopra, ho descritto in dettaglio la sequenza temporale delle operazioni che vengono svolte.

Il 27/1/2021 alle 19:25 , Giovanni Segreto ha scritto:

Significa che non può passare a n+2 se non ha caricato tutti gli ingressi mappati dal utente? 

Ogni cpu ha una sua dimensione IPI, per esempio alcune vecchie cpu S7-300 avevano una IPI da 256 Byte. Ovvero a inizio ciclo tutti gli ingresso da 0 a 255 venivano caricati in memoria, per accedere ad ingressi al di fuori di quest'area devi usare istruzioni specifiche (PEW). Lo stesso dicasi per le uscite.

Tieni conto che è un'operazione (il trasferimento dell'IPI) svolta in automatico dal sistema operativo, quindi in "ombra", ti basta sapere com'è il meccanismo.

Penso che il trasferimento dell'IPI non si limiti agli ingressi mappati dall'utente (ovvero quelli richiamati nel programma, se è questo che intendi), ma a tutti gli ingressi definiti nella configurazione Hardware, forse addirittura tutta la grandezza dell'IPI (256 byte nell'esempio), mappati o meno.

 

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...