OPC-Helper DLL für PB (Beta)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
derMicha
Beiträge: 8
Registriert: 01.07.2009 00:10

connect mit WinCC

Beitrag 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
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
derMicha
Beiträge: 8
Registriert: 01.07.2009 00:10

WinCC

Beitrag 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
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
derMicha
Beiträge: 8
Registriert: 01.07.2009 00:10

Beitrag 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 .
derMicha
Beiträge: 8
Registriert: 01.07.2009 00:10

Beitrag 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 .
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
derMicha
Beiträge: 8
Registriert: 01.07.2009 00:10

noch ne Frage

Beitrag 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
Benutzeravatar
mk-soft
Beiträge: 3700
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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?
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
derMicha
Beiträge: 8
Registriert: 01.07.2009 00:10

Beitrag 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 .
Antworten