Oppure

Loading
07/12/21 20:45
bernie
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
aaa
09/12/21 15:23
Carlo
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.
in programmazione tutto è permesso
13/12/21 9:33
bernie
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
aaa
13/12/21 11:46
Carlo
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:
pierotofy.it/pages/sorgenti/dettagli/19643-Fibonacci_a_colori_VBNET/
pierotofy.it/pages/sorgenti/dettagli/19642-Fibonacci_a_colori/
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 13/12/21 12:02
in programmazione tutto è permesso
22/12/21 13:19
bernie
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.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using EasyModbus;

namespace EroElectronic
{
    public partial class Form1 : Form
    {
        double temperatura;                                  // dichiaro la variabile per leggere la temperatura dallo strumento 
        double setpoint;                                     // dichiaro la variabile per il valore di setpoint 
        ModbusClient EroElectronic;                                             
        public Form1()
        {
            InitializeComponent();

            //***parametri comunicazione ***
            EroElectronic = new ModbusClient("COM9")         // parametri comunicazione nodo2,velocità19200,8bit,no parità
            {                                                                                      
                UnitIdentifier = 6,                          // nodo dello slave
                Baudrate = 19200,                            // velocità di comunicazione
                Parity = System.IO.Ports.Parity.None,        // parità
                StopBits = System.IO.Ports.StopBits.One      // bit stop
            };
            EroElectronic.Connect();
            temperatura= ModbusClient.ConvertRegistersToInt(EroElectronic.ReadHoldingRegisters(0, 1));                         // leggo il valore della temperatura dal modbus
            label1.Text = ("Temperatura Reale " + Convert.ToString(temperatura) + " C°");                                      // indirizzo 0 Input variable without filter
            textBox1.Text = Convert.ToString(ModbusClient.ConvertRegistersToInt(EroElectronic.ReadHoldingRegisters(1, 1)));    // indirizzo 1 Main set point value SP
            setpoint = int.Parse(textBox1.Text);
            EroElectronic.Disconnect();
            if (setpoint > temperatura)
            {
                textBox2.BackColor = Color.Red;
            }
            else if (setpoint<temperatura)
            {
                textBox2.BackColor = Color.Green;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            EroElectronic.Connect();
            EroElectronic.WriteSingleRegister(1, int.Parse(textBox1.Text));    // scrivo nella posizione  il valore di textbox2
            EroElectronic.Disconnect();                                        // chiudo la comunicazione 
        }
    }
}


Qualche consiglio?
Grazie
aaa
23/12/21 6:39
Thejuster
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.
mire.forumfree.it/ - Mire Engine
C# UI Designer
23/12/21 8:12
bernie
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.
aaa
28/12/21 15:09
bernie
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

aaa