Vai al contenuto
PLC Forum


Szl Info


guillermo.ibanez

Messaggi consigliati

guillermo.ibanez

Salve a tutti,

sto utilizzando libnodave su win xp per colloquiare con n s7 serie 300 (Vipa, nel mio caso via ethernet). Sto cercando di capire senza riuscirci, la lettura dell'area SZL in particolare per evidenziare lo stato dei led (di tutti). Ho guardato esempi e post fatti in questo forum ma io non ci riesco a leggere questa info.

Ho scaricato addirittura la lista completa dell'area SZL dal sito della Siemens ma non ci capisco alcune cose. Ad esempio cosa vuol direla sintassi

ID SZL W#16xy#19 = "stato dei led di unità" ?

La DaveReadSZL(DaveConn,ID,INDEX,[at]Buffer,Len) vuole il parametro ID e INDEX ma se io provo a scrivere ID= 16 (oppure H16 in esa) e index = 0 (o qualsiasi altro valore) mi legge delle cose e mi restituisce dei numeri ma non so cosa siano (non sono solo 1 o 0 ).

Poi ho anche provato a passare ID= H19 INDEX = 4 o 5 e mi da sempre zero (provo su un plc in STOP e dovrei vedere uno dei 2 = 1 no?)

Insomma, qualcuno mi può chiarire come devo fare per leggere tutti i led? (anche uno per uno)

Grazie mille

Link al commento
Condividi su altri siti


Salve,

non ho mai utilizzato libnodave, pertanto non so dirti con certezza se c'è una piena compatibilità nell'interpretazione dei dati che ottieni utilizzando l'equivalente funzione di sistema di Siemens che è la SFC51 [RDSYSST].

Allora consideriamo come da tuo post di voler leggere lo stato dei led.

Prima di tutto bisogna stabilire su quale unita si vuole leggere lo stato dei led.

Attribuendo il valore alla variabile SZL_ID=W#16xy#19, quindi W#16#0019 effettui una richiesta di lettura dello stato dei led, della sola CPU.

Quindi impostando 19, indichi di voler acquisire la lettura dei led della sola CPU, i campi xy, essendo a zero chiedono solamente la lettura dei led della CPU.

Per esempio se desideri acquisire invece lo stato delle interfaccie IM, il valore sarà 0119, mentre per i processori di comunicazione CP, il valore sarà 1119. Per maggior chiarezza allego questa immagine riassuntiva che ti spiega come è strutturara la word SZL_ID

immaginebie.png

Il parametro INDEX, in questo caso specifico (lettura led) è irrilevante, quindi può essere tranquillamente impostato a zero.

Mentre per esempio nel caso in cui necessiti di effettuare una diagnostica di una stazione remotata, in questo campo viene inserito in Hex, il valore di indirizzo di diagnostica assegnato nella configurazione hardware di S7 nel modulo di stazione.

Ora si tratta di interpretare i dati che la funzione restituisce, quindi nel tuo caso credo che i valori vengano depositati nelle variabili:

[at]Buffer,Len.

Andando sempre per analogia con la SFC51 di Siemens, in quando non ho sottomano la spiegazione del comando in libnodave,

credo che il parametro di uscita len, si possa assoggettare allo SZL_HEADER di SFC51, mentre [at]Buffer al parametro DR.

Il parametro SZL_HEADER è una struttura composta da due word, nella prima viene espressa la lunghezza in byte di un set di dati, mentre nella seconda word il numero relativo a quanti set di dati sono associati in questo caso alla lettura dei led della CPU.

Esempio pratico di lettura LED della CPU:

La prima word della variabile di uscita SZL_HEADER vale 4 (ovvero un set di dati e composto da 4byte=2word)

La seconda word vale 8 (ovvero per la lettura dei led della CPU vengono restituiti 8 set di dati)

Considerando che un set di dati è composto da 4 byte, il buffer di lettura dovrà essere lungo almeno 8*4=32byte=16word.

A questo punto nel buffer ,[at]Buffer dovresti trovarti depositati nell'area dati di lunghezza 32 byte lo stato dei led della CPU,

Tipicamente nel DB associato al parmetro DR della SFC51, la prima word contiente il numero del primo set di dati, la seconda word lo stato del led associato al primo set di dati,quindi la terza word il numero del secondo set di dati, la quarta word lo stato del led associato al secondo set di dati e così via.....fino all'ultimo set che è l'ottavo.

A questo punto si tratta di solo di comprendere per esempio a quale numero relativo al set di dati, fa riferimento il led di RUN.

Per il led RUN devi ricercare nel buffer la word contenente il valore 4 e quindi leggere il byte o i byte della word sucessiva per sapere lo stato del led.

Non mi dilungo oltre, ed allego questa tabella di semplice interpretazione per associare numero set di dati a quello di tuo interesse ed interpretazione dello stato del LED (acceso,spento,lampeggiante etc. etc.)

immagineww.png

Sperando di averti reso le cose più semplici auguro un buon lavoro.

Modificato: da cagliostro
Link al commento
Condividi su altri siti

guillermo.ibanez

Caro Cagliostro, ho appena ricevuto la notifica e mi metterò a leggere accuratamente tutta la tua eccellente informazione che mi hai dato. Voglio ringraziarti comunque per la cortesia. Eventualmente ti disturberò ancora per qualche piccolo chiaremiento.

Grazie di nuovo e a buon rendere!

Link al commento
Condividi su altri siti

guillermo.ibanez

Ho porvato a leggere 32 byte e ho ottenuto dell'informazione che adesso devo analizzare. Volevo chiederti Cagliostro; le word vanno swappate per via

del formato Siemens ?

i contenuti dei byte sono

(0, 25, 0, 0, 0, 4, 0, 7, 0, 1, 1, 0 , 0, 4, 0, 0, 0, 5, 1, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 11, 0, 0 )

Noto che la word nr. 1 avrebbe un valore di 25 dec oppure 19 hex ... questo 19 mi sembra il parametro della chiamata o mi sbaglio ? (tutti questi valori se i byte non vanno swappati, altrimenti sono tutt'altro.)

quindi, seguendo quello che mi dici:

word 1 = 19 h -> NUMERO DEL PRIMO SET DI DATI

word 2 = 0 -> RELATIVO STATO DEI LED

word 3 = 4 -> NUMERO DEL SECONDO SET DEI DATI

word 4 = 7 -> RELATIVO STATO DEI LED

word 5 = 1 -> NUMERO DEL TERZO SET DEI DATI

word 6 = A h -> RELATIVO STATO DEI LED

word 7 = 4 -> NUMERO DEL QUARTO SET DEI DATI

word 8 = 0 -> RELATIVO STATO DEI LED

word 9 = 5 -> NUMERO DEL QUINTO SET DEI DATI

word 10 = A h -> RELATIVO STATO DEI LED

word 11 = 6 -> NUMERO DEL SESTO SET DEI DATI

word 12 = 0 -> RELATIVO STATO DEI LED

word 13 = 8 -> NUMERO DEL SETTIMO SET DEI DATI

word 14 = 0 -> RELATIVO STATO DEI LED

word 15 = B h -> NUMERO DEL OTTAVO SET DEI DATI

word 16 = 0 -> RELATIVO STATO DEI LED

Se tuttoi questo che ho scritto va bene ora mi rimane di chiederti la conferma per l'esempio LED STOP

scelgo il QUINTO set di dati ( seguendo l'elenco in tabelle W#16#0005 e leggo:

word 9 = 5 -> NUMERO DEL QUINTO SET DEI DATI

word 10 = A h -> RELATIVO STATO DEI LED

dove la word 10 s'interpreta = 0000 1010 h -> Byte LED_ON = 0 e byte LED_BLINK = A h

quindi capirei il led_on = 0 (non è in STOP ma nella realtà è in STOP)

led_blink = ?????

se i byte fossero girati avremmo

word 9 = 50 h

word 10 = A0 h ---> 1010 0000 h Led on = ???? Led blink = 0 = non lampeggia

IO adesso sul plc ho il led di stop accesso e non lampeggia . Dove sbaglio ?

Grazie mille

Link al commento
Condividi su altri siti

guillermo.ibanez

Ciao, aggiungo valori come vengono swappando le word. Le parentesi richiudono le triplete (word-byte-byte) -> (index, ledon, ledblink)

(25, 0, 0) ,

(4, 7, 0) ,

(1, 0, 1),

(4, 0, 0),

(5, 0, 1),

(6, 0, 0),

(8, 0, 0),

(11, 0, 0)

se invece NON swappo le word

(6400, 0, 0),

(1024, 0, 7),

(256, 1, 0),

(1024, 0, 0),

(1280, 1, 0),

(1536, 0, 0),

(2048, 0, 0),

(2816, 0, 0))

Continuo a non riuscire a decrifrare la info !!! :-D

Buon fine di settimana e tante grazie per qualsiasi aiuto

Link al commento
Condividi su altri siti

Continuo a non riuscire a decrifrare la info !!! :-D

siamo in due......... :cussing:

Ho dato un'occhiata al comando libnodave:

daveReadSZL(daveConnection * dc, int ID, int index, void * buf);

Leggendo la spiegazione all'istruzione si capisce come sia veramente difficile interpretare i dati restituiti specie quando scrivono

I don't know how to find out the available or meaningful indices. In most cases, index 0 is the whole list, while other indices retrieve parts of it

Guardando i dati da te riportati, trà l'altro non capisco perchè nella sequenza word-byte-byte, compare per due volte quello che credo sia l'indice 4.

Cercando in rete ho trovato qualcosa che forse potrebbe ritornarti utile, dal momento che come scritto nel mio precedente messaggio, non ho esperienza sull'utilizzo di libnodave.

non ho mai utilizzato libnodave, pertanto non so dirti con certezza se c'è una piena compatibilità nell'interpretazione dei dati che ottieni utilizzando l'equivalente funzione di sistema di Siemens che è la SFC51 [RDSYSST].

L'esempio sottoriportato probabilmente è stato fatto con una versione datata, ma vedi se ti può ritornare utile.

I've done it in VB6 and it works fine...

You must use daveReadSZL(PLC.dConn, ID, SLZ_index, buffer(0))...

where PLC.dConn is the pointer to your PLC connection, ID is the SLZ_ID (search on Siemens documentation the list of SZL_ID), SLZ_index what you want to read.....

If you try with ID=0019h (25 dec) you will read LEDS of CPU (SLZ_index = 0 means all):

on buffer you will receive:

0,1,0,0,0,4,1,0,0,5,0,0,0,6,0,0,0,B,0,0,

--|-------|-------|-------|-------|

--|-------|-------|-------|------ B,0 -> BF = 0 -> Led BF off

--|-------|-------|------ 6,0 -> FRCE = 0 -> led FRCE off

--|-------|------ 5,0 -> STOP = 0 -> led STOP off

--|------ 4,1 -> RUN = 0 -> led RUN on

--1,0 -> SF = 0 -> led SF off

Modificato: da cagliostro
Link al commento
Condividi su altri siti

guillermo.ibanez

Caro Cagliostro, ti ringrazio tantissimo per la tua gentilezza ma non preoccuparti ! E' molto probabile che la libreria Libnodave abbia un bug non riportato perché la lettura dei ZSL non sia molto usata oppure il PLC che sto usando che è un Vipa 314 SC e non Siemens puro. Per il m omento non ho un altro PLC a disposizione ma appena possibile ci provo.

Grazie di nuovo

:senzasperanza:

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