Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Relaiskarte K8056 von Velleman seriell ansteuern (https://www.delphipraxis.net/69932-relaiskarte-k8056-von-velleman-seriell-ansteuern.html)

kiar 23. Mai 2006 23:28

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
moin Hagü,

du musst deine Checksumme noch Konvertieren.

Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var messagestring:string;
    checksum:extended;
    address:integer;
    factor:integer;
begin

  checksum := (255 - ((((13 + address + Ord('T') + Ord(factor)) / 256) - (Int(13)) + address + Ord('T') + Ord(factor)) / 256)) * 256 + 1;
  messagestring := Char(13) + Char(address) + 'T' + factor + FloatToStr(checksum);<-- hier

  messagestring:= messagestring+messagestring;
  ApdComPort1.Output:= messagestring;
  showmessage (FloatToStr(checksum)); <--  hier

end;
raik

HaGü 24. Mai 2006 11:00

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Hallo Kiar,

nach 2 Flaschen Wein und die halbe Nacht, kam ich auf eine ähnliche Idee.
Die Fehlermeldungen sind zwar alle weg, die Karte wird aber trotzdem nicht angesprochen.
Eine LED an der Leitung zeigt mit zwar das etwas gesendet wird, aber noch nicht das richtige.
Hab mir sorgar was eingebaut um das gesendete anzeigen zulassen, aber...
Habe auch VB installiert, obwohl ich davon überhaupt keine Ahnung habe, sieht aber ähnlich aus wie Delphi.(VB nur als Notlösung, :wall: kommt anschließend wieder runter. Arg langsam).
Delphi-Quellcode:
procedure TForm1.Button4Click(Sender: TObject);
var messagestring:string;
    checksum:extended;
    address:integer;
    factor:integer;
begin
  address:= 1;
  factor:= 1;
  checksum := (255 - ((((13 + address + Ord('T') + Ord(factor)) / 256) - Int((13 + address + Ord('T') + Ord(factor)) / 256)) * 256)) + 1;

  messagestring := Char(13) + (inttostr(address)) + 'T' + (inttostr(factor)) + (floattostr(checksum));

  messagestring:= messagestring+messagestring;
  ApdComPort1.Output:= messagestring;
  panel1.caption := FloatToStr(checksum);
  showmessage (messagestring);
Bis bald und Grüsse von der Mosel
HaGü

Sharky 24. Mai 2006 12:04

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Hai HaGü,

ich würde das ganze so aufbauen das man auch erkennt was, wo im Code passiert ;-)
Delphi-Quellcode:
type
  TCommandSet = array[1..4] of Byte;

const
  Cmd_Start = 13;
  Cmd_Nothalt = Ord('E'); //: Nothalt
  Cmd_DisplayAdress = Ord('D'); //: Display-Adresse
  Cmd_SetRelay = Ord('S'); //: Relais einstellen
  Cmd_ClearRelay = Ord('C'); //: Relais löschen
  Cmd_ToggleRelay = Ord('T'); //: Toggle-Relais
  Cmd_ChangeCardAdress = Ord('A'); //: Adresse einer Karte wechseln
  Cmd_SetAllCarsToOne = Ord('F'); //: Alle Karten auf Adresse 1
  Cmd_SendByte = Ord('B'); //: Byte senden

  Relay_1 = Ord('1');
  Relay_2 = Ord('2');
  Relay_3 = Ord('3');
  Relay_4 = Ord('4');
  Relay_5 = Ord('5');
  Relay_6 = Ord('6');
  Relay_7 = Ord('7');
  Relay_8 = Ord('8');
  AllRealy = Ord('9'); // Nur für Command S und C

function Zweierkomplement(aValue: Integer): Integer;
var
  neg: Boolean;
  iDez: Integer;
begin
  iDez := aValue;
  neg := iDez < 0;
  if (neg) then
    iDez := iDez * -1;
  iDez := iDez xor $FFFF;
  Inc(iDez);
  result := iDez;
end;

function CalcCheckSum(aValue: TCommandSet): Integer;
var
  summ: Integer;
  ndx: Integer;
begin
  summ := 0;
  for ndx := Low(aValue) to High(aValue) do
  begin
    summ := summ + aValue[ndx];
  end;
  result := Zweierkomplement(summ) + 1;
end;

procedure TDemoForm.btn_testClick(Sender: TObject);
var
  CommandSet: TCommandSet;
  CheckSum: Integer;
begin
  CommandSet[1] := Cmd_Start;
  CommandSet[2] := 1; // Karte 1
  CommandSet[3] := Cmd_ToggleRelay;
  CommandSet[4] := Relay_1;
  CheckSum := CalcCheckSum(CommandSet);
  // Und hier jetzt der Code um die 4 Byte des CommandSets und die Prüfsumme zu senden
end;
Was mir noch nicht klar ist: Die Prüfsumme kann ja kein Byte sein. Da ja die Summe von 4 Byte nicht in ein Byte passt. Andererseits wird aber ein Byte an die Karte gesendet. :gruebel:

Klaus01 24. Mai 2006 12:17

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Befehle:
'E': Nothalt
'D': Display-Adresse
'S': Relais einstellen
'C': Relais löschen
'T': Toggle-Relais
'A': Adresse einer Karte wechseln
'F': Alle Karten auf Adresse 1
'B': Byte senden. Ermöglicht es, den Status aler Relais mit einem Befehl zu steuern.


1. CHR$(13)
2. Kartenadresse(1...255)
3. Befehl
4. Adresse (1...255) oder Relaisnummmer('1'..'9' ASCII)
5. 'checksum' Summe prüfen(2-Komplement der Summe der 4 vorigen Bytes +1)

Ich denke Du mußt die Bytes einzeln zu der Karte schicken
Out32(Addresse:Integer; Wert:byte);stdcall;export; external 'INPOUT32.DLL';

out32(com2,$13);
out32(com2,$31);
out32(com2,$84); // sende 'T'
out32(com2,$31);

checksum := ( ($13+$31+$84+$31) XOR $FF) +1; // hoffe das 2er Komplement ist so richtig gebildet
// checksum := (umme(Byte1 - Byte4) bitweise XOR FF)+1
out32(com2,checksum);

dann müssen m.E. weitere Befehle gesendet werden,
solange bis der Befehl 'B' gesendet wird.

Aber wie das ganze gesendet werden soll, müßte eigentlich
in den Unterlagen zu der Relaiskarte stehen.

Grüße
Klaus

DP-Maintenance 24. Mai 2006 12:34

DP-Maintenance
 
Dieses Thema wurde von "Sharky" von "Windows API / MS.NET Framework API" nach "Sonstige Fragen zu Delphi" verschoben.
Ich verschiede das mal. Mit API hat es nicht mehr viel zu tun

Sharky 24. Mai 2006 12:36

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Zitat:

Zitat von Klaus01
... Aber wie das ganze gesendet werden soll, müßte eigentlich in den Unterlagen zu der Relaiskarte stehen. ...

Noch eine Anmerkung: Wenn ich das richtig gelesen haben muss die gesamte Instruction sequence (also Byte 1 bis 5) zweimal gesendet werden.

HaGü 24. Mai 2006 15:46

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Hallo Sharky, Hallo Klaus,

ich muß gleich erstmal alles ausprobieren.Danke für die Arbeit. :wink:
Stimmt, ich muß den Befehl zweimal senden. Ich mache dies indem ich den Befehl als 'messagestring' mit:
Delphi-Quellcode:
  messagestring:= messagestring+messagestring;
  ApdComPort1.Output:= messagestring;
sende.

Grüße von der Mosel
HaGü

HaGü 25. Mai 2006 16:02

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Hallo Leute,

werd euch mal den genauen Text abschreiben, vielleicht hab ich was übersehen.
Zitat:

Die K8056-Karte über RS232-Befehle ansteuern.
1. Anweisungen für den Entwurf der Software:
Weil die Befehle aus einer Kette von ASCII-Zeichen bestehen, ist es einfach Software, die über
einen seriellen Port des PC die Befehle überträgt, zu entwerfen.

Einstellungen für den Port P:
Baud: 2400
Paritätt: keine
Databits: 8
Stopbits:1

Zur Bedienung mit einem Kabel muß die Sequenz von Befehlen mindestens Zweimal gesendet werden.
Zur drahtlosen Bedienung empfehlen wir, dass die Sequenz von Befehlen fünfmal hintereinander
gesendet wird. Für eine höhere Zuvelässigkeit, sorgen Sie am besten für eine Pause von minimal
300ms zwischen 2 verschiedenen Befehlen.

2. Befehlsfolge:
Um einen Befehl auszuführen, muss die richtige Befehlsreihenfolge der K8056 übertragen werden.
1. CHR$(13)
2. Kartenadresse(1...255)
3. Befehl
4. Adresse (1..255) oder Relaisnummer('1'..'9'ASCII)
5. 'checksum' Summe prüfen (2-Komplement der Summe der 4 vorigen Bytes +1)

3. Befehle
´E´: Nothalt für alle karten, ungeachtet die Adresse. Achtung, Relais, die durch 'Open-Collector'-
Ausgänge eingeschaltet wurden, werden durch diesen Befehl nicht ausgeschaltet.)
´D´: Display-Adresse. Alle Karte zeigen binaär ihre heutige Adresse.
(LD1 : MSB, LD8 : LSB)
´S´: Relais einstellen. 'S'-Befehl soll durch Relais #'1' bis '8' gefolgt werden.
´C´: Relais löschen. 'C'-Befehl soll durch Relais #'1' bis '8' ('9' löscht alle Relais zur gleichen
Zeit) gefolgt werden.
´T´: Toggle-Relais umschalten. 'T'-Befehl soll durch Relais #'1' bis '8' gefolgt werden.
´A´: Die heutige Adresse einer Karte wechseln. 'A'-Befehl soll durch die neue Adresse gefolgt
werden (1..255).
´F´: Alle Karten auf Adresse 1 (Standart)
´B´: Byte senden. Ermöglicht es, den Status alle Relais mit einem Befehl zu steuern, dadurch,
dass ein Byte mit dem Relais-Status für jedes Relais gesendet Wird (MSB : Relais 1 LSB :
Relais acht)'Wenn ich 8 schreibe zeigt der :cool: sich'
Vielleicht sehe ich vor lauter Bäumen den Wald nicht und deshalb das Problem nicht.
Ich wünsche Euch einen schönen Vatertag
HaGü

Klaus01 25. Mai 2006 16:22

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Na, so ganz steige ich da auch nicht durch.
Aber wie fit bist denn Du in C?

Hier gibt es ein Steuerungsprogramm für Linux in C geschrieben
http://k8056.free.fr/k8056_20051007.tgz mit Quelltext,
vielleicht kannst Du dir da ein paar Inspirationen holen.

Grüße
Klaus

HaGü 25. Mai 2006 22:11

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Hallo Klaus,

c habe ich mal vor 10 Jahren probiert und sein gelassen, da ich nur ab und zu programmiere.
Aber da ich mir derzeit eine Sternwarte selber baue und die natürlich auch steuern möchte, habe ich angefangen mich wieder intensiver damit zu beschäftigen. Delphi hab ich ausgewählt, weil es doch weit verbreitet ist und ich einige kommerzielle Programmierer kenne, die aber auf Datenbanken und wirtschaftliche Programme spezialisiert sind.
Morgen treff ich mich mit ´nem Kuppel der in C++ programmiert und wir werden uns der Sache mal in C++ annehmen. Vielleicht ist dann die portation leichter. Jetzt noch eine 2. Sprache lernen muß nicht sein. Aber Grundwissen wäre trotzdem nicht schlecht.
Es freud mich aber, nicht alleine mit einem großen Fragezeichen dazustehen.
Sobald ich ein Ergebnis habe, poste ich es natürlich. Die Karte ist nicht schlecht und es gibt bestimmt mehr Möglichkeiten die Karte zu nutzen.

Bis bald
HaGü


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:11 Uhr.
Seite 2 von 5     12 34     Letzte »    

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