Vai al contenuto
PLC Forum


Server Libnodave - Client-server dataserver basato su libnodave


leonardi.mair

Messaggi consigliati

Il server in discussione basato sulla libreria libnodave e tramite

un file di definizione degli items (linking nome simbolico a indirizzo dell'area DB nel plc)

rende disponibili i valori in tcp/ip ad una libreria referenziabile in un

progetto VB. Nel progeto VB si accede a queste tags con una sintassi del tipo:

a=plc.item("prima tag") in lettura

plc.item("prima tag")=b in scrittura

C'è anche un simulatore che emula il comportamento del plc in modo tale da utilizzare

il programma client senza avere fisicamente a disposizione il plc.

Link al commento
Condividi su altri siti


  • Risposte 85
  • Created
  • Ultima risposta

Top Posters In This Topic

  • Bruno

    28

  • leonardi.mair

    20

  • yahoo52

    19

  • borinid

    7

Buongiorno !

Il progetto sembra interessante, una domanda: cosa intendi per VB ? VB6 o VB.NET ?

Penso che dovremmo dare strumenti in modo che la libreria sia referenziabile anche con il framework.

Tornando ai problemi di connessione ho fatto una prova prima di iniziare la giornata lavorativa:

1) Ho usato il programma sviluppato in VB6 "TestLibNoDave" che ho messo a disposizione nell'area upload/download

2) Nel test ho usato la DLL della versione 0.8.2

3) Nel test ho eseguito una connessione ISO on TCP con un PLC S7300 (CPU 314C-2DP e CP 343-lean)

4) Dopo la connessione ho eseguito un paio di letture su DB con successo

5) Ho staccato il cavo ethernet

6) Ho provato ad eseguire una lettura su DB e dopo un timeout (sembravano 5 sec) è ritornato il codice di errore

7) Il programma non è terminato

8) Ho provato ad eseguire altre letture senza successo

9) Ho ricollegato il cavo ethernet

10) Ho provato ad eseguire altre letture senza successo

11) Eseguito disconnessione da PLC

12) Ho ricomandato la connessione (eseguita con successo)

13) Dopo la connessione ho potuto eseguire letture su DB con successo

Oggi in pausa pranzo controllo l'esempio in C#, non vorrei che manchi qualche gestione di errore.

Magari se trovo il tempo provo anche con la DLL versione 0.8.4 (nei miei impianti sono ancora alla 0.8.2)

Ciao

Modificato: da Bruno
Link al commento
Condividi su altri siti

il problema si manifesta con letture cicliche di + datablock. Per esempio:

timer (300ms)

{

Lettura DB400

Lettura DB401

Lettura DB402

...

Lettura DB450

//

aggiornamento immagine interna

//

}

Ad ogni lettura viene richiamata la funzione davereadbytes, dopodichè, alla fine della lettura di tutti i DB ci sarà

un nuovo ciclo di timer. Nel tuo progetto c# ho inserito molte aree DB da leggere e l'ho lasciato ciclare.

Ho poi scollegato il cavo e succedeva che rimaneva bloccato dal s.o., come succede con il mio.

Utilizzando invece s7online(mpi con cp5611) si verifica un errore irreversibile (quello di cui parlavo).

Link al commento
Condividi su altri siti

Stavo giusto per postare che il test appena fatto con l'esempio in C# è andato a buon fine quando ho letto il tuo ultimo messaggio.

ok !

Consideriamo però che i due esempi messi nell'area upload/download servivano come indicazione sul modo di operare con la DLL, nel server

che utilizzo nei miei impianti (con letture/scritture cicliche e senza interfaccia utente) dopo x errori di comunicazioni dichiaro chiusa la comunicazione

(eseguo anche il cleanUP) e ciclicamente riprovo la connessione.

NAturalmente cerco di discriminare certe scelte con il codice di errore, specie se ho più PLC collegati:

Con un solo PLC collegato tutti i santi aiutano: puoi chiudere tutto e ritentare dall'inizio.

Con più PLC collegati bisogna esser più oculati e disconnettere solo quello in errore (es: un quadro spento) e continuare le operazioni sugli altri.

Proverò comunque a ripetere il tuo test (comunque con la gestione errore) per vedere di replicare il problema e vedere come affrontare la questione.

ciao

BR1

Modificato: da Bruno
Link al commento
Condividi su altri siti

anch'io faccio la stessa cosa.

Oggi ho modificato il timeout di comunicazione della libreria, in ethernet tutto

si è sistemato. Il problema grosso è sempre con MPI via cp.

Link al commento
Condividi su altri siti

L'utilizzo del collegamento MPI via CP implica, se non sbaglio, il collegamento S7ONLINE.

Io lo evito sempre in quanto utilizza un DLL proprietaria della siemens, con i relativi problemi

di licenze, installazioni e configurazioni. (senza contare il fatto che non sono allegati i sorgenti).

Le volte che ho utilizzato il protocollo MPI con libnodave in un impianto avevo fatto installare il

PC Adapter seriale in modo da non dover installare null'altro che il mio protocollo.

Nel caso di altri supporti bisognerebbe verificare che con l'acquisto della scheda (CP o Adattatore USB)

venga fornito un CD che insieme al protocollo sviluppato permetta configurazione e collegamento, il test

va fatto su un PC "vergine" sicuramente senza aver installato cose tipo S7 manager o WinCC flex.

Io considero conveniente l'installazione di una scheda di rete ethernet sul PLC (la CP-343 lean) è abbastanza

economica, il cablaggio è semplice e i vantaggi sono vari e tali da giustificarne la spesa per quegli impianti

che necessitano di una supervisione (non sarà gratis ???) ;)

Ciao

BR1

Link al commento
Condividi su altri siti

Salve a tutti,

devo implementare un sistema di controllo degli alcuni impianti, presumibilmente attraverso PLC S7200. So, e ho già provato, che esiste da Siemens OPC server che permette di far colloquiare PC e PLC tramite Ethernet. Ho visto però che esiste questa libnodave che dovrebbe permettere ad un programmatore di avere le stesse funzionalità di un OPC gratuitamente,

Secondo voi è consigliabile utilizzarla anche in applicazioni "spinte" (non dovrebbe essere il mio caso) o è più che altro una libreria per amatori?

Grazie 1000

Daniele.

Link al commento
Condividi su altri siti

libnodave funziona egreggiamente anche per applicazioni spinte.

Io la utilizzo in impianti con 5 pc collegati in rete e 2 plc. Per ogni pc vengono caricati circa

(dipende dalla funzione) 10-15 DB con 300-500 byte per DB.

Il tempo di aggiornamento delle variabili nel client dipende dal tipo di cpu

(+ lenta la 300 che ha un unico processore, anche tecnology).

Nel mio caso si passa dai 250ms (s7 400) ai 500-600 (S7 300).

Link al commento
Condividi su altri siti

Ho utilizzato anche PBsoftnet + opc della Siemens,ma oltre a essere + lento,

la Siemens ha continuamente cambiato versione degradando nelle prestazioni e

complicando il setup. Prova a dire ad un cliente che deve prepararsi un pc

di configurare il softnet 2005 per esempio. Nel mio caso installo tutto con

un pacchetto msi ed ho finito.

Per rispondere a Bruno:

Io installavo la scheda CP5611 + step7 con licenza che utlizzavo anche

per la teleassistenza, quindi l'utilizzo di s7onlinx era regolare. In questo caso, rispetto

all'utilizzo di softnet, risparmiavo in quanto installavo un pacchetto che comunque

mi era necessario e non installavo il softnet.

Libnodave dovrebbe lavorare correttamente indipendentemente dal fatto

di utilizzare o meno la libreria siemens (in particolar modo se legata ad

un prodotto licenziato). Inoltre anche nel server che hai messo come esempio hai inclusa

la possibilità di utilizzare la CP con /S7online, quindi se è inclusa deve funzionare correttamente.

Il problema di puntamento è legato ad un valore null ritornato da s7onlinx. Questo fine settimana

provo a controllare nella libreria cosa succede. Ho inoltre aggiunto un accorgimento:

se utilizzo /s7online controllo che sia installata la libreria s7onlinx.dll prima di accedervi, altrimenti

l'accesso provoca un errore fatale dell'applicazione client.

Per quanto riguarda il blocco in collegamente ethernet ho visto che la funzione Open() che apre la

connessione tcp/ip impiega diversi secondi a ritornare il controlla all'applicazione client in caso

di mancanza di collegamento. Ho pensato di aggiungere un parametro alla funzione che mi consenta

un minor numero di cicli di test prima di ritornare (come nel comando ping).

Link al commento
Condividi su altri siti

Ciao a tutti

Per quanto riguarda il collegamento con i PLC della serie S7-200, io non l'ho mai usato in un impianto, ho fatto solo alcune prove di comunicazione (consuccesso), ma ho letto che diverse persone utilizzano libnodave con tale PLC.

Per quanto riguarda il sopracitato esempio in VB6 prevede il collegamento seriale (PPI) con il PLC ed è stato testato con successo da un utente del forum (varg), devi solo stare attento alla configurazione della seriale e indicare come DB1 la zona per leggere i registri V.

Puoi vedere anche questa discussione

Per leonardi.mair, mi piace l'idea della verifica installazione DLL. Entro lunedì dovrei riuscire anche io a testare libnodave con una CP5611, se trovo miglioramenti

posto qualcosa...

Per quanto riguarda l'utilizzo della DLL siemens forse non mi sono spiegato bene, intendevo dire che bisogna utilizzare software altrui solo con le licenze a posto (come mi sembra che tu stia facendo se installi S7 con licenza anche sui PC cliente). Sono sicuro che ognuno di noi vuole che il proprio lavoro sia riconosciuto e rispettato. Io sono felice quando mi dicono di aver utilizzato software o parti di software che avevo pubblicato, mi incazzerei molto se qualcuno utilizzasse mio software di strafugo :rolleyes: .

Ciao

BR1

Link al commento
Condividi su altri siti

approposito...

ho visto che in send/receve le nuove 300 non hanno + il limite dei 240 byte,ma 8192.

Vista la lentezza nello scambio dati rispetto alle 400, se si scambiassero 8192 bytes per pacchetto

con libnodave si colmerebbe il gap di velocità tra i due plc...

Link al commento
Condividi su altri siti

ho risolto il problema della dll s7onlinx mancante (se non installate step7).

Basta applicare la modifica di seguito riportata.

EXPORTSPEC HANDLE DECL2 openS7online(const char * accessPoint, HWND handle) {
    HMODULE hmod;
    int h,en;
	_setHWnd SetSinecHWnd; 

    hmod=LoadLibrary("S7onlinx.dll");
    if (NULL == hmod)
    {
       return -1;   //exit on s7onlinx.dll not installed
    }    
    if (daveDebug & daveDebugOpen)
	LOG2("LoadLibrary(S7onlinx.dll) returned %p)\n",hmod);

    SCP_open=GetProcAddress(hmod,"SCP_open");
    if (daveDebug & daveDebugOpen)
    	LOG2("GetProcAddress returned %p)\n",SCP_open);

    SCP_close=GetProcAddress(hmod,"SCP_close");
    if (daveDebug & daveDebugOpen)
	LOG2("GetProcAddress returned %p)\n",SCP_close);

    SCP_get_errno=GetProcAddress(hmod,"SCP_get_errno");
    if (daveDebug & daveDebugOpen)
	LOG2("GetProcAddress returned %p)\n",SCP_get_errno);

    SCP_send=GetProcAddress(hmod,"SCP_send");
    if (daveDebug & daveDebugOpen)
	LOG2("GetProcAddress returned %p)\n",SCP_send);

    SCP_receive=GetProcAddress(hmod,"SCP_receive");
    if (daveDebug & daveDebugOpen)
	LOG2("GetProcAddress returned %p)\n",SCP_receive);

    SetSinecHWnd=GetProcAddress(hmod,"SetSinecHWnd");
    if (daveDebug & daveDebugOpen)
	LOG2("GetProcAddress returned %p)\n",SetSinecHWnd);

    en=SCP_get_errno();
    h=SCP_open(accessPoint);
    en=SCP_get_errno();
    LOG3("handle: %d  error:%d\n", h, en);
	SetSinecHWnd(h, handle);
    return h;
};[/code]

Link al commento
Condividi su altri siti

per Bruno: ho modificato il file di progetto in quanto non erano inclusi opens7online.h e opens7online.c

(le funzioni di s7online non era riconosciuta nella libreria).

Link al commento
Condividi su altri siti

per Bruno:

Ho provato questa mattina la dll ricompilata, tutte le funzioni restituiscono un valore, ma non

(in ethernet) stabilisce un collegamento con il plc, mentre sostituendo quella originale il tutto

funziona regolarmente. La versione è sempre la 8.4. Oggi purtroppo non ho il tempo di controllare

il file di progetto, di sicuro manca ancora qualcosa.

Link al commento
Condividi su altri siti

Ho appena scaricato il file di progetto, appena possibile gli do un'occhiata.

Non ti preoccupare non mi sembra un problema enorme, magari per le prove si utilizza la DLL precedente.

Nella parte VB e C# devo aggiungere una modifica per la chiusura (in caso windows ed Ethernet) corretta del socket:

dopo diverse connessioni e disconnessioni consucutive sembra che possa comparire un errore (problema segnalato in un'altra discussione).

Magari al termine dei test potrei aggiornare la sezione upload/download o mettere un nuovo progetto completo di:

Sorgenti libnodave completo di progetto per la compilazione con Dev-C++ (tool liberamente utilizzabile)

Sorgenti di un progetto di esempio in C# utilizzabile con Visual C# 2005 Express o con SharpDevelop (tools liberamente utilizzabile)

Sorgenti di un progetto di esempio in VB6 (anche se richiede un ambiente di sviluppo a pagamento :huh: )

Nel fine settimana faccio prove e magari sistemo gli esempi.

BR1

Link al commento
Condividi su altri siti

io non ho mai avuto problemi di chiusura connessioni (magari è latente),

se ho tempo controllo anch'io il problema del progetto.

Se fai l'upload dei progetti aggiungi anche il controllo sulla libreria

che ho "post-ato".

Link al commento
Condividi su altri siti

Ciao

Ho preparato un paio di progetti per Dev-C++ in modo da compilare le DLL di libnodave (oltre all'ultima anche la 0.8.2 che uso in diversi impianti), e sono riuscito a fare le prove.

Preparando e testando i progetti di test in VB6 e C# ho notato una discrepanza nei file:

  • libnodave-0.8.4\Dot.NET\libnodave.net.cs
  • libnodave-0.8.4\Excel And VB\Modul12.bas
nel download della libreria da sourceforge.

Infatti nell'ultima versione della libreria è stata modificata la chiamata alla funzione openS7online da

EXPORTSPEC HANDLE DECL2 openS7online(const char * accessPoint);

a

EXPORTSPEC HANDLE DECL2 openS7online(const char * accessPoint, HWND handle);

Adesso in questi eseguo alcune prove, quindi metterò nella sezione upload/download

un nuovo progetto con le correzioni opportune.

Naturalmente contatterò Thomas Hergenhahn per cumunicargli la svista nella parte windows...

Stay tuned

BR1

Link al commento
Condividi su altri siti

non è una svista è stata appositamente modificata per risolvere un

problema che aveva la versione 0.8.2.

Io utilizzo la 0.8.4 da un anno con questa chiamata modificata.

Link al commento
Condividi su altri siti

... sto adattando il server che utilizzo (di cui parlavo) per

un suo libero utilizzo. Chiaramente attualmente è troppo specifico

e adattato al mia realtà aziendale. Spero in settimana di riuscire

a pubblicarlo.

Link al commento
Condividi su altri siti

La svista di cui mi riferivo, non è nella parte sorgente del codice in C.

Ma nei due file da utilizzare quando si usa la DLL in windows e in VB6 o con DOT.NET.

i file openS7online.c e openS7online.h sono corretti, sono gli altri due che debbono essere modificati.

Ciao

Link al commento
Condividi su altri siti

Confermo quanto detto sopra, ecco i risultati dei primi test:

VB6

modificare il modolo per le dichiarazioni delle funzioni libnodave

da:

Private Declare Function openS7online Lib "libnodave.dll" (ByVal peer As String) As Long

a:

Private Declare Function openS7online Lib "libnodave.dll" (ByVal peer As String, ByVal hw as Long) As Long

All'interno del software la chiamata di apertura cambia

da:

ph = openS7online("/S7ONLINE")

a:

ph = openS7online("/S7ONLINE", frm.hdwn) ' Si può anche usare l'API per ottenere l'handle in caso di applicazione console (ho provato con 0 e funziona)

Dopo aver fatto le prove anche in DOT.NET pubblicherò gli esempi.

stay tuned

BR1

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