AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

mit LPT oder COM steuern

Ein Thema von AndyKaBea · begonnen am 20. Aug 2005 · letzter Beitrag vom 25. Aug 2005
Antwort Antwort
AndyKaBea

Registriert seit: 20. Aug 2005
Ort: Wien
1 Beiträge
 
Delphi 7 Enterprise
 
#1

mit LPT oder COM steuern

  Alt 20. Aug 2005, 19:54
Also, vorerst mal Hallo, und danke an alle die sich mir widdmen ...

Zu meinem Anliegen :

Ich hab ein Aquarium, welches ich nun mit ein paar kleinen spielerein erweitern möchte.
Genaugesagt soll es um ein dimmbares Vorschaltgerät für die Leuchtmittel ergänzt werden.
Das Vorschaltgerät ist recht leicht steuerbar :
Erstens wird es fix auf L, N und Pe geschlossen, und dann wird zusätzlich noch N fix angeschlossen, und L geschaltet zugeführt. Und genau über diese Leitung wird gesteuert.
Ist dieser 230Vrms Impuls <0,6sek wird das Leuchtmittel ein und aus geschaltet.
Bei längeren Impulsen dimmt die Leuchte bis der Impuls endet.

Endgültig möchchte ich das ganze recht toll lösen, mit nem µP, ner RTL, nem LDR usw ...

Bis dahin möchte ich ne Kurzlösung erstellen -> ich will mit dem PC diesen Impuls erzeugen ...
d.h. um 8 in der früh soll ein 0,4sek Impuls kommen ... bis mittags im stundentakt ein 1sek Impuls, sodass ca. um 2 Uhr die volle Helligkeit da ist, und er dann runterdimmt (macht der Dimmer automatisch, Impuls bleibt gleich), sodass am Abend so gegen 21 Uhr wieder der 0,4sek Impuls zum Abschalten kommt.


Hat Jemand eine Idee wie ich das lösen kann ? Ist LPT besser oder COM ? ...
Das umsetzen des 12V bei COM bzw. das 5V Signal bei der LPT kann ich, da ich in der Elektronik Branche arbeite. - Auch das Programmieren mit Assembler ist kein Problem .. - nur leider hier happerts bei mir noch --- hoffe aber, jetzt den Startschuss zu bekommen

so .. viel geschrieben .. - vielleicht hat Jemand einen Tip für mich ... sorry, bin momentan bei Delphi newbie (bin bei pascal, c++, etc. leider stehen geblieben)

ich dank Euch mal im vorhinein,
Andy


p.s. - verwende Win 2k/XP - sowie Delphi 7
  Mit Zitat antworten Zitat
Benutzerbild von chrisw
chrisw

Registriert seit: 11. Jan 2005
Ort: Schleswig
193 Beiträge
 
Delphi XE8 Professional
 
#2

Re: mit LPT oder COM steuern

  Alt 25. Aug 2005, 12:25
Ich würde die COM Schnittstelle nutzen und DTR zu den benötigten Zeiten für den benötigten Zeitraum auf High setzen.


Es werden hierzu zwei Timer benötigt
Timer1 = (Intervall 60000 (millisekunden)) jede Minute checken ob benötigte Zeiten erreicht;
Timer2 = (Interval 400 bzw 1000) 0,4 bzw. 1 Sekunde

Hier der Code : (allerdings nicht getestet)

Delphi-Quellcode:
unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls;

const COMPORT = 1; //Hier die Schnittstelle einstellen 1 = COM1, 2 = COM2 usw.

type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    Timer2: TTimer;
    procedure Timer1Timer(Sender: TObject);
    procedure Timer2Timer(Sender: TObject);
  private
    { Private declarations }

    procedure DoImpuls(TimeInterval:Real);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}


//Die folgenden Funktionen zum Zugriff auf Serielle Schnittstellen sind aus einem Tutorial übernommer
//guckst Du hier !!
//http://www.delphi-forum.de/topic_Serielle+Schnittstelle+ansprechen+und+pollen_36037.html&sid=4edb82047a1e1abd741c14a776ca55ba
var
  PortTimeout : _COMMTIMEOUTS;
  PortHandle : Integer;
  PortDCB : TDCB;
  PortNr : Integer;
  PortState : Cardinal;
  WriteOverlapped,ReadOverlapped,StatusOs: TOverlapped;

