niky Inserito: 17 febbraio 2008 Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
pigroplc Inserita: 17 febbraio 2008 Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
niky Inserita: 17 febbraio 2008 Autore Segnala Share Inserita: 17 febbraio 2008 ciao ho provato la tua prima soluzione ma non funziona mentre la seconda si................comunque grazie Link al commento Condividi su altri siti More sharing options...
JumpMan Inserita: 18 febbraio 2008 Segnala Share 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: * Link al commento Condividi su altri siti More sharing options...
STEU Inserita: 18 febbraio 2008 Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
niky Inserita: 18 febbraio 2008 Autore Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
cisio Inserita: 18 febbraio 2008 Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
STEU Inserita: 19 febbraio 2008 Segnala Share 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> Link al commento Condividi su altri siti More sharing options...
rddiego Inserita: 19 febbraio 2008 Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
kamikaze Inserita: 19 febbraio 2008 Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
Gapo Inserita: 19 febbraio 2008 Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
Gapo Inserita: 19 febbraio 2008 Segnala Share 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) Link al commento Condividi su altri siti More sharing options...
Savino Inserita: 19 febbraio 2008 Segnala Share 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. Link al commento Condividi su altri siti More sharing options...
TRC Inserita: 21 aprile 2008 Segnala Share 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... Link al commento Condividi su altri siti More sharing options...
Luca Bab Inserita: 21 aprile 2008 Segnala Share 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 Link al commento Condividi su altri siti More sharing options...
Gapo Inserita: 21 aprile 2008 Segnala Share 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. Link al commento Condividi su altri siti More sharing options...
TRC Inserita: 21 aprile 2008 Segnala Share Inserita: 21 aprile 2008 Gapo dai... era una battuta per ridere... Link al commento Condividi su altri siti More sharing options...
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