AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Relaisplatine über COM Port ansteuern
Thema durchsuchen
Ansicht
Themen-Optionen

Relaisplatine über COM Port ansteuern

Ein Thema von Salomon · begonnen am 15. Okt 2002 · letzter Beitrag vom 21. Dez 2005
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#1

Relaisplatine über COM Port ansteuern

  Alt 15. Okt 2002, 08:40
Hallo,
in versuche seit geraumer Zeit die 8 Fach Relaisplatine von Conrad anzusteuern. Leider nur mit mäßigen Erfolg. Die Platine wird an die Serielle Schnittstelle angeschlossen.
Ein Hardware Fehler kann ausgeschlossen werden, da sie mit der (selbstprogrammierten)Software von jemand anderem funktioniert.

Die Serielle Schnittstelle habe ich erfolgreich initialisiert. Siehe Code:

Code:
function opencom(comport : string): boolean;
begin
  hport:= CreateFile(PChar(comport),GENERIC_READ + GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);

  GetCommState(hport,dcb);

  dcb.BaudRate := StrToCard(comconfig.baudrate.Text);// Bautrate
  dcb.ByteSize := StrToInt(comconfig.data.Text);    // 8 Bits je Byte
  dcb.Parity  := StrToInt(comconfig.parity.Text);  // kein Paritäts Bit NOPARITY
  dcb.StopBits := StrToInt(comconfig.stopbit.text); // ein Stopp Bit ONESTOPBIT
  dcb.wReserved:= 0;
                         // In Buffer                       // Out Buffer
  if SetupComm(hPort, strtoint(comconfig.inbuffer.Text), strtoint(comconfig.Data.Text))
     then
      begin
       result := true;
       log(comconfig.ComboBox1.Text + 'erfolgreich initialisiert...');
      end
     else
      begin
       result := false;
       log(comconfig.ComboBox1.Text + 'konnte NICHT initialisiert!');
      end;

  SetCommState(hport,dcb);
end;
Daten sende ich über diese Funktion an die Karte:

Code:
                        //  byte
procedure outport(data: char);
var
  len: cardinal;
  written: dword;  // cardinal
begin
  len:= 1;
  WriteFile(hport,data,len,written,nil);
end;

Mein Problem liegt nun im ansteuern der Relais! Die Karte erwartet einen 4 Byte langen Befehlsrahmen (siehe weiter unten Datenblatt), den ich wahrscheinlich nicht richtig "aufbaue" und an die Karte sende.

Auch das initialisieren der Karte klappt nicht!.

Code:
procedure senddata(par1, par2,par3: byte);
var summe : byte;
begin
summe := par1 xor par2 xor par3;
outport(chr(par1));
outport(chr(par2));
outport(chr(par3));
outport(chr(summe));
end;

Procedure initcard;
begin
senddata (1,1,0);
end;
Auf Seite 7 des Datenblattes steht wie die Relais anzusteuern sind.
Auf der darauf folgenden Seite ist ein BASIC Programm, das mich leider nicht weiterbringt. Datenblatt


So, ich hoffe das war nicht zuviel auf einmal Please help.

Mfg
Salomon
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2
  Alt 15. Okt 2002, 09:50
Da hast du Glück. Ich habe da eine Unit für genau diese Relaiskarte.
Im Attachment findest du die gepackte Unit.
Angehängte Dateien
Dateityp: zip 58_1034671831.zip (3,3 KB, 225x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#3
  Alt 15. Okt 2002, 10:28
Super, das sieht echt gut aus

Ich werde mir das gleich mal genauer anschauen.
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#4
  Alt 15. Okt 2002, 12:26
Mit der Unit komme ich genauso weit wie vorher, es hapert einfach an den Daten, die ich zum Schalten der Relais an die Karte senden muss.

Die Function rel.CmdSetPorts(1,1); erledigt das für mich. Wobei der zweite Parameter vom Typ Byte ist und daher aus 8 Bit besteht.

In der Anleitung steht dazu folgendes:
Ports setzten und lesen lassen, Bit 0 im Datenwert korrespondiert mit Relais 1, Bit 1 entsprechend mit Relais 2.


Wie es aussieht muss ich die 8 Bits des Bytes einzeln setzen können, also 0 oder 1, wie geht das?

Mfg
Salomon
  Mit Zitat antworten Zitat
wwerner

Registriert seit: 5. Aug 2002
18 Beiträge
 
#5
  Alt 15. Okt 2002, 13:31
DeinByte := 0; //init
DeinByte := DeinByte or (1 shl 3) //setzt das 3 bit in DeinByte
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#6
  Alt 15. Okt 2002, 13:50
Wenn Du nur ein Relay (z.B. das 6., also Bit 5) ändern möchtest, dann musst Du zuerst den aktuellen Status ermitteln (COM auslesen), dann das entsprechende Bit setzen und anschliessend wieder die Daten zum COM Port schreiben.

Code:
//Pseudo Code

procedure SetRelay(RelayBit: Byte; SwitchOn: Boolean);
var
  CurrState: Byte;
begin
  CurrState := ReadByteFromCOM;
[color=#0800ff] if SwitchOn then
    CurrState := CurrState or (1 shl RelayBit)
  else
    CurrState := CurrState and (not (1 shl RelayBit));[/color]
  WriteByteToCOM(CurrState);
end;


//// später im Code

// setze Relais 6 on
SetRelay(5, True);

// setze Relais 6 off
SetRelay(5, False);
Der farbige Bereich ist der eigentliche Teil zum Schalten eines Relais. Bedenke, das mit dem Schreiben eines Bytes immer acht Relais geschalten werden.
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#7
  Alt 15. Okt 2002, 20:06
So, das Schalten der einzelenen Relais funktioniert dank euch schonmal.

Wenns noch irgendwelche Probleme gibt melde ich mich hier.

Thanx
Salomon
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#8
  Alt 15. Okt 2002, 21:32
Zitat von Salomon:
Die Function rel.CmdSetPorts(1,1); erledigt das für mich.
Warum nutzt du denn die Lowlevel-Funktionen von TRelais? Mit den als High-Level kommentierten Methoden kannst du auch sakuras Code ganz einfach in einer einzigen Zeile abhandeln:. ActivatePorts(1, 1 shl BitNum) bzw. DeactivatePorts(1, 1 shl BitNum) oder wenn du die Ports von an nach aus bzw. von aus nach an schalten willst: TogglePorts(1, 1 shl BitNum)
  Mit Zitat antworten Zitat
Benutzerbild von Salomon
Salomon

Registriert seit: 9. Jun 2002
453 Beiträge
 
#9
  Alt 16. Okt 2002, 10:33
Du hast recht, vor lauter Hardware naher Programmierung habe ich wohl die Highlevel Functions ganz übersehen.

Eine Frage hätte ich noch. Mit welcher Funktion kann ich den Status der Relais abfragen?
Die Function müsste mir doch ein Byte zurückgeben, indem alle momentanen schaltzustände sind.
  Mit Zitat antworten Zitat
wwerner

Registriert seit: 5. Aug 2002
18 Beiträge
 
#10
  Alt 16. Okt 2002, 10:39
GetPorts
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 10:34 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