Vai al contenuto
PLC Forum


Indirizzamento Indicizzato Con S5


bobco

Messaggi consigliati

Devo pilotare un display a 7 segmenti (4 cifre) con un PLC S5-115.

Il numero da visualizzare è un codice di allarme. Tutti gli allarmi sono su delle MW.

In pratica devo interrogare i singoli bit di 6 MW (96 allarmi).

Volevo utilizzare un indirizzamento indicizzato con una sorta di polling a tempo.

Avete qualche suggerimento o esempio da indicarmi?

Grazie a tutti.

Link al commento
Condividi su altri siti


Beh, e' un po' che non utilizzo S5, sono quindi un po' arrugginito, pero' ci provo ugualmente.

Premessa.

-Allarmi in MW da 100 a 110 quindi da M100.0 a M111.7

-Mw10=Puntatore

-MW12=contatore

-M1.0=Allame attivo individuato

-T0 =Tempo di "visualizzazione.

Per cominciare prova cosi' e vedi se funziona, BUON LAVORO!!!!

Link al commento
Condividi su altri siti

Gabriele Corrieri

Ciao

non capisco tanta complicazione!

a prescindere dal metodo di pilotaggio del display potrebbero volerci da 12 a 32 uscite, ma a quel punto basta semplicemente fare una serie di confronti, con un jump d'uscita ... esempio breve breve

confronto con "allarme 1"
carica "0001" nel MW dei display
jump uscita
confronto con "allarme 2"
carica "0002" nel MW dei display
jump uscita
confronto con "allarme 2"
carica "0002" nel MW dei display
jump uscita

uscita:be

non te lo scrivo in S5 perchè sono arruginitissimo ... scriverei errori e basta, credo comunque che il principio sia chiaro

Ciao

Modificato: da Gabriele Corrieri
Link al commento
Condividi su altri siti

Nello step5 l’indicizzazione si ottiene con l’istruzione B.

P.es per leggere la DW102 si può scrivere:

L KF102

T MW 10 <<<PUNTATORE

B MW 10

L DW 0 <<<Legge DW indicizzata da MW10 (legge DW102)

E’ possibile indicizzare anche la lettura di 1 bit, ma è molto tempo che non lo uso e non mi ricordo esattamente come si costruisce il puntatore, te lo potrà dire qualcuno che ha i manuali sottomano (o che ha installato sulla sua crapa una flash più capiente della mia, io ogni tanto devo formattare qualche zona di memoria per far posto a nuovi dati :P ).

In ogni caso la lettura di 1 bit per ciclo (incremento puntatore ad ogni ciclo plc) la vedo molto lenta, viceversa, la lettura di tutti i 96 bit in 1 solo ciclo (con 96 incrementi di puntatore e istruzioni varie) la vedo troppo pesante, quindi ti consiglierei di costruirti un puntatore ai 12 byte di allarme:

Esempio: Se hai gli allarmi da MW0 a MW10 ti fai un contatore (es. su MW100) che cicla da 0 a 11, questa MW (puntatore) la usi per esaminare un intero byte di allarmi (8 allarmi alla volta), se il valore del byte puntato è <>0 blocchi il contatore (puntatore) e inizi a esaminare a 1 a 1 gli 8 bit..... ogni volta che trovi 1 bit a 1 fermi il tutto e visualizzi il nr. corrispondente (che può risultare da un calcolo sul valore dei puntatori oppure dal valore di un “contatore” parallelo).

Link al commento
Condividi su altri siti

:rolleyes:

Rispondo a Gabriele Corrieri. E' chiaro che è molto più semplice fare dei confronti, bit per bit, con dei salti, ma se gli allarmi sono un centinaio, conviene risparmiare sull'occupazione della memoria di programma o comunque fare una programmazione più "intelligente", altrimenti perchè avrebbero inventato l'indirizzamento indiretto?

Grazie a tutti per i consigli.

Link al commento
Condividi su altri siti

E’ possibile indicizzare anche la lettura di 1 bit, ma è molto tempo che non lo uso e non mi ricordo esattamente come si costruisce il puntatore.....

Ci provo...

DB 5

......

DW 2 KH = 0105

DW 3 KH= 0002

......

FB 1

...

A DB 5

...

...

B DW 2

U E 0.0 // E 5.1

...

B DW 3

SE T 0 // SE T 2

...

P.S. : Il english indexed statement per proccessing operation e' DO, quindi

DO DW2

A I 0.0 // input 5.1

...

P.S. spero non avere sbagliato di tanto :rolleyes:

Modificato: da Savino
Link al commento
Condividi su altri siti

Gabriele, ho paura che il tuo codice restituisca solo il nr. del 1° allarme incontrato, in caso contrario non ho capito bene cosa intendi per “confronto”.

Un codice simile io lo uso per i messaggi di “manovra errata” in manuale, che devono restituire 1 solo messaggio alla volta (se l’operatore sbaglia una manovra).

DW 2 KH = 0105

Allora si potrebbe scrivere anche KY 1,5

Ma siamo sicuri che non sia KH0501 e KY 5,1 ? ... Il bit sta nel byte alto ?... Perché ora ,facendo uno scandisk della flash (sempre quella della mia crapa), mi riaffiora un ricordo che il bit sta nel byte basso!

Chi ha i manuali ?

Link al commento
Condividi su altri siti

Ma siamo sicuri che non sia KH0501 e KY 5,1 ?

No.

Confermo sopra postato, adesso con due manuali (95 e 115 ) in mano.

Un'altro esempio.

DB 6

DW 12 : KH =0108
DW 13 : KH =0001

FBx

A DB 6
..
..
B DW 12
U M 0.0          // U M 8.1
B DW 13
SS T 0           // SS T 1
..

..

Gabriele, ho paura che il tuo codice restituisca solo il nr. del 1° allarme incontrato, in caso contrario non ho capito bene cosa intendi per “confronto”.

L' idea di massima strutturata da Gabriele l'ho utilizzata anch'io con successo per il ricavo del numero di messaggio da visualizzare ........ potrebbe diventare lunga da scrivere, a seconda la lunghezza del numero di messaggi da gestire ma molto veloce nella sua esecuzione. ;)

Modificato: da Savino
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...