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

Beitrag von mk-soft »

werde die tage mal sehen ob ich per d-com die komponenten als node abfragen kann
Was meinst du als Node?
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 »

Code: Alles auswählen

OpcConnect(ServerName.s, ServerNode.s)
ist doch die IP adresse des servers der über Dcom angebunden ist , wenn ich das richtig nachgelesen habe nach opc standart. Ich habe bisher immer auf dem rechner probiert der den server am laufen hat , mal sehen ob das funzt.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag von mk-soft »

Wenn WinCC auf XP-Pro SP2 läuft lade dir von Siemens die Beschreibung zur Freigabe der DCom Schnittstelle für Netwerk herrunter. Mit SP2 sind die Sicherheitseinstellungen vom MS geändert worden was auch sinn macht.
Außerdem müssen die anderen PC mindesten Hauptbenutzerberechtigungen auf der WinCC Machine haben. Die DCOM-Schnittstelle richtig zu konfigurieren ist nicht gerade einfach. Für SimaticNet V6.3 oder WinCC 6 gibt es glaube ich bei Siemens ein Tool welches dir die Einstellungen übernimmt.

Habe bis jetzt immer Probleme gehabt auf Anhieb die DCOM richtig zu konfigurieren und nicht vergessen den Port für DCOM in der Firewall frei zu geben.
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

Re: OPC-Helper DLL für PB (Beta)

Beitrag von derMicha »

Ich bin gerade dabei ein App/runtime zu testen wo ich in Threads einmal die Verbindung über die dll halten und in weiteren Werte berechne usw. . Klappt mit den Abfragen gut . Bei zb. Verbindungsunterbrechung , meinem timeoutthread dauert es zulange oder wenn alle Items einen Fehler bringen , bau ich die OPC Verbindung ab und starte sie nach einer Zeit neu usw.. Nun ist mir beim testen aufgefallen das dabei meine Anwendung dabei Speichermäßig wächst . Hatte erst an irgendwelche Probleme mit den Thread´s gedacht aber als ich nach einigem herumprobieren nicht mehr weiterkam habe ich eines der Testprogramme genommen und lasse es verbinden , abfragen , neustarten usw. . Hier tritt das gleiche Problem auf wenn man dieses im taskmanager beobachtet . Bei meinen Tests kommt es mir so vor als wenn beim Neuverbinden und beim Abbau der speicher wächst .

Code: Alles auswählen

[code]
; Compiler : Unicode

; *********************************************************************************************************

IncludeFile "PBOPC.pbi"
IncludeFile "PBOPC_Help.pbi"
IncludeFile "VariantHelper_Include.pb"

Global restart = 0
; *********************************************************************************************************

#OPC_QUALITY_BAD = $00
#OPC_QUALITY_UNCERTAIN = $40
#OPC_QUALITY_GOOD = $C0
#OPC_QUALITY_CONFIG_ERROR = $04
#OPC_QUALITY_NOT_CONNECTED = $08
#OPC_QUALITY_DEVICE_FAILURE = $0c
#OPC_QUALITY_SENSOR_FAILURE = $10
#OPC_QUALITY_LAST_KNOWN = $14
#OPC_QUALITY_COMM_FAILURE = $18
#OPC_QUALITY_OUT_OF_SERVICE = $1C
#OPC_QUALITY_LAST_USABLE = $44
#OPC_QUALITY_SENSOR_CAL = $50
#OPC_QUALITY_EGU_EXCEEDED = $54
#OPC_QUALITY_SUB_NORMAL = $58
#OPC_QUALITY_LOCAL_OVERRIDE = $D8

; *********************************************************************************************************
Global Exit.l
Global y.l
Global Dim *items(6)

Procedure.s PeekUnicode(*text)
Protected result.s

If *text
result = PeekS(*text, #PB_Any, #PB_Unicode)
Else
result = ""
EndIf
ProcedureReturn result
EndProcedure

Procedure MyCallback(*szReason)

Debug "Shutdown erkannt: " + PeekUnicode(*szReason)
exit = 1

EndProcedure

Procedure test()
; OPC Server verbinden
Debug "OPC Server verbinden"
;*Server = OpcConnect("INAT TCPIPH1 OPC Server", "") ;MpiCom.OPC.Server
*Server = OpcConnect("MpiCom.OPC.Server", "") ;MpiCom.OPC.Server
Debug GetErrorString(*Server, OpcGetLastError())
If *Server = 0
ProcedureReturn 0
EndIf
Debug "Fertig OPC verbinden."
Delay(500)


Debug "Init Shutdown"
*Shutdown = OpcInitShutdown(*Server)
If *shutdown = 0
Debug GetErrorString(*Server, OpcGetLastError())
Else
Debug "Setze MyCallback"
OpcSetShutdownCallBack(*shutdown, @MyCallback())
EndIf

Debug "Fertig Init shutdown."
Delay(500)


; Gruppe anlegen
Debug "Gruppe anlegen"
*Group = OpcAddGroup(*Server, "Test")
Debug GetErrorString(*Server, OpcGetLastError())
If *Group = 0
ProcedureReturn 0
EndIf
Debug "Fertig Gruppe anlegen."
Delay(500)

; Items anlegen
Debug "Items anlegen"

prefix.s = "testverbindung."
*items(0) = OpcAddItem(*Group, "", prefix + "DB1.W8")
*items(1) = OpcAddItem(*Group, "", prefix + "mb4")
*items(2) = OpcAddItem(*Group, "", prefix + "db1.w0")
*items(3) = OpcAddItem(*Group, "", prefix + "db1.w2")
*items(4) = OpcAddItem(*Group, "", prefix + "db1.w4")
*items(5) = OpcAddItem(*Group, "", prefix + "db1.w6")
Debug "Fertig Items anlegen ."
Delay(500)

; wait for plc
Debug "PLC Verbinung püfen"
value1.l
quality.l
Repeat
r1 = OpcReadWord(*items(0), @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 Verbindung prüfen."
Delay(500)
; item lesen


While exit = 0
; r1 = OpcReadWord(*items(0), @value1, @quality)
If r1
Debug GetErrorString(*Server, r1)
Else
Debug "Item 1 gelesen: " + Str(value1) + " Qulity: " + GetQualityText(quality)
EndIf
Delay(200)


y = y + 1
If y = 5
exit = 1
EndIf

Wend

; Server beenden - Intern werden automatisch die Gruppen gelöscht (OpcRemoveGroup(...))
Debug "Beenden Server"
r1 = OpcReleaseShutdown(*shutdown)
r1 = OpcRelease(*Server)
Debug "Fertig beenden."
Delay(500)
EndProcedure

For x = 1 To 200
test()
exit = 0
y = 0
Next x
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: OPC-Helper DLL für PB (Beta)

Beitrag von mk-soft »

Bei ReleaseServer(...) sollte der Speicher wieder freigeben sein. Bei meinen Tests war dieses auch so. OpcReleaseShutdown(*shutdown) sollte vor ReleaseServer(...) nicht vergessen werden.

Bei Threads verwende ich einen zweiten Thread als Überwachung falls doch mal der OPC-Server nicht mehr reagieren sollte. Vernichte dann denn Daten Thread mit Killthread was aber natürlich zu speicherlecks führt.

FF :wink:

P.S.
Habe warscheinlich den Speicherleck gefunden. Muss noch RemoveGroup(...) auf die angelegten Items prüfen und aus der internen Item Liste löschen.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: OPC-Helper DLL für PB (Beta)

Beitrag von mk-soft »

Update v2.27

Die Items werden jetzt automatisch bei OpcRemoveGroup und OpcRelease aus der interen Liste entfernt.

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: OPC-Helper DLL für PB (Beta)

Beitrag von mk-soft »

Update v2.30

Bugfix:
- Speicherleck bei OpcRemoveGroup(...) und OpcRelease(...)

Fixed für PB4.40:
- VariantHelper_Include.pb auf Version v2.10

P.S. PB 4.40
Der Debugger von PB ist so schnell geworden das in den Testcodes bei Verbindung Prüfen... ein Delay(100) eingebaut werden muss.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: OPC-Helper DLL für PB (Beta)

Beitrag von mk-soft »

Update v2.4

- Fixed: Speicherleck bei Items löschen.
- Neu: Das ShutdownObject ist jetzt ein Teil des ServerObject und es wird allen Shutdown-Funktionen das ServerObject angegeben.
- Neu: OpcRelease(...) beendet jetzt auch automatisch das ShutdownObject.

FF :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten