Delphi-PRAXiS
Seite 1 von 2  1 2      

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)

HaGü 22. Mai 2006 14:42


Relaiskarte K8056 von Velleman seriell ansteuern
 
Hallo Leute,

bin rel. neu hier und bis jetzt nur im LeseStatus.
Da ich aber für mein Problem keine Lösung finden kann, schreibe ich heute mal.
Also, ich möchte die Relaikarte K8056 von Velleman seriell ansteuern.
Um einen Befehl auszuführen, muss die richtige Befehlsfolge übertragen werden.
Eigentlich sieht solch eine Befehlsfolge so aus:
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)

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.

Ich versuche dauernd folgenden Befehl in verschiedenen Versionen und Fariationen zu senden:
CHR($13)+CHR($31)+CHR($84)+CHR($31)+CHR($98)
1. CHR($13)
2. CHR($31) - Kartenadresse 1
3. CHR($84) - Befehl('T' Toggle)
4. CHR($31) - Relaisnummer 1
5. CHR($98) - Checksumme

Was ist falsch und/oder wie funktionierts
Brauche dringend Hilfe

Mit Grüssen von der Mosel
HaGü

Klaus01 22. Mai 2006 15:02

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Womit kommunizierst denn Du mit der Schnittstelle
AsyncPro, TSerial?

Würde eventuell helfen, Dein Problem zu lösen.
Grüße
Klaus

HaGü 22. Mai 2006 15:14

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Hallo Klaus,

öffnen und schliessen mach ich mit inpout32.dll.
Habe aber auch die "TurboPower Async Professional" installiert.
Mein Listing bis jetzt wäre:
Delphi-Quellcode:
unit Relaiskarte1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Datei1: TMenuItem;
    beenden1: TMenuItem;
    Relais1: TMenuItem;
    allean1: TMenuItem;
    alleaus1: TMenuItem;
    RadioGroup1: TRadioGroup;
    RadioGroup2: TRadioGroup;
    RadioGroup3: TRadioGroup;
    RadioGroup4: TRadioGroup;
    RadioGroup5: TRadioGroup;
    RadioGroup6: TRadioGroup;
    RadioGroup7: TRadioGroup;
    RadioGroup8: TRadioGroup;
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    procedure beenden1Click(Sender: TObject);
    procedure allean1Click(Sender: TObject);
    procedure alleaus1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);


  private
    { Private-Deklarationen }


  public
    { Public-Deklarationen }
  end;
var
  Form1: TForm1;
  ComHandle: THandle;
  f: TextFile;
  s: string;

implementation
{$R *.dfm}
{Funktionen aus "inpout32.dll" laden:}
procedure Out32(Addresse:Integer; Wert:byte);stdcall;export; external 'INPOUT32.DLL';
function Inp32(Addresse:Integer):Byte;stdcall;export; external 'INPOUT32.DLL';



procedure TForm1.beenden1Click(Sender: TObject);
begin
     RadioGroup1.ItemIndex:= 1;
     RadioGroup2.ItemIndex:= 1;
     RadioGroup3.ItemIndex:= 1;
     RadioGroup4.ItemIndex:= 1;
     RadioGroup5.ItemIndex:= 1;
     RadioGroup6.ItemIndex:= 1;
     RadioGroup7.ItemIndex:= 1;
     RadioGroup8.ItemIndex:= 1;
  FileClose(ComHandle);
  close;
end;

procedure TForm1.allean1Click(Sender: TObject);

begin

     RadioGroup1.ItemIndex:= 0;
     RadioGroup2.ItemIndex:= 0;
     RadioGroup3.ItemIndex:= 0;
     RadioGroup4.ItemIndex:= 0;
     RadioGroup5.ItemIndex:= 0;
     RadioGroup6.ItemIndex:= 0;
     RadioGroup7.ItemIndex:= 0;
     RadioGroup8.ItemIndex:= 0;
end;

