VO e ModBus RTU [Risolto]

Forum dedicato ai programmatori di X# in lingua italiana – Italian language forum

Moderator: wriedmann

Post Reply
User avatar
claudiocarletta
Posts: 101
Joined: Sat Sep 05, 2020 8:56 am

VO e ModBus RTU [Risolto]

Post by claudiocarletta »

Salve a tutti e buon anno,
vorrei utilizzare il protocollo ModBus RTU, tramite un adattatore USB to RS485 https://www.waveshare.com/usb-to-rs485.htm, per far colloquiare il PC con sensori e attuatori tramite questo protocollo.
Ho già sviluppato e risolto, a scuola (sono un insegnante), in ambiente Arduino questo problema e mi sarebbe piaciuto poterlo mostrare ai ragazzi in altra veste, con una applicazione Win32.
Ho trovato una libreria già bella e pronta qui: https://github.com/stephane/libmodbus/w ... 08-Express ma non so dove metterla nel progetto Visual Studio per utilizzarla ammesso che la possa utilizzare con VO.
Ho provato pure ad inserire tutto il codice https://github.com/stephane/libmodbus/tree/master/src in un nuovo progetto VO Windows Application senza nessun risultato, credo che sia scritto per una console C++.
Ho provato anche ad importare qualche libreria da NuGet ma durante l'import mi dà il seguente errore:
Non è stato possibile installare il pacchetto 'MDBLib 1.0.5'. Si sta tentando di eseguire l'installazione in un progetto destinato a '.NETFramework,Version=v4.6', ma il pacchetto non contiene riferimenti ad assembly o file di dati compatibili con il framework.
e non so che significa.
Se ci fosse qualcuno che potesse darmi una dritta ...

Grazie a tutti
e Buon Anno
Last edited by claudiocarletta on Sat Jan 06, 2024 8:19 pm, edited 1 time in total.
User avatar
wriedmann
Posts: 3759
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Re: VO e ModBus RTU

Post by wriedmann »

Ciao Claudio,
purtroppo sono in ferie con una connessione internet molto scadente, perciò non ti posso essere d'aiuto.
Questa DLL è una DLL Win32, perciò necessita dei prototipi per VO. Scriverli da un file .h è un lavoro manuale e dipende dal numero delle chiamate necessarie, può impegnare circa 5-10 minuti per chiamata.
Come scritto, sono in ferie e non mi posso guardare l'interfaccia necessaria.
Saluti
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
claudiocarletta
Posts: 101
Joined: Sat Sep 05, 2020 8:56 am

Re: VO e ModBus RTU

Post by claudiocarletta »

Ciao Wolfgang,
grazie per la disponibilità, io continuo a smanettarci sopra, se dovessi risolvere prima del tuo ritorno da solo o con l'aiuto di qualcun altro, troverai un [risolto] nel titolo del post, altrimenti ho paura che ti ruberò del tempo. ;)

P.S. ma quindi è inutile che provo a trovare una libreria da NuGet che non mi dia problemi nell'istallazione, oppure se dovesse installarsi correttamente potrebbe funzionare?
Ciao
Claudio
User avatar
wriedmann
Posts: 3759
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Re: VO e ModBus RTU

Post by wriedmann »

Ciao Claudio,
una libreria da NuGet non funziona con VO, ma solo con X#. E se usi XIDE serve un po di lavoro manuale.
Saluti
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
claudiocarletta
Posts: 101
Joined: Sat Sep 05, 2020 8:56 am

Re: VO e ModBus RTU

Post by claudiocarletta »

Ciao Wolfgang,
per fortuna ho letto in ritardo la tua risposta in cui mi dicevi che:
una libreria da NuGet non funziona con VO, ma solo con X#
continuando a smanettare ho inserito la prima libreria per ModBus che non mi dava errori
e ieri sera ho letto perfettamente volt, amper e watt da un analizzatore di rete, lo stesso che ero riuscito ad interfacciare con Arduino.
Non so quindi se sia stato solo un colpo di lato B ma credo di aver trovato una soluzione al mio problema. Posto quindi quanto realizzato se ci fosse ancora qualcuno che sviluppa in VO e volesse interfacciarsi con sensori e attuatori in ModBus.

EasyModbus è la libreria che ho inserito nel progetto:
Image

e questo è uno scorcio del codice utilizzato per leggere un registro dell'analizzatore di rete

Code: Select all

    LOCAL Com           AS STRING
    LOCAL Vel:= 9600    AS INT
    LOCAL i,status      AS INT
    LOCAL Valore        AS REAL4
    LOCAL aRegistro     AS INT[]

    sSym := oControl:NameSym
	DO CASE
        CASE sSym == #CbCom
            BEGIN SEQUENCE
                Com := SELF:oDCCbCom:CurrentItem
                status := 0
                SELF:ChiudiCom()
                SELF:ChiudiModBus()
                status := 1
                SELF:oSerial := SerialPort{Com, Vel, Parity.None, 8, StopBits.One}
                SELF:oSerial:Open()
                IF !SELF:oSerial:IsOpen
                    SELF:aComTro := {}
                    SELF:oDCCbCom:Clear()
                    InfoBox{SELF, "Attenzione", "Problemi con la COM selezionata"}:Show()
                    SELF:oCCCercaCom:SetFocus()
                ELSE
                    status := 2
                    SELF:Pointer := Pointer{POINTERHOURGLASS}
                    SELF:oSerial:DiscardInBuffer()
                    SELF:oSerial:DiscardOutBuffer()
                    SELF:oSerial:WriteLine("Prova")                  // Trasmissione dati Iniziale
                    SELF:AspettaTraCom(2, SELF:oSerial)         // Attesa completamento trasmissione
                    SELF:AspettaRicCom(2, SELF:oSerial)         // Attesa dati in ricezione
                    SELF:oSerial:ReadExisting()                 	    // Eliminazione dati ricevuti
                    SELF:oDCDaTrasm:SetFocus()
                    SELF:oSerial:Close()
                    
                    status := 3
                    SELF:MyMoBu:SerialPort  := Com 
                    SELF:MyMoBu:Baudrate    := Vel
                    SELF:MyMoBu:Parity      := Parity.None
                    SELF:MyMoBu:StopBits    := StopBits.One
                    SELF:MyMoBu:UnitIdentifier := 10                // Unità slave da interrogare
                    SELF:MyMoBu:Connect()
                    SELF:MyMoBu:ConnectedChanged += CambioConnessioneModBus()
                    IF SELF:MyMoBu:Connected
                        aRegistro := SELF:MyMoBu:ReadHoldingRegisters(0X0144, 2)		// Registro sull'analizzatore da leggere 2 numero di byte
                        Valore := EasyModbus.ModbusClient.ConvertRegistersToInt(aRegistro, EasyModbus.ModbusClient.RegisterOrder.HighLow) / 1000.0
                    ELSE
                        ErrorBox{SELF, "FALLITA", "comunicazione ModBus"}:Show()
                    ENDIF
                    SELF:Pointer := Pointer{POINTERARROW}
                ENDIF
            RECOVER
	            DO CASE
                    CASE status == 0
                        InfoBox{SELF, "Attenzione", "Impossibile chiudere le precedenti comunicazioni COM e/o ModBus"}:Show()
                    CASE status == 1
                        InfoBox{SELF, "Attenzione", "Impossibile aprire la porta " + Com + " selezionata"}:Show()
                    CASE status == 2
                        InfoBox{SELF, "Attenzione", "Impossibile verificare la porta " + Com + " selezionata"}:Show()
                    CASE status == 3
                        InfoBox{SELF, "Attenzione", "Impossibile utilizzare ModBus sulla porta " + Com + " selezionata"}:Show()
                ENDCASE
                SELF:ChiudiCom()
                SELF:ChiudiModBus()
            END SEQUENCE

    ENDCASE
Non so se avrò ancora problemi nel prosieguo del progetto ma per adesso va bene così

Ciao
Claudio

p.s. Buone vacanze, penso che leggerai il post dopo la Befana
Attachments
Nuget.gif
User avatar
wriedmann
Posts: 3759
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Re: VO e ModBus RTU

Post by wriedmann »

Ciao Claudio,
tanto per correttezza: quello che tu stai usando, non è VO, ma X# con le classi GUI di VO, e perciò un applicatico .NET in tutti i sensi.
Devi ricordare che .NET non ti limita nella scelta delle GUI, ma al contrario ti da un mare di possibilità. Le classi GUI principali sono si Windows Forms e WPF, ma ce ne sono anche altri di Microsoft o altri produttori, come nel nostro caso le classi GUI VO compatibili e le XGUI sempre compatibili con le classi GUI VO, ma basati su Windows Forms.
Mi sembra molto importante che queste scelte siano molto chiare perchè solo in questo caso riesci a muoverti in .NET senza problemi, e anche qui nel forum le risposte possono essere corrette.
Saluti
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
User avatar
claudiocarletta
Posts: 101
Joined: Sat Sep 05, 2020 8:56 am

Re: VO e ModBus RTU

Post by claudiocarletta »

Ciao Wolfgang,
Grazie della spiegazione. Avevo sempre avuto il dubbio circa il linguaggio in cui in questi anni stavo programmando: ma è VO o X#?
E non capivo come alla fine potessi utilizzare: la libreria per le comunicazioni poi la libreria per il parlato e adesso quella per le comunicazioni ModBus.
Quindi quello che uso io è X# nel dialetto VO ma pur sempre un applicativo .NET
Diciamo che la cosa mi entusiasma non poco visto quello che quindi potrei fare :roll:
Grazie sempre
Saluti
Claudio
User avatar
wriedmann
Posts: 3759
Joined: Mon Nov 02, 2015 5:07 pm
Location: Italy

Re: VO e ModBus RTU [Risolto]

Post by wriedmann »

Ciao Claudio,
in effetti è una grandissima cosa che riusciamo a lavorare "come sempre", ma in un ambiente completamente differente e molto più potente.
Saluti
Wolfgang
Wolfgang Riedmann
Meran, South Tyrol, Italy
wolfgang@riedmann.it
https://www.riedmann.it - https://docs.xsharp.it
Post Reply