Vai al contenuto
PLC Forum


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


niky

Messaggi consigliati

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

Link al commento
Condividi su altri siti


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

Link al commento
Condividi su altri siti

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: *

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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>

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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)

Link al commento
Condividi su altri siti

: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. ;)

Link al commento
Condividi su altri siti

  • 2 months later...

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

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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.

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