Seite 3 von 4

connect mit WinCC

Verfasst: 01.07.2009 00:41
von derMicha
Hi , mksoft
Ich habe versucht mit den Testprogrammen direkt zu WinCC zu verbinden .Bei WinCC Items anzulegen nach der OPC.SimaticNET variante funktioniert leider nicht so richtig . Der Fehlercode sagte aus Itemname nicht verfügbar . Man kann aber die direkten Itemnamen der Variablen aus dem WinCC Projekt benutzen um Werte auszulesen . Vieleicht hat ja jemand mit WinCC schon mal experimentiert ? Ich werde dies mal in der kommenden Woche weiter versuchen .

Code: Alles auswählen

Procedure test()

; Read Items  WinCC 6.2

; OPC Server verbinden
  Debug "OPC Server verbinden"
  ;*Server = OpcConnect("OPC.SimaticNET", "")
  *Server = OpcConnect("OPCServer.WinCC", "")
  Debug GetErrorString(*Server, OpcGetLastError())
  If *Server = 0
    ProcedureReturn 0
  EndIf
  Debug "Init Shutdown"
  *Shutdown = OpcInitShutdown(*Server)
  If *shutdown = 0
    Debug GetErrorString(*Server, OpcGetLastError())
  Else
    Debug "Setze MyCallback"
    OpcSetShutdownCallBack(*shutdown, @MyCallback())
  EndIf
  
  Debug "Fertig."
  ; Gruppe anlegen
  Debug "Gruppe anlegen"
  *Group = OpcAddGroup(*Server, "S7_Group")
  
  Debug *Group
  Debug GetErrorString(*Server, OpcGetLastError())
  If *Group = 0
    ProcedureReturn 0
  EndIf
  ; Items anlegen
  Debug "Items anlegen"
  *item1 = OpcAddItem(*Group, "", "testo")  ;############# Hier die in WinCC definierte Variable wählen
    Debug GetErrorString(*Server, OpcGetLastError())
  Debug "Fertig."
  
  ; wait for plc
  Debug "PLC Verbinung püfen"
  value1.l
  quality.l
  Repeat
    r1 = OpcReadWord(*item1, @value1, @quality)

    If r1
      Debug GetErrorString(*Server, r1)
      OpcRelease(*server)
      End
    EndIf
    If quality = #OPC_QUALITY_GOOD
      Break
    Else
      count + 1
      If count > 10
        OpcRelease(*Server)
        Debug "PLC Offline"
        End
      EndIf
    EndIf
  ForEver
  Debug "Fertig."
  Delay(1000)  
  ; item lesen
  value1.l
  quality.l
  
  While exit = 0
   r1 = OpcReadWord(*item1, @value1, @quality)

    If r1
      Debug GetErrorString(*Server, r1)
    Else
      Debug "Item 1 gelesen: " + Str(value1) + " Qulity: " + GetQualityText(quality)
    EndIf
    Delay(2000)
  Wend
  
  ; Server beenden - Intern werden automatisch die Gruppen gelöscht (OpcRemoveGroup(...))
  Debug "Beenden Server"
  r1 = OpcReleaseShutdown(*shutdown)
  r1 = OpcRelease(*Server)
  Debug "Fertig"
  
EndProcedure

Verfasst: 01.07.2009 17:45
von mk-soft
Mi Michi,

der Item name ist falsch. Müsste "verbindungsname.ordnername.variablenname" heißen.
Vielleicht mal mit ein OPC-Testclient (Siemens Scout) mal nach den Items browsen. Wenn er nicht erreichbar ist muss dieser eventuell in der Startkonfiguration erst mit angewählt werden.
Ist schon etwas her wo ich auf den OPC-Server von WinCC gearbeitet habe.

FF :wink:

P.S. Zur Zeit habe ich kein WinCC installiert da ich diesen zur Zeit auch nicht brauche.

WinCC

Verfasst: 01.07.2009 19:24
von derMicha
Hi MKsoft ,

mit dem oben beschriebenen Beispiel , also nur mit dem Variablennamen bekomme ich einen Read hin . Was meinst du mit Ordnername ? Den Gruppennamen des Variablenordner in WinCC ?

gruß
derMicha

Verfasst: 01.07.2009 21:01
von mk-soft
Der Fehlercode sagte aus Itemname nicht verfügbar

Code: Alles auswählen

Debug "Items anlegen"
  *item1 = OpcAddItem(*Group, "", "testo")  ;############# Hier die in WinCC definierte Variable wählen
  If *item = 0
    Debug GetErrorString(*Server, OpcGetLastError())
    r1 = OpcReleaseShutdown(*shutdown)
    r1 = OpcRelease(*Server)
    ProcedureReturn 0
  EndIf
Dann ist die Auswertung nicht ganz richtig. OpcAddItem liefert NULL zurück wenn ein fehler aufgetretten ist

Brows mal mit ein OPC-TestClient um zu sehen woe die Items richtig heißen

Verfasst: 01.07.2009 21:27
von derMicha
Da habe ich mich wohl verkehrt ausgedrückt ,

Code: Alles auswählen

*item1 = OpcAddItem(*Group, "", "testo")  ;############# Hier die in WinCC definierte Variable
testo ist die Variable in WinCC , das funktioniert so wie hier im Code beschrieben.

Alles andere like OPC.SimaticNET Beispiel hat nicht gefruchtet wie zb S7:[Verbindungsname] oder verschiedene von mir ausprobierte kombinationen . Deswegen fragte ich nach dem ordnernamen . Ich versuchte ein nicht in dem WinCC Projekt definiertes Item hinzuzufügen wie zb. MW4 .
Habe ebend mal versucht ein Real auszulesen , giebt es da evt. eine Siemensbesonderheit ? OPCReadFloat giebt mir andere Werte zurück wie in WinCC angezeigt .

Verfasst: 01.07.2009 22:22
von derMicha
sorry , mit dem real ist alles ok , ich hatte das erste siemensbeispiel benutzt , callback , und umgemünzt . Mit den anderen Beispielen deiner .rar mit dem VT_STR(result(i)) klappt es .
Klasse sache deine DLL .

Verfasst: 01.07.2009 22:55
von mk-soft
Die Beispiel sind eher Testprogramme. Werde Wohl mal einige bessere Beispiele schreiben.
Jeder OPC-Server hat seine Schreibweise der Items. Muss man dann leider jedesmal nachlesen wie die Syntax ist.

Noch einmal zu der automatischen Typenanpassung.

OpcReadFloat liest nicht das Item als Float aus der Steuerung, sondern wandelt den gelesenen Wert in Float um. Wie OpcReadString das Item als String zurück gibt.
Welcher Type gelesen wird ist abhändig wie das Item angelegt wird.
z.B. Siemens:
Merker Float = "S7:[Labor]mreal4"
DB String = "S7:[Labor]db100,String0.20"

Somit kann man mit OpcWriteString auch in ein Float in der Steuerung schreiben. z.B OpcWriteString(*item, "100,5")

FF :wink:

P.S. Mit OpcGetItemDataType(*Item) kann man den Type des Item abfragen. Das Ergebnis entspricht den Variant Typen. (#VT_R4, etc)

noch ne Frage

Verfasst: 15.08.2009 23:02
von derMicha
Ich hätte da noch ne Frage ,

bin ein bisschen noch am Probieren nur in dem einen Source des Downloads ist ein Verweis auf eine OPCFunctionsV22.pb anstatt der sonst verwendeten PBOPC.pbi . Diese ist nicht in dem Downloadordner vorhanden ist. Hat die einen besonderen Hintergrund oder ist die PBOPC.pbi ohne Probleme überall verwendbar ?


gruß der Micha

Verfasst: 16.08.2009 20:32
von mk-soft
Die "PBOPC.pbi" und die "PBOPC.lib" ist immer erforderlich um mit der DLL zu verlinken. Die "OpcFunctionsV22.PB" ist mein Source-Code der DLL und war wohl noch in den Testcodes verlinkt.
Dieser wird zur Zeit nicht veröffendlich.

P.S. Wie läuft es denn mit deine OPC-Client Programme?

Verfasst: 20.08.2009 01:07
von derMicha
Im moment bin ich das ´Umfeld `am zusammenstricken . Ich möchte 6 Anlagen auf dem Intranet in unserer Firma verfügbar machen , welche als Standalonerechner mit WinCC vorhanden sind. Die ersten Tests mit deiner dll sind erfolgreich verlaufen , werde die tage mal sehen ob ich per d-com die komponenten als node abfragen kann .