Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - Modbus
Forum - C# / VB.NET - Modbus

Pagine: [ 1 2 3 4 ] Precedente | Prossimo
Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 21:45
Martedì, 07/12/2021
Salve a tutti, avrei bisogno di fare comunicare un PLC con il PC. Pensavo di fare una app in VB. La comunicazione deve essere Modbus, 4word in lettura dal PLC e 4 word in scrittura. La app riesco a scriverla, ma non so come implementare la comunicazione Modbus.
Qualche consiglio?
Grazie

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 16:23
Giovedì, 09/12/2021
10 anni fa, ho scritto dei software che usavano il protocollo MODBUS, però erano in VB6.
Ho trovato l'esempio da cui ero partito, il modulo MODBUS ti potrebbe dare una base di partenza.
Vedi allegato.


Carlo ha allegato un file: ModbusRTU.zip (66580 bytes)
Clicca qui per scaricare il file


in programmazione tutto è permesso
PM Quote
Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 10:33
Lunedì, 13/12/2021
Grazie Carlo
Ho guardato un po , e sinceramente non ci ho capito molto .
Stavo pensando , in rete si trova molta documentazione ma prevalentemente in C#.
Visto che l'applicazione è quasi banale , ricevo 4 valori , li elaboro , li rispedisco , stavo pensando di usare C#, non lo conosco , ma non dovrebbe essere un grosso problema fare quello che mi serve .
Opinioni ?

Grazie

PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 12:46
Lunedì, 13/12/2021
Se conosci VB.Net, il passaggio a C# è indolore.
Devi solo vedere come si scrivono i for, gli if e gli operatori logici, fatte due prove resta tutto chiaro. Anche le parentesi graffe non sono un problema, da visual studio 2017 in poi le graffe sono indendate e collegate da un tratteggio che evita di dover andare a contare quante ne sono, non da ultimo se vai con il cursore sopra ad una graffa appare un tooltip che ne indica la corrispondenza. Con la tastiera Italiana la graffa chiusa } si scrive con i tasti Shift + Alt Gr + ] e la graffa aperta { con Shift + Alt Gr + [

Diverso il discorso della conversione dei tipi, se in VB .Net programmavi senza Option Strict On, tutte le conversioni dei tipi venivano fatte dal compilatore (conversione implicita). In C# tutte le conversioni dei tipi devono essere gestite dal programmatore (conversione esplicita).

Potresti convertire i programmi in C# in VB .Net, ma te lo sconsiglio, visto che VB .Net non è più supportato nei nuovi Framework, il lavoro che spenderesti per convertire e poi far funzionare il tutto in VB .Net non avrebbe nessuna utilità futura. Mentre se impari a comprendere la sintassi C#, ti sarà utile anche in futuro.

Imparare la sintassi di C#, non ti farà diventare un programmatore C/C++, ma ti farà leggere e capire semplici programmi scolastici scritti anche in questi linguaggi.

Se guardi tra i progetti, ho pubblicato molti programmi ripetuti in ambedue i linguaggi VB .Net e C#, vedrai che le analogie saltano subito all'occhio.
l'ultimo:
http://www.pierotofy.it/pages/sorgenti/dettagli/19643-Fibo ...
http://www.pierotofy.it/pages/sorgenti/dettagli/19642-Fibo ...
I programmi sono identici me scritti nei due linguaggi.

Attenzione, sono della vecchia scuola e i miei programmi hanno un'approcio procedurale, da non prendere ad esempio, se non nello specifico delle routine contenute o per la sintassi.


Ultima modifica effettuata da Carlo il 13/12/2021 alle 13:02


in programmazione tutto è permesso
PM Quote
Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 14:19
Mercoledì, 22/12/2021
Continuo qui , anche se sto cercando di cambiare da VB a C#.
Ho guardato un poco in rete , ho installato easymodbus  e ho provato a fare quello che dovrei fare . Ovviamente non funziona .
Il programma è semplice, in un form  c'è una label , una textbox e un button.
Il testo della label lo leggo dal modbus , mentre il valore che imposto nel textbox lo dovrei mandare al plc quando premo il tasto .
Quando lancio il dubug non mi trova il dispositivo slave .
La configurazione del dispositivo slave è l'unica cosa di cui sono sicuro.
Codice sorgente - presumibilmente C#

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. using EasyModbus;
  11.  
  12. namespace EroElectronic
  13. {
  14.     public partial class Form1 : Form
  15.     {
  16.         double temperatura;                                  // dichiaro la variabile per leggere la temperatura dallo strumento
  17.         double setpoint;                                     // dichiaro la variabile per il valore di setpoint
  18.         ModbusClient EroElectronic;                                            
  19.         public Form1()
  20.         {
  21.             InitializeComponent();
  22.  
  23.             //***parametri comunicazione ***
  24.             EroElectronic = new ModbusClient("COM9")         // parametri comunicazione nodo2,velocità19200,8bit,no parità
  25.             {                                                                                      
  26.                 UnitIdentifier = 6,                          // nodo dello slave
  27.                 Baudrate = 19200,                            // velocità di comunicazione
  28.                 Parity = System.IO.Ports.Parity.None,        // parità
  29.                 StopBits = System.IO.Ports.StopBits.One      // bit stop
  30.             };
  31.             EroElectronic.Connect();
  32.             temperatura= ModbusClient.ConvertRegistersToInt(EroElectronic.ReadHoldingRegisters(0, 1));                         // leggo il valore della temperatura dal modbus
  33.             label1.Text = ("Temperatura Reale " + Convert.ToString(temperatura) + " C°");                                      // indirizzo 0 Input variable without filter
  34.             textBox1.Text = Convert.ToString(ModbusClient.ConvertRegistersToInt(EroElectronic.ReadHoldingRegisters(1, 1)));    // indirizzo 1 Main set point value SP
  35.             setpoint = int.Parse(textBox1.Text);
  36.             EroElectronic.Disconnect();
  37.             if (setpoint > temperatura)
  38.             {
  39.                 textBox2.BackColor = Color.Red;
  40.             }
  41.             else if (setpoint<temperatura)
  42.             {
  43.                 textBox2.BackColor = Color.Green;
  44.             }
  45.         }
  46.  
  47.         private void Form1_Load(object sender, EventArgs e)
  48.         {
  49.            
  50.         }
  51.  
  52.         private void button1_Click(object sender, EventArgs e)
  53.         {
  54.             EroElectronic.Connect();
  55.             EroElectronic.WriteSingleRegister(1, int.Parse(textBox1.Text));    // scrivo nella posizione  il valore di textbox2
  56.             EroElectronic.Disconnect();                                        // chiudo la comunicazione
  57.         }
  58.     }
  59. }



Qualche consiglio?
Grazie

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 7:39
Giovedì, 23/12/2021
L'unica cosa che mi viene in mente è:
Hai provato a cambiare il baudrate?

I PLC lavorano in questi range 1200, 9600, 19200, 38400
per le altre configurazioni (stop bit) che può variare da 1 a 2

So per certo che se il baudrate è sbagliato, non riuscirai a comunicare con il plc.


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 9:12
Giovedì, 23/12/2021
Grazie Thejuster
Il baudrate l'ho settato nello strumento a 19200.
Quello che non so è il bit di stop, nelle configurazioni dello strumento non è indicato.

PM Quote
Avatar
bernie (Normal User)
Pro


Messaggi: 164
Iscritto: 23/10/2019

Segnala al moderatore
Postato alle 16:09
Martedì, 28/12/2021
Ho provato a cambiare il baudrate , e anche lo StopBits, il risultato non cambia.
Alla riga 32 "  temperatura = ModbusClient.ConvertRegistersToInt(EroElectronic.ReadHoldingRegisters(0, 1)); "
mi da sempre l'errore "System.TimeoutException:'No Response from Modbus Slave'"
Qualche consiglio?
Grazie


PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 14:12
Mercoledì, 29/12/2021
Il PLC ha l'RS232 vera, oppure ha l'USB?

Ultima modifica effettuata da Carlo il 29/12/2021 alle 14:13


in programmazione tutto è permesso
PM Quote
Pagine: [ 1 2 3 4 ] Precedente | Prossimo