PVI von B&R in AutoIt

  • Hallo und frohe Ostern,

    hat jemand schonmal eine Verbindung hergestellt von AutoIt zu einer Steuerung von B&R über den PVI-Manager? Das ganze über DLL-Calls wie bei LibNoDave.

  • Also ich bin nunmal schon soweit gekommen, das ich das ganze mit AutoItObject mache. DllOpen funktioniert auch und ich bekomme ein Objekt. Nur wenn ich eine Funktion aufrufen will, kommt von meiner _ErrFunc die Meldung "Funktion nicht in angegebener DLL definiert.".

    [autoit]

    #include <AutoitObject.au3>

    [/autoit][autoit][/autoit][autoit]

    Global $oError = ObjEvent("AutoIt.Error", "_ErrFunc")

    [/autoit][autoit][/autoit][autoit]

    _AutoItObject_StartUp()
    $oPVICom = _AutoItObject_DllOpen("C:\Programme\BrAutomation\PVI\V3.00.02\Bin\PviCom.dll")
    $oPVICom.PviGetVersion("none")

    [/autoit][autoit][/autoit][autoit][/autoit][autoit]

    Func _ErrFunc()
    ConsoleWrite("! COM Error ! Number: 0x" & Hex($oError.number, 8) & " ScriptLine: " & $oError.scriptline & " - " & $oError.windescription & @CRLF)
    Return
    EndFunc ;==>_ErrFunc

    [/autoit]

    Laut DLL Export Viewer gibt es aber die Funktion.
    Woran kann das liegen?

  • Stellt die DLL wirklich ein COM-interface zur Verfügung? Wenn es DLLCalls sind, musst du auch DLLCall verwenden. Es muss eine Dokumentation mit den nötigen Parametertypen geben.

  • Ich weiß es nicht. Ich hab nur etwas wie sie in C++ und VB angewendet werden. Aber wenn es kein COM-Interface hat, würde ich dann ein object trotzdem bekommen?

  • Ich weiß es nicht. Ich hab nur etwas wie sie in C++ und VB angewendet werden. Aber wenn es kein COM-Interface hat, würde ich dann ein object trotzdem bekommen?


    Für AutoIt geht es ziemlich genau so wie für VB. Also wie wird es dort gemacht?

  • Vielen Dank, hab nun die Defines gefunden als .bas. Dort sind ja auch die Funktionen aufgeführt mit Parametern. Und siehe da, ich bekommen keinen Error mehr vom DLLCall.
    Aber wie schreib ich sowas um?

    Code
    Public Type T_PVI_INFO_LICENCE
            PviWorkState(0 To 1) As Byte      ; working state
            T_PviWorkState(0 To 1) As Byte    ; inverted working state
            Res1 As Long                      ; reserved
            LcName As String * PVI_LCNAME_LEN1  ; B&R license name
    End Type


    und dies


    Enum kenn ich ja, nur die Variable direkt hinter Enum weiß ich nicht wo sie hinkommt.

  • Vermutlich so:

    [autoit]

    ;' request/response/event mode:
    Global Enum _ ;E_POBJ_MODE
    $POBJ_MODE_NULL , _ ;' undefiened
    $POBJ_MODE_EVENT , _ ;' event
    $POBJ_MODE_READ , _ ;' read
    $POBJ_MODE_WRITE , _ ;' write
    $POBJ_MODE_CREATE , _ ;' create object
    $POBJ_MODE_DELETE , _ ;' delete object
    $POBJ_MODE_LINK , _ ;' link object
    $POBJ_MODE_CHGLINK , _ ;' change link object
    $POBJ_MODE_UNLINK ;' unlink object
    ;End Enum

    [/autoit][autoit][/autoit][autoit]

    Global Const $T_PVI_INFO_LICENCE = _
    "byte PviWorkState[2]; " & _ ; working state
    "byte T_PviWorkState[2]; " & _ ; inverted working state
    "long Res1; " & _ ; reserved
    "char LcName[" & $PVI_LCNAME_LEN1 & "];" ; B&R license name

    [/autoit]
  • Danke.

    Hab den nächsten Hänger, unzwar:

    Code
    PviSetGlobEventMsg POBJ_EVENT_PVI_CONNECT, AddressOf OnResponseGlobalEvents, SET_PVICALLBACK, 0


    Ich habe alle Variablen zugeordnet, mir fehlt nur noch das AddressOf. Womit kann ich das vergleichen in AutoIt?

  • AddressOf musst du mit einem DLLCallbackGetPtr ersetzen, also OnResponseGlobalEvents zuerst als DLLCallback registrieren