procedure InitOverlapped(var Overlapped : TOverlapped);
begin
  Overlapped.Offset := 0;
  Overlapped.OffsetHigh := 0;
  Overlapped.Internal := 0;
  Overlapped.InternalHigh := 0;
  Overlapped.hEvent := CreateEvent(nil,True,False,'');
end;

function OpenCOM(Port: byte): boolean; stdcall;
begin
  PortHandle :=
  CreateFile(PChar('\\.\COM'+IntToStr(Port)),GENERIC_READ or GENERIC_WRITE,0,
             nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,LongInt(0));

  //Overlapped = Asynchron auf Microsoftianisch

  {Da wir nun asynchron auf die Schnittstelle zugreifen (weiss der Teufel
  warum – aber es sieht so aus als wäre diese Art des Zugriffs ab W2K
  praktisch ZWINGEND notwendig – selbst wenn man gar nicht asynchron übertragen will)
  muss man auch die dafür notwendigen Structs initialisieren}

  if PortHandle > 0 then
  begin
    Result := true;
    InitOverlapped(WriteOverlapped);
    InitOverlapped(ReadOverlapped);
    InitOverlapped(StatusOs);
  end else Result := false;
end;

procedure CloseCOM; stdcall;
begin
  PurgeComm(PortHandle, PURGE_RXABORT or PURGE_RXCLEAR or PURGE_TXABORT or PURGE_TXCLEAR);
  SetCommMask(PortHandle,0); //unterbricht WaitCommEvent im Polling thread
  CloseHandle(PortHandle);
  PortHandle := 0;
end;

function ComAvailable(ComNr: byte): boolean; stdcall;
var
  TestHandle : integer;
begin
  TestHandle :=
  CreateFile(PChar('\\.\COM'+IntToStr(ComNr)),GENERIC_READ or GENERIC_WRITE,0,
             nil,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,LongInt(0));
  if (TestHandle <= 0) then
    Result := false
  else
  begin
    Result := true;
    CloseHandle(TestHandle);
  end;
end;

procedure SetDTR; stdcall;
begin
  if (PortHandle <> 0) then EscapeCommFunction(PortHandle,5);
end;

procedure ClearDTR; stdcall;
begin
  if (PortHandle <> 0) then EscapeCommFunction(PortHandle,CLRDTR);
end;

//Und hier dann der Code für die Steuerung


//öffnet die COM-Schnittstelle(Wenn vohanden) und setzt DTR auf HIGH
procedure TForm1.DoImpuls (TimeInterval:Real);
begin
  if ComAvailable(COMPORT) then
    begin
      OPENCOM(COMPORT); //Schnittstelle öffnen !
      SETDTR; //DTR setzen
      Timer2.Interval := Round(TimeInterval * 1000); //Timer auf die gewünschte Zeit setzen
      Timer2.enabled := True; //Timer enablen
    end else showmessage('COMPORT ' + IntToStr(COMPORT) + ' nicht vorhanden oder in Benutzung !');
end;


//Wird jede Minute einmal gestartet und prüft ob die gewünschte Zeit erreicht ist.
//Wenn erreicht ruft er die function doimpuls auf
procedure TForm1.Timer1Timer(Sender: TObject);
begin
  //wenn 08:00: in der jetzigen Uhrzeit vorkommt, dann setzte DTR für 0,4 Sekunden
  if pos('08:00:',TimeTostr(now)) <> 0 then DoImpuls(0.4);
  if pos('09:00:',TimeTostr(now)) <> 0 then DoImpuls(1.0);
  if pos('10:00:',TimeTostr(now)) <> 0 then DoImpuls(1.0);
  if pos('11:00:',TimeTostr(now)) <> 0 then DoImpuls(1.0);
  if pos('12:00:',TimeTostr(now)) <> 0 then DoImpuls(1.0);
  if pos('13:00:',TimeTostr(now)) <> 0 then DoImpuls(1.0);
  if pos('14:00:',TimeTostr(now)) <> 0 then DoImpuls(1.0);
  if pos('21:00:',TimeTostr(now)) <> 0 then DoImpuls(0.4);
end;

//Lösche DTR nach angegebener Zeitspanne und gebe Schnittstelle wieder frei
procedure TForm1.Timer2Timer(Sender: TObject);
begin
  ClearDTR; //Nach angegebener Zeit DTR wieder auf low
  CLOSECOM; //Schnittstelle wieder freigeben
  Timer2.enabled := False; //Timer wieder disablen
end;

end.
Christian Wahl
me, myself and I, die lustigen Drei !!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es 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

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz