Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Excel als OPC Client (Datenaustausch)

Forumthread: Excel als OPC Client (Datenaustausch)

Excel als OPC Client (Datenaustausch)
23.01.2014 14:45:03
Stephan
Hallo,
ich bin dabei ein Prozessleitsystem (Freelance 2013 von ABB) für eine verfahrenstechnische Anlage zu programmieren und möchte eine Datenaustausch über einen OPC-Server realisieren. Ich habe dafür auch ein Makro von ABB bekommen, was dies bewerkstelligen soll. Das funktioniert auch. Ich kann Messwerte auslesen und mir in excel anzeigen lassen, aber ich kann bei laufenden Makro von ABB "OPCExample Macro()" keine anderen Makros starten und excel ist blockiert (oben die ganze toolbar ist grau). Ich kann das Makro auch nur über Strg+Pause beenden.
Mein Ziel ist es, dass mein selbst geschriebenes Makro, welches die Messwerte im sekundentakt abgreift und forlaufend in ein Tabellenblatt schreibt auch während des
"OPCExample Macro()" läuft.
Meine Frage ist nun: Woran liegt es das mir dieses Makro es nicht ermöglicht andere Makros aufzurufen. Ich habe auch schon versucht einen Aufruf meines Makros aus dem "OPCExample Macro()" auszulösen aber leider ohne erfolg. Es scheint so als würde dieses Makro alle anderen killen.
Version Excel 2010
Option Explicit 'to avoid that variables automativally
'variable declaration
Dim Server As IOPCServerDisp 'the reference to the server object
Dim Group As IOPCItemMgtDisp 'the reference to the group object
Dim ServerUpdateRate As Long 'will contain the update rate the server is using for the group
Dim ServerGroupHandle As Long 'will contain the server generated group handle
Dim NrOfItems As Long 'number of items in this example
Dim ItemIDs() As String 'array for the item names
Dim ActiveStates() As Boolean 'array for the active states of each item
Dim ClientHandles() As Long 'array for the client handles of each item
Dim AccessPaths() As String 'array for the access path of each item
Dim RequestedDataTypes() As Integer 'array for the requested datatype of each item
Dim ItemErrors As Variant 'will contain the error code of each item
Dim ServerHandles As Variant 'will contain the server handle of each item
Dim ItemObjects As Variant 'will contain the references to each item
Sub OPCExampleMacro()
Dim i, ActualHour, ActualMinute, ActualSecond, WaitingTime, ServerName   'local variables
NrOfItems = 14                     'change this value if you want to read more items
'resize all arrays to the necessary size
ReDim ItemIDs(NrOfItems)
ReDim ActiveStates(NrOfItems)
ReDim ClientHandles(NrOfItems)
ReDim AccessPaths(NrOfItems)
ReDim RequestedDataTypes(NrOfItems)
' start the specified server, change the name for your configuration
ServerName = "Freelance2000OPCServer.23"
Set Server = CreateObject(ServerName)
' add a group to the server
Set Group = Server.AddGroup( _
"Group 1", _
True, _
1000, _
1, _
0, _
&H409, _
ServerGroupHandle, _
ServerUpdateRate)
'set the name of the item
ItemIDs(0) = "TRI12"               'change the name for your configuration
ItemIDs(1) = "TRI18"               ' meine temperaturwerte
ItemIDs(2) = "TRI21"
ItemIDs(3) = "TRI22"
ItemIDs(4) = "TRI25"
ItemIDs(5) = "TRI32"
ItemIDs(6) = "TRI34"
ItemIDs(7) = "TRI36"
ItemIDs(8) = "TRI312"
ItemIDs(9) = "TRI316"
ItemIDs(10) = "TRI42"
ItemIDs(11) = "TRI44"
ItemIDs(12) = "TRI48"
ItemIDs(13) = "e"
'set client handles and active state of the items
For i = 0 To (NrOfItems - 1)
ClientHandles(i) = i + 1        'use a differen client handle for each item
ActiveStates(i) = True          'all items are active
Next
'add items to the group
Group.AddItems _
NrOfItems, _
ItemIDs, _
ActiveStates, _
ClientHandles, _
ServerHandles, _
ItemErrors, _
ItemObjects, _
AccessPaths, _
RequestedDataTypes
'as long as CTRL-BREAK is not pressed update every 1 seconds the sheet
Worksheets(1).Visible = True
While True
ActualHour = Hour(Now())
ActualMinute = Minute(Now())
ActualSecond = Second(Now()) + 1        'change 1 to x if you want faster execution
WaitingTime = TimeSerial(ActualHour, ActualMinute, ActualSecond)
Application.Wait WaitingTime
For i = 0 To (NrOfItems - 1)
'  Worksheets(1).Cells(1 + 2, i + 1) = "Server:"
'  Worksheets(1).Cells(1 + 2, i + 2) = ServerName
'  Worksheets(1).Cells(1 + 3, i + 1) = "Name:"
'  Worksheets(1).Cells(1 + 3, i + 2) = ItemObjects(i).ItemID
'  Worksheets(1).Cells(2 + 3, i + 1) = "Access Rights:"
'  Worksheets(1).Cells(2 + 3, i + 2) = ItemObjects(i).AccessRights
'  Worksheets(1).Cells(3 + 3, i + 1) = "Value:"
'  Worksheets(1).Cells(3 + 3, i + 2) = ItemObjects(i).Value
'  Worksheets(1).Cells(4 + 3, i + 1) = "Quality:"
'  Worksheets(1).Cells(4 + 3, i + 2) = ItemObjects(i).Quality
'  Worksheets(1).Cells(5 + 3, i + 1) = "Timestamp:"
'  Worksheets(1).Cells(5 + 3, i + 2) = ItemObjects(i).Timestamp
'ab hier werden die gewünschten Variablen auf das Tabellenblatt Data1 als Momentanwert   _
_
geschrieben
Worksheets(2).Cells(1, i + 6) = ItemObjects(i).ItemID
Worksheets(2).Cells(3, i + 6) = ItemObjects(i).Value
Worksheets(1).Cells(10, 1) = ItemObjects(13).Value 'gibt die variable e auf  _
tabellenblatt 1 aus um startlog zu aktivieren
Next
Wend
End Sub

Vielen Dank für eure Hilfe.
Stephan

Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Excel als OPC Client (Datenaustausch)
23.01.2014 14:56:47
GuentherH
Hallo Stephan,
der Aufruf Deines Makro's mit
call Makroname
gehört in die neue Zeile zwischen "next" und "Wend"
Gruß,
Günther

AW: Excel als OPC Client (Datenaustausch)
23.01.2014 15:10:45
Rudi
Hallo,
Woran liegt es das mir dieses Makro es nicht ermöglicht andere Makros aufzurufen.
VBA ist nicht multitasking-fähig.
Ich habe auch schon versucht einen Aufruf meines Makros aus dem "OPCExample Macro()" auszulösen
Das sollte gehen. Zwischen While True und For i=... oder zwischen Next und Wend.
Gruß
Rudi

Anzeige
AW: Excel als OPC Client (Datenaustausch)
23.01.2014 15:46:39
Stephan
Ok, das klappt.
Ich hab da aber noch eine Bedingung die an das Ausführen meines Makro gestellt ist.
Ich möchte nämlich durch eine boolean aus meinem Prozessleitsystem die messwertaufzeichnung starten und stoppen können.
Wie schaffe ich es jetzt, dass das Makro StartLog nicht mit jedem Schleifendurchgang ausgeführt wird, sondern nur einmalig bzw. die Messwertaufzeichnung sich nur dann ändert wenn im Range A10 sich was ändert.
Und wie kann ich das OPCExample Macro() ohne das drücken von Strg + Pause beenden.?
Danke
While True
If Worksheet(1).Range("A10").Text = "WAHR" Then Call StartLog
If Worksheet(1).Range("A10").Text = "FALSCH" Then Call StoptLog
ActualHour = Hour(Now())
ActualMinute = Minute(Now())
ActualSecond = Second(Now()) + 1 'change 1 to x if you want faster execution
WaitingTime = TimeSerial(ActualHour, ActualMinute, ActualSecond)
Application.Wait WaitingTime
For i = 0 To (NrOfItems - 1)
.
.
.
.

Anzeige
AW: Excel als OPC Client (Datenaustausch)
23.01.2014 16:03:57
Rudi
Hallo,
Syntaxfehler! Ein s fehlt.
If Worksheets(1).Range("A10").Text = "WAHR" Then Call StartLog
If Worksheets(1).Range("A10").Text = "FALSCH" Then Call StoptLog
Und wie kann ich das OPCExample Macro() ohne das drücken von Strg + Pause beenden.?
Wie willst du das Prog denn beenden?
Gruß
Rudi

