Vai al contenuto
PLC Forum


Scambio soglie


Project75

Messaggi consigliati

Buona sera ho una CPU et200sp, vorrei realizzare uno scambio di soglie su 3 soffiati, spiego meglio,  ho tre soffiati che lavorano con tre soglie diverse, supponiamo di dare 3 soglie diverse soglia 1=10, soglia 2=20 e soglia 3=30, queste tre soglie devono alternarsi sulle 3 soffiati quindi soffiati 1=10, soffiante 2=20 e soffiante 3=30, dopo 1 ora soffiante 1=20, soffiante 2=30 e soffiante 3=10, dopo ancora un ora soffiante 1=30, soffiante 2=10 e soffiante 3=20 e dopo un'altra ora soffiante 1=10, soffiante 2=20 e soffiante 3=30, e così via.... cosa mi suggerite per realizzare questa combinazione? 

 

Modificato: da Project75
Link al commento
Condividi su altri siti


  • Risposte 53
  • Created
  • Ultima risposta

Top Posters In This Topic

  • Project75

    26

  • acquaman

    14

  • Livio Orsini

    6

  • batta

    4

Top Posters In This Topic

Posted Images

Fai uno shift circolare con le tre soglie alla soffiata 1 assegni laposizione 1, alla soffiata 2 la posizione 2 ed alla soffiata 3 la posizione 3.

Dopo ogni soffiata dai un avanamento allo shift così allo prossima soffiata hai già le sogle pronte.

Questo è il primo metodo che mi viene alla mente, probabilmente c'è anche qualche altro modo.

Link al commento
Condividi su altri siti

Non so come fare ad entrare nel dettaglio.

Se programmassi ancora i PLC ti metterei il codice che si aggirerebbe in una decina di righe in AWL.

Se non sai cos'è un shift, fai un contatore da 1 a 3; contatore che andrai ad incrementare dopo ogni soffiata; se il contatore > 3 ===> contatore = 1.

Poi fai i test di eguaglianza e, a seconda del conteggio, applichi i valori previsti per le soffianti.

Link al commento
Condividi su altri siti

in pseudocodice:

 

ora_attuale = oradelsistema

 

IF ora_attuale<>ora_ultima THEN

    soglia=soglia+1

    IF soglia > 3 THEN soglia=1

    IF soglia = 1 THEN soffio1 = 10 : soffio2 = 20 : soffio3 = 30

    IF soglia = 2 THEN soffio1 = 20 : soffio2 = 30 : soffio3 = 10

    IF soglia = 3 THEN soffio1 = 30 : soffio2 = 10 : soffio3 = 20

    ora_ultima=ora_attuale

ENDIF

 

Link al commento
Condividi su altri siti

12 minuti fa, Livio Orsini ha scritto:

Non so come fare ad entrare nel dettaglio.

Se programmassi ancora i PLC ti metterei il codice che si aggirerebbe in una decina di righe in AWL.

Se non sai cos'è un shift, fai un contatore da 1 a 3; contatore che andrai ad incrementare dopo ogni soffiata; se il contatore > 3 ===> contatore = 1.

Poi fai i test di eguaglianza e, a seconda del conteggio, applichi i valori previsti per le soffianti.

Infatti ho fatto così, il contatore conta da 1 a 3 e con il blocco == trasferisco la soglia corrispondente al numero del conteggio, e cosi tutto funziona. Per semplificare le cose e per evitare tanti move ho fatto una array da 1 a 3 of real e con lindice, che sarebbe il numero del conteggio, trasferisco il valore della mia soglia senza fare eguaglianza,  però quando carico alla CPU mi da un errore e non si avvia e rimane acceso LED arancione, cosa può essere?......allego foto errore

20220222_133748.jpg

Link al commento
Condividi su altri siti

36 minuti fa, drn5 ha scritto:

in pseudocodice:

 

ora_attuale = oradelsistema

 

IF ora_attuale<>ora_ultima THEN

    soglia=soglia+1

    IF soglia > 3 THEN soglia=1

    IF soglia = 1 THEN soffio1 = 10 : soffio2 = 20 : soffio3 = 30

    IF soglia = 2 THEN soffio1 = 20 : soffio2 = 30 : soffio3 = 10

    IF soglia = 3 THEN soffio1 = 30 : soffio2 = 10 : soffio3 = 20

    ora_ultima=ora_attuale

ENDIF

 

Grazie infinite, ma non uso questo tipo di linguaggio. 

Link al commento
Condividi su altri siti

6 ore fa, Project75 ha scritto:

però quando carico alla CPU mi da un errore e non si avvia e rimane acceso LED arancione

Sicuramente l'indice esce dai limiti dell'array.

 

Se inserisci l'OB "ProgrammingError" (anche vuoto), la cpu dovrebbe rimanere in RUN. Ma l'errore, comunque, rimane,

Link al commento
Condividi su altri siti

1 ora fa, batta ha scritto:

Sicuramente l'indice esce dai limiti dell'array.

 

Se inserisci l'OB "ProgrammingError" (anche vuoto), la cpu dovrebbe rimanere in RUN. Ma l'errore, comunque, rimane,

Immaginavo che fosse un problema dell'indice,  perché appena lo toglievo andava via l'errore, come si può fare a non farlo uscire fuori dal limite dell'array?

Link al commento
Condividi su altri siti

12 minuti fa, max.bocca ha scritto:

Il programma che ha inserito drn5 e simil SCL con qualche adattamento è funzionante sul 1200/1500

Purtroppo non programmo in SCL...... altra soluzione? 

Link al commento
Condividi su altri siti

Ciao batta, grazie mille per la tua disponibilità,  perché l'indice esce dai limiti dell'array, cosa bisogna modificare per evitare questo errore? 

Link al commento
Condividi su altri siti

11 ore fa, Project75 ha scritto:

perché l'indice esce dai limiti dell'array, cosa bisogna modificare per evitare questo errore? 

 

Se hai dimensionato l'array a 3 devi devi, quando incrementi l'indice, verificare che non sia >3.

Link al commento
Condividi su altri siti

1 ora fa, Livio Orsini ha scritto:

 

Se hai dimensionato l'array a 3 devi devi, quando incrementi l'indice, verificare che non sia >3.

In ogni caso larray dell'indice e sempre dimensionato a 3, e l'errore però lo fa senza avviare niente, anche perché la cpu non va in run.......

Modificato: da Project75
Link al commento
Condividi su altri siti

Non è che si capisca molto.

IN_Soglia_START è un array. Di che dimensioni?

IndiceSoglia è un altro array, probabilmente da 1 a 3.

Ma che valore hanno IndiceSoglia[1], IndiceSoglia[2] e IndiceSoglia[3]?
Perché sono quasti valori che passi come indice per IN_Soglia_START.

 

13 ore fa, Project75 ha scritto:

Purtroppo non programmo in SCL...... altra soluzione? 

Devi assolutamente colmare questa tua lacuna. Oggi non è più ammissibile programmare PLC senza conoscere il testo strutturato.

Link al commento
Condividi su altri siti

20 minuti fa, batta ha scritto:

Non è che si capisca molto.

IN_Soglia_START è un array. Di che dimensioni?

IndiceSoglia è un altro array, probabilmente da 1 a 3.

Ma che valore hanno IndiceSoglia[1], IndiceSoglia[2] e IndiceSoglia[3]?
Perché sono quasti valori che passi come indice per IN_Soglia_START.

 

Devi assolutamente colmare questa tua lacuna. Oggi non è più ammissibile programmare PLC senza conoscere il testo strutturato.

Gli array sono tutti da 1a3 ed i valori dell'indice sono rispettivamente 1, 2 e 3. Quindi l'indice soglia 1 trasferisce il valore del IN soglia START 1 al OUT soglia START 1

Link al commento
Condividi su altri siti

40 minuti fa, acquaman ha scritto:

Secondo me negli indici soglie non ci sono valori idonei, prima di questo blocco metti un controllo su questi indici se il valore è compreso tra 1 e 3.

Ciao acquaman, il valore agli indici lo trasferisco con un move 16456997557775402183464793188780.thumb.jpg.84e8e62992c3e8f6afba1d75f52fd7d8.jpg

Link al commento
Condividi su altri siti

Se l'array Indice è un array temp e il contatore ha ha valore 0  l'array indice è tutto a zero.

A cosa serve usare 2 array IN e OUT?
Ho l'impressione che ti stai un pò complicando la vita.

Io userei un array con le tre soglie, e in array con l'indice della soglia delle 3 soffianti.

 

La soffiante 1 userà La soglia Soglia[Indice[1]]

La soffiante 2 userà La soglia Soglia[Indice[2]]

La soffiante 3 userà La soglia Soglia[Indice[3]]

Nell'indice soffiante  verranno caricati i valori 1, 2, 3.

 

Ad ogni ora schifto i valori dell'indice.

IF Cambio_Ora Then

AuxIndice:=Indice[1];

Indice[1]:=Indice[2];

Indice[2]:=Indice[3];

Indice[3]:=AuxIndice;

END_IF;

Link al commento
Condividi su altri siti

17 minuti fa, Project75 ha scritto:

il valore agli indici lo trasferisco con un move

Indice_Soglia è una variabile statica o temporanea?
i MOVE vengono eseguiti sempre, ad ogni ciclo?
Se Indice_Soglia è una variabile temporanea e non viene eseguito il MOVE, assume valore 0.

3 minuti fa, acquaman ha scritto:

Se l'array Indice è un array temp e il contatore ha ha valore 0  l'array indice è tutto a zero.

@acquaman, mi hai anticipato per un soffio 😉

 

Link al commento
Condividi su altri siti

39 minuti fa, batta ha scritto:

Indice_Soglia è una variabile statica o temporanea?
i MOVE vengono eseguiti sempre, ad ogni ciclo?
Se Indice_Soglia è una variabile temporanea e non viene eseguito il MOVE, assume valore 0.

@acquaman, mi hai anticipato per un soffio 😉

 

1645703364004824626688886132634.thumb.jpg.1c3513d7b600f21b3b6e806506326bce.jpg

Link al commento
Condividi su altri siti

Ma hai verificato che valori ci sono dentro l'array soglie?

Per evitare questo problema, crea gli array soglie che vanno da 0..3, se per qualche motivo i valori dell'indice sono a 0 il plc non va in stop.

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