Mit Excel/VBA und OPC an S7300

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

es funktioniert jetzt soweit.
Gebracht hat es die Siemens Funktion:

Function TwoByteToInt(ByVal LoByte As Byte, _
ByVal HiByte As Byte) As Integer
'Check if HiByte is 0
If (HiByte And &H80) <> 0 Then
TwoByteToInt = ((HiByte * 256&) + LoByte) Or &HFFFF0000
Else
TwoByteToInt = (HiByte * 256) + LoByte
End If
End Function

Ohne die bekam ich die dollsten Fehlermeldungen, wenn ich auf die gelesenen Variablen zugreifen wollte. Durch die Formatkonvertierung klappt es jetzt.

Nun habe ich aber noch ein Problem:
Ich lese die Daten der SPS'sen zyklisch jede Sekunde. Kein Problem. Ziehe ich aber nun den MPI-Stecker ab, so versucht das OPC control ca. 10 Sekunden land auf das OPC Item zuzugreifen, bevor es in den Timeout geht.
Kann man diese Zeit irgendwo einstellen ?
Mit einem vom OPC control erzeugten Ereignis möchte ich nicht arbeiten, da ich auch protokollieren will, ob die CPU's erreichbar sind.


Gruss

Oliver
 
Ach je - du machst es aber einem nicht leicht dir zu helfen!

Einmal sprichst du von
ItemId = "S7:[3_head]DB1,W0,2
Jetzt von
Warum machst du denn nicht was man dir sagt?
S7:[3_head]DB1,INT0,2
Du willst doch einen Integer-Wert! Warum also mehrere Byte lesen um dann daraus wieder ein Integer zu machen?

Dann könntest du dir das ganze zusammen basteln deiner Werte sparen!

Aber zu deinem neuen Problem:
Mit einem vom OPC control erzeugten Ereignis möchte ich nicht arbeiten, da ich auch protokollieren will, ob die CPU's erreichbar sind.
Verstehe ich zwar nicht - genau dafür ist das Ereignis ja da! Wenn es auftritt entsprechend darauf reagieren - sprich Protokoll erstellen!

Die Zeit hat nichts mit der Control zu tun, sondern wird vom OPC-Server bestimmt! (Schau mal in NetPro unter den Eigenschaften deiner Verbindung nach Stichwort "Auftrags-Timeout" und wenn du schon in der Maske bist: "Die Verbindung permanent aufrecht erhalten" anklicken!)

Es gibt für jede Verbindung eine System-Variable die dir den Zustand der Verbindung anzeigt (Bei Inat "Status" bei Siemens &statepathval)

Hier der Auszug der Doku:
&statepathval()
Zustand einer Kommunikationsverbindung zu einem Partnergerät.
Rückgabewerte:
1
Verbindung ist nicht aufgebaut
2
Verbindung ist aufgebaut
3
Verbindung wird aufgebaut
Also könntest du bevor du zyklisch liest immer erst &statepathval auswerten! Wenn <> 2 dann macht lesen eh keinen Sinn!

Syntax:"S7:[3_head]&statepathval()"
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo BPlagens,

Du hast recht, ich möchte 16 Bit auslesen.
Da ich aber immer die Fehlermeldung"VB unterstützt diese Art der Variablen aus der Automatisierung nicht" bekommen habe, ging es nicht anders. Ob das an Excel 2007 VBA oder was auch immer liegt, weiss ich nicht und habe darauf auch keine Antwort bekommen.
Da es mit dem Byte Zugriff funktioniert und ich überhaupt keine Zeit habe, nehme ich diesen, ist letztenendes auch egal.

Vielen Dank für den Tip mit der Abfrage :"S7:[3_head]&statepathval()"

Vielleicht kann ich mich mal revanchieren.

Gruss
 
Hallo nochmal BPlagens,

ich weiss das ich nerve, aber ich baue das erste Mal einen OPC Client mit Excel.
Ich würde gerne Deinem Tip mit dem Statepathval folgen.
Du hast ja auch schon die Syntax geschrieben, ich weiss aber trotzdem nicht wie ich das machen soll.

"S7:[3_head]&statepathval()" ist ja in Anführungszeichen und damit ein String.

Was soll ich damit machen?

Ich wäre unglaublich dankbar für ein kleines Beispiel.

z.B:

dim test as variant ?????

test = "S7:[3_head]&statepathval()"

So ist test natürlich nur der String.

oder wie funktionierts?

Hab die Siemens Doku gelesen, finde aber keine richtige Antwort.

Wäre toll, wenn Du nochmal hilfst.

Gruss

Oliver
 
Ist ganz einfach!

Es geht genau so wie du jetzt deine Tags liest!
ItemId = "S7:[3_head]DB1,W0,2
ReturnValue = UserForm1.DatCon1.ReadVariable(ItemId, Value, Quality, Timestamp)
Nur das ItemId="S7:[3_head]&statepath()" lautet.
Mit "ReturnValue = DatCon1.ReadVariable(ItemId, Value, Quality, Timestamp)" liest du dann den Tag vom OPC Server (ist eben nur ein "System-Tag" der nicht aus der SPS kommt).

Dann hat Value eben den Wert 1,2 oder 3!
Value ist vom Type Byte!

Mach gleich mal ein Beispiel!
Nachtrag: Hier das Beispiel:
Code:
Private Sub cmdStatepath_Click()
    Dim myValue(1) As Variant 'hier schreibt DatCon1 den Wert der Variable rein
    Dim myQuality(1) As Long 'hier schreibt DatCon1 einen Wert für die Qualität des Tags rein (muss 192 sein)
    Dim myTimeStamp(1) As Date 'hier schreibt DatCon1 den TimeStamp des Tags rein
    Dim ErrorNr(1) As Long 'Rückgabewert des Aufrufes (muss 0) sein
    Dim ItemID(1) As String 'hier übergeben wir die Tag-Adresse
    
    On Error GoTo ErrorHandler
    
    ItemID(1) = "S7:[3_head]&statepathval()"
       
    'Und aufrufen
    ErrorNr(1) = DatCon1.ReadVariable(ItemID(1), myValue(1), myQuality(1), myTimeStamp(1))
   
    Select Case myValue(1)
        Case 1
            MsgBox "Verbindung ist nicht aufgebaut!"
        Case 2
            MsgBox "Verbindung ist aufgebaut!"
            'Hier könnte dann das Lesen der eigentlichen Tags erfolgen
        Case 3
            MsgBox "Verbindung wird aufgebaut!"
        Case Else
            MsgBox "Status unbekannt!"
            
    End Select
     
    Exit Sub
    
ErrorHandler:
    MsgBox Err.Description

End Sub



 
Zuletzt bearbeitet:
Ich las gerade folgende Zeilen:

'ItemId = "S7:[3_head]DB1,W0" // auskommentiert , funktioniert
ItemId = "S7:[3_head]DB1,W0,2" // hier möchte ich einfach mal 2 Variablen gleichzeitig lesen
ReturnValue = UserForm1.DatCon1.ReadVariable(ItemId, Value, Quality, Timestamp)
Valuelong = CLng(Value(1)) // hier möcht ich den Inhalt einer Variablen lesen, dabei kommt es zur Fehlermeldung "VB unterstützt diesen Typ nicht

Das funktionierte nicht weil "W0,2" nicht bedeutet das man "2 Variablen gleichzeitig liest" sondern EINE Variable, die vom Typ ARRAY ist und 2 Elemente besitzt.
Daher funktioniert auch der Cast mit CLng nicht, denn das Array kann nicht in einen Long gewandelt werden.

Das wollte ich nur mal angemerkt haben. Dann könnte auch die wilde Konvertiererei wegfallen.

Der Grund für den Wahnsin scheint gewesen zu sein, dass der ReadMulti nicht ging (übrigens aus genau dem selben Grund wie oben geschildert). Es kommt ein Value-Array zurück in dessen ersten Element ein "Word" (von DB1,W0) stand und im zweiten Element war ein "ArrayofWord" (von DB1,W0,2). Das zweite Item hätte einfach nur "DB1,W2" heissen müssen und es wäre gegangen.

Abschließen möchte ich erwähnen dass der "Multi-Zugriff" IMMER zu bevorzugen ist. Ein "Read-Single" (also auf nur 1 Item) dass dann allerdings ein Array mit 500 Elementen ist, geht natürlich auch, zieht aber ein "zerbröseln" im Client nach sich. Weiterhin wird dem OPC Server die Chance genommen die Zugriff zu optimieren. Deshalb IMMER Multi-Zugriffe.


 
Zurück
Oben