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.
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 die Funktionen habe ich schon ausgelesen. Mir fehlen nur noch die Parameter für den DllCall. Vielleicht kann ja jemand was mit der Dll anfangen.
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")
Func _ErrFunc()
ConsoleWrite("! COM Error ! Number: 0x" & Hex($oError.number, & " ScriptLine: " & $oError.scriptline & " - " & $oError.windescription & @CRLF)
Return
EndFunc ;==>_ErrFunc
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?
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
' request/response/event mode:
Public 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
Alles anzeigen
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
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
AddressOf musst du mit einem DLLCallbackGetPtr ersetzen, also OnResponseGlobalEvents zuerst als DLLCallback registrieren