Vai al contenuto
PLC Forum


diagnostica profinet


daniele__32

Messaggi consigliati

Ciao a tutti, mi trovo con un programma che gira su una 1500 safety e sto cercando di capire la diagnostica profinet.

 

qui di seguito il codice in stl dentro un FB

 

//..Configured
      L     1
      T     #CPU_S71511.MODE

      CALL  ModuleStates
         LADDR   :="Local~Device"
         MODE    :=#CPU_S71511.MODE
         Ret_Val :=#CPU_S71511.RET_VAL
         STATE   :=#CPU_S71511.CONFIGURED

 

//..Faulty
      L     2
      T     #CPU_S71511.MODE

      CALL  ModuleStates
         LADDR   :="Local~Device"
         MODE    :=#CPU_S71511.MODE
         Ret_Val :=#CPU_S71511.RET_VAL
         STATE   :=#CPU_S71511.FAULTY

 

      CALL  MOVE_BLK
         value_type:=Bool
         count_type:=UInt
         IN    :=#CPU_S71511.FAULTY[1]
         COUNT :=16
         OUT   :="DB_ANOMALY".Profinet.CPU_S71511_module_faulty[1]

 

 

//..Exist
      L     4
      T     #CPU_S71511.MODE

 

      CALL  ModuleStates
         LADDR   :="Local~Device"
         MODE    :=#CPU_S71511.MODE
         Ret_Val :=#CPU_S71511.RET_VAL
         STATE   :=#CPU_S71511.EXIST

//---------------------------------------------

      A     "DB_DIAGNOSTIC".CPU_S71511.CONFIGURED[1]
      A     "DB_DIAGNOSTIC".CPU_S71511.FAULTY[1]
      AN    "DB_DIAGNOSTIC".CPU_S71511.EXIST[1]
      =     "DB_ANOMALY".Profinet.CPU_S71511_module_unplugged[1]

 

 

mi chiedo perche sulla DB delle anomalie mi trovo per ogni dispositivo profinet, un array di 16 bit per modulo Fault a modulo Unplugged ( vedi foto allegata)

qualcuno potrebbe aiutarmi a capire come leggere tali anomalie? non basterebbe un bit per module faulty e uno per modulo unplugged?

la dtruttura di codice che ho riportato e' la stessa per tutti i device profinet presenti

grazie a tutti

 

immDB.jpg

Link al commento
Condividi su altri siti


Ciao, se non ricordo male la funzione "ModuleStates" nel parametro MODE ti chiede la tipologia di stato da controllare.

 

Se noti meglio non hai un array di bit per ogni modulo, ma per ogni tipo di madalità (in questo caso FAULTY e UNPLUGGED). All'interno dell'array relativo a FAULTY, ogni bit rappresenta un nodo della rete (identificato col numero di nodo, quindi il bit 1 è relativo al nodo 1, il bit 2 al nodo 2, ecc..) e lo stato di quel bit ti dice se il modulo è effettivamente in fault o meno (il bit 0 è un cumulativo, ovvero se almeno uno è in fault o se nessuno è in fault).

 

Di conseguenza l'array UNPLUGGED funziona allo stesso modo ma la valenza dei bit non è più relativa al modulo in fault ma allo stato di unplugged (che poi magari vuol dire manutenzione necessaria, ti consiglio di cercare sull'. di Tia la funzione in oggetto e controllare il significato del parametro MODE).

 

Spero di essere stato chiaro, in caso contrario sono a disposizione per chiarimenti.

 

Ciao

Modificato: da NS12
Link al commento
Condividi su altri siti

piu o meno...quello che vorrei capire e'...la struttura dentro la DB_ANOMALY dove ho i 16 bit faulty e i 16 bit unplugged, si riferiscono a 16 dispositivi profinet sulla mia rete?

come faccio a capire dall array quale bit e' associato al modulo profinet?

io ad esempio sulla rete della cpu 1500  ho 20 dispositivi profinet ( una cpu 1200, dei moduli io Murr 2 robot e4 assi della schneider ecc)

se per esempio mi vedo andare a TRUE 

CPU_S71511_module_faulty[5] a chi si riferisce???

 

un altra domanda importante..dal programma vedo che in tale FB e' riportato lo stesso codice che ho scritto all inizio anche per tutti gli altri dispositivi profinet..ad esempio

 

//..Configured
      L     1
      T     #"M-1".MODE

      CALL  ModuleStates
         LADDR   :="M-1~IODevice"
         MODE    :=#"M-1".MODE
         Ret_Val :=#"M-1".RET_VAL
         STATE   :=#"M-1".CONFIGURED

//..Faulty
      L     2
      T     #"M-1".MODE

      CALL  ModuleStates
         LADDR   :="M-1~IODevice"
         MODE    :=#"M-1".MODE
         Ret_Val :=#"M-1".RET_VAL
         STATE   :=#"M-1".FAULTY

      CALL  MOVE_BLK
         value_type:=Bool
         count_type:=UInt
         IN    :=#"M-1".FAULTY[1]
         COUNT :=16
         OUT   :="DB_ANOMALY".Profinet."M-1_module_faulty"[1]

//..Exist
      L     4
      T     #"M-1".MODE

      CALL  ModuleStates
         LADDR   :="M-1~IODevice"
         MODE    :=#"M-1".MODE
         Ret_Val :=#"M-1".RET_VAL
         STATE   :=#"M-1".EXIST[1]

      A     "DB_DIAGNOSTIC"."M-1".CONFIGURED[1]
      A     "DB_DIAGNOSTIC"."M-1".FAULTY[1]
      AN    "DB_DIAGNOSTIC"."M-1".EXIST[1]
      =     "DB_ANOMALY".Profinet."M-1_module_unplugged"[1]

 

che sarebbe riferito ad un modulo profinet IO chiamato M-1 della Murr.. questa parte risulta insignificate a livello di diagnostica?

 

 

 

 

Link al commento
Condividi su altri siti

Ciao,

dalla guida il parametro STATES è commentato così:

 

Quote

Parametro STATE
Il parametro STATE consente di emettere lo stato dei moduli selezionati con il parametro MODE.
Se lo stato selezionato con MODE è corretto per un'unità, i bit successivi vengono impostatib su "1".
● Bit 0 = 1: Visualizzazione cumulativa. Il bit n di almeno un modulo è stato impostato su "1".
● Bit n = 1: Lo stato selezionato tramite MODE corrisponde allo stato del modulo nel posto connettore n-1 (esempio: Bit 3 = posto connettore 2).
Utilizzare i tipi di dati "BOOL" o "Array of BOOL".
● Per la successiva emissione del bit nella visualizzazione cumulativa delle informazioni di stato si utilizza il tipo di dati BOOL nel parametro STATE.
● Per l'emissione delle informazioni di stato di tutti i moduli utilizzare l'Array of BOOL con una lunghezza di 128 bit.

 

Quindi, con MODE = 1 la sequenza di bool, quelli a TRUE, ti restituisce i moduli effettivamente configurati; con MODE = 2, TRUE indica i moduli in errore; con MODE = 4 TRUE restituisce i moduli disponibili e così via; il massimo sono 128 bit che è poi il massimo di moduli accettati.

Il primo bit (lo zero) è un cumulativo per gli altri: in pratica per l'errore indica che almeno uno è in errore, mentre gli altri, da 1 a n, indicano lo stato del modulo stesso, così come sono stati configurati nell'hardware.

 

Dall'esperienza che ho avuto, la funzione ModuleStates va benissimo con i moduli Siemens ed il suo comportamento corrisponde a quello scritto nei manuali; con i moduli di terze parti non è sempre così e occorre fare un pò di prove per capire bene com'è il comportamento e quali sono effettivamente i bit che si alzano e per cosa.

Poi, per il distacco del cavo Profinet la ModuleStates non è proprio il massimo ed io preferisco utilizzare la DeviceStates; se cerchi bene nel forum avevo postato un esempio di come utilizzo la diagnostica che utilizzo a tutt'oggi.

 

Link al commento
Condividi su altri siti

grazie mille drugo per i suggerimenti...la mia domanda e'..in tale FB dove ho il codce che ho scritto, ho altri N segmenti con lo stesso codice inerenti a tutti i dispositivi profinet presenti...( 4 segmenti con lo stesso codice per 4 driver, 2 segmenti per 2 schede IO ecc..) tutto cio non serve, o puo servire se per esempio su ogni modulo creo una struttura nell fb come quella per cpu e nel parametro LADDR della funzione module states gli associo l HW device di un altro dispositivo e sull uscita STATE uso un semplice bit e non un array.

puo andare bene lo stesso come diagnostica??

per spiegarmi meglio ad ogni modulo profinet, uso la CALL ModulesStates, e tramite MODE verifico fault Unplugged ecc...l uscita state  uso un singolo bit che poi sara' il mio bit di allarme.. posso diagnosticare anche in questo modo?

Link al commento
Condividi su altri siti

come faccio poi a sapere , se uso la logica di chiamare la Module states usando come LADDR l indirizzo hardware della cpu , l associazione bit- modulo nell array?

ad esempio se ho 20 moduli profinet e mi si alza il faulty[5] dell array...a chi corrisponde?

Link al commento
Condividi su altri siti

Non riesco a capire perche per ogni modulo profinet mi trovo lo stesso codice di programma scritto per la cpu e non capisco perche sulla DB_ANOMALY mi trovo per ogni device una struttura faulty e unplugged di 16 bit ognuna

DB.jpg

Link al commento
Condividi su altri siti

I post sono diversi, ma dove ho postato il link per esempi e documentazione per la diagnostica è questo; i file, invece, si trovano qui.

Immaginiamo che hai un rack ET200SP remotato collegato alla tua CPU con una IM156; normalmente mi comporto in questo modo: con la DeviceStates verifico che la comunicazione Profinet sia a posto; con la ModuleStates verifico che il rack ed i suoi moduli siano pronti; tutto questo lo eseguo solo e soltanto se la spia della CPU diventa rossa lampeggiante (istruzione LED), così evito di chiamare tutte le istruzioni di diagnostica se non necessario; se estraggo il quarto modulo dal rack dovrebbe attivarsi il primo bit (lo zero) che è il cumulativo ed il quinto bit che dovrebbe corrispondere al modulo mancante perchè l'ho estratto, con la ModuleStates che ha MODE=2.

Purtroppo non ho mai utilizzato il tuo hardware, quindi non so cosa potresti ottenere dalle istruzioni. Per come sono abituato, richiamo DeviceStates per ogni nodo Profinet e DeviceStates e ModuleStates per i rack esterni; per i moduli nel bus della CPU, invece, basta una sola ModuleStates.

 

Facciamo un esempio:

hardware con CPU, 2 moduli nel bus, 3 rack ET200SP con IM156, un robot e un sistema di visione; in questo caso chiamo l'istruzione LED per sapere se il sistema è in errore, una ModuleStates per i moduli nel bus, 3 accoppiate DeviceStates e ModuleStates per i 3 rack, una DeviceStates per il robot ed una per il sistema di visione; non richiamo ModuleStates per il robot ed il sistema di visione perchè al loro interno hanno un segnale di "Ready" che mi permette di sapere se i sistemi sono a posto, mentre per i rack mi limito a segnalare quale di loro è in errore, senza menzionare i singoli moduli, perchè tramite la diagnostica su HMI (che è solo da attivare senza configurazione), si riesce a sapere agilmente quale modulo del rack è in errore.

 

Link al commento
Condividi su altri siti

Ciao,

 

per curiosità ho provato la funzione in questione su un impianto che ho in collaudo e funziona.

Innanzi tutto immagino sia inserita nell'OB1.

Seconda cosa ne basta soltanto 1 per ogni parametro MODE che decidi di controllare (io ho provato FAULT e DISPONIBILI quindi una funzione col parametro 2 nel MODE e una col parametro 4 nel MODE).

Terza cosa, per capire a quale Device della tua rete si riferisce ogni bit ti basta controllare nella configurazione HDW i vari numeri di nodi profinet dei tuoi Device in quanto i bit sono numerati allo stesso modo. Il bit 1 identifica lo stato del device con numero di nodo 1, il bit 2 identifica lo stato del device con numero di nodo 2 e così via.

 

Spero di essere stato chiaro.

Link al commento
Condividi su altri siti

allora perche nel mio programma mi trovo una network per ogni dispositivo profinet con la stessa logica?

 

quindi dovrei usare una call Module state con LADDR l id della cpu e dopo di che usare tale sfc per ogni tipo di MODE che voglio usare giusto?

e nell array dei bit ad asempio faulty e unplugged mi trovero' in caso di allarme presente un bit di tale array a 1

se nel mio caso ho 21 dispositivi profinet..posso creare degli array di 21 bool?

 

 

Link al commento
Condividi su altri siti

la prova che hai fatto l hai fatta con il codice pari pari come l avevo scritto?

 

domanda...nella parte del mode 4

 

//..Exist
      L     4
      T     #CPU_S71511.MODE

 

      CALL  ModuleStates
         LADDR   :="Local~Device"
         MODE    :=#CPU_S71511.MODE
         Ret_Val :=#CPU_S71511.RET_VAL
         STATE   :=#CPU_S71511.EXIST

//---------------------------------------------

      A     "DB_DIAGNOSTIC".CPU_S71511.CONFIGURED[1]
      A     "DB_DIAGNOSTIC".CPU_S71511.FAULTY[1]
      AN    "DB_DIAGNOSTIC".CPU_S71511.EXIST[1]
      =     "DB_ANOMALY".Profinet.CPU_S71511_module_unplugged[1]

 

con questa logica mi si alza sempre e solo "DB_ANOMALY".Profinet.CPU_S71511_module_unplugged[1] in caso di anomalia?

non dovrei inserire anche qui il block move per splamerlo sul mio array di  16 bit?

Link al commento
Condividi su altri siti

io uso il DeviceStatus al quale passi un array di booleani e pochi altri parametri.

Lo chiamo una volta sola e poi vado a vedere i rispettivi bit (indicizzati dell'array). L'indice viene assegnato nella configurazione hw.

Se i bit relativi ad ogni devices in rete è falso genero un allarme.

Funziona bene, lo testi subito staccando il cavo di rete dallo switch

ciao

Link al commento
Condividi su altri siti

2 ore fa, walterword ha scritto:

io uso il DeviceStatus al quale passi un array di booleani e pochi altri parametri.

Concordo.
DeviceStates è facile da usare e ti fornisce tutte le informazioni per la diagnostica dei nodi, sia Profibus che Profinet.

Link al commento
Condividi su altri siti

nella conf hw , l'indice è il numero dispositivo che viene assegnato dal plc.

Se hai un drive o un robot assegnati come numero dispositivi 23 e 24 non dovrai fare altro che verificare l'array che passi al DeviceStatus nei suoi campi ...nome_Array[23] e [24].

Se sono falsi generi allarmi e fermi il ciclo o fai quello che devi fare in base al processo.

ciao

Link al commento
Condividi su altri siti

io non so cosa fanno gli altri , awl , puntatori e cacate varie e mi riferisco a Daniele.

Il modo più semplice secondo me è questo .

 

device_status.png

Modificato: da walterword
Link al commento
Condividi su altri siti

se i feedback ossia i valori nell'array , uno per uno , sono a zero allora generi allarmi, blocchi il ciclo o fai quello che devi fare in base al processo.

Butta via tutto e prova come ti ho indicato io, poi mettere puntatori , scrivere in assembly etc puoi sempre farlo dopo.

già quando si ha in mano una porcheria scritta da altri è difficile capire, allora si butta tutto nel cesso e si rifà da capo che fai prima e non ti viene la depressione.

Sempre se si sà quello che si deve fare ovviamente.

ciao

 

Link al commento
Condividi su altri siti

infatti ieri pomeriggio sono arrivato alla conclusione di cacciare via tutto e farlo da capo..perche mi stavo veramente rompendo i ......

Grazie di tutto a tutti in particolar modo  a WALTERWORD e DRUGO66.

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