Problem beim schreiben von S7-Daten in Excel-Datei

SanderKarl

Level-1
Beiträge
10
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe einen OPC-Client in ExcelVBA geschrieben, der Daten aus einem Datenbaustein einer S7 315-2DP liest und Diese dann in eine Excel-Tabelle schreibt.
Da es sehr viele verschiedene Daten sind, werden die Daten in einer For-Schleife per "Set OPC_Item" aus der SPS gelesen, in den Server geschrieben und im nachfolgenden Schritt per "Tabelle1.Cells(Zeile, Spalte) = OPC_Item" in das Tabellenblatt geschrieben.

Die Schleife sieht also folgendermaßen aus (vereinfacht, aber alles wichtige ist drin):
For i = 1 To numOfData

Set OPC_Item = OPC_Items.AddItem("S7-Verbindung.DB11.DBDI" & byteAdress, Line) ' Daten aus SPS in Server holen
Tabelle1.Cells(Line, Column) = OPC_Item ' Daten aus Server in Tabellenblatt 1 schreiben
byteAdress = byteAdress + SIZEofDINT ' Adresse der nächsten DINT-Variablen
line = line + 1 ' nächste Zeile im Tabellenblatt

Next

Wenn ich Dies per Debugging Schritt für Schritt durchtippe funktioniert alles wunderbar, ebenso funktioniert es, wenn ich einen Breakpoint hinter die "Set"-Anweisung setze und es dann ausführe.
Will ich das Ganze jedoch einfach nur ausführen, werden keine Daten in die Tabelle geschrieben, als hätte die "Set"-Anweisung gar keine Daten aus der SPS gelesen.

Habe betreits eine Wartezeit per "Sleep" hinter die "Set"-Anweisung gepackt, leider ohne Erfolg. Egal, ob ich 1ms oder 5s warte, es funktioniert nur, wenn ein Breakpoint hinter dem Set gesetzt ist oder ich das Ganze händisch durchtippe.

Ich müsste recht schnell eine Lösung zu diesem Problem finden, wäre also super wenn hier jemand eine Idee hätte woran es zumindest liegen kann.

Vielen Dank schonmal im Vorraus
SanderKarl
 
Hallo,
mal eine Vermutung dazu :
Du weißt in dem Script dem OPC-Server den gewünschten Item-Namen zu. Der OPC-Server wird dann, wenn er den Item-Namen findet, diesen bei Gelegenheit aktualisieren. So steht das Ding erstmal nur in seiner To-Do-Liste drin.
Dieses Aktualisieren passiert dann irgendwann ...
Was ich jetzt machen würde wäre :
Du meldest alle deine Items schon viel früher (z.B. beim Aufrufen des Sheet) an und kannst dann sehr wahrscheinlich in diesem Script sie dann auch verwenden.

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,

erstmal vielen Dank für die schnelle Antwort.
Auf den Gedanken bin ich auch schon gekommen, allerdings liegt es leider nicht daran, da alle Items ganz am Anfang des Skripts deklariert werden.

Ich vermute, dass bei der Abarbeitung des Programms keine Ressourcen auf Betriebssystemebene mehr vorhanden sind, da Excel alles in beschlag nimmt. Das würde erklären, warum das Programm im Debug-Modus per "durchzappen" oder mit Hilfe von Breakpoints funktioniert. Hierbei wird das Programm stellenweise angehalten und das Betriebssystem hat wieder genügend Ressourcen zur Verfügung um dem OPC-Server per LAN die Daten zukommen zu lassen.

Könnte dies eventuell der Fall sein?
Und wenn ja, wie kann ich zur Laufzeit das Programm "pausieren" lassen? Ich dachte schon an die "Sleep"-Funktion, aber diese gibt im beschriebenen Fall keine Ressourcen frei.

Gruß
 
Hallo,
nein ... ich denke mit der Vorgehensweise bist du "auf dem Holzweg".
Wie schon von mir geschrieben - du mußt dir alle Items als eigenständige globale Variablen deklarieren und denen so früh wie möglich (beim Start des Sheet oder noch besser beim Start der Datei) ihre SPS-Zuordnung verpassen. Also für jedes Anzeige-Element ein eigener Item - das könnte von mir aus auch ein Item-Array sein wenn VBS das kann.
In deiner Schleife, greifst du dann (viel später) auf das Item-Array zu.
Da mit Delays zu arbeiten ist doch nicht zweckdienlich. Du mußt dir prinzipiell die Funktionsweise des OPC-Servers (Item-Servers) vorstellen. Du meldest eine Variable bei ihm an, der aktualisiert die dann und dann willst du deren Wert haben. Das Ganze funktioniert asynchron, ggf. gibt es sogar ein Event, das dann ausgelößt wird, wenn der Item aktualisiert wurde.
Wenn du dein Programm durch-traced dann sind da ja Zeiten ohne Ende drin. Das geht vielleicht auch mit Delays ... aber wie lange soll dass Script denn Laufen ? 20 Sek. ... 40 Sek. ... 60 Sek. ...?

Ich muß dir hier aber auch gestehen, dass du meine Antworten bitte als prinzipielle Vorgehensweise einstufen sollst. Ich arbeite selber nicht mit Excel wenn ich so etwas mache. Der Unterschied sollte aber nicht gravierend sein.

Wie sieht denn dein gesammte Code aus und wann wir der angestossen / durchlaufen ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry,

ich habe extra nicht für jeden DB-Wert ein eigenes Item angelegt, da es sich um ca. 2500 Werte handelt, die zudem auch noch verschiene Datentypen aufweisen.

Daran liegt es auch nicht, habe mal ein kleines Testprogramm angelegt, wo alles in nur einem Sub passiert und nur ein Item verwendet wird.
Auch hier habe ich das gleiche Problem.

Hier mal das Testprogramm:

Code:
Option Explicit

Private Server As OPCServer
Private GroupColl As OPCGroups
Private Group As OPCGroup
Private ItemColl As OPCItems
Private Item1 As OPCItem

Public Sub Bla()
    Set Server = New OPCServer
    Call Server.Connect("INAT TcpIpH1 OPC Server")
    
    Set GroupColl = Server.OPCGroups
    Set Group = GroupColl.Add("MyGroup")
    Group.IsSubscribed = True
    Group.UpdateRate = 0

    Set ItemColl = Group.OPCItems
    Set Item1 = Group.OPCItems.AddItem("S7-Verbindung_1.DB11.DBDI64", 1)
    
    Tabelle1.Cells(1, 1) = Item1.Value
    Tabelle1.Cells(1, 2) = Item1.Quality
    
    
    If Not Server Is Nothing Then
        Server.OPCGroups.RemoveAll
        Server.Disconnect
        Set Server = Nothing
    End If
End Sub

Die Ausgaben des Programms sehen wie folgt aus (DB11.DBW64 hat den Wert 10):
bei normaler Ausführung: A1="" und B1="0"
bei Debuggen: A1="10" und B1="192"​

Sind denn schon hier Fehler im Code??

Gruß
SanderKarl
 
... ich gebe es auf ...:icon_sad:

Du könntest meine Aussage ja ganz einfach widerlegen wenn du es einfach mal ausprobierst ... was ich geschrieben habe ... und wie ich es geschrieben habe ...
aber vielleicht stimmt ja auch das, was ich geschrieben habe ...
 
Zurück
Oben