Anzeige
AW: Excel als OPC Client (Datenaustausch)
23.01.2014 16:37:47
Stephan
Hallo,
der Syntaxfehler ist nur beim übertragen passiert. Das mit dem Prog beenden werde ich entweder mit Exit Sub oder dem Befehl End machen. Das schaffe ich schon irgendwie.
Mein hoffentlich letztes Problem besteht darin die Startlog bzw Stoplog prozedur innerhalb der while schleife nur einmal bzw. bei einer Werteänderung auszulösen.
Vielleicht nochmal als erklärung was ich genau möchte:
Erst baue ich mit dem OPCExample Macro() eine Verbindung zu meinem Prozessleitsystem (PLS) auf. Wenn dieses Makro läuft bin ich erst in der Lage Daten auszulesen.
Die While-Schleife fragt sekündlich die Daten aus dem PLS ab.
Ich möchte nun über einen button die Messwertaufzeichnung starten (StartLog()) und stoppen (StopLog()).
Da die Bedingung an das Starten und Stoppen meiner Makros in der While-Schleife stehen werden diese leider auch im Sekundentakt ausgeführt. Das soll aber nicht so sein. Am besten wäre es wenn diese Makros nur bei einer Änderung des Wertes von WAHR auf FALSCH oder umgekehrt ausgelöst werden.
Zur Funktion der beiden Makros StartLog() StopLog().
StartLog(): Auf dem Datenblatt 2 stehen alle Messwerte in einer Zeile (ca. 60 Stück). Das Makro
nimmt jeweilse diese Zeile und kopiert diese im sekundentakt fortlaufend in die nächst freie Zeile.
StopLog(): Beendet den kopiervorgang.
Danke vorab für die Hilfe

Anzeige
AW: Excel als OPC Client (Datenaustausch)
23.01.2014 16:43:08
Rudi
Hallo,
StartLog(): Auf dem Datenblatt 2 stehen alle Messwerte in einer Zeile (ca. 60 Stück). Das Makro
nimmt jeweilse diese Zeile und kopiert diese im sekundentakt fortlaufend in die nächst freie Zeile.

warum schreibst du die Daten nicht direkt untereinander auf das richtige Blatt?
Gruß
Rudi

Anzeige
AW: Excel als OPC Client (Datenaustausch)
23.01.2014 17:02:53
Stephan
Hallo,
das Kopier-Makro funktioniert ja tadellos. Ich schreib die Werte zu erst auch auf die selbe Zeite nur bei versuchskampagnen die länger als 18 Stunden dauern muss ich das tabbelenblatt wechseln weil es dann voll ist.
Ich möchte StartLog() in der While-Schleife halt nicht mit jedem durchgang der While-Schleife ausführen.
Weil Starlog() immer die erste Zeile kopiert (auch im sekundentakt) und in die zweite einfügt. Da die While-Schleife auch immer im sekundentakt StartLog() ausführt kann nicht viel passieren bzw. schafft StartLog() es genau einmal die Messwerte zu kopieren.

Anzeige
AW: Excel als OPC Client (Datenaustausch)
23.01.2014 17:09:54
Rudi
Hallo,
nur bei versuchskampagnen die länger als 18 Stunden dauern muss ich das tabbelenblatt wechseln weil es dann voll ist.
wieso?
1.048.576/3.600=291 h
Gruß
Rudi

AW: Excel als OPC Client (Datenaustausch)
23.01.2014 16:57:07
Stephan
Hallo,
der Syntaxfehler ist nur beim übertragen passiert. Das mit dem Prog beenden werde ich entweder mit Exit Sub oder dem Befehl End machen. Das schaffe ich schon irgendwie.
Mein hoffentlich letztes Problem besteht darin die Startlog bzw Stoplog prozedur innerhalb der while schleife nur einmal bzw. bei einer Werteänderung auszulösen.
Vielleicht nochmal als erklärung was ich genau möchte:
Erst baue ich mit dem OPCExample Macro() eine Verbindung zu meinem Prozessleitsystem (PLS) auf. Wenn dieses Makro läuft bin ich erst in der Lage Daten auszulesen.
Die While-Schleife fragt sekündlich die Daten aus dem PLS ab.
Ich möchte nun über einen button die Messwertaufzeichnung starten (StartLog()) und stoppen (StopLog()).
Da die Bedingung an das Starten und Stoppen meiner Makros in der While-Schleife stehen werden diese leider auch im Sekundentakt ausgeführt. Das soll aber nicht so sein. Am besten wäre es wenn diese Makros nur bei einer Änderung des Wertes von WAHR auf FALSCH oder umgekehrt ausgelöst werden.
Zur Funktion der beiden Makros StartLog() StopLog().
StartLog(): Auf dem Datenblatt 2 stehen alle Messwerte in einer Zeile (ca. 60 Stück). Das Makro
nimmt jeweilse diese Zeile und kopiert diese im sekundentakt fortlaufend in die nächst freie Zeile.
StopLog(): Beendet den kopiervorgang.
Danke vorab für die Hilfe
Anzeige
;
Anzeige

Infobox / Tutorial

Excel als OPC Client für den Datenaustausch


Schritt-für-Schritt-Anleitung

  1. OPC-Server einrichten: Stelle sicher, dass dein OPC-Server korrekt installiert und konfiguriert ist. Du benötigst die Serveradresse und den Namen, um die Verbindung herzustellen.

  2. Makro erstellen: Öffne Excel und drücke Alt + F11, um den VBA-Editor zu öffnen. Erstelle ein neues Modul und füge den folgenden Code ein:

    Option Explicit
    Dim Server As IOPCServerDisp
    Dim Group As IOPCItemMgtDisp
    Dim NrOfItems As Long
    Dim ItemIDs() As String
    Dim ItemObjects As Variant
    
    Sub OPCExampleMacro()
       NrOfItems = 14
       ReDim ItemIDs(NrOfItems)
       ' Hier die ItemIDs definieren, z.B.:
       ItemIDs(0) = "TRI12"
       ' OPC-Server starten und Gruppe hinzufügen
       ' ...
       ' Während der Schleife die Werte abfragen
       While True
           ' Daten abfragen und in Excel schreiben
           ' ...
           Application.Wait Now + TimeValue("00:00:01") ' Warte 1 Sekunde
       Wend
    End Sub
  3. Makro anpassen: Füge Logik hinzu, um das Makro nur dann auszuführen, wenn sich die Bedingung in Range("A10") ändert.

  4. Testen: Führe das Makro aus und überprüfe, ob die Daten korrekt abgerufen werden.


Häufige Fehler und Lösungen

  • Fehler: Excel blockiert während der Ausführung des Makros.

    • Lösung: VBA ist nicht multitasking-fähig. Du kannst das Problem umgehen, indem du das Makro so anpasst, dass es nur dann arbeitet, wenn bestimmte Bedingungen erfüllt sind, z. B. die Änderung eines Wertes.
  • Fehler: Das Makro wird im Sekundentakt ausgeführt, auch wenn die Bedingungen nicht erfüllt sind.

    • Lösung: Verwende eine boolean Variable, um die Ausführung zu steuern und verhindere, dass das Makro mehrmals ohne Bedingung aufgerufen wird.

Alternative Methoden

  • Verwendung von Excel OPC UA Client: Es gibt spezielle Add-Ins, die als OPC UA Excel Client fungieren. Diese können oft einfacher konfiguriert werden und bieten eine bessere Integration.

  • Datenübertragung mittels API: Wenn der OPC-Server eine API bereitstellt, könntest du auch auf diese Weise die Daten in Excel abfragen.


Praktische Beispiele

Sub StartLog()
   ' Hier wird die Messwertaufzeichnung gestartet
   Worksheets(2).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = "Neue Messwerte"
   ' Weitere Logik hinzufügen
End Sub

Sub StopLog()
   ' Hier wird die Messwertaufzeichnung gestoppt
   ' Logik für das Stoppen hinzufügen
End Sub

In diesem Beispiel wird die Funktion StartLog verwendet, um Messwerte in die nächste freie Zeile zu schreiben. Achte darauf, dass das Makro StopLog nur dann aufgerufen wird, wenn ein bestimmter Wert in Range("A10") erkannt wird.


Tipps für Profis

  • Verwende Application.Wait: Um die Ausführung deines Makros für eine bestimmte Zeit zu pausieren, kannst du Application.Wait verwenden. So kannst du einen Sekundentakt erreichen, ohne die Ausführung des gesamten Excel zu blockieren.

  • Debugging: Nutze die Debugging-Tools im VBA-Editor, um Fehler schneller zu finden und zu beheben.

  • Dokumentation: Halte deine Makros gut dokumentiert, um die Wartung zu erleichtern, besonders wenn du mit OPC Datenaustausch arbeitest.


FAQ: Häufige Fragen

1. Wie kann ich das OPC-Makro beenden, ohne Strg + Pause zu drücken?
Du kannst Exit Sub oder End verwenden, um das Makro programmgesteuert zu beenden.

2. Warum kann ich nicht mehrere Makros gleichzeitig ausführen?
VBA unterstützt kein echtes Multitasking, daher blockiert das aktuelle Makro alle anderen Prozesse, bis es abgeschlossen ist.

3. Wie kann ich die Messwertaufzeichnung nur bei einer Änderung des Wertes starten?
Verwende eine If-Bedingung innerhalb der While-Schleife, um die Ausführung von StartLog und StopLog nur bei Änderungen in Range("A10") zu steuern.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige