![]() |
Relaisplatine über COM Port ansteuern
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:
Daten sende ich über diese Funktion an die Karte:
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;
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:
Auf Seite 7 des Datenblattes steht wie die Relais anzusteuern sind.
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 der darauf folgenden Seite ist ein BASIC Programm, das mich leider nicht weiterbringt. ![]() So, ich hoffe das war nicht zuviel auf einmal :-) Please help. Mfg Salomon |
Liste der Anhänge anzeigen (Anzahl: 1)
Da hast du Glück. Ich habe da eine Unit für genau diese Relaiskarte.
Im Attachment findest du die gepackte Unit. |
Super, das sieht echt gut aus :-)
Ich werde mir das gleich mal genauer anschauen. |
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 |
DeinByte := 0; //init
DeinByte := DeinByte or (1 shl 3) //setzt das 3 bit in DeinByte |
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:
Der farbige Bereich ist der eigentliche Teil zum Schalten eines Relais. Bedenke, das mit dem Schreiben eines Bytes immer acht Relais geschalten werden.
//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); |
So, das Schalten der einzelenen Relais funktioniert dank euch schonmal.
Wenns noch irgendwelche Probleme gibt melde ich mich hier. Thanx Salomon |
Zitat:
|
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. |
GetPorts
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz