Vellman 8 Port Relaiskarte K8056

Hallo,

ich habe gestern Nacht die Vellman 8 Port Relais-Karte zusammen gelötet.
Und mache jetzt meine ersten Gehversuche mit dem Com Port Modul von IPS.
Hat schon jemand die Karte in IPS eingebunden??
Ich denke das sollte ohne große Probelem möglich sein.
Leider habe ich keine Ahnung wie das mit den Bits und Bytes auf der Com -Port funktioniert.Kopfzerbrechen bereitet mir nicht nur die „Checksummen“ berechnung:mad:

Hier ein Auszug aus der Doku:

  1. DIE K8056-KARTE ÜBER RS232-BEFEHLE ANSTEUERN.

Anmerkung: Sie können ein Testprogramm von unserer Site herunterladen. Der
Quellcode ist auch verfügbar (nur auf Englisch).

  1. Anweisungen für den Entwurf der Software:

Weil die Befehle aus einer Kette von ASCII-Zeichen bestehen, ist es einf~
Software, die über einen seriellen Port des PC die Befehle übertragt, zu
entwerfen.

Einstellungen für den Port P:

X Baud:2400
X Paritätt: Keine
X Databits: 8
X Stopbits: 1

• Zur Bedienung mit einem Kabel muss die Sequenz von Befehlen
mindestens zweimal gesendet werden.
• Zur drahtlosen Bedienung empfehlen wir, dass die Sequenz von Befet
fünfmal hintereinander gesendet wird. Für eine höhere Zuverlässigkeil
sorgen Sie am besten für eine Pause von minimal 300ms zwischen 2
verschiedenen Befehlen.

  1. Befehlsfolge:

Um einen Befehl auszuführen, muss die richtige Befehlsfolge der K8056
übertragen werden.
Eigentlich sieht solch eine Befehltolge so aus:

  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 vorigei
    Bytes + 1)

  6. Befehle:

‘E‘ : Nothalt für alle Karten, ungeachtet die Adresse. (Achtung, Relais, die
durch Open~CollectOrAuSg ge eingeschaltet wurden, werden durch
diesen Befehl nicht ausgeschaltet.)

‘0‘ : Display-Adresse. Alle Karten zeigen binär ihre heutige Adresse. (LD1
MSB, LD8: LSB)

‚S‘:
Relais einstellen. S-Befehl soll durch Relais # ‘1 bis 8‘ (‘9 stellt alle
Relais zur gleichen Zeit ein) gefolgt werden.

‚C‘
Relais löschen. 0-Befehl soll durch Relais # ‘1‘ bis ‘8‘ (‘9‘ löscht alle
Relais zur gleichen Zeit) gefolgt werden.

‚T‘
Toggle-ReIaiS 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 (Standard)

‘B‘ :Byte senden. Ermöglicht es, den Status aller Relais mit einem Befehl
zu steuern, dadurch. dass ein Byte mit dem Relais-Status für jedes
Relais gesendet wird (MSB: Relais 1 LSB: Relais8)

Jürgen

comp1.png

comp2.png

Hallo Jürgen,

  1. ‘checksum Summe prüfen (2-Komplement der Summe der 4 vorigei
    Bytes + 1)

mit dem 2-Komplement ist die negative Zahl gemeint.

Die Beschreibung in der Klammer ist jedoch nicht eindeutig.
Zwei Interpretationen sind möglich:

  1. (2-Komplement der Summe) + 1
$sum = $byte1 + $byte2 + $byte3 + $byte4;
$twocomp = -$sum;
$checksum = $twocomp + 1;

// oder kürzer
$checksum = 1 - $byte1 - $byte2 - $byte3 - $byte4;
// oder
$checksum = 1 - $sum1;
  1. 2-Komplement (der Summe + 1)
$sum1 = $byte1 + $byte2 + $byte3 + $byte4;
$sum2 = $sum + 1;
$checksum = -$sum2;

// oder kürzer
$checksum = ~($byte1 + $byte2 + $byte3 + $byte4);
// oder
$checksum = ~$sum1;

Die zweite Version ist übrigens gleichbedeutend mit dem 1-Komplement, bei dem jedes Bit einfach nur invertiert wird.

Um die Check-Summe auf 8 bit (1 Byte) zu beschränken, sollten die überflüssigen oberen Bits ausgeblendet werden:

$checksum &= 0xff;

Gruß
HJH

Hallo zusammen,

bin einen kleinen Schritt weiter, ich habe mal das Prog-Beispiel für VB
mir angeschaut sieht so aus:

Private Sub Command4_Click()
checksum = (255 - ((((13 + address + Asc("C") + Asc("9")) / 256) - Int((13 + address + Asc("C") + Asc("9")) / 256)) * 256)) + 1

messagestring = Chr$(13) & Chr$(address) & "C9" & Chr$(checksum)
messagestring = messagestring & messagestring
messagestring = messagestring & messagestring
comm.Output = messagestring
End Sub

Die Adresse meiner Karte ist 1 .

aber wie mache ich das mit PHP ???:confused:

Kann mir da jemand helfen ??

Danke vorab.

Jürgen

Hallo Jürgen,

für die Vellemann-Karten gibt es in IP-Symcon spezielle Befehle, die in der IPS-Wiki dokumentiert sind. Die Befehle beginnen alle mit VELLESUB_…

Wenn Du diese nutzt, brauchst Du dich um Check-Summen und Befehlszusammensetzung nicht kümmern.

Wenn die Karten auch über RS232 anzusteuern sind, müßte es theoretisch auch so „zu Fuß“ gehen (kann ich aber nicht garantieren):

// Befehlsparameter festlegen
$KartenAdr = 1;   // Kartenadresse
$Befehl = 'C';    // Befehl: Relais ausschalten (ASCII)
$Relais = '9';    // Relais-Nummer (ASCII)

// Check-Summe bilden
// alle Bytes, die ASCII-Zeichen sind, müssen in ord(...) verpackt werden
$Summe = 13 + $KartenAdr + ord($Befehl) + ord($Relais);
$CheckSumme = (~$Summe + 1) & 0xff;

// Befehlssequenz erzeugen
// alle Bytes, die keine ASCII-Zeichen sind, müssen in chr(...) verpackt werden
$HalbSequenz = chr(13). chr($KartenAdr). $Befehl. $Relais. chr($CheckSumme);
// bei Kabelverbindung verdoppeln
$Sequenz = $HalbSequenz. $HalbSequenz;

// der String $Sequenz muss anschließend an die Karte übermittelt werden

Vergiss das ganze und nimm lieber die in IPS integrierten Befehle. :wink:

Gruß
HJH

Hallo HJH,

vielen Dank für die ausführliche Anleitung und deine Hilfe.

Mit dem USB Board und der Relaiskarte zusamen funzt alles wunderbar mit IPS.

Ich würde natürlich gerne mit nur der Relaiskarte klar kommen.

Folgender Status:

Die richtige Sequenz habe ich jetzt,nachdem ich 2 PC mit Nullmodem-Kabel
und Hyperterminal verbunden und die Sequenzen mitgeloggt habe.

C9v
C9v
C9v
C9v

Wenn ich das richtig sehe, wird die Sequenz 4 mal gesendet jeweils gefolgt von einen CRLF.

Aber mit COMPort_SendText…passiert auf der Karte nix !!

Der Com-Port steht auf grün.

MUss ich auf dem Com-Port und / oder im Gerätemanager noch was einstellen

z.B Flowcontroll etc…habe auch hier schon einiges probiert.

Hat noch jemand eine Idee oder muss ich wohl oder übel 2 Board zusammen einsetzen ??

Jürgen

Bei den Schnittstellen-Settings sollte keine Flusskontrolle stehen.
Ich habe mir mal das Demo-Programm angesehen.
Dort wird als erstes RTS und DTR gesetzt. Das könnte evtl. in IPS ein Problem sein. Zum extra setzen dieser Leitungen gibt es wohl noch keine Funktionen, oder wurde das im letztem Update mit eingebaut???

Die Sequenz zum Senden im Testprogramm hat (wie in der Beschreibung/aber anders wie Dein Test 5 Bytes (13, 1(Karte), ‚C‘(Befehl),‚3‘(Relay),Prüfsumme.


(VB-Syntax:)
messagestring = Chr$(13) & Chr$(address) & "C3" & Chr$(checksum)

Die Prüfsumme zum versenden wird dort so berechnet:


(VB-Syntax:)
checksum = (255 - ((((13 + address + Asc("C") + Asc("3")) / 256) - Int((13 + address + Asc("C") + Asc("3")) / 256)) * 256)) + 1

Das kann man ja 1:1 in PHP Abbilden. Siehie dazu auch den Thread zum Conrad Relayboard und zu meinem Demo-Script für das M232-Interface bezüglich dem Handling von Binären und Stringdaten.

Tommi

oder wurde das im letztem Update mit eingebaut???

Jepp. CTRL+SPACE für eine Übersicht :slight_smile:

paresy

Hallo,

dank HJH und Tommi läuft es jetzt super…:smiley:

Vielen Dank an euch beide und an das IPS Team für das tolle Programm.

So sieht das fertige Script aus:


// Befehlsparameter festlegen
$KartenAdr = 1;   // Kartenadresse

/* Befehle:
E - Notschaltung alles aus,
D -> Display Anzeige Adresse
S -> Relais einschalten
C -> Relais auschalten
T -> Toggle Relais
*/
$Befehl = 'S';

$Relais = '9';    // Relais-Nummer (ASCII) 1-8, 9 = alle

// Check-Summe bilden
$Summe = 13 + $KartenAdr + ord($Befehl) + ord($Relais);
$CheckSumme = (~$Summe + 1) & 0xff;

// Befehlssequenz erzeugen

$HalbSequenz = chr(13). chr($KartenAdr). $Befehl. $Relais. chr($CheckSumme);
// bei Kabelverbindung verdoppeln
$Sequenz = $HalbSequenz. $HalbSequenz;

    COMPort_SetRTS(38545,True);
    COMPort_SetDTR(38545,True);
    COMPort_SendText(38545, $Sequenz);

echo $Sequenz ;


Jürgen

Hallo Tommi,

(VB-Syntax:)
checksum = (255 - ((((13 + address + Asc("C") + Asc("3")) / 256) - Int((13 + address + Asc("C") + Asc("3")) / 256)) * 256)) + 1

natürlich kann man das nahezu 1:1 nach PHP übernehmen, aber diese Art der Checksummen-Berechnung ist an Umständlichkeit kaum zu überbieten :smiley: .
Da ist der von mir vorgestellte Weg doch deutlich eleganter und wegen der fehlenden Typumwandlung (bei der Division) darüberhinaus auch wesentlich effizienter.

// Check-Summe bilden
$Summe = 13 + $KartenAdr + ord($Befehl) + ord($Relais);
$CheckSumme = (~$Summe + 1) & 0xff; 

Gruß
HJH

PS: PHP nimmt bei Division grundsätzlich eine Typwandlung nach Float vor.

Hallo HJH,

Ein bisschen merkwürdig kam mir das auch vor, aber auf Deine Ersetzung wäre ich garantiert nicht gekommen. Vielleicht hatte der Vellemann-Designer vorher am Obfuscation-Toolkit-Contest teilgenommen.

Zum Glück gibt es beim Programmieren meistens (anders als in der Mathematik) nicht nur eine korrekte Lösung…

Viele Grüße
Tommi

Hallo Paresy

CTRL+SPACE für eine Übersicht

Wer lesen kann, ist wieder klar im Vorteil :mad:

Aber um in der Übung zu bleiben: Da könnte man doch gleich noch die Funktionen zum Auslesen von CTS/DSR und RI einbauen, oder? :stuck_out_tongue:

Tommi