|
Registriert seit: 18. Aug 2008 Ort: Berlin 759 Beiträge Turbo Delphi für Win32 |
#16
@sirius
Habe das erstmal wie folgt gelöst. Weiß nicht, ob das so wirklich logisch ist aber bisher tut es seine Tätigkeit. Hier erstmal der Code: in der ersten Unit wird geprüft, ob die DLL vorhanden ist. Wenn sie vorhanden ist, wird eine Komponente kreiert, die in der 2. Unit eingeführt wird.
Delphi-Quellcode:
In der 2. Unit wird die TV_Tische-Class eingeführt und hier sämtliche benötigten Funktionen statisch aus der DLL ausgelesen. Das war leider so nötig, wegen den Problemen, die beim dynamischen Laden aufgetreten sind.
function THUnterthread.DLL_suche(const sDatei: string): THandle;
var DLL_Handle: THandle; begin try DLL_Handle:=LoadLibrary(PChar(ExtractFilePath(ParamStr(0))+sDatei)); if DLL_Handle <> 0 then result := DLL_Handle else result := 0 except result := 0; end; end; procedure THUnterthread.Verschiebetische_initialisieren; begin iThreadmsg := 2; if DLL_suche('MMC.DLL') <> 0 then begin V_Tische := TV_Tische.create; iThreadmsg := 3; VTComPort_ermitteln; Komponente_anlegen('MMC.DLL','Verschiebetische', VTComPort_ermitteln); end else iThreadmsg := 4; end;
Delphi-Quellcode:
Im Nachhinein ist es glaube ich auch möglich dies alles dynamisch zu machen. Werde dies auch gleich mal probieren. Das Problem an sich ist, dass ich wenn ich für die meisten boolschen-DLL-Funktionen die mir die DLL bietet auf einer Com-Schnittstelle, an der ein anderes Gerät angeschlossen ist (bei mir war das z.B. die Maus) meist den Wert true zurück bekam. Dadurch wurde die Verifizierung des richtigen Com-Ports sehr schwierig. Deswegen habe ich die MST_moving benutzt, da dies die einzige von mir gefundene DLL-Funktion ist, die wirklich true ist, wenn die Tische angesprochen werden.
unit VT_Funktionen;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, ComCtrls; const maxComPort = 100; Bautrate = 9600; ExtLib = 'MMC.DLL'; constMillimeter = 6400; type TV_Tische = class private Tischbmp: TBitmap; function Bewegtsich(const Kanal: integer): boolean; function Bremsen: boolean; function Geschwindigkeit_festlegen(const iGeschwindigkeit: integer): boolean; function Beschleunigung_festlegen(const iBeschleunigung: integer): boolean; public DLL_Handle: THandle; bBewegung, bkalibriert: boolean; iaktuelleTischposition, iZielTischposition, iComport, iFehlercode: integer; bAngeschlossen: boolean; constructor create; reintroduce; destructor Destroy; override; function VTische_verbinden(Comport: integer): boolean; function Kalibrierung(const Kanal: integer): boolean; function BewegenABS(dneuPos: double): boolean; overload; function BewegenABS(const KaliPos: string): boolean; overload; function BewegenABS(dneuPos: double; iGeschwindigkeit: integer): boolean; overload; function BewegenABS(dneuPos: double; iGeschwindigkeit, iBeschleunigung: integer):boolean; overload; end; {*********************************************************************************** * allgemeine Funktionen für Verschiebetische * ***********************************************************************************} {**********************************Ende Funktionen**********************************} {*********************************************************************************** * Funktionen für Verschiebetische * ***********************************************************************************} function MMC_COM_open(portnumber,baudrate:integer):integer; stdcall external ExtLib; function MMC_COM_close:integer; stdcall external ExtLib; // function MMC_COM_setBuffer:integer; stdcall external ExtLib; // function MMC_sendString(pCmd:pChar):integer; stdcall external ExtLib; // function MMC_sendCommand(pCmd:pChar):integer; stdcall external ExtLib; // function MMC_getPos:integer; stdcall external ExtLib; // function MDC_getPosErr:integer; stdcall external ExtLib; // function MMC_getVal(query:integer):integer; stdcall external ExtLib; // function MMC_getReport(pCmd,psRead:PChar):integer; stdcall external ExtLib; // function MMC_getStringCR(psRead:PChar):integer; stdcall external ExtLib; // function MDC_moving:integer; stdcall external ExtLib; // function MST_moving:integer; stdcall external ExtLib; // function MMC_initNetwork(maxaxis:integer):integer; stdcall external ExtLib; // function MMC_select(newaxis:integer):integer; stdcall external ExtLib; // function MMC_setDevice(newaxis:integer):integer; stdcall external ExtLib; // function MMC_COM_clear:integer; stdcall external ExtLib; // function MMC_COM_EOF:integer; stdcall external ExtLib; // function MMC_getSTB(byteno:integer):integer; stdcall external ExtLib; // function MDC_waitStop:integer; stdcall external ExtLib; // function MST_waitStop:integer; stdcall external ExtLib; // function MMC_getDLLversion:integer; stdcall external ExtLib; function MMC_moveA(axis,position:integer):integer; stdcall external ExtLib; function MMC_moveR(axis,shift:integer):integer; stdcall external ExtLib; function MMC_getMacro(macno:integer;content:PChar):integer; stdcall external ExtLib; function MMC_globalBreak:integer; stdcall external ExtLib; {**********************************Ende Funktionen**********************************} implementation constructor TV_Tische.create; begin inherited create; bBewegung := false; bkalibriert := false; bAngeschlossen := false; end; function TV_Tische.Geschwindigkeit_festlegen(const iGeschwindigkeit: Integer): boolean; begin try MMC_sendCommand(PAnsiChar('SV'+inttostr(iGeschwindigkeit))); result := true; except result := false; end; end; function TV_Tische.Beschleunigung_festlegen(const iBeschleunigung: Integer): boolean; begin try MMC_sendCommand(PAnsiChar('SA'+inttostr(iBeschleunigung))); result := true; except result := false; end; end; function TV_Tische.Bremsen: boolean; begin try Geschwindigkeit_festlegen(0); Beschleunigung_festlegen(0); MMC_sendCommand('AB') except end; end; function TV_Tische.BewegenABS(dneuPos: double): boolean; begin Geschwindigkeit_festlegen(500); Beschleunigung_festlegen(500); MMC_sendCommand(PAnsiChar('MA' + inttostr(round(dneuPos*constMillimeter)))); end; function TV_Tische.BewegenABS(const KaliPos: string): boolean; begin Geschwindigkeit_festlegen(1000); Beschleunigung_festlegen(1000); MMC_sendCommand(PAnsiChar(KaliPos)); end; function TV_Tische.BewegenABS(dneuPos: double; iGeschwindigkeit: integer): boolean; begin Geschwindigkeit_festlegen(iGeschwindigkeit); Beschleunigung_festlegen(500); MMC_sendCommand(PAnsiChar('MA' + inttostr(round(dneuPos*constMillimeter)))); end; function TV_Tische.BewegenABS(dneuPos: Double; iGeschwindigkeit: Integer; iBeschleunigung: Integer): boolean; begin Geschwindigkeit_festlegen(iGeschwindigkeit); Beschleunigung_festlegen(iBeschleunigung); MMC_sendCommand(PAnsiChar('MA' + inttostr(round(dneuPos*constMillimeter)))); end; function TV_Tische.VTische_verbinden(Comport: integer): boolean; begin try MMC_COM_open(Comport, Bautrate); BewegenABS('FE2'); if MST_moving = 1 then begin Bremsen; end except result := false; end; end; function TV_Tische.Kalibrierung(const Kanal: integer): boolean; begin try MMC_setDevice(Kanal); BewegenABS('FE2'); except end; end; function TV_Tische.Bewegtsich(const Kanal: integer): boolean; begin MMC_setDevice(Kanal); if MST_moving = 1 then result := true else result := false; end; destructor TV_Tische.Destroy; begin Bremsen; MMC_COM_close; inherited Destroy; end; end. Wie gesagt, mit den Erkenntnissen sollte es jetzt auch möglich sein, alles dynamisch zu machen. Meine neue Frage hierzu wäre: Ist dies wirklich noch nötig oder kann ich es so lassen? Vielen Dank BAMatze |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |