AGB  ·  Datenschutz  ·  Impressum  







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

Ampelschaltung mit Delphi über Com Port

Ein Thema von ruebach · begonnen am 24. Feb 2010 · letzter Beitrag vom 25. Feb 2010
Antwort Antwort
Seite 2 von 3     12 3      
ruebach

Registriert seit: 24. Feb 2010
Ort: Marienheide
5 Beiträge
 
#11

Re: Ampelschaltung mit Delphi über Com Port

  Alt 24. Feb 2010, 12:46
Also Vorwiderstand haben die LED ^^ gegrillt werden sie also beim Anschluss an den Computer (hoffentlich) nicht, zu mindestens nicht, nach unseren Versuchen und Berechnungen.

Die Idee das ganze erstmal intern in Delphi zu machen, bzw. da auch anzeigen zu lassen finde ich gut. Hatte ich heute auch mal der Gruppe vorgeschlagen. So haben wir im Notfall mindestens etwas ^^ interne Programmierung läuft ja einigermaßen.
Ein Problem wird dann aber glaube ich weiterhin sein, wie wir das ganze dann als Signal an die LEDs bekommen.

Die Sache mit den Relaiskarte finde ich jetzt nicht so gut. Es kann zwar sein, dass ich den Mund jetzt zu voll nehme, aber es sollte laut unseren Informationen auch ohne diese gehen.
Aber trotzdem danke.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#12

Re: Ampelschaltung mit Delphi über Com Port

  Alt 24. Feb 2010, 13:05
Wenn ihr das Ganze OOP-mäßig gestaltet, dann könntet ihr euch einige Objekte erstellen

z.B.
Delphi-Quellcode:
type TAmpelStatus = (asRot, asRotGelb, asGelb, asGruen, asGelbBlinkend);
  TAmpel2 = class
  private
    x, y: Integer; // die Koordinaten, wo sie auf dem Bildschirm gezeichnet wird
    PortRot: Integer; // die Adressen der entsprechenden LED
    PortGruen: Integer; //
    Status: TAmpelStatus;
  public
    Constructor Erstelle(x, y: Integer; PortRot, PortGruen: Integer);
    Procedure Umstellen(NeuerStatus: TAmpelStatus);
    Prozedure Zeichne(Zeichenflaeche: TCanvas);
  end;
  TAmpel3 = class
  private
    x, y: Integer; // die Koordinaten, wo sie auf dem Bildschirm gezeichnet wird
    PortRot: Integer; // die Adressen der entsprechenden LED
    PortGelb: Integer; //
    PortGruen: Integer; //
    BlinkerAn: Boolean; // einfach bei jedem Zeichnen umschalten und zusammen
    Status: TAmpelStatus; // mit asGelbBlinkend auf das Gelb anwenden
  public
    Constructor Erstelle(x, y: Integer; PortRot, PortGelb, PortGruen: Integer);
    Procedure Umstellen(NeuerStatus: TAmpelStatus);
    Prozedure Zeichne(Zeichenflaeche: TCanvas);
  end;
Die Komponenten wissen wie sie selber aussehn und welche LEDs sie ansteuern müssen.
Somit muß sich das Steuerprogramm nicht darum kümmern.

Jetzt könnt ihr im Programm einfach alle nötigen Ampeln erzeugen und jede Ampel kann sich dann selber auf eine Zeichenfläche malen und die zugehörigen LEDs ansteuern.
Dann braucht ihr nur noch das Programm erstellen, welches diese Komponenten ansteuert.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Jaynder
Jaynder

Registriert seit: 2. Dez 2004
Ort: Süderelbe
134 Beiträge
 
Delphi 10.4 Sydney
 
#13

Re: Ampelschaltung mit Delphi über Com Port

  Alt 24. Feb 2010, 13:19
@ruebach
Zitat:
Die Sache mit den Relaiskarte finde ich jetzt nicht so gut. Es kann zwar sein, dass ich den Mund jetzt zu voll nehme, aber es sollte laut unseren Informationen auch ohne diese gehen.
Wird es nicht, COM ist eine Datenschnittstelle für serielle Bit-Sequenzen, und außer den beiden Steuerleitungssignalen DTR und DSR mit +/-12V kannst du dort nichts schalten, und die auch nur, wenn du den Steuerchip der Schnittstelle direkt per Assembler ansprichst, normalerweise werden die von der Treibersoftware intern entsprechend des Datenflusses dynamisch ein und ausgeschaltet. Nimm die Relaiskarte und du hast 'ne Chance.
  Mit Zitat antworten Zitat
Benutzerbild von Tonic1024
Tonic1024

Registriert seit: 10. Sep 2003
Ort: Cuxhaven
559 Beiträge
 
RAD-Studio 2009 Ent
 
#14

Re: Ampelschaltung mit Delphi über Com Port

  Alt 24. Feb 2010, 13:43
Also als Ex-Elektroniker und Informatiker möchte ich nur ganz kurz was dazu sagen.

Ein paar Fakten:
  • Die Serielle Schnittstelle benötigt ein Schieberegister oder Microcontroller um sinnvoll signale raus zu bekommen.
  • Beim vergewaltigen der DSteuerleitungen solltet ihr bedenken, dass zwar gut Spannung aber quasi kein Strom bereitgestellt wird. Könnte sein, dass die LEDs so schwach leuchten, dass sie faktisch immer aus sind/bleiben.
  • Sch**ß auf die ollen LEDs. Ohne ordentliche Trennung der Signale vom PC habt ihr ruck zuck eier Board gegrillt.
  • genau darum hat man früher den Parallelport für solche Spielchen verwendet. Da musste man aber trotzdem einen Treibertransistor verwenden und ne externe Spannungsversorgung weil auch hier die Power nicht reichte.
  • Unter Vista/Win7 kann man den Parallelport nicht mehr direkt ansteuern. XP bin ich nicht sicher.

Nehmt ne billige Schnittstellenkarte. Mit Relais oder ohne spielt keine Rolle.


Gruß,

Toni
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#15

Re: Ampelschaltung mit Delphi über Com Port

  Alt 24. Feb 2010, 13:47
Über den seriellen und vorallem den parallelen (Drucker) Port könnte man zwar direkt Signale abgreifen, aber wenn da was schief läuft, dann könnte man sich auch schnell mal das Mainboard zerschießen.

[edit]
das Internet ist heute komisch ... vorhin war der Beitrag von Tonic1024 noch nicht da,
aber ich kann ihm nur vollkommen zustimmen und rate von soeinem Vorhaben ab.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#16

Re: Ampelschaltung mit Delphi über Com Port

  Alt 24. Feb 2010, 14:10
Zitat von Jaynder:
Wird es nicht, COM ist eine Datenschnittstelle für serielle Bit-Sequenzen, und außer den beiden Steuerleitungssignalen DTR und DSR mit +/-12V kannst du dort nichts schalten, und die auch nur, wenn du den Steuerchip der Schnittstelle direkt per Assembler ansprichst, normalerweise werden die von der Treibersoftware intern entsprechend des Datenflusses dynamisch ein und ausgeschaltet.
Ich weiß zawr nicht, was Du benutzt, aber zB mit TComport kann man schon seit ewigen Zeiten auf darauf zugreifen
Delphi-Quellcode:
    property FlowControl: TFlowControl read GetFlowControl write SetFlowControl stored False;
    property OutCTSFlow: Boolean read FOutCTSFlow write SetOutCTSFlow;
    property OutDSRFlow: Boolean read FOutDSRFlow write SetOutDSRFlow;
    property ControlDTR: TDTRFlowControl read FControlDTR write SetControlDTR;
    property ControlRTS: TRTSFlowControl read FControlRTS write SetControlRTS;
    property DSRSensitivity: Boolean
      read FDSRSensitivity write SetDSRSensitivity default False;
  Mit Zitat antworten Zitat
Benutzerbild von Jaynder
Jaynder

Registriert seit: 2. Dez 2004
Ort: Süderelbe
134 Beiträge
 
Delphi 10.4 Sydney
 
#17

Re: Ampelschaltung mit Delphi über Com Port

  Alt 24. Feb 2010, 14:14
Oh, gut zu wissen. Habe nur so eine asbach-Komponente namens TSerialPort. Aber das ganze Thema ist zum Glück inzwischen komplett out.
  Mit Zitat antworten Zitat
martin_

Registriert seit: 19. Mai 2008
Ort: Österreich
89 Beiträge
 
#18

Re: Ampelschaltung mit Delphi über Com Port

  Alt 25. Feb 2010, 09:07
Zitat von himitsu:
Wenn ihr das Ganze OOP-mäßig gestaltet, dann könntet ihr euch einige Objekte erstellen

z.B.
Delphi-Quellcode:
type TAmpelStatus = (asRot, asRotGelb, asGelb, asGruen, asGelbBlinkend);
  TAmpel2 = class
  private
    x, y: Integer; // die Koordinaten, wo sie auf dem Bildschirm gezeichnet wird
    PortRot: Integer; // die Adressen der entsprechenden LED
    PortGruen: Integer; //
    Status: TAmpelStatus;
  public
    Constructor Erstelle(x, y: Integer; PortRot, PortGruen: Integer);
    Procedure Umstellen(NeuerStatus: TAmpelStatus);
    Prozedure Zeichne(Zeichenflaeche: TCanvas);
  end;
  TAmpel3 = class
  private
    x, y: Integer; // die Koordinaten, wo sie auf dem Bildschirm gezeichnet wird
    PortRot: Integer; // die Adressen der entsprechenden LED
    PortGelb: Integer; //
    PortGruen: Integer; //
    BlinkerAn: Boolean; // einfach bei jedem Zeichnen umschalten und zusammen
    Status: TAmpelStatus; // mit asGelbBlinkend auf das Gelb anwenden
  public
    Constructor Erstelle(x, y: Integer; PortRot, PortGelb, PortGruen: Integer);
    Procedure Umstellen(NeuerStatus: TAmpelStatus);
    Prozedure Zeichne(Zeichenflaeche: TCanvas);
  end;
Hallo,
nachdem ich den Code gelesen habe, ergibt sich für mich folgende Frage:
Der Unterschied zwischen den beiden Klassen ist nur das eine blinken kann und die andere nicht.
Also für weitere Betrachtungen wird die erste Klasse verwendet. Wie funktioniert das mit dem Typ TAmpelStatus und der Procedure umstellen?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#19

Re: Ampelschaltung mit Delphi über Com Port

  Alt 25. Feb 2010, 09:46
Nja, der Unterschied war jetzt eher Fußgängerampel mit Rot/Grün und eine Ampel mit Rot/Gelb/Grün.

Ideal wäre natürlich, wenn alle Ampeln von einem Basisobjekt abgeleitet werden, damit man für alle die selbe Schnittstelle hat.

Das Umschalten wäre jetzt einfach durch Zuweisen eines der Stati möglich.
Das Objekt würde dann in der Prozedur entsprechend des Wertes seine Anzeige/Ausgänge/LEDs umstellen.



Delphi-Quellcode:
type
  TAmpelStatus = (asAllesAus, asRot, asRotGelb, asGelb, asGruen, asGelbBlinkend);
  TAmpelBasis = class
    procedure Umstellen(NeuerStatus: TAmpelStatus); virtual; abstract;
    procedure ZeichneNeu; virtual; abstract;
  end;
  TAmpelRotGruen = class(TAmpelBasis)
  private
    fBild: TCanvas;
    fX, fY: Integer; // die Koordinaten, wo sie auf dem Bildschirm gezeichnet wird
    fGeraet: TIrgendwas; // Schnittstelle zum Ausgabegerät;
    fPortRot: Integer; // die Adressen der entsprechenden LED
    fPortGruen: Integer; //
    fStatus: TAmpelStatus;
  public
    constructor Erstelle(Zeichenflaeche: TCanvas; x, y: Integer;
      Geraet: TIrgendwas; PortRot, PortGruen: Integer);
    procedure Umstellen(NeuerStatus: TAmpelStatus); override;
    procedure ZeichneNeu; override;
  end;
  TAmpelRotGelbGruen = class(TAmpelBasis)
  private
    fX, fY: Integer; // die Koordinaten, wo sie auf dem Bildschirm gezeichnet wird
    fPortRot: Integer; // die Adressen der entsprechenden LED
    fPortGelb: Integer; //
    fPortGruen: Integer; //
    fBlinkerAn: Boolean; // einfach bei jedem Zeichnen umschalten und zusammen
    fStatus: TAmpelStatus; // mit asGelbBlinkend auf das Gelb anwenden
  public
    constructor Erstelle(Zeichenflaeche: TCanvas; x, y: Integer;
      Geraet: TIrgendwas; PortRot, PortGelb, PortGruen: Integer);
    procedure Umstellen(NeuerStatus: TAmpelStatus); override;
    procedure ZeichneNeu; override;
  end;

constructor TAmpelRotGruen.Erstelle(Zeichenflaeche: TCanvas; x, y: Integer;
  Geraet: TIrgendwas; PortRot, PortGruen: Integer);
begin
  fBild := Zeichenflaeche;
  fX := x;
  fY := y;
  fGeraet := Geraet;
  fPortRot := PortRot;
  fPortGruen := PortGruen;
  fStatus := asAllesAus;
  Zeichne;
end;

procedure TAmpelRotGruen.Umstellen(NeuerStatus: TAmpelStatus);
begin
  fStatus := NeuerStatus;
  case fStatus of
    asAllesAus: begin
      fGeraet.Aus(fPortRot);
      fGeraet.Aus(fPortGruen);
    end;
    asRot: begin
      fGeraet.An(fPortRot);
      fGeraet.Aus(fPortGruen);
    end;
    asGruen: begin
      fGeraet.Aus(fPortRot);
      fGeraet.An(fPortGruen);
    end;
    else raise Exception.Create('diesen Status gibt es hier nicht');
  end;
  Zeichne;
end;

procedure TAmpelRotGruen.Zeichne;
begin
  ZeichneRahmenUndWasSonstNochBenötigtWird(fBild);
  case fStatus of
    asRot: ZeichneRotesLicht(fBild);
    asGruen: ZeichneGruenesLicht(fBild);
  end;
end;

// Ampel erstellen
Liste.Add(TAmpelRotGruen.Erstelle(Canvas, 100, 50, Geraet, 1, 2));

// erste Ampel umstellen
Liste[0].Umstellen(asRot);

// alles neu zeichnen
for i := 0 to Liste.Count - 1 do
  Liste[i].Zeichne;

// alles auf Grün stellen (bitte nicht nachmachen)
for i := 0 to Liste.Count - 1 do
  Liste[i].Umstellen(asGruen);
Vorteil ist eben, daß man jetzt einfach für jedes Ampel, welche es in "real" gibt, ein passendes Objekt erstellt, diesem mittteilt welche LEDs zu ihm gehören und so das Steuerprogramm nicht wissen muß, wie es welche LEDs ansteuert.

Im Steurprogramm wird dann z.B. über einen Timer das Programm gefahren und einfach nur noch die Objekte angesteuert
Delphi-Quellcode:
Liste[0].Umstellen(asRot);
Liste[2].Umstellen(asRot);
'ne Sekunde später dann noch
Liste[1].Umstellen(asGruen);
Liste[3].Umstellen(asGruen);
...
(z.B. 'ne Kreuzung mit 4 Ampeln)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
martin_

Registriert seit: 19. Mai 2008
Ort: Österreich
89 Beiträge
 
#20

Re: Ampelschaltung mit Delphi über Com Port

  Alt 25. Feb 2010, 10:55
Danke. Die Sache mit der Vererbung ist mir klar. Nur wie kommt man auf die Idee sich für die Zustände eigene Typen zu erstellen? Als Zustände eigenen sich nur Konstanten, die immer gleich sind und an verschiedenen Stellen im Projekt (auch mit unterschiedlichen Ausprägungen) benötigt werden. Gibt es sonst noch eine allgemein anwendbare Regel, wann ein eigener Typ (wie TAmpelStatus) verwendet werden kann? Bzw. wie geht man vor um sie zu finden?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 19:39 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