Seite 2 von 4
Re: DLL richtig verwenden?
Verfasst: 05.03.2010 19:43
von edel
Am besten nimmst du die DLL aus dem Ordner "Example Visual C V6", die Headerdatei kannste auch gleich nach pb portieren.
Die C DLL passen besser zu PB als jede andere Version.
Re: DLL richtig verwenden?
Verfasst: 05.03.2010 20:28
von mk-soft
Der Header Importer kommt mit der Datei nicht klar. Die Konstanten und Structuren werden übersetzt. Nur die Funktionen nicht.
Auszug
Code: Alles auswählen
extern "C" {
//
__declspec(dllexport) bool __cdecl _MPI_A_Einleitung_RS232(int* Handle, int ComNr, long BaudRate, BYTE PGMPIAdresse, BYTE HoechsteMPI, bool* SchnittstelleWarSchonAllokiert, WORD* Error);
__declspec(dllexport) bool __cdecl _MPI_A_Einleitung_NetLink(int* Handle, char* _IPAdresseStr, BYTE PGMPIAdresse, BYTE HoechsteMPI, WORD* Error);
__declspec(dllexport) bool __cdecl _MPI_A_Einleitung_NetLinkPro(int* Handle, char* _IPAdresseStr, BYTE PGMPIAdresse, BYTE HoechsteMPI, WORD* Error);
__declspec(dllexport) bool __cdecl _MPI_A_Einleitung_NetLinkPro_TCP_AutoBaud(int* Handle, char* IPAdresseStr, BYTE PGMPIAdresse, BYTE HoechsteMPI, WORD* Error);
__declspec(dllexport) bool __cdecl _MPI_A_Einleitung_NetLinkPro_TCP_SelectBaud(int* Handle, char* IPAdresseStr, BYTE PGMPIAdresse, BYTE HoechsteMPI, bool IstProfibusDP, WORD VorgabeBaudrate, WORD* Error);
__declspec(dllexport) bool __cdecl _MPI_A_Einleitung_TCP_IP_Direct(int* Handle, char* IPAdresseStr, int CPUSlotNr, WORD* Error);
__declspec(dllexport) bool __cdecl _MPI_A_Einleitung_SimaticNet(int* Handle, WORD* Error);
__declspec(dllexport) bool __cdecl _MPI_A_GetErreichbareTeilnehmer(int Handle, int *Teilnehmer, int* AnzahlTeilnehmer, WORD* Error);
//
__declspec(dllexport) bool __cdecl _MPI_A_SetRoutingData(int Handle,
BYTE ZielBaugruppeSlotNr, BYTE ZielBaugruppeRackNr, BYTE ZielBaugruppeMPI_DP_Adresse,
char* ZielBaugruppeIPAdresseStr, WORD ZielSubnetzID_High, WORD ZielSubnetzID_Low,
?
Re: DLL richtig verwenden?
Verfasst: 05.03.2010 20:37
von Kiffi
mk-soft hat geschrieben:P.S. Wenn diese mit VB6 zu verwenden geht dann hat die DLL nicht mit dotnet zu tun.
doch, hat sie. Ich saug es mir ja schließlich nicht aus den Fingern.
http://www.mhj-software.com/DownLoad/Ha ... vS7-V6.pdf
Kapitel 3.4: C#
Grüße ... Kiffi
Re: DLL richtig verwenden?
Verfasst: 05.03.2010 21:26
von The_Dark_Zim-.-
^^ okey ich guck mir das mal an, kann ja nur schief gehen XD
Thx so far :P
Re: DLL richtig verwenden?
Verfasst: 05.03.2010 22:00
von edel
mk-soft hat geschrieben:Der Header Importer kommt mit der Datei nicht klar. Die Konstanten und Structuren werden übersetzt. Nur die Funktionen nicht.
Auszug
Das sollte sehr einfach sein :
Code: Alles auswählen
importc "hierdielib"
_MPI_A_Einleitung_RS232(*Handle,ComNr,BaudRate,PGMPIAdresse,HoechsteMPI, *SchnittstelleWarSchonAllokiert,*Error)
[...]
endimport
usw.
Re: DLL richtig verwenden?
Verfasst: 07.03.2010 16:44
von The_Dark_Zim-.-
Also irgentwie komme ich nicht weiter.. gibt es da kein gutes Tutorial für. Und was ist dieses "Header Importer" ? Brauch ich das ?
Wäre nett wenn einer ein kleines Beispiel hat ^^
Gruß Zim
Re: DLL richtig verwenden?
Verfasst: 07.03.2010 17:02
von ts-soft
Headerimporter erspart einem zwar etwas schreibarbeit, aber das Ergebnis ist im allg. ohne
Korrekturen nicht anwendbar.
Du mußt also alle Konstanten in der C++ Headerdatei nach PB übertragen, sowie alle
Strukturen. Dann Importierst Du die Funktionen, wobei wieder bei den Variablen Typen
die entsprechenden PB Pendants zu wählen sind.
Ohne Grundkenntnisse in C wird das nichts werden. Gemeint sind hier aber nur die
minimalsten Grundlagen in C, hat man in wenigen Tagen gelernt, vor allem wenn man
viel mit der WinAPI arbeitet, wo ja auch alles in C dokumentiert ist.
Tutorial gibts da keins und wirds wohl nie geben. Beispiele gibts wie Sand am mehr,
aber ohne C-Grundkenntnisse wirste das nicht verstehen.
Gruß
Thomas
Re: DLL richtig verwenden?
Verfasst: 07.03.2010 18:51
von The_Dark_Zim-.-
Oo das kann doch nicht so schwer sein eine DLL zu verweden ...
Also nochmal, Ich hab eine DLL von MHJ-Software, namens "MPIA32_V60_VB.dll". Die habe ich für Visual Basic, Delphi und C oder C++. Dann hab ich noch die Declaration der Befehle.
Ich habe jetzt das Problem das ich nicht weis wie ich die Antworten der DLL bekomme. Das kann doch eingentlich nicht so schwer sein ? Gibt es überhaupt ein Unterschied bei den DLL's ? Müsste das nicht mit allen gehen ?
Gruß Zim
Re: DLL richtig verwenden?
Verfasst: 07.03.2010 19:02
von ts-soft
Es gibt normalle windows DLLs = stdcall, dann gibts die unter C üblichen mit CDECL Konventionen.
Desweiteren gibts ActiveX DLLs für VB, Delphie usw., sowie welche für .NET und noch andere.
Das einfachste wäre die Verwendung der DLL für C. Die Funktionen importieren,
evtl. Strukturen und Konstanten definieren und dann kannste loslegen. Ist nicht
schwer. Aber Grundkenntnisse in C wären schon notwendig.
Aber ich werde mir das jetzt nicht installieren um an die notwendige DLL und die
Header-Dateien zu kommen, zu mal ich dann mangels Hardware trotzdem nicht testen
kann.
Re: DLL richtig verwenden?
Verfasst: 08.03.2010 12:03
von Rings
ich habe ne sps, einen alten seriellen Adapter,
also hab ichs mal grad übersetzt.
ist wirklich einfach, beachte die VB6 deklarationen und
dann mein PB-Befehl dazu .
Das ganze ist ohne Prototypen gemacht,
klassisch halt:
Code: Alles auswählen
; TEST MHJ DLL MPI Seriell
; S.Rings, march 2010
;library öffnen
sMPILIB_NAME.s="mpia32_v60_vb.dll"
iLib=OpenLibrary(#PB_Any,sMPILIB_NAME)
If iLIB
Debug iLIB
MPIHandle.l
;Declare Function MPI6_OpenRS232 _
;Lib "mpia32_v60_vb.dll" (ByRef Handle As Long, ByVal ComNr As Long, ByVal BaudRate As Long, _
;ByVal PGAddress As Byte, ByVal HighestAddress As Byte, ByRef ComWasAlreadyUsed As Long, _
;ByRef Error As Integer) As Long
MPIHandle.l
ComNr.l=1
BaudRate.l=19200
PGMPIAdresse.b=0
HoechsteMPI.b=31
SchnittstelleWarAllokiert.l=0
MyError.l
Ret_Value.l = CallFunction(iLib,"MPI6_OpenRS232",@MPIHandle, ComNr, BaudRate, PGMPIAdresse, HoechsteMPI, @SchnittstelleWarAllokiert, @MyError)
Debug ret_Value
Debug Myerror
If myerror=0 And ret_Value=1
;Declare Function MPI6_ConnectToPLC _
;Lib "mpia32_v60_vb.dll" (ByVal Handle As Long, ByVal PlcAddress As Byte, ByRef Error As Integer) As Long
AGMPIAdresse=2 ;MPI-Adresse SPS = 2
Ret_Value.l = CallFunction(iLib,"MPI6_ConnectToPLC",MPIHandle, AGMPIAdresse, @MyError)
If Ret_Value
Debug "Verbindung zum AG wurde aufgebaut!"
KommunikationAufgebaut = 1
Else
Debug "Fehler beim Aufbauen der Verbindung zum AG!"
KommunikationAufgebaut = 0
EndIf
If KommunikationAufgebaut
;Das mit den (st)rings geht irgendwie nicht
;Declare Function MPI6_GetOrderNrPlc _
;Lib "mpia32_v60_vb.dll" (ByVal Handle As Long, ByVal OrderNrStr As String, ByRef Error As Integer) As Long
mem=AllocateMemory(255)
Ret_Value = CallFunction(iLib,"PI6_GetOrderNrPlc",MPIHandle,@mem, @MyError)
Debug mem
If ret_value
Debug PeekS(mem);BestellNrString
Debug mem
Else
Debug ret_Value
Debug Myerror
ErrorString.s=Space(256)
Ret_Value = CallFunction(iLib,"MPI_A_GetDLLError",MPIHandle, @ErrorString, @MyError)
Debug errorstring
EndIf
If mem : FreeMemory(mem):EndIf
;Inhalt von DB10 auslesen
;Declare Function MPI_A_ReadDBWort _
;Lib "mpia32_v60_vb.dll" (ByVal Handle As Long, _
;ByVal Von As Integer, ByVal AnzahlWorte As Integer, _
;ByRef StatusBuffer As Integer, ByVal DBNummer As Integer, _
;ByRef Error As Integer) As Long
For I=1 To 10
Von.w = 0
AnzahlWorte.w = 10
DBNummer.w = 10
StatusBuffer.w
mem=AllocateMemory(AnzahlWorte*2)
ret_value= CallFunction(iLib,"MPI_A_ReadDBWort",MPIHandle, Von, AnzahlWorte, mem, DBNummer, @rError)
If myerror=0
Debug Str(PeekW(mem)) +"," + Str(PeekW(mem+2)) +"," + Str(PeekW(mem+4)) +"," + Str(PeekW(mem+6))
Else
Debug ret_Value
Debug Myerror
EndIf
If mem : FreeMemory(mem):EndIf
Next
;Beenden
;Declare Function MPI6_CloseCommunication _
;Lib "mpia32_v60_vb.dll" (ByVal Handle As Long, ByRef Error As Integer) As Long
Ret_Value = CallFunction(iLib,"MPI6_CloseCommunication",MPIHandle, @MyError)
Debug "Kommunikation wurde beendet!"
EndIf
EndIf
CloseLibrary(iLIB)
Else
MessageRequester("ACHTUNG","LIBRARY KANN NICHT GEÖFFNET WERDEN",0)
EndIf