Vai al contenuto
PLC Forum


Server Libnodave - Client-server dataserver basato su libnodave


leonardi.mair

Messaggi consigliati

Ciao a tutti

Sono riuscito a mettere in archivio (sezione software) un file zip inferiore a 2 MB con uno starter kit per chi volesse cominciare giocare con le librerie libnodave, nel file sono presenti:

  • direttorio con i sorgenti della libreria per eseguire la compilazione in ambiente windows, è presente anche il file di progetto per Dev-Cpp ver 4.9.9.2 (liberamente scaricabile da http://www.bloodshed.net/ in modo da provare a modificare e/o sviluppare progetti in C o C++.
  • direttorio con i sorgenti di un esempio in VB6, nel direttorio è presente un modulo .bas che vi permette di interfacciare i vostri applicativi alla dll compilata nel punto precedente (la dll non va registrata è sufficiente copiarla nel direttorio dove risiede il vostro file exe )
  • direttorio per la creazione della DLL per il framawork 2.0 per interfacciare la vostra soluzione con la DLL compilata nel pruimo punto, la DLL risultante dalla compilazione con l'apposito file .bat va referenziata nel vostro progetto, ma ricordatevi di copiare la DLL base nel direttorio dove riesiedono i vostri file exe (conviene copiarla sia nel direttorio debug che in quello release).
  • direttorio con un progetto sviluppato in C# con #Develop sul framework 2.0 (testato anche in Visual Studio 2005).
  • direttorio con un link che punta ad una versione DEMO di un simulatore PLC S7 che vi permette di fare i test di comunicazione della vostra applicazione senza PLC, la versione DEMO ha la limitazione che dopo 15 min la CPU virtuale commuta in STOP ma la comunicazione continua a funzionare (Not BAD).
Il file da scaricare è StarterKit_084.zip in quanto fa rirefimento alla libreria libnodave ver 0.8.4

Spero che possiate divertirvi...

Per Leo,

Ciao ho eseguito la prova che avevo citato con una CP-343 Lean ed è fallita, purtroppo i collaudatori non mi hanno fatto continuare le prove e si sono rifiutati di farmi dare un'occhiata alla configurazione HW della scheda.

Il test consisteva con leggere in un pacchetto unico 400 BYTE di dati (più header) con protocollo 122 (ISO on TCP), l'errore risultante è stato:

0x8500 - > incorrect PDU size.

Appena avrò un PLC vero a disposizione farò altre prove (non penso che sia salutare fare certi test su un PLC virtuale).

Ciao

BR1

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

ho eseguito il server c#, ho notato un piccolo errore. Se avvii il programma, segli options e poi scegli debug-->datablock

ricevi il seguente messaggio di errore:

Lanciata Eccezione System.NullReferenceException nel debugger:
Object reference not set to an instance of an object.

debugToolStripMenuItem_Click() - c:\__DEPOSITO\DP7\Sorgenti\libnodave-0.8.4\StarterKit_084\libnodave\Ver_8.4\libnodave_C#\Test_Form\Test_Form\MDI_Main.cs:361,14
RaiseEvent()
OnClick()
HandleClick()
HandleMouseUp()
FireEventInteractive()
FireEvent()
OnMouseUp()
OnMouseUp()
WmMouseUp()
WndProc()
WndProc()
WndProc()
WndProc()
OnMessage()
WndProc()
DebuggableCallback()
System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop()
RunMessageLoopInner()
RunMessageLoop()
Run()
Main() - c:\__DEPOSITO\DP7\Sorgenti\libnodave-0.8.4\StarterKit_084\libnodave\Ver_8.4\libnodave_C#\Test_Form\Test_Form\Program.cs:17,13

Link al commento
Condividi su altri siti

ho provato davereadmaxpdu, con s7400 mi ha restituito correttamente 480. Domani lo proverò con s7300T.

Non ho capito la funzione addnewpdu...guarderò il sorgente della libreria appena avrò tempo.

Link al commento
Condividi su altri siti

Ciao yahoo52

Alla faccia deglio orari tirati !!! :o

Ho visto la cappella, grazie ! Adesso preparo la patch...

il tools web era un'idea per testare il server web che le CP della siemens riescono ad avere (non centra non libnodave), ma l'esempio è tratto da un programmino di test...

Il logger non è niental'altro che una serie di messaggi di testo mandati ad un server UDP .

Appena riesco a provare la dimensione del messaggio ti avverto, ma prima vorrei completare l'interfaccia per le funzioni in DOT.NET, infatti alcune funzioni non sono richiamabili perchè non presenti nel fine libnodave.net.cs, ma presenti nella dll....

Speriamo che arrivi anche la fine anno.

ciao

Link al commento
Condividi su altri siti

ciao Bruno,

ho provato la funzione getpdu sulla s7300T e mi ha restituito 240 :angry: :angry:

Ho individuato un altro problema con le 300 che le 400 non hanno:

se si utilizza la funzione setbit (o resetbit) nella stessa word 2 volte di seguito nel programma client

la 300 non risponde in tempo utile la variazione di stato causato dalla prima scrittura per

fare in modo che la seconda abbia il risultato voluto. Esempio:

....

DB400,dbw0 vale 0

daveSetBit dc, daveDB, 400, 0, 0

daveSetBit dc, daveDB, 400, 0, 1

db400,dbw0 vale 2 e non 3 in quanto la seconda istruzione che viene eseguita non

trova il valore settato a 1.

S7300 scrive subito 1 nella word 0, ma fornisce il datachange in ritorno alla funzione di lettura dopo

un tempo relativamente alto.

Le funzioni si setbit leggono la word, la modificano e infine la scrivono. Il server che utilizza le funzioni

di scrittura dovrebbero rispettare il tempo di risposta della cpu plc mettendo in coda le scritture ed

eseguendole in successione temporizzata. Il problema si comunque solo aggiornando lo stato dei bit appartenenti

alla stessa word.

Per esempio io ho utilizzato una word per una serie di bit di jog. Nel server si può impostare un tempo di ciclo

di scrittura maggiore di x ms, ma in tal modo tutte le scritture (in particolare un array) avrebbero un tempo di aggiornamento

troppo elevato. Si può introdurre un controllo in scrittura in modo da memorizzare lo stato della word aggiornata da setbit

in modo che se prima di un timeout arriva un altra richiesta di scrittura venga variato lo stato della word memorizzata e riscritta

nel plc.

Link al commento
Condividi su altri siti

ho provato la libreria ricompilata... funziona correttamente.

Sai con quale compilatore è stata compilata l'originale ?

(originale 124 kb, ricompilata 138 kb).

Link al commento
Condividi su altri siti

Ho visto che la differenza di kb sta nei settaggi del winmake.

Ho provato a inserire la seguente funzione:

EXPORTSPEC int DECL2 WORD_to_BIT(); (in nodave.h file)

int DECL2 WORD_to_BIT() {

return (1);

}

(in nodave.c file)

la compilazione è ok,ma quando richiamo la funzione da VB non ne trova l'entry point.

Dal punto di vista logico-sintattico mi sembra ok, sto provando a controllare i

parametri del linker.

Link al commento
Condividi su altri siti

nel file .def mi sembra pure tutto a posto...

; dlltool --base-file C:\DOCUME~1\ADMINI~1\IMPOST~1\Temp/cca05168.base --output-exp libnodave.exp --dllname libnodave.dll --output-def liblibnodave.def --no-export-all-symbols --add-stdcall-alias --exclude-symbol=DllMainCRTStartup[at]12 --def C:\DOCUME~1\ADMINI~1\IMPOST~1\Temp/cca05168.def --output-lib liblibnodave.a
EXPORTS
    WORD_to_BIT = WORD_to_BIT[at]0 [at] 1
    WORD_to_BIT[at]0 [at] 2
    __daveAnalyze = __daveAnalyze[at]4 [at] 3
    __daveAnalyze[at]4 [at] 4

        .... e così via...

Link al commento
Condividi su altri siti

... i namespace!...

comunque sono riuscito ad aggiungere delle nuove funzioni alla libreria libnodave.

Per Bruno, ti ho spedito il link da cui scaricare il progetto modificato. Ho inserito anche i parametri del linker

per passare le stringhe e i safearray al vb.

p.s.: attenzione ad un problema in devc++:

se definite una funzione nel file.c e .h, ne cambiate il nome e accedete alla lista classi,

ritroverete la vecchia definizione. Dovete chiudere e riaprire il programma affinchè la modifica venga

visualizzata correttamente.

Link al commento
Condividi su altri siti

la funzione daveSetBit presente nella libreria non esegue prima il caricamento dello stato attuale del byte che

contiene il bit da variare. Aggiungerò una funzione che effettui tale controllo prima di cambiare lo stato del bit.

Simplified single bit set:

*/

int DECL2 daveSetBit(daveConnection * dc,int area, int DB, int byteAdr, int bitAdr) {

int a=1;

return daveWriteBits(dc, area, DB, 8*byteAdr+bitAdr, 1, &a);

}

/*

n.b.: nel modulo aggiunto ci sono delle funzioni per lo swapping che sostanzialmente ho visto

presenti nella libreria, anche se non così esplicite. Le funzioni nuove riguardano la conversione

dei bit in una stringa ed il test bit.

Link al commento
Condividi su altri siti

ho visto anche la mancanza di una funzione di toggle (inversione dello stato di un bit).

La prossima settimana proverò le funzioni descritte che ho appena scritto.

Link al commento
Condividi su altri siti

L'aggiunta del nuovo comando di scrittura bit esegue il confronto di seguito riportato:

    //int DECL2 newSetBit(daveConnection * dc,int area, int DB, int byteAdr, int bitAdr,BOOL ECO) {
    
    //con ECO=0
    //leggo il byte indicato
    //setto il bit  nel byte e riscrivo il byte
    
    //con ECO=1
    //leggo il byte indicato, lo confronto con il valore memorizzato del byte (con DB,byteAdr uguali)
    //se uguale verrà comandata la scrittura altrimenti il valore di ritorno della funzione sarà -1
    
    //con -1 il client valuta se richiedere nuovamente la scrittura del bit in quanto consapevole
    //che il plc non ha ancora notificato la modifica precedente nell'ambito 
    //dello stesso byte.

Link al commento
Condividi su altri siti

un ulteriore funzione riguarderà l'acquisizione di dati da plc e la loro scrittura diretta

in xml file o in un database (via ODBC in windows ,sqlite o postgres), in modo

da avere una funzione efficiente di acquisizione ed archiviazione dati.

Io per esempio archivio ogni minuto un array di 600 word di una prova di compressione,

che poi viene visualizzata al cliente sotto forma di grafico. Tale prova è anche salvata

in files di testo organizzati per giorno.

Link al commento
Condividi su altri siti

Quanti post !!!!

Io ho passato il week end sul lago, ora provo a digerire i vari passaggi.

1) PDU e lunghezza max, le prove che hai fatto mi convincono sempre di più che l'utente non si deve preoccupare della configurazione hardware al momento dello sviluppo per cui deve essere trasparente la lunghezza massima. Sarà la libreria a cercare di ottimizzare i pacchetti riconoscendo l'hardware collegato.

2) Operazioni su BIT: preoccupante !!! Anche se a dire il vero spesso il buon programmatore PC-PLC definisce le aree in modo opportuno. Comunque preoccupante e da non sottovalutare

3) Se non sbaglio, leggendo tra i vari file TXT l'autore (Thomas) sviluppa principalmente in ambiente linux (quindi gcc) poi penso che esegua le compilazioni e i test emulando windows su linux (lo ipotizzo leggendo i file BAT)... mi sembra che in windows utilizzi Microsoft Visual C++ 6.0. Le prove in linux io le ho fatte in Suse 10.0, Knoppix 4.0 e MAndriva 2005.

continua..

Link al commento
Condividi su altri siti

purtroppo in settimana ho avuto poco tempo a disposizione...ma le funzioni arriveranno

nel frattempo posso dirvi che anche prodave della siemens aveva il problema di scrittura dei bit.

Questa settimana ho cercato di installare rslinx 2.51 della rockwell in un pc con xp sp2 embedded della siemens

(477B)... non funziona xchè sembra che i driver ethernet del siemens siano troppo aggiornati (ipv6 e vlan disponibili), ma funziona

il server con libnodave !!!!

Link al commento
Condividi su altri siti

... p.s....

attenzione al virus WORM_IRCBOT.A** colpisce i file *.rar rendendoli illegibili, si trasmette con le cartelle condivise,

installa un file nascosto autorun.inf che lancia un eseguibile nascosto. Sfrutta inoltre il protocollo irc per ricevere comandi.

disassemblandolo ho visto che scarica gli updates da http://www.max-gate.com/backup/mitm.com

quindi comprimete in .zip e salvate degli autorun.inf nascosti in sola lettura. Filtrate tale indirizzo (per esempio con un proxy)

per prevenire versioni mutate.

Link al commento
Condividi su altri siti

  • 2 weeks later...

Salve, sto creando una piccola applicazione in LabView usando le funzioni .NET. L'applicazione dovrebbe collegarsi ad un PLC Siemens tramite ISO TCP e leggere alcune aree di memoria. Purtroppo con la versione di LV che uso, la 7.1, non riesco a vedere tutti i costruttori. Ho anche provato a modificare il sorgente della libnodave.net.dll che ho trovato nello Starter Kit ma senza risultati positivi. Per il momento non allego nessun file perche' vorrei prima capire se c'e' qualcuno che usa LabView.

Link al commento
Condividi su altri siti

  • 1 month later...

Ciao ragaz

Tiro fuori questo post per comunicare che ho messo la nuova versione dello Starter Kit per libnodave 0.8.4 nella sezione download

come la precedente ha le seguenti caratteristiche:

* direttorio con i sorgenti della libreria per eseguire la compilazione in ambiente windows, è presente anche il file di progetto per Dev-Cpp ver 4.9.9.2 (liberamente scaricabile da http://www.bloodshed.net/ in modo da provare a modificare e/o sviluppare progetti in C o C++.

* direttorio con i sorgenti di un esempio in VB6, nel direttorio è presente un modulo .bas che vi permette di interfacciare i vostri applicativi alla dll compilata nel punto precedente (la dll non va registrata è sufficiente copiarla nel direttorio dove risiede il vostro file exe )

* direttorio per la creazione della DLL per il framawork 2.0 per interfacciare la vostra soluzione con la DLL compilata nel pruimo punto, la DLL risultante dalla compilazione con l'apposito file .bat va referenziata nel vostro progetto, ma ricordatevi di copiare la DLL base nel direttorio dove riesiedono i vostri file exe (conviene copiarla sia nel direttorio debug che in quello release).

* direttorio con un progetto sviluppato in C# con #Develop sul framework 2.0 (testato anche in Visual Studio 2005).

* direttorio con un link che punta ad una versione DEMO di un simulatore PLC S7 che vi permette di fare i test di comunicazione della vostra applicazione senza PLC, la versione DEMO ha la limitazione che dopo 15 min la CPU virtuale commuta in STOP ma la comunicazione continua a funzionare (Not BAD).

In più in questo progetto ho voluto inserire:

(1) Accesso a database

(2) Serializzazione e Deserializzazione di classi

(3) Funzionalità di client ad un server UDP per loggare eventi

(4) Funzionalità di server per permettere a client di accedere in letture e scrittura al PLC indipendentemente dal collegamento che il server ha

(5) Funzionalità di trasformazione dati

(6) Spostamento dell'applicazione nella icon-tray

Questo progetto rappresenta un server che una volta collegato ad un PLC ne legge in modo ripetitivo alcune aree definite su database (1), le impostazioni dell'applicativo vengolo lette e salvate su un file XML (2).

Durante le operazioni il software spedisce stringhe di debug via UDP (3)

Accetta connessioni TCP/IP, e risponde a messaggi dei client dopo aver eseguito operazioni di lettura e scritttura (4)

Con i surrerimenti di yhaoo52 ho inserito delle funzioni di gestione allarme e trasformazione dei valori da PC a PLC e viceversa (nell'ipotesi di yahoo52 le funzionalità erano all'interno della DLL di libnodave, ma ho preferito preparare una DLL esterna al protocollo di comunicazione che possa essere utilizzata liberamente (chiamata PlcForum.dll).

Una volta lanciato il server per terminarlo bisogna chiuderlo dal file menù, se si tenta di chiuderlo con la [X] del form viene spedito nella icon-tray

Nella stessa soluzione è presente un applicativo client (che può essere lanciato anche su un altro PC connesso in rete), con l'esempio di operazioni di lettura e scrittura di byte attraverso collegamento TCP/IP con il server: la filosofia è che gli applicativi che debbono comunicare con il PLC non si preoccupano del collegamento fisico al PLC (MPI, Seriale, Ethernet) e magari nemmeno del tipo di PLC (per questo motivo al momento ho limitato le operazioni a BYTE).

Nella DLL PlcForum ho inserito alcune funzioni che normalmente utilizzo e altre che mi sono state ispirate da alcuni di voi (che ringrazio!)

Se trovate errori o possibili miglioramenti (questo caso sono infiniti !!!!) comunicatemelo pure che il progetto va avanti.

Ciao a tutti

BR1

Link al commento
Condividi su altri siti

  • 3 weeks later...

Mi rifaccio vivo sulla questione libnodave.net-labview. Ho provato la demo della versione 8.5 e vedo correttamente tutti i costruttori. Evidentemente nella versione 7.1 il supporto per il .net framework e' ancora piuttosto rozzo.

Link al commento
Condividi su altri siti

  • 4 weeks later...

ho visto in sourceforge che libnodave è stato aggiornato alla versione 8.4.4. La versione che Bruno ha incluso nella

sessione download è aggiornata con i bug fix apportati alla versione 8.4.4 ?

Link al commento
Condividi su altri siti

appunti sullo starter kit pubblica:

1) non è chiaro il modo d'utilizzo: "server name" nel cliente cosa significa ? indirizzo ip o nome del programma sever ? e "use areas" ?

2) funziona "database on sql server ?"

3) il client si collega sempre sulla porta 3005 del server ? e se cambio la porta nel server ?

4) l'invio di dati udp al logger e il salvataggio su file dovrebbero essere deselezionabili in quanto nel regolare funzionamento

rallentano in modo significativo l'applicazione.

5) come faccio sapere ,guardando il client, il range di indirizzi inseriti nel database che posso utilizzare. Se gli indirizzi richiesti dal

client sono errati, cosa succede ? ho una notifica ?

6) cosa significa nel database "Allarmi","Stato macchina", "Statistiche" ? e l'utilizzo delle colonne ?

7) la tabella "Alarmshist" cosa significa ? come si utilizza ?

8) nella cartella " libnodave_C#" il file di progetto dovrebbe essere esterno alla cartella "test_form". Se eseguo il progetto con

c# develop parte solo il client, mentre il server devo farlo partire come eseguibile.

Il significato dei punti in elenco è il seguente:

Lo starter kit è una pregevole realizzazione, ma se consideriamo che lo scopo della sua stesura è didattica, allora diventa ancora più

importante la documentazione chiara. I programmi dovrebbero avere solo le funzionalità implementate in modo che

l'utilizzatore non venga confuso da opzioni non funzionanti.

spero che questo mio post sia motivo di miglioramento del prodotto; i passi fin qui fatti meritano sicuramente un seguito...

Link al commento
Condividi su altri siti

Rispondo in fila:

1) Indirizzo IP (o nome del PC) della macchina sulla quale gira il server (il client si collega al server di comunicazione)

2) Per poter differenziare alcune operazioni nel caso che i dati risiedano su un server (stile SQL server o MySQL) o su MS ACCESS (o similari)

3) Bravo !!! Bisogna che modifichi la classe e rendere pubblica la proprietà (inserire metodo) --> grazie

4) Io normalmente cambio il livello delle segnalazione (nessuna è mai superiore a 10) :)

5) In caso di indirizzi fuori range hai una segnalazione, è in preparazione una serie di messaggi di diagnostica (sapere le aree, diagnostica dei collegamenti, diagnostica del PLC)... per quanto riguarda la diagnostica del PLC (nel caso di S7300) l'ho provata in VB6 (avrei bisogno di pause pranzo più lunghe)

6,7) Nell'esempio ho definito un'area (20 byte = 160 bit) che ipotizzo siano 160 allarmi che possono essere settati e resettati all'interno del PLC, il server memorizza le variazioni (deve vedere una salita e una discesa) come un gestore semplice di storico allarme. Nella tabella viene salvato il numero dell'allarme (1..160) e le date di inizio e fine dell'allarme

8) In IDE di sviluppo come #Develop e/o Visual Studio all'interno di soluzione si può impostare il progetto di partenza.... non lo sapevi ?

Sono felice di sentire qualcuno che si proponga di scrivere un bel DOC sul progetto. grazie

Ciao

BR1

Link al commento
Condividi su altri siti

Per quanto riguarda l'aggiornamento su sourceforge (come ti avevo anticipato con MP) è antecedente all'esempio, io l'ho scaricata e sto verificando ancora la compatibilità con gli esempi che ho pubblicato, appena sono tranquillo aggiorno i vari esempi.

Per quanto riguarda l'affidabilità della nuova versione sono abbastanza tranquillo, seguo questo progetto dal 2004 e Thomas non ha mai pubblicato versioni alla Bill Gates.... i problemi che ho trovato erano solo a valle della libreria utilizzandola in windows (l'autore sviluppa in linux) e magari utilizzandola abbinate con le librerie Siemens (attenti alle licenze !!!).

Ancora saluti

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