Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Acquisizione Analogica - non ho capito...


Messaggi consigliati

Inserito:

Buongiorno ragazzi scusate,

ma ancora non sono riuscito a capire come devo fare per acquisire un ingresso analogico,ho un PLC 300 CPU 312 ho letto tutti i post che ho trovato con la funzione CERCA pero' non sn riuscito a metterli in pratica non mi va nulla.In effetti non ho capito, se deve essere quantizzato, memorizzato in qualche registro....boh...aiutatemi..Anche la guida in linea non dice molto.Poi un altra cosa nella eventualità che io debba confrontare questo segnale di ingresso analogico con delle soglie per abilitare dei merker che mi fanno partire dei cicli come devo fare potreste darmi un'idea.

Grazie.


Inserita:

Prima di tutto ti serve la scheda di ingressi analogica

poi segui lo schema di collegamento

poi dal tuo programma interroghi la periferia di ngresso relativa all'ingresso che vuoi leggere ( l'indirizzo e quello della configurazione HW )

ovviamente lo puoi confrontare con qualsiasi livello

Saluti

Luca

Inserita:

Ok Luca ma se non ho ancora comprato il set cioe' la scheda anlogica e sto solo programmando come faccio ad indirizzare ed interrogare l'ingresso analogico.

In pratica se vorrei simularlo tramite PLCSIm?

Grazie.

emanuele.croci
Inserita:

Ciao,

l'ingresso analogico lo interroghi molto facilmente conoscendo il suo indirizzo.

(nota: l'indirizzo lo puoi vedere nella config. hw)

Ad es. supponiamo che l'indirizzo sia 256 ti basta fare.

L PEW256

...questa istruzione ti restituisce un numero che vale da 0 (0% del segnale, 0 VDC, 4 mA, ecc...) a 27648 (100% del segnale, 10VDC, 20 mA, ecc... )

Ad es. supponiamo che il tuo segnale sia 0VDC=0= acqua a 0 gradi, 10VDC=27648=acqua a 100 gradi.

Vuoi dare un allarme quando la temperatura dell'acqua supera 70 gradi:

L PEW256

L 19353 //....(27648 / 100 * 70)

>I

S A8.0 //accendo una spia di allarme

Ciao, Emanuele

Inserita:

Grazie Emanuele posso iniziare a mettere nero su bianco, nella eventualità che ci siano problemi vi faccio sapere.

Grazie ancora.

Inserita:

Chiedo scusa, ho un altro problema,

il mio programma deve far partire una serie di elettropompe in dei giorni prestabiliti, come faccio a passare questi giorni al programma ed in particolare alla funzione che mi dovrebbe far partire queste elettropompe.

Infine mi è capitata una cosa strana, dall'OB1 sto richiamando due blocchi funzionali, uno che mi gestisce delgi allarmi e un altro che mi gestisce degli altri allarmi.Quando simulo, se richiamo in sequenza i due blocchi funzionali, le uscite comuni in entrambi i blocchi non si abilitano, mentre se le simulo uno per volta tutto funziona correttamente come mai?

Grazie.

Inserita:

1 I giorni sono date o giorni della settimana? Comunque devi prima attivare l'ologio calendario o, se non è previsto dalla CPU, crearne uno.

2 Se le uscite sono comuni ai due blocchi la spiegazione più semplice è che un blocco le attiva e l'altro le disattiva. Oppure quando testi i due blocchi assieme c'è qualche errore. Prova a testarli in sequenza, ma inserendo delle istruzioni di halt nei blocchi in modo da poter tracciare lo stato.

Inserita:

Come ti dice Livio , non e' corretto fare delle uscite ( = ) in 2 blocchi diversi

1- nei 2 blocchi usi solo dei set o reset ( ma le uscite non sono retentive )

2- nei 2 blocchi fai delle M ed in un'altro blocco , con le M fai le uscite

Se ti serve la data e ora di sistema ( sulla 312 non ho esperienza ma dalla 313 in su' funziona ) e' disponibile nelle variabili temporanee dell'OB1 da LW12 in poi

Ciao

Luca

Inserita:

Vi spiego meglio,

allora i giorni mi servirebbero settimanalmente e non come data.

Poi si in effetti i blocchi funzionali che richiamo in sequenza dall'OB1 contengono dei seti e reset, puo' essere qualche errore in questi blocchi che mi da quel problema', nel senso che rimane qualche reset attivato?

Grazie

Inserita:

Tornando agli ingressi analogici...

Io ti consiglio di non continuare a leggere in giro nel programma il valore di ingressi analogici, dove magari fai le tue comparazioni.

Questo per due motivi:

1) la lettura di un valore analogico avviene nel momento in cui lo interroghi. Questo vuol dire che all'interno della stessa scansione potresti fare due volte la stessa comparazione ed avere esiti diversi.

2) E' scomodo usare un valore 0-27648. Io di solito leggo ad inizio scansione il valore, faccio la scalatura scrivendo il valore in una variabile di un DB (o in una MW se preferisci), ed utilizzo nel programma il valore ingegneristico (quello scalato). Anche in fase di debug è molto più comodo leggere un valore che ha immediatamente un senso, senza dover fare calcoli ogni volta.

Un esempio di scalatura (senza tirare in ballo calcoli in virgola mobile) per convertire da 0-27648 a 0-1000:

L PEW 256

ITD

L L#1000

*D

L L#27648

/D

T MW100

Il risultato viene sempre approssimato per difetto.

Se preferisci, puoi spulciare nelle librerie S7 (TI-S7 Converting Blocks) ed utilizzare la funzione "SCALE" oppure, se pensi ti possa servire, ti faccio avere una mia funzione di scalatura, che ha qualche parametro in più.

Lo stesso discorso vale per la scrittura di un valore analogico: lavoro sempre con valore ingegneristico, e solo alla fine converto e scrivo su uscita.

Inserita:

Per estrarre il giorno della settimana...

In OB1 trovi la variabile locale OB1_DATE_TIME. Nell'. trovi descritti i dati che contiene.

Per il giorno della settimana comunque, interessa solo l'ultimo nybble (4 bit meno significativi dell'ultimo byte), quindi:

L LB19

L B#16#F

UW

T MB100

In MB100 trovi un valore da 1 a 7 che indica il giorno della settimana (1=domenica...7=sabato)

Se vuoi essere un po' più sofisticato, anzichè accedere al byte locale con un indirizzamento diretto puoi scrivere:

L P#OB1_DATE_TIME

LAR1

L LB[AR1,P#7.0]

UW

T MB100

Inserita:

Ciao ho questo problema,

ho creato 3 FB con i relativi 3 DB di istanza.Ogni FB mi gestisce delle uscite che devono essere abilitate in base a degli allarmi.Alcune uscite sono comuni a 2 FB nel senso che per FB1 se si verifica il raggiungimento di un livello massimo mi dovrebbe abilitare da Q3.0 fino a Q1.0, mentre per FB2 se si verifica il livello minimo mi deve abilitare solo Q3.0 e Q4.0. Queste Fb sono richiamate dall OB1.Il problema e' questo se richiamo una Fb alla volta inserendo // davantia ll'altra tutto funziona correttamente, mentre se le richiamo entrambi, le uscite in comune e cioe' Q 3.0 e Q 4.0 mi funzionano solo per la FB2 e non per la Fb1 come mai?

Grazie... ah un altra cosa, ho trovato sul forum questo pezzo di codice per far lampeggiare un uscita ma secondo voi e' corretto?....ve lo scrivo...

AN T1

L S5T#1s

SE T0

A T0

L S5T#1S

SE T1

A T0

= M 1.0

Grazie.

Inserita:

Non spieghi con che istruzione attivi le uscite. Tieni presente che se richiami FB1 e dopo richiami FB2, lo stato assegnato alle uscite comuni in FB2 andrà a sovrascrivere lo stato assegnato alle uscite comuni in FB1. Risultato: avranno effetto solo le istruzioni scritte in FB2.

Questo potrebbe non essere vero se le uscite le attivi con l'istruzione SET. In questo caso tutto dipende da come gestisci il RESET.

Se per te non è un problema, mi puoi mandare il progetto (o parte di esso) all'indirizzo e-mail che vedi sotto. Ti garantisco che ti risponderò. Quello che non ti posso garantire è la rapidità della risposta.

Inserita:

Ti ringrazio batta, stasera ci studio su un altro po e vedo un po meglio la gestione dei reset e se non ci riesco domani te lo mando.

Per cio' che riguarda il blocco di codice che genera un intermittenza sull'uscita c'e' un bug che ho trovato e precisamente

AN T1

L S5T#1s

SE T0

A T0 in questa linea si deve usare AN al posto di A

L S5T#1S

SE T1

A T0

= M 1.0

Come devo fare per dichiarare un ingresso analogico nella tabella dei simboli?

e poi l'istruzione l pew256 me la da come errore come mai?

Grazie.

Inserita: (modificato)
Per cio' che riguarda il blocco di codice che genera un intermittenza sull'uscita c'e' un bug che ho trovato e precisamente

No, è corretta la prima versione.

Tieni presente che se hai bisogno di un semplice bit che cambia di stato ogni secondo, puoi configurare nella cpu un byte di merker di clock. Ti trovi con 8 merker già pronti con frequenza da 0.5 a 10 Hz.

Se poi vuoi crearti un bit che lavora con la frequenza che vuoi tu, puoi comunque risparmiare un timer.

X T 0

X M 0.1

= M 0.1

UN T 0

L S5T#2S

SE T 0

Con un paio di istruzioni in più puoi anche usare un solo timer e tempi diversi.

X T 0

X M 0.0

= M 0.0

L S5T#3S

U M 0.0

SPB L001

L S5T#1S

L001: UN T 0

SE T 0

Rispetta l'ordine. Il timer, per motivi che non ti sto a spiegare, deve essere posto in fondo, oppure lo devi appoggiare ad un merker.

Come devo fare per dichiarare un ingresso analogico nella tabella dei simboli?

e poi l'istruzione l pew256 me la da come errore come mai?

Niente di particolare. Nella colonna "Simbolo" gli dai un nome, nella colonna "Indirizzo" scrivi PEW256.

Per la sintassi, controlla bene, forse hai sbagliato a scrivere. L'istruzione L PEW256 è corretta.

Correzione: se usi il mnemonico in inglese, sia nella tabella simboli, sia nel programma devi scrivere PIW al posto di PEW (PQW al posto di PAW per le uscite)

Modificato: da batta
Inserita:

Grazie batta, domattina controlla tutto cio' e ti faccio sapere.

Penso che hai capito che sono alle prime armi ma ci metto molto impegno, poi mi dovrai spiegare come configurare quel byte nella cpu per crearmi il merker di clock.

comunque piano piano...

Grazie.

Inserita:

Ciao amici, purtroppo non resco a risolvere il problema

e cioe' che le uscite comuni mi funzionano nell'ultima FB richiamata da OB, in particolare l'uscita sirena mi funziona solo nella FB "Allarme livello massimo", essa dovrebbe funzionare anche nel primo FB e cioe' allarme livello minimo pero' non va non riesco a capire il perche'.Intanto vi posto il codice spero possiate aiutarmi:

OB1

CALL "Allarme livello minimo" , DB1

CALL "Allarme livello massimo" , DB2

poi FB1 e cosi' formata

primo segmento

A "Galleggiante aspir. min."

S "Abilitaz.allarmi l.min"

secondo segmento

A "Galleggiante aspir. min."

A "Emergenza"

ON "Galleggiante aspir. min."

R "Abilitaz.allarmi l.min"

terzo segmento

A "Abilitaz.allarmi l.min"

= "Lampeggiante"

= "Livello minimo"

= "Fault 1"

= "Fault 2"

= "Fault 3"

= "Abilitazione sirena"

poi FB2 è cosi' formata

primo segmento

A "Galleggiante aspir. max."

S "Abilitaz.allarmi l.max"

secondo segmento

A "Galleggiante aspir. max."

A "Emergenza"

ON "Galleggiante aspir. max."

R "Abilitaz.allarmi l.max"

terzo segmento

A "Abilitaz.allarmi l.max"

= "Lampeggiante"

= "Abilitazione sirena"

come si nota l'uscita lampeggiante e' cmune alle due FB, in particolare se le simulo singolarmente tutto funziona correttaente, mentre se le richiamo entrambi dall'OB1 , l'uscita lampeggiante si attiva solo con la chiamata di FB2 e non con la chiamata di FB1.Vi chiedo di aiutarmi a capire il problema.

Grazie.

Inserita:

Come ti è già stato segnalato, se tu in FB1 attivi le uscite "Lampeggiante" e "Sirena" con l'allarme di minimo livello, ma poi in FB2 le stesse uscite le condizioni allo stato dell'allarme massimo livello, ti troverai che queste uscite funzionano solo con il massimo livello.

Devi usare dei merker di appoggio, oppure comandare le uscite comuni NON in FB1 ed FB2, ma in un'altra parte di programma, scrivendo per esempio:

O "Abilitaz.allarmi l.min"

O "Abilitaz.allarmi l.max"

= "Lampeggiante"

= "Abilitazione sirena"

Un'altra cosa. Usi FB perchè hai dati statici da appoggiare a DB, o per errore?. Se non hai motivi validi per usare FB ti consiglio di usare FC.

Inserita:

Ok batta, eseguo le modifiche e ti faccio sapere....ah si forse hai ragione te non mi conviene ad usare le FB.

A dopo. Ciao Grazie.

Inserita:

Mi raccomando, non devi applicare le modifiche, provare se funziona ed in caso affermativo fermarti lì. Devi assolutamente capire perchè prima non funzionava. E' un concetto basilare nella programmazione di plc (e non solo di plc).

Poi, se mi posso permettere di darti un consiglio, se sei all'inizio (e quindi non hai ancora piena dimestichezza della sintassi) usa il mnemonico in tedesco. Io personalmente non conosco nessuno che usa le istruzioni in inglese.

Inserita:

Ciao Batta, ho risolto il problema in pratica io comandavo la stessa uscita da due pati di prgramma differenti, e la priorità era data dall'ultima FB che richiamavo, adesso ho raggruppato tutti i consensi che mi fanno partire il lampeggiante in un altra parte di programma.Inoltre ho cambiano anche il linguaggio mnemonico l'ho messo tedesco.

Una cosa che non ho capito, io dovrei il lunedi mercoldi e venerdi far partire una sequenza di elettropompe, come faccio a far capire al programma che e' o lunedi o mrcoledi' o venerdi?e come faccio a simularlo...hai qualche esempio??

Grazie.

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