Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1344to1348
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

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

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

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

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

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

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige