![]() |
Re: Relaiskarte K8056 von Velleman seriell ansteuern
moin Hagü,
du musst deine Checksumme noch Konvertieren.
Delphi-Quellcode:
raik
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; |
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:
Bis bald und Grüsse von der Mosel
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); HaGü |
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:
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:
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; |
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
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 |
Re: Relaiskarte K8056 von Velleman seriell ansteuern
Zitat:
|
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:
sende.
messagestring:= messagestring+messagestring;
ApdComPort1.Output:= messagestring; Grüße von der Mosel HaGü |
Re: Relaiskarte K8056 von Velleman seriell ansteuern
Hallo Leute,
werd euch mal den genauen Text abschreiben, vielleicht hab ich was übersehen. Zitat:
Ich wünsche Euch einen schönen Vatertag HaGü |
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 ![]() vielleicht kannst Du dir da ein paar Inspirationen holen. Grüße Klaus |
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 09:06 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