mazzucconi Inserito: 15 aprile 2009 Segnala Inserito: 15 aprile 2009 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 1OB richiesto: OB di errore di programmazione (OB 121)OB assente, inibito o non avviabile nello stato di funzionamento attualeErrore 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.0FC1 "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?
pigroplc Inserita: 15 aprile 2009 Segnala Inserita: 15 aprile 2009 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
mazzucconi Inserita: 15 aprile 2009 Autore Segnala Inserita: 15 aprile 2009 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: 15 aprile 2009 Segnala Inserita: 15 aprile 2009 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
batta Inserita: 15 aprile 2009 Segnala Inserita: 15 aprile 2009 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.
mazzucconi Inserita: 15 aprile 2009 Autore Segnala Inserita: 15 aprile 2009 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.0Mentre rileggevo il blocco ho trovato un errore (in grassetto), invece di ITB ho scritto ITD.Può causare l'errore ?
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