niky Inserito: 17 febbraio 2008 Segnala Inserito: 17 febbraio 2008 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 M002M001: = A 0.0 = A 0.1M002: = A 0.2 = A 0.3
pigroplc Inserita: 17 febbraio 2008 Segnala Inserita: 17 febbraio 2008 la sintassi giusta è L 1L MW 100==I SPB M001L 2L MW 100==I SPB M002M001: = A 0.0= A 0.1SPA ENDM002: = A 0.2= A 0.3END:NOP 0(siamo alle prime armi con step 7 vero???????)non mi dilungo nelle spiegazioni ma semplifica il codice:L 1L MW 100==I = A 0.0= A 0.1L 2L MW 100==I = A 0.2= A 0.3leggi bene come funziona l'attribuzione del risultato logico e il ruolo degli accumulatori......pigroplc
niky Inserita: 17 febbraio 2008 Autore Segnala Inserita: 17 febbraio 2008 ciao ho provato la tua prima soluzione ma non funziona mentre la seconda si................comunque grazie
JumpMan Inserita: 18 febbraio 2008 Segnala Inserita: 18 febbraio 2008 Per semplificare ancora:L MW 100L 1==I = A 0.0= A 0.1INC 1==I = A 0.2= A 0.3Ma occhio che INC usa 8 bit e arriva fino a max 256Se 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: *
STEU Inserita: 18 febbraio 2008 Segnala Inserita: 18 febbraio 2008 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 1L MW 100==I SPB M001L 2L MW 100==I SPB M002M001: = A 0.0= A 0.1CLR= A 0.2= A 0.3SPA ENDM002: = A 0.2= A 0.3CLR= A 0.0= A 0.1END:NOP 0
niky Inserita: 18 febbraio 2008 Autore Segnala Inserita: 18 febbraio 2008 non riesco a capire il significato di questo codice potresti spiegarmelo gentilmente.........GRAZIESe 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.1CLR= A 0.2= A 0.3SPA ENDM002: = A 0.2= A 0.3CLR= A 0.0= A 0.1END:NOP 0grazie per l'aiuto
cisio Inserita: 18 febbraio 2008 Segnala Inserita: 18 febbraio 2008 questo è un altro esempio con l'istruzione SPL L MW100 SPL MAX SPA PA00 SPA PA01 SPA PA02 SPA PA03 SPA PA04MAX: 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 Basicse mw100=0 salta a PA00 e fa una cosase mw100=1 salta a PA01 e ne fa un'altrase 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à erroreciao
STEU Inserita: 19 febbraio 2008 Segnala Inserita: 19 febbraio 2008 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>
rddiego Inserita: 19 febbraio 2008 Segnala Inserita: 19 febbraio 2008 ma scusate non è forse molto molto più semplice e pulito fare così senza salti inutili:U M101.0= A0.0= A0.1U M101.1= A0.2= A0.3
kamikaze Inserita: 19 febbraio 2008 Segnala Inserita: 19 febbraio 2008 Hai ragione rddiego,oppure anche cosi:L 1L MW 100==I=A0.0=A0.1L 2L MW 100==I=A0.2=A0.3Che 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
Gapo Inserita: 19 febbraio 2008 Segnala Inserita: 19 febbraio 2008 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 1L MW 100==ISPB M001L 2L MW 100==ISPB M002SPA END //<--------------- per evitare di eseguire M001 e M002 se non si verifica nessuna uguaglianzaM001: = A 0.0= A 0.1SPA END //<--------------- per evitare di eseguire M002 dopo aver fatto M001M002: = A 0.2= A 0.3END:NOP 0ma 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.3L 1L MW 100==ISPB M001L 2L MW 100==ISPB M002SPA ENDM001: = A 0.0= A 0.1SPA END M002: = A 0.2= A 0.3END: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 1L MW 100==I= A 0.0= A 0.1L 2L MW 100==I= A 0.2= A 0.3ci 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.1perché 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
Gapo Inserita: 19 febbraio 2008 Segnala Inserita: 19 febbraio 2008 hai delle uscite che a seconda dei salti posso essere comandate o menointendevo 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)
Savino Inserita: 19 febbraio 2008 Segnala Inserita: 19 febbraio 2008 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.
TRC Inserita: 21 aprile 2008 Segnala Inserita: 21 aprile 2008 Ma il programma alla fine deve anche essere leggibile o deve funzionare e basta ????...da pigroplc... condivido in pienoL 1L MW 100==I = A 0.0= A 0.1L 2L MW 100==I = A 0.2= A 0.3Non 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...
Luca Bab Inserita: 21 aprile 2008 Segnala Inserita: 21 aprile 2008 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 azzeccatama perche' ostinarsi all'AWL ??mi sembra una cosa da LADDER , impossibile sbagliarsi , stupido da leggere e lo srivi in una sola maniera.Luca
Gapo Inserita: 21 aprile 2008 Segnala Inserita: 21 aprile 2008 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.
TRC Inserita: 21 aprile 2008 Segnala Inserita: 21 aprile 2008 Gapo dai... era una battuta per ridere...
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora