Vai al contenuto
PLC Forum

Partecipa anche tu alla Live su Youtube martedì 28/01/2025 per festeggiare i 24 anni di PLC Forum

Per ulteriori informazioni leggi questa discussione: https://www.plcforum.it/f/topic/326513-28012025




Opc - Script VB


Messaggi consigliati

Inserito:

Buongiorno a tutti.

Premetto che non conosco nulla sul VB

Sto tentando di usare excel per leggere dati dal server OPC di winCC. Ho realizzato una macro in vba come descritto nelle istruzioni sul sito siemens e fino a qui funziona tutto benissimo. Lo script allegato è fatto da siemens. Il mio problema è: cosa bisogna modificare e come se voglio visualizzare due o + variabili

Grazie a tutti

Script:

Option Explicit

Option Base 1

Const ServerName = "OPCServer.WinCC"

Dim WithEvents MyOPCServer As OpcServer

Dim WithEvents MyOPCGroup As OPCGroup

Dim MyOPCGroupColl As OPCGroups

Dim MyOPCItemColl As OPCItems

Dim MyOPCItems As OPCItems

Dim MyOPCItem As OPCItem

Dim ClientHandles(1) As Long

Dim ServerHandles() As Long

Dim Values(1) As Variant

Dim Errors() As Long

Dim ItemIDs(1) As String

Dim GroupName As String

Dim NodeName As String

'---------------------------------------------------------------------

' Sub StartClient()

' Purpose: Connect to OPC_server, create group and add item

'---------------------------------------------------------------------

Sub StartClient()

' On Error GoTo ErrorHandler

'----------- We freely can choose a ClientHandle and GroupName

ClientHandles(1) = 1

GroupName = "MyGroup"

'----------- Get the ItemID from cell "A1"

NodeName = Range("A1").Value

ItemIDs(1) = Range("A2").Value

'----------- Get an instance of the OPC server

Set MyOPCServer = New OpcServer

MyOPCServer.Connect ServerName, NodeName

Set MyOPCGroupColl = MyOPCServer.OPCGroups

'----------- Set the default active state for adding groups

MyOPCGroupColl.DefaultGroupIsActive = True

'----------- Add our group to the Collection

Set MyOPCGroup = MyOPCGroupColl.Add(GroupName)

Set MyOPCItemColl = MyOPCGroup.OPCItems

'----------- Add one item, ServerHandles are returned

MyOPCItemColl.AddItems 1, ItemIDs, ClientHandles, ServerHandles, Errors

'----------- A group that is subscribed receives asynchronous notifications

MyOPCGroup.IsSubscribed = True

Exit Sub

ErrorHandler:

MsgBox "Error: " & Err.Description, vbCritical, "ERROR"

End Sub

'---------------------------------------------------------------------

' Sub StopClient()

' Purpose: Release the objects and disconnect from the server

'---------------------------------------------------------------------

Sub StopClient()

'----------- Release the Group and Server objects

MyOPCGroupColl.RemoveAll

'----------- Disconnect from the server and clean up

MyOPCServer.Disconnect

Set MyOPCItemColl = Nothing

Set MyOPCGroup = Nothing

Set MyOPCGroupColl = Nothing

Set MyOPCServer = Nothing

End Sub

'---------------------------------------------------------------------

' Sub MyOPCGroup_DataChange()

' Purpose: This event is fired when a value, quality or timestamp in our Group has changed

'---------------------------------------------------------------------

'----------- If OPC-DA Automation 2.1 is installed, use:

Private Sub MyOPCGroup_DataChange(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long, ItemValues() As Variant, Qualities() As Long, TimeStamps() As Date)

'----------- Set the spreadsheet cell values to the values read

Range("B2").Value = CStr(ItemValues(1))

Range("C2").Value = Hex(Qualities(1))

Range("D2").Value = CStr(TimeStamps(1))

End Sub

'---------------------------------------------------------------------

' Sub worksheet_change()

' Purpose: This event is fired when our worksheet changes, so we can write a new value

'---------------------------------------------------------------------

Private Sub worksheet_change(ByVal Selection As Range)

'----------- Only if cell "B3" changes, write this value

If Selection <> Range("B3") Then Exit Sub

Values(1) = Selection.Cells.Value

'----------- Write the new value in synchronous mode

MyOPCGroup.SyncWrite 1, ServerHandles, Values, Errors

End Sub


Inserita:
Private Sub worksheet_change(ByVal Selection As Range)

'----------- Only if cell "B3" changes, write this value

If Selection <> Range("B3") Then Exit Sub

Values(1) = Selection.Cells.Value

'----------- Write the new value in synchronous mode

MyOPCGroup.SyncWrite 1, ServerHandles, Values, Errors

End Sub

Premetto che non conosco WinCC, ma conosco piuttosto bene VBA... :D

Questo pezzo di codice, ad occhio e croce, serve a trasferire il valore della cella B3 in una non ben precisata locazione di memoria del PLC ogni volta che si fa una modifica alla cella.

Quindi, se MyOPCGroup.SyncWrite serve a scrivere, per leggere la classe MyOPCGroup dovrebbe mettere a disposizione il metodo SyncRead, o qualcosa del genere.

Usa il visualizzatore di oggetti per navigare tra le proprietà, i metodi e gli eventi messi a disposizione della suddetta classe.

Ammesso che il metodo SyncRead esista, dovrai costruire una sub del genere:

Sub lettura_valore()

MyOPCGroup.SyncRead <<parametri>>

End Sub

Probabilmente, però, avrai il problema di quando eseguire questa subroutine, perchè vorrai vedere il valore della cella aggiornarsi di continuo...

Una soluzione potrebbe essere quella di inserire in un modulo questa subroutine

Sub Auto_Open()

Do

lettura_valore

DoEvents

Loop While 1

End Sub

Questa chiama di continuo la subroutine di lettura, permettendo però l'esecuzione degli altri eventi...

Ciao!

  • 3 weeks later...
Inserita:

Non è proprio così, quando interroghi un server OPC devi prima dichiarare il nome del server a cui collegarsi, creare un gruppo e dichiarare il nome delle variabili da leggere (o scrivere). Quello a cui ti riferisci è la scrittura della variabile precedentemente dichiarata. Il mio problema è dichiarare + di 1 variabile.

'----------- Get the ItemID from cell "A1"

NodeName = Range("A1").Value

ItemIDs(1) = Range("A2").Value

In questo punto dichiaro il nome del computer nella cella A1 ed il nome della variabile nella cella A2

'----------- Set the spreadsheet cell values to the values read

Range("B2").Value = CStr(ItemValues(1))

Range("C2").Value = Hex(Qualities(1))

Range("D2").Value = CStr(TimeStamps(1))

End Sub

e qui mi restituisce il valore della variabile (B2), il quality code (C2) e l'ora (D3).

Se voglio inserire 2 variabili cosa devo modificare???

Grazie a tutti

Saluti

Inserita:

si confermo , per leggere in questa maniera c'e' il metodo SyncRead.

"MyOPCGroup.SyncWrite " e' il metodo che usi per scrivere , mentre per leggere sara' "MyOPCGroup.SyncRead".

Comunque se hai le msdn a posto prova a fare cosi :

digita MyOpcGroup e poi digiti il "." a questo punto dovrebbero apparirti tutti i metodi , le proprieta

e gli eventi che l'oggetto , tramite la classe madre , mette a disposozione.

"MyOPCGroup_DataChange" questa invece e' una routine che gestisce un evento , precisamente DataChenge

dell'oggetto e si scatena ogni volta che cambiano di valore i dati che passi come item nei parametri della routine stessa.

il vb no lo conosco ma con vc# le cose sono molto simili per quanto riguarda "l'oggettistica" ;)

poi anche crearti delle routine a tuo piacimento gestendo gli eventi .

se usi vb.net puoi nel tuo progetto , dopo aver importato la dll dell'opc server , avere a disposizione

tutto il Namespace contenente nell'assemly.

e da qui aprire le viste ad albero per scrutare e studiarti tutte le classi incorporate , i metodi di tali, le proprieta ect.

buon divertimento

ciao

walter

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