Seite 3 von 4

Verständnis Problem

Verfasst: 29.04.2009 11:50
von heiße Luft
Ich habe da ein Verständnis Problem.

Ach ja, schon lange nichts mehr mit PB gemacht und schon wieder vieles vergessen.

Der erste Teil des Codes ist Variablendeklaration. Ich mache das nicht so gerne on the fly.

Nach der Deklaration öffne ich in Zeile 76 die DLL PviCom.dell.
Geht das klar setze ich lib_laden_ok auf 1 und in Zeile 87 wird eine Init-Funktion aufgerufen.
Geht auch das klar wird die Procedure AnmeldenPvi() aufgerufen.
Diese wird auch korrekt abgearbeitet. Egal ob ich einen Fehler provoziere oder nicht (also egal welcher Weg durch die if Abfrage genommen wird).
Ich bekomme immer die Ausgabe aus Zeile 70.
Jetzt sollte das Programm doch eigentlich in Zeile 89 Weitermachen (direkt nach AnmeldenPvi() ) oder?
Das Programm kommt dort aber nicht an und bleibt ohne Fehlermeldung stehen.
Wo ist mein (Denk) Fehler?

Grüße hL

Code: Alles auswählen

; *****************************************************************************
;*                                                                            *
;* Online Verwaltung von User Rezepten                                        *
;*                                                                            *
;* Beginn 22.04.2009                                                          *
;*                                                                            *
;* Version 0.0.0.1                                                            *
;* Stand: 27.04.09                                                            *
;*                                                                            *
;* Autor: heiße Luft                                                          *
;******************************************************************************


; Deklaration
Lib_laden_ok.b = 0 ; wird gesetzt wenn PviCom.dll gefunden und geöffnet wurde
Global Quit.b = 0 ; wird gesetzt (1) wenn das Programm beendet werden soll

Define.l Event, WindowID, GadgetID, EventType, MenuID

Global Adresse.l
Global RPV1.w, RPV2.w, RPV3.w, RPV4.w, WPV1.w, WPV2.w, WPV3.w, WPV4.w, BR_SIM.b
Global ObjectPath.s,ObjectPath_PV1.s,ObjectPath_PV2.s,ObjectPath_PV3.s,ObjectPath_PV4.s
Global LPARAM.l, WPARAM.l
Global WPV1_S.s,WPV2_S.s,WPV3_S.s,WPV4_S.s

Global Meldung1.s 
Enumeration
 #RPV1
 #RPV2
 #RPV3
 #RPV4
 #Meldung
 #WPV1
 #WPV2
 #WPV3
 #WPV4
 #But_Lesen
 #But_Schreiben
 #But_Sim
 #But_Beenden

 EndEnumeration 
 
 ;PVI VAriablen
 Global errNum.l = 0 ; Fehlernummer PVI
 Global hPvi.l    ; für Funktion PviLink Instanzhandel
 
;Hilfsvariablen für die Etwicklung, Kann nach Fertigstellung glöscht werden 
Timer.l        = 0
RPV1 = 1
RPV2 = 2
RPV3 = 3
RPV4 = 4


Procedure AnmeldenPvi()

 If errNum = CallFunction(0,"PviLink",hPvi,"Pvi","0",1,"0")
 Debug errNum
 Debug  "Anmeldung funktioniert"; Meldung1 = "Anmeldung funktioniert"
 
   Else    
      Debug "Can't link to PVI object!"
      Debug errNum
      ;Meldung1 ="Anmeldung fehlgeschlagen"
      Quti = 1
 EndIf  

       
Debug "procedure ende"
EndProcedure


; PviCom.dll öffnen und initialisieren

  If OpenLibrary(0,"PviCom.dll")
    lib_laden_ok = 1
  EndIf     

  If lib_laden_ok = 0 
     Meldung1 = "dll konnte nicht geladen werden"
   Else
     Meldung1     = "dll wurde geladen"
     Adresse      = GetFunction(0,"PviInitialize")   ; Adresse der Funktion PviInitialize holen
     ComTimeout.l = 200 ; Kommunikations Timeout für Den PVI Manager in Sekunden
     RetryTime.l  = 200 ; Wiederholungszeit für PVICOM Anwedermeldung in Sekunden
     If errNum = CallFunctionFast(Adresse,ComTimeout, Retrytime,"0",0) ; PVI Manager initialisieren
         AnmeldenPvi()
         Debug "zurück in Schleife"
         
     EndIf
  EndIf
 

 
; Hauptprogramm
 If OpenWindow(0,0,0,640,480,"Rezeptverwaltung",#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget)

Re: Verständnis Problem

Verfasst: 29.04.2009 12:01
von Kiffi
ähm, ja...

ist schon ein wenig wuselig, Dein Code, gell? ;-)

Code: Alles auswählen

If errNum = CallFunction(0,"PviLink",hPvi,"Pvi","0",1,"0")
 Debug errNum
 Debug  "Anmeldung funktioniert"; Meldung1 = "Anmeldung funktioniert"
ich nehme mal an, dass das eher so aussehen sollte:

Code: Alles auswählen

errNum = CallFunction(0,"PviLink",hPvi,"Pvi","0",1,"0")
If errNum
 Debug errNum
 Debug  "Anmeldung funktioniert"; Meldung1 = "Anmeldung funktioniert"
oder? (Weiss nicht, was CallFunction() in diesem Fall zurückliefert. U.u.
muss errNum dann auf 0 geprüft werden.)

Ansonsten: Unbeding 'EnableExplicit' in die erste Zeile tippern.
Ich denke, dann fällt Dir auch folgende Zeile ins Auge:

Code: Alles auswählen

      Quti = 1
und: Du solltest in Deinem Code so wenig Global-Variablen wie nötig
verwenden. Schau Dir hierzu mal Protected und Shared in der Online-Hilfe an.

Grüße ... Kiffi

Verfasst: 29.04.2009 12:28
von Kaeru Gaman
>> Ich bekomme immer die Ausgabe aus Zeile 70.
>> Jetzt sollte das Programm doch eigentlich in Zeile 89 Weitermachen (direkt nach AnmeldenPvi() ) oder?

eigentlich ja.

aber wie Kiffi schon sagte, bring erstmal die IFs in ordnung...

Code: Alles auswählen

     If errNum = CallFunctionFast(Adresse,ComTimeout, Retrytime,"0",0) ; PVI Manager initialisieren
         AnmeldenPvi()
         Debug "zurück in Schleife"
         
     EndIf
das sieht aus als sollte es C sein...
"=" ist in PB wahlweise ein zuweisungs- und vergleichs-operator.
in diesem fall fungiert er als vergleich, d.h. es wird gar keine zuweisung stattfinden.

wann soll denn der Zweig ausgeführt werden.... doch wahrscheinlich wenn kein Fehler auftrat?
musst du die fehlernummer hier wirklich rückspeichern? ich sehe jedenfalls keine auswertung.

wie ist denn die allgemeine Rückgabe der Funktion?

bei PB-Funktionen bekommst du #False zurück, wenn die Funktion fehlgeschlagen ist,
ansonsten eine Nummer, je nachdem ein Handle, eine ID oder sonstwas.

wenn du deinen Rückgabewert in einen Container namens errNum packst,
läßt das darauf schließen, dass deine Funktion #Null zurückgibt, wenn sie erfolgreich war, ansonsten eine Fehlernummer.

also musst du dein IF grad umgekehrt einrichten wie für PB-Funktionen.

Code: Alles auswählen

     errNum = CallFunctionFast(Adresse,ComTimeout, Retrytime,"0",0) ; PVI Manager initialisieren
     
     If errNum = #Null  ; kein Fehler
         AnmeldenPvi()
         Debug "zurück in Schleife"
     EndIf

>> Ich mache das nicht so gerne on the fly.

das ist ganz prima! :allright:

... jetzt schreib noch EnableExplicit in den CodeKopf, und benutze Define vor deinen Erstdeklarationen, dann bekommst du deine Variablennamen auch im Autocomplete vorgeschlagen. :D

Verfasst: 29.04.2009 15:41
von heiße Luft
So meine Herren,

ich hoffe so gefällt es euch etwas besser.
Leider komme ich immer noch nicht aus der Procedure raus.

Die Ausgabe im Debuger ist folgende

zur Anmeldung
268459200
0
Anmeldung funktioniert
procedure ende

Danach steht das Prog. und ich muß es manuell beenden

Grüße hL

Code: Alles auswählen

; Deklaration
EnableExplicit
Define.b 
Define Lib_laden_ok = 0   ; wird gesetzt wenn PviCom.dll gefunden und geöffnet wurde
Define Quit         = 0   ; wird gesetz (1) wenn das Programm beendet werden soll
Define BR_SIM       = 0   ; hat entsprechung auf der PP41

Define.l 
Define Event, WindowID, GadgetID, EventType, MenuID 
Define Adresse      = 0   ; Variable für die Adressen der PVI Funktionen
Define LPARAM, WPARAM
Define errNum       = 0   ; Fehlernummer PVI
Define hPvi         = 0   ; inti Handel
Define ComTimeout   = 200 ; Kommunikations Timeout für Den PVI Manager in Sekunden
Define RetryTime    = 200 ; Wiederholungszeit für PVICOM Anwedermeldung in Sekunden

Define.w 
Define RPV1, RPV2, RPV3, RPV4, WPV1, WPV2, WPV3, WPV4

Define.s
Define ObjectPath,ObjectPath_PV1,ObjectPath_PV2,ObjectPath_PV3,ObjectPath_PV4
Define PV1_S,WPV2_S,WPV3_S,WPV4_S
Define Meldung1
  
Enumeration
 #RPV1
 #RPV2
 #RPV3
 #RPV4
 #Meldung
 #WPV1
 #WPV2
 #WPV3
 #WPV4
 #But_Lesen
 #But_Schreiben
 #But_Sim
 #But_Beenden

 EndEnumeration 
 
 DisableExplicit


Procedure AnmeldenPvi()
Shared Meldung1, Quit, hPvi
Static Adresse.l, errNum.l

Adresse = GetFunction(0,"PviLink")
Debug Adresse
errNum = CallFunctionFast(Adresse,hPvi,"Pvi","0",1,"0")
If errNum = #Null
   Debug errNum
   Debug  "Anmeldung funktioniert" 
   Meldung1 = "Anmeldung funktioniert"
 Else    
   Debug "Can't link to PVI object!"
   Debug errNum
   Meldung1 ="Anmeldung fehlgeschlagen"
   Quit = 1
 EndIf  
 Debug "procedure ende"
EndProcedure


; PviCom.dll öffnen und initialisieren

  If OpenLibrary(0,"PviCom.dll")
    lib_laden_ok = 1   ; DLL wurde gefunden und geladen
   Else
    lib_laden_ok = 0   ; DLL wurde nicht gefunden und geladen
  EndIf     

  If lib_laden_ok = 0 
     Meldung1 = "dll konnte nicht geladen werden"
   Else               ; wenn die DLL geladen wurde weiter zur Initialisierungs Funktion der DLL
     Meldung1 = "dll wurde geladen"
     Adresse  = GetFunction(0,"PviInitialize")   ; Adresse der Funktion PviInitialize holen
     errNum = CallFunctionFast(Adresse,ComTimeout, Retrytime,"0",0) ; PVI Manager initialisieren
     If errNum = #Null
        Meldung1 = "Init OK"
        Debug "zur Anmeldung"
        AnmeldenPvi()
      Else
        Debug "Fehler"
        Quit = 1
     EndIf    
    Debug "zurück in Schleife" ; <--- hier sollte das Programm nach AnmeldenPvi() fortfahren
  EndIf

Verfasst: 29.04.2009 16:05
von Kiffi
heiße Luft hat geschrieben:Leider komme ich immer noch nicht aus der Procedure raus.
tschoa, keine Ahnung, woran das liegt. Habe mal versuchsweise die
pvicom.dll geladen; diese möchte aber auch eine pvilog.dll, die ich
nirgendwo finde. Somit kann ich das hier nicht testen.

Grüße ... Kiffi

Verfasst: 29.04.2009 16:21
von ts-soft
> Danach steht das Prog. und ich muß es manuell beenden
Da ist keine Schleife, also gabs einen IMA?
Da sollte im Ausgabefenster auch die Zeile stehen, wahrscheinlich
CallFunctionFast, was man sowieso eher nicht verwenden sollte, lieber
Prototypes.

Ohne Header-Datei kann ich da nicht helfen, bzw. die dll wäre auch nützlich.

Verfasst: 29.04.2009 18:55
von heiße Luft
Das gesamte PVI gibts hier bei B&R. Das kann ich aber nicht verlangen, das ihr das installiert.
http://www.br-automation.com/cps/rde/xc ... U_HTML.htm

Die dll´s habe ich hier. Pass ist hL

Grüße hL
DLL

Verfasst: 29.04.2009 19:10
von ts-soft
Das Paket werde ich mir nicht installieren :wink:
Die DLLs ohne Header-Dateien sind nutzlos. In den Developer Tools sollten
auch Dateien mit der Endung .h sein, die sind wichtig! Evtl. noch die doku
dazu.

Verfasst: 29.04.2009 19:58
von Kiffi
das Setup habe ich mir nicht installiert, aber mit pvicom.dll und pvilog.dll
komm ich nun zumindest schon mal bis zum PviInitialize, welche dann
allerdings fehlschlägt. Ich schätze mal, dass mir jetzt Dateien aus dem
Setup oder die entsprechende Hardware fehlt.

Grüße ... Kiffi

Verfasst: 29.04.2009 20:43
von heiße Luft
ts-soft hat geschrieben:> Danach steht das Prog. und ich muß es manuell beenden
Da ist keine Schleife, also gabs einen IMA?
Da sollte im Ausgabefenster auch die Zeile stehen, wahrscheinlich
CallFunctionFast, was man sowieso eher nicht verwenden sollte, lieber
Prototypes.
@TS-Soft
IMA?
Warum sollte ich CallFunctionFast und/oder CallFunction meiden?
Wo liegt der Vorteil von Prototypes?

Wenn ich die Doku richtig verstanden habe, ist die Reihenfolge der benötigen Funktionen
PviInitialze
PviLink
PviCreateResponse

dann PviRead oder PviWrite
bis zum PviLink sollte es ohne Hardware gehen. Allerdings startet die Funktion PviInitialize den Pvi-Manager aus dem installierten PVI Paket.

Wer sich dafür interessiert. Das PVI kann sich jeder laden, da ist ein Web-Server, ein OPC-Server, ein DDE-Sever und Beispiele für Visual C, Visual Basic und Delpi dabei. Natürlich alles nur für B&R Hardware. Allerdings ist die Laufzeit des PVI ohne Dongel begrenzt.

Ich suche morgen mal in der Firma Doku und Header Dateien zusammen.
Was mich wundert, die Zeile vor dem Endprocedure wird noch ausgeführt. Dann sollte die CallFuctionFast doch beendet sein oder?

Grüße
heiße Luft