Classe Gestione MODBUS su TCP/IP

domenica 29 gennaio 2006 - 16.09

mc Profilo | Newbie

Ciao,
Sto implementando una classe che permette di comunicare via Ethernet TCP-IP attraverso il protocollo MODBUS. Questo permette di interagire con qualsiasi apparato (tipo PLC per intenderci) che supporta le funzioni di Modbus Slave. Può essere una cosa interessante?

Brainkiller Profilo | Guru

>Ciao,
>Sto implementando una classe che permette di comunicare via Ethernet
>TCP-IP attraverso il protocollo MODBUS. Questo permette di interagire
>con qualsiasi apparato (tipo PLC per intenderci) che supporta

Direi di sì, per chi usa PLC.
Io so cos'è un PLC ma mai programmato per PLC, in cosa consiste esattamente il protocollo MODBUS, hai qualche info in più o dove reperire informazioni ? Tanto per curiosità, sempre meglio sapere una cosa in più che una in meno.
Ciao ;)


David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

mc Profilo | Newbie

Informazioni sul protocollo Modbus le trovi al sito www.modbus.org
In pratica non è altro che una comunicazione che si basa sul principio di Server e Client (o master e slave)
Due sono le sue applicazioni: via seriale (RS-485) o via Ethernet (TCP-IP)
Il client (in questo caso un PC) richiede delle informazioni al server (uno o più PLC, strumentazione ecc.) tramite degli opportuni codici funzione. Le informazioni scambiate riguardano le aree di memoria del PLC o ad esempio lo stato delle memorie (merker) interne, oppure degli ingressi ecc.
La classe che ho realizzato permette di far questo su reti ethernet in TCP-IP in accordo con gli standard ovviamente descritti nella sezione del sito (http://www.modbus.org/specs.php).

L'unica cosa che mi manca è una gestione del timeout di comunicazione., mi chiedevo se qualcuno mi poteva dare una mano perchè cerco una cosa semplice ma allo stesso tempo performante, che non appesantisca troppo l'applicazione.

Grazie. Ciao!



Marco.

Brainkiller Profilo | Guru

>L'unica cosa che mi manca è una gestione del timeout di comunicazione.,
>mi chiedevo se qualcuno mi poteva dare una mano perchè cerco
>una cosa semplice ma allo stesso tempo performante, che non
> appesantisca troppo l'applicazione.

Ma per la comunicazione fai uso di Socket classici ? Sincroni/asincroni ?
Ciao


David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

gripen2k6 Profilo | Newbie

ciao
io sto cercando una classe o un activex che mi permetta di comunicare tramite protocollo modbus con una periferica utilizzando il cavo seriale (quindi modbus/RTU). premetto che nn sono molto pratico di ambiente .net. volevo chiedervi se è possibile convertire la classe da comunicazione tcp/ip a porta seriale. esistono soluzioni in rete ma sono tutte o commerciali o per java (vedi jamod)
a presto
gripen2k6

mc Profilo | Newbie

Se ti può interessare io ho già scritto una classe per la comunicazione seriale in Modbus RTU. Per ora implementata solo gli Holding Register (che alla fine è l'unica funzione che serve!).

Marco.

mc Profilo | Newbie

Ho risolto il problema.
Per il timeout io non lo gestirei in modbus TCP-IP, primo perchè la comunicazione è controllata a basso livello dal .NET perciò se cade lo so dal sistema. Per i messaggi da inviare al server, se hanno la sitassi corretta il server mi risponde sempre, al massimo con un messaggio di errore perchè non conosce quella funzione o la memoria che punto è sbagliata. il Timeout ha senso sulla comunicazione seriale e dove il modbus è più complesso perchè c'è il calcolo del CRC.


Marco.

gripen2k6 Profilo | Newbie

grande...
sono riuscito anch'io a far comunicare il software con la seriale
però ho problemi sulla temporizzazione... i fatidici 3.5 bit prima e dopo l'istruzione da inviare....

riguardo gli holding register.. si effettivamente è l'unica istruzione interessante...

ti ringrazio infinitamente per la disponibilità... se vuoi ti mando il mio codice... sarà molto grossolano non essendo esperto di programmazione vb.net

a presto
fabio

Alexo Profilo | Newbie

Dovre realizzare un Modbus TCP slave per eseguire un test di un master, è presente in rete un sorgente da cui partire .... linguaggi preferiti : c#

grazie

Lev1975 Profilo | Newbie

Ciao,
ho iniziato a lavorare sulla gestioen in vb.net 2005 della comunicazione MODBUS RTU per poter gestire i PLC dotati di pota seriale.

Qualche tempo fa avevo implementato la comunicazione utilizzando il WINSOCK sfruttando il protocollo MODBUS TCP, e tutto è andato bene.

Il problema che ho nella versione per porta seriale è il seguente:

- utilizzando l'oggetto serialport, riesco a mandare solamente delle stringhe verso la porta seriale del PC
- i pacchetti conformi allo standard MODBUS li creo riempiendo un vettore di byte.

Il problema è che non riesco a convertire il vettore di byte in una stringa.

Hai qualche suggerimento a proposito?

Ciao

alextyx Profilo | Expert

Questo codice, spedisce un array di byte con la seriale. Io lo uso per comunicare con una scheda custom con a bordo un PIC:

Try serialPort.Write(Me.ArrDomanda, 0, Me.ArrDomanda.Length) Catch ex As Exception MsgBox(ex.ToString) End Try

L'array in questione è 'ArrDomanda'

salvcilib82 Profilo | Newbie

Ciao,
girando per i forum ho letto alcune tue conversazioni relative allo scorso anno, riguardanti le classi che hai implementato per la comunicazione con i PLC sfruttando MODBUS TCP/IP. Mi sono interessato perchè programmo PLC e perchè sto implementando anch'io un protocollo di comunicazione MODBUS TCP. Ho già ottenuto buoni risultati con Visual Basic 6 (utilizzando il socket di windows "winsock"), adesso volevo passare a vb.net e le cose si sono complicate. Con Vb.net riesco solo a scrivere su aree di memoria ma non a leggere. Mi sapresti gentilmente dare una mano visto che hai già percorso la stessa strada? Ti sarei infinitamente grato.
Saluti,
Salvatore Ciliberti

fabolo Profilo | Newbie

Ciao a tutti, forse dovrò implementare una comunicazione modbus con uno SCADA client o con un PLC e vorrei farlo in c#, su cui ho esperienza solo di database e threading. Se mi date una base su cui partire posso condividere con voi il mio sviluppo e insieme magari fare qualcosa di riutilizzabile...
Saluti, Fabrizio www.delin-elettronica.it

libera_arte Profilo | Newbie

devo sviluppare una classe che colloquia con un PLC tramite ModBus TCP/IP.
Ti chiedo se è possibile accedere alla classe che hai sviluppato tu?
grazie

molonz Profilo | Newbie

Ciao io sto tentando di sviluppare un software per gestire un impianto di allarme..xò nn riesco a comunicare col plc della centrale dell'allarme..se puoi mi fai avere della documentazione da studiare per implementare una classe che mi renda possibile visualizzare le uscite del plc x favore? mi basta anche la documentazione generale per un plc a caso tanto per vedere come funziona la cosa e provare a sviluppare l'applicazione..Se non vuoi fa lo stesso capisco ke ti sei rotto per farlo e puoi anche nn volere che altri abbiano vita facile..Accetto qualsiasi risposta...grazie mille intanto

landre Profilo | Newbie

ciao a tutti mi chiedevo se qualcuno non era disposto a condividere qualcosa...

grazie in anticipo...

fabolo Profilo | Newbie

Ciao a tutti, io ho trovato un esempio funzionante in c# per comunicare in modbus tcp, l'ho provato con GE Proficy Cimplicity, appena rientro in ufficio vi posto i dettagli...

landre Profilo | Newbie

Bene grazie attendo tue notizie :)

fabolo Profilo | Newbie

ho verificato l'applicazione che avevo scaricato ed è:

http://www.nmodbus.com/

io ho scaricato la 1.4 e compilato con visual studio 2005
ma ho visto che sono andati avanti...

ho usato il progetto MySample incluso nella soluzione e adattato

ModbusTcpMasterReadInputsFromModbusSlave

ho fatto una prova veramente minima, giusto per capire se era fattibile.
allego il metodo che ho modificato:
il pC era il 155 mentre il progetto cimplicity era sul 205
se farò dello sviluppo vi farò sapere...
ciao,
Fabrizio

public static void ModbusTcpMasterReadInputsFromModbusSlave()
{
byte slaveID = 1;
int port = 502;


IPAddress sladdress = new IPAddress(new byte[] { 192, 168, 111, 155 });
// create and start the TCP slave
TcpListener slaveTcpListener = new TcpListener(sladdress, port);
slaveTcpListener.Start();
ModbusSlave slave = ModbusTcpSlave.CreateTcp(slaveID, slaveTcpListener);
Thread slaveThread = new Thread(slave.Listen);
slaveThread.Start();

// create the master
IPAddress address = new IPAddress(new byte[] { 192, 168, 111, 205 });
TcpClient masterTcpClient = new TcpClient(address.ToString(), port);
ModbusIpMaster master = ModbusIpMaster.CreateTcp(masterTcpClient);

ushort numInputs = 5;
ushort numRegisters = 1;// 5;
ushort startAddress = 0;// 100;

// read five register values
//ushort[] inputs = master.ReadInputRegisters(startAddress, numInputs);

byte mslaveID = 3;
// read five register values
ushort[] registers = master.ReadHoldingRegisters(mslaveID, startAddress, numRegisters);


//for (int i = 0; i < numInputs; i++)
// Console.WriteLine("Register {0}={1}", startAddress + i, inputs[i]);

// clean up
masterTcpClient.Close();
//slaveTcpListener.Stop();

// output
// Register 100=0
// Register 101=0
// Register 102=0
// Register 103=0
// Register 104=0
}

gabmar82 Profilo | Newbie

Ciao,
dovrei acquisire dei dati da un encoder assoluto che utilizza protocollo Ethernet/IP. L'encoder assoluto è collegato a una macchina da cui dovrei acquisire dei dati da trattare in un'applicazione visual basic per un progetto di ricerca.
Il tuo lavoro potrebbe essermi utile?

Grazie per la disponibilità

Gabriele Martino

fabolo Profilo | Newbie

ciao, se la macchina utilizza il protocollo modbus tcp direi di si, anche se poi io non ho approfondito più di tanto il mio prototipo.
Immagino poi che parli di Visual Basic.NET, con VB6 non saprei come fare...
Ciao e auguri!

d@dora Profilo | Senior Member

ciao, so che sono passati tanti anni da questo thread, pero' mi sono ritrovato a sviluppare un progetto che deve utilizzare il protocollo modbus. Cercando in rete ho trovato questa vostra discussione dove parlavate di un esempio in vb, ma il sito al quale facevate riferimento non esiste piu', non e' che potresti inviarmi qualche info in piu' o, se ce l'hai ancora, gli esempi di cui facevi cenno ??

ciao e grazie
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5