Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 3 von 3 ErsteErste 123
Ergebnis 21 bis 28 von 28

Thema: Mit Excel/VBA und OPC an S7300

  1. #21
    Registriert seit
    03.12.2009
    Beiträge
    64
    Danke
    1
    Erhielt 2 Danke für 2 Beiträge

    Standard


    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

  2. #22
    Registriert seit
    01.08.2005
    Beiträge
    149
    Danke
    0
    Erhielt 20 Danke für 19 Beiträge

    Standard

    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
    TwoByteToInt
    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()"
    Geändert von BPlagens (12.04.2010 um 14:26 Uhr)

  3. #23
    Registriert seit
    03.12.2009
    Beiträge
    64
    Danke
    1
    Erhielt 2 Danke für 2 Beiträge

    Standard

    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

  4. #24
    Registriert seit
    03.12.2009
    Beiträge
    64
    Danke
    1
    Erhielt 2 Danke für 2 Beiträge

    Standard

    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

  5. #25
    Registriert seit
    01.08.2005
    Beiträge
    149
    Danke
    0
    Erhielt 20 Danke für 19 Beiträge

    Standard

    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



    Geändert von BPlagens (13.04.2010 um 13:59 Uhr)

  6. #26
    Registriert seit
    03.12.2009
    Beiträge
    64
    Danke
    1
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Hallo BPlagens,

    Du bist echt ne Bank,
    Unglaublich tolle Hilfe.

    Danke

    Oliver

  7. #27
    Registriert seit
    01.08.2005
    Beiträge
    149
    Danke
    0
    Erhielt 20 Danke für 19 Beiträge

    Standard

    dafür gibt es ja dieses Forum!

    Viel Erfolg!

  8. #28
    Registriert seit
    27.10.2009
    Beiträge
    317
    Danke
    0
    Erhielt 64 Danke für 54 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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.



Ähnliche Themen

  1. S7300 Verbindung mit BC9000
    Von repök im Forum CODESYS und IEC61131
    Antworten: 14
    Letzter Beitrag: 22.10.2011, 19:10
  2. S7300 Modbus/TCP Kommunikation
    Von selly im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 16.06.2010, 12:45
  3. Modbus an S7300
    Von Andi_W im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 21.03.2009, 21:17
  4. Verbindung S7200 <--> s7300
    Von mst im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 20.04.2007, 08:49
  5. Inkrementalzähler FM350-1 S7300
    Von Kleissler im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 08.05.2006, 23:17

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •