Vai al contenuto
PLC Forum


Evento Xcomm1 per Visual Basic


Amicoadi

Messaggi consigliati

Buonasera,

vorrei chiedere a voi che praticate maggiormante questo argomento se esiste un evento per visual basic che si attivi al cambiare di una word o un bit dell'homeplc.

Mi spiego meglio, per leggere una word su visual basic dall'homeplc bisogna usare l'istruzione  XComm1.DTHP ( 1000, 1, 1 ), oppure del bit XComm1.HP_ReadIO(450, 1, 1).BIT2. Questa istruzione deve essre inserita in un comando button.click, oppure in un timer.event. Quello che vorrei sapere se esiste un evento di Xcomm1 che si attivi al cambiare di un bit o del valore di una word, come invece avviene già per esempio alla lettura di un lettore Transponder che scatena il seguente evento:evento

 

Private Sub XComm1_ReadCardA(ByVal Codeimp As Long, NumCard As Long, CardError As Long, Level As Integer, DataScad As String, HourScad As String, Timeframes As Integer, _

OptValue1 As Long, Optvalue2 As Long, V_Address As Long, Ind As Long, Srv As Integer)

 

if ....... then

xxx

end if

 

End Sub

 

Da altre discussioni ho visto che un evento simile esiste per il termo, ma non vedo quacosa di simile solo per un determinato bit/word.

 

Grazie

 

Link al commento
Condividi su altri siti


HomePLC_Manager

Si esiste..

Essendo HomePLC un PLC ad eventi basta che utilizzi:

 

Area Eventi 1 che trovi sul manuale di HomePLC da %MW3301 fino %MW3332 oppure

Area Eventi 2 che va da %MW3351 fino %MW3382

 

anche spostando un valore o un Bit (ingresso, uscita ecc..) tramite programma,

e la variazione arriva per evento tramite la libreria XComm utilizzando l'evento ZoneEvent,

 

i parametri dell'evento sono:

Zone - identifica l'area che viene trasmessa dall'evento

Value () - riporta i valori dei registri dell'area

V_Address - è l'indirizzo Virtuale dell'HomePLC

Ind - è l'indirizzo Fisico dell'HomePLC

Srv - è il Numero di Server su cui è connesso HomePLC

 

Esempio di lettura dei registri per evento:


 

Private Sub XComm1_ZoneEvent(ByVal Zone As Integer, value() As Long, V_Address As Integer, Ind As Integer, Srv As Integer)

Dim cnt, idx, b(64)
Select Case Zone
Case 1 ' Eventi Zona 1

            For cnt = 0 To 31
                Form2.lblArea1(cnt).Caption = value(cnt + 1)
            Next cnt


Case 2 ' Eventi Zona 2

            For cnt = 0 To 31
                Form2.lblArea2(cnt).Caption = value(cnt + 1)
            Next cnt


End Select


End Sub

 

 

Essendo XComm un sistema distribuito l'evento viene ricevuto da tutte le postazioni connesse al server, quindi il programma di gestione dell'evento può girare indistintamente sia sul Server, sia sulle postazioni Client (Workstation) ma anche su Internet dai vari Browser connessi al Web Server di sistema.

 

Nota: 

Per precisare rispetto al titolo del post, lo stesso Evento è valido per vari linguaggi quindi oltre al Visual Basic 6, si può ricevere da:

  1. VBA Visual Basic for Application (MS Word, Excel, ecc..) e relativi Software che lo integrano tra cui molti Scada Industriali
  2. Visual Basic .NET
  3. C#
  4. PHP
  5. ecc..

in pratica da qualsiasi programma che è in grado di creare un riferimento o incorporare la tecnologia COM di Microsoft

 

 

Modificato: da HomePLC_Manager
Link al commento
Condividi su altri siti

Grazie per la risposta.

Ho provato ma non funziona. Probabilmente sbaglio qualcosa o non ho capito come va usato. Quello che ho testato è:

lato HomePlc ho messo in parallelo una memoria 424.13 e un evento 3301.0 comandati da un ingresso fisico.

 

                      %MX3301.0

    %IX0.0             ()

-------| |--------------()--------GND

                      %MX424.13

 

Lato Visual Basic:

 

Private Sub XComm1_ZoneEvent(ByVal Zone As Integer, value() As Long, V_Address As Integer, Ind As Integer, Srv As Integer)

        Label12.Text = 1
End Sub

 

Da quello che ho capito attivando l'ingresso IX0.0 automaticamente cambia il valore dell'evento 3301. Questo dovrebbe attivare la Sub ZoneEvent ed eseguire il codice all'interno, ma questo non avviene.

 

Io uso per delle prove l'HomePlc EMPLL2T. Su ladderhome tutto va bene.

Qualche suggerimento?

 

 

Link al commento
Condividi su altri siti

del_user_45696

Si, il primo è di verificare che XComm sia realmente connesso al sistema, questo lo si fa semplicemente testando il risultato 

della funzione ConnectSRV se lato Server oppure ConnectWS se lato Workstation


 

If XComm1.ConnectSRV() Then
     ServerConnesso = True   
  Else
     ServerConnesso = False
End If

 

poi anche senza disturbare il Ladder, puoi fare una verifica veloce tramite la finestra di TEST I/O di Home&BUilding

modificando il valore del registro 3301 e controllare che questo venga inviato per evento come nella figura sottostante:

 

AreaEventi.jpg.3a494cb66cf3e6e25784999fead0bb01.jpg

 

 

 

 

 

 

 

Link al commento
Condividi su altri siti

Ciao la connessione è Ok, avevo già controllato questo. Inoltre, per testare, nel form ho inserito un TimerEvent con il seguente codice per far cambiare colore ad un button

 

     If (XComm1.HP_ReadIO(424, 1, 1).BIT13) Then
            Button1.BackColor = Color.Green
        Else
            Button1.BackColor = Color.Gray
        End If

e questo codice funziona correttamente. 

Ho testato quello che mi ha suggerito, inviando 54, leggo 54. Dato che il mio evento è appoggiato sul 3301.0, alzando l'ingresso %XI0.0 (quindi mettendo a 1 %MX3301.0), nella finestra sotto vedo che il valore cambiare a 55.

 

image.png.89be42ea2f4b8da3c21ff67fbf3c646c.png

 

Ho provato altri registri evento (3310) ma nulla cambia.

 

 

Link al commento
Condividi su altri siti

del_user_45696

Non ci sono altri parametri se non controllare che il framework e HomePLC

cosi come eventuali Master I/O siano effettivamente aggiornati.

 

L' evento viene trasmesso se si modifica anche un solo Bit delle aree ad eventi.


 

 

 

 

 

 

 

 

 

 

 

 

Link al commento
Condividi su altri siti

HomePLC_Manager
Quote

utilizzo windows 7 ultimate. L'applicativo di controllo utilizzo Visual studio express 2013.

 

stai utilizzando la libreria COM oppure quella .NET ?

 

Link al commento
Condividi su altri siti

libreria COM.

Ho provato a utilizzare sia la word intera dell'evento che il singolo bit, ma nulla. Le altre comunicazioni vanno, ma l'event change non ne vuol sapere di andare.

C'è modo di aggiornare la libreria COM=

Se voglio importare la .NET come dovrei fare?

Modificato: da Amicoadi
Link al commento
Condividi su altri siti

HomePLC_Manager

 

Specifica sempre il sistema operativo e l'ambiente di sviluppo, anche utilizzando la stessa versione di XComm,

ogni ambiente SO/IDE ha le sue caratteristiche,

 

simulando quello che fai tu, rilevo che su WIN7 l'avvio di VS.NET per l'uso di componenti COM (senza la configurazione specifica prevista)

deve avvenire come amministratore (Tasto destro < Avvia Come Amministratore >) indistintamente dal fatto che tu lo sia come utente.

 

Infatti avviando il programma senza specificarlo ho lo stesso comportamento che descrivi, mentre con l'avvio con diritti estesi funziona tutto regolarmente,

 

AreaEventiNET2.thumb.jpg.8480eb9b57a92275350c488972386125.jpg

 

 

 

 

Link al commento
Condividi su altri siti

Ciao, ho provato ad avviare visual studio come amministratore, e ho controllato tutti i consensi e sono ok.

image.png.a8d5fd4d738d3527355c8bb01f14a2b7.png

 

Per prova ho caricato il programma di prova C:\ActiveSystem\LH2_Samples\VB.NET Samples\Demo XComm ++ (COM), l'ho modificato per inserire un Form con un listbox e ho inserito nel form la Sub ZoneEvent. Provando a inviare 40 sul registro DTHP 3001 nulla accade. Al connessione al server, nella label Read DTHP ogni tanto inserire qualche valore a random (1, 2,3) ma non so da dove li tira fuori.

 

image.thumb.png.f8a5a00d6865141df2db4337bfab33e3.png

 

 

Sicuramente mi sto perdendo in un bicchier d'acqua, ma non capisco dove sto sbagliando.

L'editor che utilizzo è Visual Studio Express 2013 per Windows Desktop Versione 12.0.21

 

Link al commento
Condividi su altri siti

HomePLC_Manager
Quote

 Provando a inviare 40 sul registro DTHP 3001 nulla accade

 

Be, per partire prova a scrivere nel registro 3301 

il 3001 non è un registro ad eventi...😊

 

 

 

 

 

 

Link al commento
Condividi su altri siti

In realtà preso dalla disperazione le ho provate tutte. Eventi gruppo 1 (3301-3332), eventi gruppo 2 (3351-3382) e non eventi.

Nel post precedente non so perchè ho incollato la prova con il non evento. 

HomePLC_Manager tu usi Visual Studio 2019? Su che windows?

 

Link al commento
Condividi su altri siti

scusa se te lo chiedo, mi puoi postare il codice che hai scritto in Visual Basic qualche post sopra?

Hai utilizzato la libreria Xcomm_building. Il componente AxXcomm1 come lo hai creato/inizializzato? 

 

Forse ho capito dove sbaglio. ZoneEvent è un membro della libreria XcommBuilding, mentre io ho sempre usato la libreria AxDrive_Xcomm e non ha l'evento ZoneEvent.

 

Grazie

Modificato: da Amicoadi
Link al commento
Condividi su altri siti

HomePLC_Manager
Quote

Hai utilizzato la libreria Xcomm_building. Il componente AxXcomm1 come lo hai creato/inizializzato?

 

I componenti COM come quelli .NET si caricano semplicemente in modo standard per Visual Studio dall'apposita finestra

 

AreaEventiNET1.thumb.jpg.3da157a385a593d5cf60a1154f9ddb23.jpg

 

 

Link al commento
Condividi su altri siti

HomePLC_Manager
Quote

scusa se te lo chiedo, mi puoi postare il codice che hai scritto in Visual Basic qualche post sopra?

 

Direi che è un codice molto snello...

 

Imports AxXComm_Building

Public Class Form1

    Private Sub AxXComm1_ZoneEvent(sender As Object, e As __XComm_ZoneEventEvent) Handles AxXComm1.ZoneEvent

    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Label1.Visible = AxXComm1.ConnectSRV
    End Sub
End Class

 

La prima riga importa i riferimenti all'oggetto che connette Visual Studio al sistema BMS, tramite questa semplice impostazione si ha accesso a tutte le funzioni di Domotica e Building Automation, compreso controllo Accessi, Termoregolazione ecc..

 

Il Timer che esegue il refresh della Label è stato inserito solo per mostrare a video se l'oggetto è connesso al Server locale (ma potrebbe anche essere usato in Rete connesso alle Workstation)

 

Poi trovi il codice dell'evento dove arrivano le variazioni di stato quando queste si verificano nel programma Ladder/FBD dell'HomePLC

 

Modificato: da HomePLC_Manager
Link al commento
Condividi su altri siti

Questo è quello che ho fatto. Agiungere la libreria COM Xcomm_building.

 

libreria.thumb.jpg.8ec0e4c3f5612618b734ea4d593e4641.jpg

 

Creato il form con label e timer e scritto il codice.

 

codice.thumb.jpg.15b64c2a076174c8a5a26231565ebb26.jpg

 

form.thumb.jpg.e268ba65d40b3a007c0cfab28d693703.jpg

 

Mi da errore in quanto non trova il componente AxXcomm1. Il componente va prima inizializzato e creato in InitializeComponent, come nell'esempio Demo XComm ++ (COM). Per intendeci manca sul form il componente che gestisce la comunicazione Xcomm

 

xcomm.jpg.a6cb6b5624fa1eba890359188f284bc9.jpg

 

Quindi, ho provato a inizializzarlo sulla nuova libreria, ma mi da errore durante la digitura del codice. Nell'esempio Demo XComm ++ (COM) il componente viene creato in questa maniera:

Public WithEvents XComm1 As AxDrive_Xcomm.AxXComm

Me.XComm1 = New AxDrive_Xcomm.AxXComm()
CType(Me.XComm1, System.ComponentModel.ISupportInitialize).BeginInit()
        
        '
        'XComm1
        '
        Me.XComm1.Enabled = True
        Me.XComm1.Location = New System.Drawing.Point(27, 256)
        Me.XComm1.Margin = New System.Windows.Forms.Padding(4)
        Me.XComm1.Name = "XComm1"
        Me.XComm1.OcxState = CType(resources.GetObject("XComm1.OcxState"), System.Windows.Forms.AxHost.State)
        Me.XComm1.Size = New System.Drawing.Size(200, 40)
        Me.XComm1.TabIndex = 72

Me.Controls.Add(Me.XComm1)
CType(Me.XComm1, System.ComponentModel.ISupportInitialize).EndInit()

 

La struttura della libreria Xcomm_building è diversa dalla precedente. Quindi ho provato a replicare il componente in questo modo

Public WithEvents XComm1_1 As XComm_Building.XComm

Me.XComm1_1 = New XComm_Building.XComm()

ma ovviamente non si può in quanto   Me.XComm1 = New AxDrive_Xcomm.AxXComm() (vecchia libreria) è una New Sub, mentre Me.XComm1_1 = New XComm_Building.XComm() è solo una interfaccia.

 

Sono io che sto facendo molta confusione con le librerie? Ho perso qualche passaggio nell'importare i componenti?

Grazie. 

 

Link al commento
Condividi su altri siti

Ok. Ci sono, problema risolto in parte. Invece di creare la comunicazione con il codice da me, ho caricato l'oggetto "Strumenti-> Scegli dalla casella di strumenti" e ho importato l'oggetto Xcomm_Building.Xcomm.

Gli errori del codice sono spariti, riesco a compilare il codice. Quando vado in esecuzione (avvia) mi esce il seguente errore. Sai cosa può essere?

 

System.InvalidOperationException: 'Errore durante la creazione del form. Per informazioni dettagliate vedere Exception.InnerException. Errore: Interfaccia non registrata. (Eccezione da HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))'
 

Eccezione Interna

COMException: Interfaccia non registrata. (Eccezione da HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))

 

Controllando il codice di errore in internet, ho trovato che il componente COM che voglio importare non è registrato.

Dove va registrato il componente COM?

Link al commento
Condividi su altri siti

Ciao, tutto risolto 😃

Finalmente l'evento ZoneEvent funziona. Ho perso 10 giorni dietro a una cavolata. Mi ero fissato a voler importare l'oggetto scrivendo il codice.

Importato l'oggetto AxXcomm il tutto diventa facile.

Se a qualcuno interessa risolvere il problema 

Quote

 System.InvalidOperationException: 'Errore durante la creazione del form. Per informazioni dettagliate vedere Exception.InnerException. Errore: Interfaccia non registrata. (Eccezione da HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG))'

 

basta guardare il video https://www.youtube.com/watch?v=jBKfTbmAVi4 e il problema si risolve.

 

Grazie per il supporto.

Link al commento
Condividi su altri siti

HomePLC_Manager

Esatto, l'oggetto importalo sempre

dalla finestra delle librerie, non solo come riferimento...

 

 

AreaEventiNET1.thumb.jpg.ea2e3f5ff5ec42c7d6198f06b1057b18.jpg

 

 

 

 

Modificato: da HomePLC_Manager
Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...