procedure TForm1.alleaus1Click(Sender: TObject);
begin
     RadioGroup1.ItemIndex:= 1;
     RadioGroup2.ItemIndex:= 1;
     RadioGroup3.ItemIndex:= 1;
     RadioGroup4.ItemIndex:= 1;
     RadioGroup5.ItemIndex:= 1;
     RadioGroup6.ItemIndex:= 1;
     RadioGroup7.ItemIndex:= 1;
     RadioGroup8.ItemIndex:= 1;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
 {evtl. geöffnete Schnittstelle schließen:}
 CloseHandle(ComHandle);
 {COM2 per API-Funktion (CreateFile) öffnen:}
 ComHandle := CreateFile('COM2', GENERIC_READ or GENERIC_WRITE,
                           0, nil, OPEN_EXISTING, 0, 0);
 {Hinweis, ob Schnittstelle geöffnet werden konnte:}
 if ComHandle = INVALID_HANDLE_VALUE then
  begin
   beep;
   Label1.Caption := 'Fehler beim Öffnen von COM2';
  end
  else
   Label1.Caption := 'COM2 geöffnet';
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
   EscapeCommFunction(ComHandle, SETDTR);
   EscapeCommFunction(ComHandle, SETRTS);
   EscapeCommFunction(ComHandle, SETBREAK);
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
   EscapeCommFunction(ComHandle, CLRDTR);
   EscapeCommFunction(ComHandle, CLRRTS);
   EscapeCommFunction(ComHandle, CLRBREAK);
end;





end.

Klaus01 22. Mai 2006 15:23

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
mit inpout32 habe ich noch nicht gearbeitet,
nach der Durchsicht dieser WebSeite http://sheepdogguides.com/dt4j.htm
erscheint es mir aber das inpout32 für parallele Schnittstellen ist.

Grüße
Klaus

HaGü 22. Mai 2006 15:40

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Hallo Klaus,

ca. in der Mitte im Oberen Teil der Site steht: InpOut32 should also allow you to access your serial port.
Und ich kann, wie gesagt den Port aus- und einschalten. Getestet mit eine LED an den Strippen.
Ach ja, vielleicht wichtig, der Anschluß ist mit 2 Adern, müßte dann Asyncron sein.

Gruß Hagü

Klaus01 22. Mai 2006 16:46

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

mhm, ich denke da kann ich Dir nicht viel weiterhelfen
außer vielleicht mit diesem Link: http://ourworld.compuserve.com/homep..._Boyd/Dt5f.htm

Grüße
Klaus

HaGü 22. Mai 2006 16:56

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Hallo Klaus,

bin gerade mit APRO am rumspielen, kann auch senden.
ich habe aber immernoch das problem mit dem richtigen String.
Habe einen Quelltext in VB gefunden, demnach brache ich nur die Zeilen:

checksum = (255 - ((((13 + address + Asc("T") + Asc(factor)) / 256) - Int((13 + address + Asc("T") + Asc(factor)) / 256)) * 256)) + 1
messagestring = Chr$(13) & Chr$(address) & "T" & factor & Chr$(checksum)

umzusetzen.
Aber wie??????????

Sharky 22. Mai 2006 17:14

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

ersteinmal : "Herzlich Willkommen in der Delphi-PRAXiS" :hi:

In deinem Code sendest Du mit Chr($13) den ASCII Code 19 (Hex 13) an die Karte. Wenn ich das eben richtig gelesen habe wird bei der Karte ein sogenanntes Telegram aber mit Chr(13) oder Chr($D) eingeleitet.

Auch bei allen anderen Zahlen verwendest Du immer die HEX-Notation. Eventuell ist ja das dein Problem.

HaGü 23. Mai 2006 21:25

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Hallo Leute,

hab heut` so ziemlich den ganzen Tag im Internet gesucht und auch Teile gefunden, auch hier.
Danke schon mal an ALLE.

Bin also jetzt soweit, das ich nur noch 3 Fehlermeldungen bekomme.
Aber was ist noch falsch?
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 + (checksum);

  messagestring:= messagestring+messagestring;
  ApdComPort1.Output:= messagestring;
  showmessage (checksum);

end;
Bitte bitte helfen, sonst wird es wieder eine lange Nacht.

HaGü 23. Mai 2006 21:45

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Ach ja, die Fehlermeldungen,

[Fehler] Relaiskarte1.pas(157): Inkompatible Typen
[Fehler] Relaiskarte1.pas(157): Inkompatible Typen: 'String' und 'Extended'
[Fehler] Relaiskarte1.pas(161): Inkompatible Typen: 'String' und 'Extended'
[Fataler Fehler] Karte1.dpr(5): Verwendete Unit 'Relaiskarte1.pas' kann nicht compiliert werden

Gruß von der Mosel
HaGü

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ü

Cyberbob 25. Mai 2006 22:37

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Hier leute! Warum denn so umständlich?

Das Beispielprogramm, welches beim K8056 dabei ist, verwendet das Actix-X Element MicrosoftComm, welches man auch nach Delphi inportieren kann. Dann kann man es genau so verwenden, wie in VB auch.

Hab ich auch so gemacht!

HaGü 25. Mai 2006 23:30

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Hallo Cyberbob,

jetzt weiß ich gar nicht mehr weiter.
Bin Anfänger, bitte, was meinst Du jetzt :gruebel: .
Ich möchte ja keinen fertigen Code haben, aber ein paar Tips oder Hinweise wären schon nicht schlecht.

Grüsse von der Mosel
HaGü

P.S. Lasse mich auch gerne mit der Nase draufstossen.

Cyberbob 25. Mai 2006 23:43

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Ganz einfach... ?

Ich hab mir die Karte auch vor einiger Zeit gekauft. Habe mir auch das Beispielsteuerprogramm heruntergeladen, den Quellcode analysiert und festgestllt, das die Daten mit dem ActiveX Object MicrosoftComm übertragen werden. Dieses kann man auch in Delphi Installieren.

Komponente/ActiveX importieren/Microsoft Comm Control 6.0 (Version 1.1) und dann auf Installieren Klicken. Einfach installieren und du kannst es verwenden wie in VB. Natürlich mit den Delphi-konformen Befehlen ( aus CHR$(13) wird also Chr(13) oder auch #13 )

Schau mal ob ich von meinem Programm den Quelltext finde...

HaGü 26. Mai 2006 00:13

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Habe mir gerade Die mscomm32.ocx gesaugt und installiert.
Die Version 6.00.8169 ist aber von 1998, gibt es vielleicht eine neuere?
Werde Morgen wieder reinschauen.

Gepannt wie ein Flitzebogen
HaGü

Cyberbob 26. Mai 2006 00:16

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Ich hab die auch. Beim alten Notebook hats noch funktioniert. Hab jetzt allerdings ein neues ohne Serielle Schnittstelle, sodass ichs nicht mehr Testen kann.

Sharky 26. Mai 2006 06:48

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

bei meinem Code war wohl die Berechnung des zweierkomplements falsch :oops: Aber Klaus01 hat ja den richtigen Code geschreiben:
Delphi-Quellcode:
function Zweierkomplement(aValue: Integer): Integer;
begin
  result := (aValue xor $FF) + 1;
end;
Wenn ich Probleme mit der seriellensteuerung von Geräten hatte habe ich immer versucht zu ermitteln was denn das "Herstellerprogramm" sendet. Dafür einfach zwei Serielleschnittstellen mit einem Null-Modem kabel verbinden. Auf Com1 sendet das Programm und auf Com2 werden mit Hyperterminal oder einem eingenen Delphiprogramm die Daten empfangen. Dann kann man einmal genau vergleichen was das Originalprogramm sendet und was dein Programm sendet.
Zum Empfang ist es gut ein Programm zu haben welches mit den Zahlenwert der empfangenen Byte anzeigt. Dadurch hat man keine Probleme wenn der ASCII-Wert ein Steuerzeichen oder nicht darstellbares zeichen ist.

HaGü 27. Mai 2006 10:12

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Hallo Leute,

in C++ haben wir es rausbekommen.
Die Checksumme haben wir so berechnet:
Zitat:

void ResetRelais(int Nr){
char achSData[6]="";
signed char cCheckSum=0;
int result=0;

achSData[0]=13;
achSData[1]=1;
achSData[2]='C';
achSData[3]=Nr+48;
cCheckSum=achSData[0]+achSData[1]+achSData[2]+achSData[3];
cCheckSum=TwosComplement(cCheckSum);
achSData[4]=cCheckSum;

result=SendData(achSData, 5);
Die Beschreibung von Velleman ist falsch.
Einfach bei
Zitat:

'checksum' Summe prüfen (2-Komplement der Summe der 4 vorigen Bytes +1)
das
Zitat:

+1
weglassen, dann klappt es auch mit dem Nachbarn.

Auch ist es wichtig die Com-Schnittstelle richtig zu öffnen.
Wenn man DTR und RTS abschaltet, funktioniert es direkt, da man ja nur eine 2-Draht Verbindung hat, bringt es nichts wenn die Schnittstelle auf ein Steuersignal über RTS bzw. DTR wartet.
Zitat:

dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
Habe jetzt nur noch das Problem mit der richtigen deklaration der Variablen. C++ braucht
Zitat:

signed Char
, Delphi????. Die cCheckSum besteht ja aus Buchstaben und Zahlen.
Werde mal bischen rumdoktern.
Vielleicht hat ja von Euch einer eine Idee.

Bis dann
HaGü

Sharky 27. Mai 2006 10:55

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Zitat:

Zitat von HaGü
... Habe jetzt nur noch das Problem mit der richtigen deklaration der Variablen. ...

Da über die Serielle immer nur ein Byte nach dem anderen gesendet wird kannst Du die Variabeln auch als Byte deklarieren würde ich sagen.

Klaus01 27. Mai 2006 11:15

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

Zitat:

signed char

Unter signed char versteht man einen Datentyp in C++. Sein niedrigster Wert ist -128, sein höchster 127. Seine Größe beträgt 8 Bit. (as)
das habe ich hierher: ->http://www.computer-tipps.net/blexikon28.html
Das Delphi Pendant dazu wäre shortInt.
unsigned char entspricht dem Byte.

[edit] schön, daß Du schon weitergekommen bist [/edit][i]

Grüße
Klaus

HaGü 28. Mai 2006 23:07

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Hallo Leute,

ich bin soweit.
Kann die Karte jetzt ansteuern, die einzelnen relais ein-/anschalten sowie alle an und alle aus.
Was ich noch nicht hinbekommen habe, ist die Deklaration der Variablen. Darum habe ich halt die CheckSumme per Hand ausgerechnet, war eh nicht schwer, da sich der Wert nur um eins Verschiebt.
Habe also für jedes Relais eine RadioGroup erstellt.
Delphi-Quellcode:
procedure TForm1.RadioGroup2Click(Sender: TObject);
var BefehlRG21, BefehlRG22: Char;
    CheckSummeRG21, CheckSummeRG22: String;
begin
  Start        := Char(13);
  KartenAdresse := Char(1);
  BefehlRG21    := 'S';
  BefehlRG22    := 'C';
  RelaisNr     := '2';
  CheckSummeRG21:= Char(109);
  ChecksummeRG22:= Char(125);
  if RadioGroup2.Items[RadioGroup2.ItemIndex]= 'an' then
  S:= Start + KartenAdresse + BefehlRG21 + RelaisNr + CheckSummeRG21;
  if RadioGroup2.Items[RadioGroup2.ItemIndex]= 'aus' then
  S:= Start + KartenAdresse + BefehlRG22 + RelaisNr + CheckSummeRG22;
  C:= C+C;
  SerialPortNG1.SendString(S);
  Edit1.Text:= S;
für Relais 2 und
Delphi-Quellcode:
procedure TForm1.RadioGroup1Click(Sender: TObject);
var
BefehlRG11, BefehlRG12: Char;
CheckSummeRG11, CheckSummeRG12: String;
begin
  Start        := Char(13);
  KartenAdresse := Char(1);
  BefehlRG11    := 'S';
  BefehlRG12    := 'C';
  RelaisNr     := '1';
  CheckSummeRG11:= Char(110);
  ChecksummeRG12:= Char(126);
  if RadioGroup1.Items[RadioGroup1.ItemIndex]= 'an' then
  S:= Start + KartenAdresse + BefehlRG11 + RelaisNr + CheckSummeRG11;
  if RadioGroup1.Items[RadioGroup1.ItemIndex]= 'aus' then
  S:= Start + KartenAdresse + BefehlRG12 + RelaisNr + CheckSummeRG12;
  C:= C+C;
  SerialPortNG1.SendString(S);
  Edit1.Text:= S;
end;
für Relais 1.

Wer möcht kann gerne den kompletten Code haben. Er muß mir nur zeigen, wie ich ihn hier verlinken kann.

Ich Danke schon mal Allen die mir geholfen haben und noch helfen werden. :cheers:
und werde fleisig weiter :coder: .

Mit Grüssen von der Mosel
HaGü

HaGü 28. Mai 2006 23:11

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wer lesen kann ist klar im Vorteil.
Wenn man alles liest, ist der Vorteil noch größer.
Unten stets.

Arno Beekmann 6. Jun 2006 18:34

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Moin Moin
ich benutze die c-control Staion um die Relaiskarte anzusteuern.
in VB lässt sich die Befehlsfolge wie im Beispiel aufbauen.
Ich habe übrigends nicht die erfahrung gemacht das der Befehlssatz 2x gesendet werden muss.
put 13
put 1 Kartenadresse
put 66 B befehl
put 1h Byte für Relais hier 00000001
Checksumm=13+1+66+1h
Checksumm=(Checksumm XOR FFh) +1
put checksumm

näheres auch im c-control Forum. :roll:


MfG Arno

HaGü 10. Jun 2006 17:52

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Hallo Arno,

es geht auch mit einmal senden.
Laut Beschreibung von Velleman "Zur Bedienung mit einem Kabel muss 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 Zuverlässigkeit, sorgen Sie am besten für eine Pause von minimal 300ms zwischen 2 verschiedenen Befehlen"

Grüsse von der Mosel
HaGü

robinWie 7. Dez 2006 17:58

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Für die, die immernoch nicht verstanden haben, wie man die Checksummen ausrechnet (mich eingeschlossen) poste ich hier mal ne Liste, die die richtigen Summen enthält. Ich habe einfach bei den Befehlen eine FOR-Schleife von 0 bis 255 durchlaufen lassen und geguck wo das Relai schaltet.

Hier ist die Tabelle
Code:
Relai | Set | Clear | Toogle
============================
1     | 110 | 126   | 109
2     | 109 | 125   | 108
3     | 108 | 124   | 107
4     | 107 | 123   | 106
5     | 106 | 122   | 105
6     | 105 | 121   | 104
7     | 104 | 120   | 103
8     | 103 | 119   | 102
Alle | 102 | 118   |  -

Emergency Break / Notaus: 124
PS: Set = Relai einschalten; Clear = Relai ausschalten; Toogle = Relai umschalten

Cyberbob 7. Dez 2006 19:37

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Die Checksumme kann aber auch berechnet werden, was einfacher ist, wenn man mehr als eine Karte betreibt.

EDatabaseError 7. Dez 2006 19:39

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Mal ne dumme Frage - vergisst man aber mal:

-Stimmt Baudrate, Parität, DBs, SBs
-Ist das Kabel richtig belegt
-Stimmen die Handshakes (wenn vorhanden)

Probier mal alles mit dem Hyperterminal aus.

Ich könnte bei gelegenheit auch noch ne RS232 Compo beisteuern. Oder die Primitive nehen die in der OS Sparte liegt EDEComPort imho...

Tobi

Reinhard Kern 8. Dez 2006 02:05

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Zitat:

Zitat von HaGü
Hallo Leute,

bin rel. neu hier und bis jetzt nur im LeseStatus.
Da ich aber für mein Problem keine Lösung finden kann, schreibe ich heute mal.
Also, ich möchte die Relaikarte K8056 von Velleman seriell ansteuern.
Um einen Befehl auszuführen, muss die richtige Befehlsfolge übertragen werden.
Eigentlich sieht solch eine Befehlsfolge so aus:
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)

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.

Ich versuche dauernd folgenden Befehl in verschiedenen Versionen und Fariationen zu senden:
CHR($13)+CHR($31)+CHR($84)+CHR($31)+CHR($98)
1. CHR($13)
2. CHR($31) - Kartenadresse 1
3. CHR($84) - Befehl('T' Toggle)
4. CHR($31) - Relaisnummer 1
5. CHR($98) - Checksumme

Was ist falsch und/oder wie funktionierts
Brauche dringend Hilfe

Mit Grüssen von der Mosel
HaGü

Hallo,

wenn die Karten von 1..255 nummeriert werden, dann wird die Karte 1 GANZ BESTIMMT NICHT mit $31 angesprochen, sondern mit $01. Ausserdem ist CR 13 oder $0D (oder soll es DC3 sein, das wäre $13), und "T" ist 84 oder $54 ...

Ohne Anspruch auf Vollständigkeit.

Gruss Reinhard

TimonWorld 14. Dez 2006 21:23

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Sorry, ich habe da noch eine Frage.

Ich versuche es nun mit dem ActiveX-Steuerelement MSComm.

Dazu versuchte ich den VB-Code in Delphi zu übersetzen.

Ich weiß nicht, ob es klappt, weil mein Problem ist, dass er Lizenz-Fehler zur MSComm anzeigt.

Was nun?

Bitte um Hilfe.

EDatabaseError 14. Dez 2006 22:30

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Zitat:

Zitat von TimonWorld
Sorry, ich habe da noch eine Frage.

Ich versuche es nun mit dem ActiveX-Steuerelement MSComm.

Dazu versuchte ich den VB-Code in Delphi zu übersetzen.

Ich weiß nicht, ob es klappt, weil mein Problem ist, dass er Lizenz-Fehler zur MSComm anzeigt.

Was nun?

Bitte um Hilfe.

Muss es dieser ActiveX Microschrott sein ;-)
Wenn du willst sende ich dir ne 1A ComPort Komponente die IMHO mit jedem Delphi läuft...

Wenn du da was umschreibst wäre das unnötige Arbeit ;-)

Und was ist wenn auf dem Benutzerrechner das ActiveX element fehlt ;-) wäre doch auch doof

also ich würd mir das nochmal gut überlegen ;-)

TimonWorld 16. Dez 2006 00:11

Re: Relaiskarte K8056 von Velleman seriell ansteuern
 
Zitat:

Zitat von EDatabaseError
Muss es dieser ActiveX Microschrott sein ;-)
Wenn du willst sende ich dir ne 1A ComPort Komponente die IMHO mit jedem Delphi läuft...

oh das wäre genial! dann sende mir bitte per pn!

Zitat:

Zitat von EDatabaseError
Und was ist wenn auf dem Benutzerrechner das ActiveX element fehlt ;-) wäre doch auch doof

ist ja auch nur für meinen eigenen rechner vorläufig


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:04 Uhr.
Seite 1 von 2  1 2      

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