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




Conversione Data S7 300


Messaggi consigliati

Inserito:

Buongiorno a tutti,

ho una cpu siemens 315 2DP dove archivio eventi registrandone la data e l' orario in cui avvengono.

Premetto che il programma cicla da molti giorni ma stamattina ho trovato la cpu in blocco con questo allarme:

Errore di conversione BCD

registro interessato: Accu 1

OB richiesto: OB di errore di programmazione (OB 121)

OB assente, inibito o non avviabile nello stato di funzionamento attuale

Errore interno, Evento entrante.

Dovendo rendere disponibile tali dati in intero per una supervisione ho agito così:

OB1 "leggo sempre la data del PLC"

CALL "BLKMOV"

SRCBLK :=P#L 12.0 BYTE 8

RET_VAL:=#RetVal

DSTBLK :=P#DB1.DBX0.0

FC1 "Converto e appoggio su bytes temporanei "

L DB1.DBB 0

BTI

T #Data_ora.Anno

L DB1.DBB 1

BTI

T #Data_ora.Mese

L DB1.DBB 2

BTI

T #Data_ora.Giorno

L DB1.DBB 3

BTI

T #Data_ora.Ora

L DB1.DBB 4

BTI

T #Data_ora.Minuto

L DB1.DBB 5

BTI

T #Data_ora.Secondo.

La diagnostica mi riportava a questo segmento.

Ho riavviato il plc escludendo il blocco interessato dopodichè l'ho reinserito e senza far nulla non si è più bloccato.

Di certo ho sbagliato qualcosa , ma cosa?


Inserita:

Probabilmente non hai scritto i valori nella DB prima di ripartire, in quel momento era possibile capire quale era il valore che creava problemi nella conversione....

Prova a inserire un'altra FC tipo FC1 mettendo dei valori dalla tabella delle variabili e simulando i vai valori possibili, quindi metti prima un controllo di range prima della conversione dove trovi il baco, altrimenti se non vuoi perderci troppo tempo inserisci l'OB121 (io farei così!)

pigroplc

Inserita:

E' vero pigroplc, dovevo annotarmi i dati, mea culpa.

Proverò a fare il test con un fc e nel frattempo inserisco l'ob121.

Un'ulteriore domanda.

Con l'OB121 il plc non si arresta ma nella data potrò trovare i valori errati?

Ciao

FattoreDiPotenza
Inserita:

Se non erro l'errore conversione BCD , avviene se si supera il valore massimo ammesso nella trattazione BCD appunto , quindi 9 massimo per ogni nibble.

In un byte è raffigurabile un valore massimo di 99 , mentre in una word 9999 , in formato BCD.

Quindi un byte della DB1 compreso nell'intervallo tra zero e cinque dovrebbe contere un valore maggiore di 99 INT.

La diagnostica ti ha evidenziato il punto esatto di interruzione ( il cursore si sarebbe dovuto portare esattamente nel punto in cui il valore è in overflow) ma non ti ha dato la reale causa dell'errore che è ravvisabile nel blocco in cui scrivi i valori in DB1.

Sinceramente anche se potenzialmente corretto ,trovo anomalo il modo in cui hai registrato la data , secondo la letteratura classica , devi usare il blocco SFC1 che restituisce in un solo colpo entro l'intervallo di byte predefinito i dati dell'orologio , già disponibili in formato INTEGER.

Ivan

Inserita:

Concordo anch'io con l'utilizzo di SFC1 al posto di SFC20, ma i dati sono comunque ancora in BCD. SFC1 restituisce data e ora in formato DATE_AND_TIME, proprio come la variabile locale OB1_DATE_TIME.

Potresti condizionare la conversione da BCD a INT alla corretta esecuzione di SFC1 (memorizzando eventuali esecuzioni terminate con errore), oppure inserire in OB121 un po' di istruzioni tanto per vedere se l'errore si ripresenta.

Inserita:

Concordo con Ivan che il mio modo di registrare la data è un po' anomalo, ma non programmando a tempo pieno cerco di arrangiarmi e miglioro le mie conoscenze grazie ai consigli come i vostri.

Detto questo, come è possibile scrivere un valore di data o tempo superiore a 99 ?

La data e l'orario sono aggiornati a cadenza giornaliera dal supervisore.

Lui scrive in intero i valori ed ad un suo comando io lo trasferisco al plc.

U DB1.DBX 16.0

FP M 1.0

= M 1.1

U M 1.1

SPBNB WrPC

L DB1.DBB 8

ITB

T LB 0

L DB1.DBB 9

ITB

T LB 1

L DB1.DBB 10

ITB

T LB 2

L DB1.DBB 11

ITB

T LB 3

L DB1.DBB 12

ITB

T LB 4

L DB1.DBB 13

ITB

T LB 5

L B#16#0

T LB 6

T LB 7

CALL SFC 0

PDT :=#Data_Time_PC

RET_VAL:=#Aux_sfc0

R DB1.DBX 16.0

Mentre rileggevo il blocco ho trovato un errore (in grassetto), invece di ITB ho scritto ITD.Può causare l'errore ?

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