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