Vai al contenuto
PLC Forum


Sintassi Awl - .......sbaglio qualcosa


Messaggi consigliati

Inserito:

non capisco perchè quando mi salta all'etichetta M001 mi elabora anche M002, quale è la giusta sintassi per creare il salto condizionato?

L 1

L MW 100

==I

SPB M001

L 2

L MW 100

==I

SPB M002

M001: = A 0.0

= A 0.1

M002: = A 0.2

= A 0.3


Inserita:

la sintassi giusta è

L 1

L MW 100

==I

SPB M001

L 2

L MW 100

==I

SPB M002

M001: = A 0.0

= A 0.1

SPA END

M002: = A 0.2

= A 0.3

END:NOP 0

(siamo alle prime armi con step 7 vero???????)

non mi dilungo nelle spiegazioni ma semplifica il codice:

L 1

L MW 100

==I

= A 0.0

= A 0.1

L 2

L MW 100

==I

= A 0.2

= A 0.3

leggi bene come funziona l'attribuzione del risultato logico e il ruolo degli accumulatori......

pigroplc

Inserita:

ciao ho provato la tua prima soluzione ma non funziona mentre la seconda si................

comunque grazie

Inserita:

Per semplificare ancora:

L MW 100

L 1

==I

= A 0.0

= A 0.1

INC 1

==I

= A 0.2

= A 0.3

Ma occhio che INC usa 8 bit e arriva fino a max 256

Se vuoi fare salti indicizzati puoi anche usare SPL (tratto dall'.):

L MW100 //Carica il numero di destinazioni di salto in ACCU 1-L-L.

SPL LSTX //Destinazione di salto se ACCU 1-L-L > 3.

SPA SEG0 //Destinazione di salto se ACCU 1-L-L = 0.

SPA SEG1 //Destinazione di salto se ACCU 1-L-L = 1.

SPA COMM //Destinazione di salto se ACCU 1-L-L = 2.

SPA SEG3 //Destinazione di salto se ACCU 1-L-L = 3.

LSTX: SPA COMM

SEG0: * //Istruzione ammessa.

*

SPA COMM

SEG1: * //Istruzione ammessa.

*

SPA COMM

SEG3: * //Istruzione ammessa.

*

SPA COMM

COMM: *

Inserita:
ciao ho provato la tua prima soluzione ma non funziona mentre la seconda si................

comunque grazie

La prima soluzione non funziona sole perchè quando fai il salto all'etichetta M001 o M002 non c'è nessuna istruzione che rimette a 0 le uscite quindi (solo per prendere famigliarità con lo step 7) dovresti scrivere:

L 1

L MW 100

==I

SPB M001

L 2

L MW 100

==I

SPB M002

M001: = A 0.0

= A 0.1

CLR

= A 0.2

= A 0.3

SPA END

M002: = A 0.2

= A 0.3

CLR

= A 0.0

= A 0.1

END:NOP 0

Inserita:

non riesco a capire il significato di questo codice potresti spiegarmelo gentilmente.........GRAZIE

Se vuoi fare salti indicizzati puoi anche usare SPL (tratto dall'.):

L MW100 //Carica il numero di destinazioni di salto in ACCU 1-L-L.

SPL LSTX //Destinazione di salto se ACCU 1-L-L > 3.

SPA SEG0 //Destinazione di salto se ACCU 1-L-L = 0.

SPA SEG1 //Destinazione di salto se ACCU 1-L-L = 1.

SPA COMM //Destinazione di salto se ACCU 1-L-L = 2.

SPA SEG3 //Destinazione di salto se ACCU 1-L-L = 3.

LSTX: SPA COMM

SEG0: * //Istruzione ammessa.

*

SPA COMM

SEG1: * //Istruzione ammessa.

*

SPA COMM

SEG3: * //Istruzione ammessa.

*

SPA COMM

COMM: *

per quanto riguarda l'istruzione CLR perchè serve se le uscite non le setto con l'istruzione di set?

M001: = A 0.0

= A 0.1

CLR

= A 0.2

= A 0.3

SPA END

M002: = A 0.2

= A 0.3

CLR

= A 0.0

= A 0.1

END:NOP 0

grazie per l'aiuto

Inserita:

questo è un altro esempio con l'istruzione SPL

L MW100

SPL MAX

SPA PA00

SPA PA01

SPA PA02

SPA PA03

SPA PA04

MAX: SPA FINE

///

PA00: // salta qui se mw100 = 0

///

PA01: // salta qui se mw100 = 1

///

PA02: // salta qui se mw100 = 2

///

PA03: // salta qui se mw100 = 3

///

PA04: // salta qui se mw100 = 4

///

FINE:

è come una specie di SELECT .. CASE di Visual Basic

se mw100=0 salta a PA00 e fa una cosa

se mw100=1 salta a PA01 e ne fa un'altra

se mw100 > 4 salta a MAX

però tra l'istruzione SPL e la riga con l'etichetta MAX (cioè quella specificata da SPL stessa) ci devono essere solo SPA (salti assoluti)

altrimenti il compilatore ti dà errore

ciao

Inserita:
per quanto riguarda l'istruzione CLR perchè serve se le uscite non le setto con l'istruzione di set?

Quando metti a 1 un bit , sia esso un merker o un' uscita, questo bit rimane a 1 fino quando non lo metti a 0 ,

quindi nell' primo esempio fatto da pigroplc quando MW100 vale 1 salti alll'etichetta M001 e metti a 1 le uscite A0.0 e A0.1 , quando poi MW100 vale 2 salti all' etichetta M002 metti a 1 le uscite A0.2 e A0.3 ma non metti a 0 le uscite A0.0 e A0.1 che quindi rimangono a1.

Inoltre per fare le cose giuste tra l'istruzione SPB M002 e l'etichetta M001 , bisognerebbe mettere un istruzione di salto per non elaborare le le istruzioni dove metti le uscite a 1 quando MW 100 non vale nè 1 nè 2.

Quindi se vuoi lasciare le uscite comE sono il codice giusto è:

<span class="postcolor">L 1
   L MW 100
   ==I 
   SPB M001
   L 2
   L MW 100
   ==I 
   SPB M002
   
   SPA END
   
   M001: = A 0.0
   = A 0.1
   CLR
   = A 0.2
   = A 0.3
   SPA END
   M002: = A 0.2
   = A 0.3
   CLR
   = A 0.0
   = A 0.1
   END:NOP 0</span>
oppure se vuoi mettere le uscite a 0 se mw 100 non vale nè 1 e nè 2
<span class="postcolor">L 1
 L MW 100
 ==I 
 SPB M001
 L 2
 L MW 100
 ==I 
 SPB M002

 CLR
 </span><span class="postcolor"> = A 0.0
 = A 0.1</span>
 <span class="postcolor">= A 0.2
 = A 0.3
 SPA END

 </span><span class="postcolor">M001: = A 0.0
 = A 0.1
 CLR
 = A 0.2
 = A 0.3
 SPA END
 M002: = A 0.2
 = A 0.3
 CLR
 = A 0.0
 = A 0.1
 END:NOP 0</span>

Inserita:

ma scusate non è forse molto molto più semplice e pulito fare così senza salti inutili:

U M101.0

= A0.0

= A0.1

U M101.1

= A0.2

= A0.3

Inserita:

Hai ragione rddiego,

oppure anche cosi:

L 1

L MW 100

==I

=A0.0

=A0.1

L 2

L MW 100

==I

=A0.2

=A0.3

Che piu' si avvicina all'esempio iniziale.

Al di la' della pura ed utile didattica , sono dell'idea che semplificare e' meglio! (e non sono solo io a dirlo , ma anche i miei clienti).

Ivan

Inserita:

il PLC è "stupido", e si limita ad eseguire in sequenza le istruzioni che scrivi. Quando salti a M001, "di seguito" esegui anche le istruzioni scritte per M002: non stai richiamando due subroutine diverse, stai semplicmeente saltando.

Potresti sistemare i salti, in questo modo:

L 1

L MW 100

==I

SPB M001

L 2

L MW 100

==I

SPB M002

SPA END //<--------------- per evitare di eseguire M001 e M002 se non si verifica nessuna uguaglianza

M001: = A 0.0

= A 0.1

SPA END //<--------------- per evitare di eseguire M002 dopo aver fatto M001

M002: = A 0.2

= A 0.3

END:NOP 0

ma sarebbe comunque "rischioso", perché hai delle uscite che a seconda dei salti posso essere comandate o meno, e se non sono comandate mantengono il valore del ciclo precedente (senza controllo effettivo). Praticamente una volta che sono state comandate, non c'è più nessuno che le azzera. A questo punto bisognerebbe aggiungere un reset iniziale:

CLR

= A 0.0

= A 0.1

= A 0.2

= A 0.3

L 1

L MW 100

==I

SPB M001

L 2

L MW 100

==I

SPB M002

SPA END

M001: = A 0.0

= A 0.1

SPA END

M002: = A 0.2

= A 0.3

END:NOP 0

...oppure in ogni salto definire quali uscite sono a zero e quali sono a uno, ma sarebbe uno spreco inutile di risorse con tutti quei salti che non hanno una reale utilità; molto meglio una cosa più semplice:

L 1

L MW 100

==I

= A 0.0

= A 0.1

L 2

L MW 100

==I

= A 0.2

= A 0.3

ci possono poi essere altri trucchetti per ottimizzare ancora meglio il codice a scapito della leggibilità, ma eviterei la soluzione che ti hanno suggerito altri tipo:

U M101.0

= A 0.0

= A 0.1

perché M101.0 non è alto solo quando MW100 è uguale a 1, ma è altro per ogni valore dispari di MW100 (che nel tuo caso potrebbe coincidere, ma in generale non è così)

ciao

Inserita:
hai delle uscite che a seconda dei salti posso essere comandate o meno

intendevo dire "[...] hai delle uscite che a seconda dei salti posso essere _gestite_ o meno [...]"

IMHO le uscite devo essere SEMPRE gestite, alte o basse che siano... non posso permettermi di "saltarle"...

(tra parentesi, personalmente prediligo eseguire tutta la logica su dei merker, e poi usare i merker per attivare l'uscita, un passaggio in più che mi permette spesso di riciclare facilmente del codice, soprattutto per macchine o impianti simili)

Inserita:

:lol::)

niky, fai come tia ha detto rddiego ! ;)

Ammeno che ti piacciono particolarmente i salti, l'uso di questi verrebbero giustificati per soluzioni di compiti piu' evoluti e complessi.

Poi, tiene presente che quando assegni un valore true ad un'uscita o flag, se al ciclo successivo non gli asegni niente perche esegui un salto, questa rimane col valore assegnato. Forse meglio se utilizzi il S/R al posto della "=" e quindi per una certa transizione, allora S A 0.0 , S A 0.1 .... R A 0.2, R A 0.3 .

Se le condizione cambiano, allora S A 0.2 , S A 0.3 .... R A 0.0, R A 0.1 ... qualcosa del genere. ;)

  • 2 months later...
Inserita:

Ma il programma alla fine deve anche essere leggibile o deve funzionare e basta ????

...da pigroplc... condivido in pieno

L 1

L MW 100

==I

= A 0.0

= A 0.1

L 2

L MW 100

==I

= A 0.2

= A 0.3

Non sono daccordo con la definizione "il plc è stupido... il plc è fatto così, è di carattere sensibile, se gli dici 1 accende l'uscita e se gli dici 0 la spegne... non è che la prende come una questione personale...

... la fantasia nel far le cose è utile... ma perchè per andare in fondo a una via... anzichè dire vai dritto... si preferisce dire... giri a destra, poi a sinistra, poi al semaforo prendi la terza a destra, passi il ponte e vedrai che in un attimo ti trovi in fondo alla via... oppure per chi abbrevia troppo dice vai... e uno deve sottintendere dritto...

Inserita:
Non sono daccordo con la definizione "il plc è stupido... il plc è fatto così, è di carattere sensibile, se gli dici 1 accende l'uscita e se gli dici 0 la spegne... non è che la prende come una questione personale...

molto bella e azzeccata

ma perche' ostinarsi all'AWL ??

mi sembra una cosa da LADDER , impossibile sbagliarsi , stupido da leggere e lo srivi in una sola maniera.

Luca

Inserita:
Non sono daccordo con la definizione "il plc è stupido... il plc è fatto così, è di carattere sensibile, se gli dici 1 accende l'uscita e se gli dici 0 la spegne... non è che la prende come una questione personale...

Il PLC (così come il computer, tanto per fare un altro esempio) *è* "stupido", dove "stupido" (virgolettato) non è certo da intendersi a livello di questione personale col PLC... è un modo come un altro per dire che non si può pretendere dal PLC che capisca le nostre intenzioni: il programma va scritto in maniera *P*R*E*C*I*S*A*, perché il PLC _si_limita_ ad eseguire in sequenza quello che gli diciamo.

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