Relaisplatine 8-fach seriell von C.....

Hallo,
kann mir jemand sagen, ob man die „RELAISPLATINE 8-fach Seriell“ von C… mit dem Modul COMPort ansteuern kann.
Wenn ja, wie?
Wie muss der der „COMPort_SendText“ aussehen
Muss das Modul „COMPort“ mit einer „Register Variable“ verbunden werden?
Danke für Eure Hilfe
Gruß
Luggi

1.es geht.
2.Man braucht die RegisterVariable, um die vom Com-Port empfangenen Daten zwischenzuspeichern
3.Man muss lt. Beschreibung muss 4 Bytes schicken/empfangen. Also wird der SendCom-Text so aussehen:


$to_com=chr($byte0).chr($byte1).chr($byte2).chr.($byte4);
ComPort_SendText(<instance>,$to_com);

Die Bedeutung der einzelnen Bytes steht in der Doku.

Für den Empfang ist zunächst die RegisterVariable auszulesen und dann die Bytes zu decodieren


$from_com=GetValueString(<RegisterVariable>);
$byte1=ord($from_com{1});
$byte2=ord($from_com{2});
$byte3=ord($from_com{3});
$byte4=ord($from_com{4});

Tommi

Hallo,
zunächst vielen Dank für die Hilfe. Aber irgend wie komme ich hier nicht weiter. Irgendwo mache ich einen Fehler
Nun meine Einstellung der Schnittstelle:
Port = com1
Baudrate = 19200
Databits = 8
Stopbits = 1
Parity = None
Flow Control = None
Der Status steht auf grün

Befehl für die Initalisierung: 1-1-0-0
$send_to_cart01=chr(49).chr(49).chr(48).chr(48);

Befehl für Ansteuerung Relais 1: 3-1-1-0
$send_to_cart01=chr(51).chr(49).chr(49).chr(48);

nichts passiert, wo ist der Denkfehler. Hat jemand eine Idee?

Gruß
Luggi

Wie sendest du die Daten denn?

Mit „ComPort_SendText“ ?

Poste doch mal das ganze Script, damit man was sehen kann.

Doc

Hallo;
kann gerne das Test-Skript posten.
Das Script schaut wie folgt aus:


<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Test.ips.php
Trigger  : 
Interval : 
0 = 48
1 = 49
2 = 50
3 = 51
4 = 52
5 = 53
*/

//Initialisieren des Board
//Befehl für die Initalisierung: 1-1-0-0
$send_to_cart01=chr(49).chr(49).chr(48).chr(48);
COMPort_SendText(24385, $send_to_cart01);

//warten
IPS_Sleep(1000);

//Relais 1 schalten
//Befehl für Ansteuerung Relais 1: 3-1-1-0
$send_to_cart01=chr(51).chr(49).chr(49).chr(48);
COMPort_SendText(24385, $send_to_cart01);

//warten
IPS_Sleep(1000);

//was kommt zurueck

$from_com=GetValueString("REG_Variable");
$byte0=ord($from_com{0});
$byte1=ord($from_com{1});
$byte2=ord($from_com{2});
$byte3=ord($from_com{3});

echo "    Rückgabe:";
echo " ".$byte0;
echo " ".$byte1;
echo " ".$byte2;
echo " ".$byte3;

?>

Gruß
Luggi

Hallo Luggi,

was funktioniert denn nun genau nicht? Kannst du nichts senden oder empfangen. Füllt sich denn die Reg-Variable, wenn du den Init sendest?

Was passiert, wenn du direkt z.B. ein
COMPort_SendText(24385, chr(1).chr(1).chr(0).chr(0));
fürs Init usw. sendest?

Doc

Hallo Luggi,

hast Du schon mal ein Blick in die Beschreibung geworfen?
Da ist ein Bespiel (zwar in Basic, aber das ist egal) dabei.
1.Die zu setzenden Bytes sind Binär, deshalb die chr()-Funktion.
2.Das letzte Byte ist eine XOR-Prüfsumme

In Deinem Fall also, wie schon vom Doc beschrieben


$byte1=1;//initialisiering
$byte2=1;//adresse
$byte3=0;//egal
$byte4=$byte1 ^ $byte2 ^ $byte3;
$send_to_cart01=chr($byte1).chr($byte2).chr($byte3).chr($byte4);
COMPort_SendText(24385, $send_to_cart01);

HTH
Tommi

Hallo,
ich habe mir mal das Basic Programm angeschaut und dabei ist mir auch das mit dem XOR aufgefallen.

Ich habe auch damit rumprobiert. Aber leider ohne Erfolg!

In der Anleitung sind folgende Kommandos definiert:
cmd Bedeutung ------------Kommandorahmen---------Antwort
0 no operation-------------0 - Adr. - x - XOR---------255 - Adr. - x - XOR
1 initialiserung-------------1 - Adr. - x - XOR---------254 - Adr. - info -XOR
2 Schaltzustände abfragen-2 - Adr. - x - XOR---------253 - Adr. - Daten - XOR
3 Relais schalten----------3 - Adr. - Daten - XOR-----252 - Adr. - x - XOR
4 Optionen abfragen-------4 - Adr. - x - XOR---------251 - Adr. - x -XOR
5 Optionen setzen---------5 - Adr. - opt. - XOR------250 - Adr. - x - XOR

x steht jeweils für ohne Bedeutung
Daten: 1 = 1.Relais; 2 = 2.Relais; 4= 4.Relais; 8= 5.Relais; 16= 6.Relais; 32= 7.Relais; 64= 8.Relais.

habe auch schon mit XOR gearbeitet
Beispiel:

$Byte01 = (51);
$Byte02 = (49);
$Byte03 = (49);
$Byte04 = ($byte01 XOR $byte02 XOR $byte03);

$send_to_cart01=chr($Byte01).chr($Byte02 ).chr($Byte03).chr($Byte04);
COMPort_SendText(24385, $send_to_cart01);

Ebenso habe ich die RegisterVariable ausgelesen. Und hier kommt was interessantes zum Vorschein.
und zwar die zurückgesendete Werte:

$byte01 = 255
$byte02 = 0
$byte03 = 114
$byte04 = 141

und dies wäre nach dem CMD Bedeutung (siehe oben)
No Operation - die Adresse der wäre 0 - ohne Bedeutung - XOR (Prüfsumme) = 141
Theoretisch müsste aber folgender Datensatz herauskommen:
$byte01 = 252 - Relais schalten
$byte02 = 1 - Adresse 1 (1.Karte)
$byte03 = 1 - 1.Relais
$byte04 = ??? - und die Prüfsumme

Ich weis nicht, aber langsam habe ich den Verdacht, die Byte-Zahl muss irgendwie anders eingegeben werden. Aber wie? in hex?

für hilfe wäre ich sehr dankbar.
Luggi

Hallo Luggi,

das hat Tommi oben doch schon geschrieben, das es binär ist.

Wenn du den Wert „1“ senden willst, musst du auch den Wert „1“ mit CHR(1) senden und nicht den ASCI-Code für eine „1“ z.B. „49“.
Ich habe die Anleitung nicht gelesen, aber ich denke, du musst die Werte an die Karte übergeben, nicht die Zahl selber.
Ich hatte dir oben schon was geschrieben, hast du das mal getestet?

Wenn du es in hex senden möchtest einfach z.B. CHR(0x01) für eine „1“ oder CHR(0x0F) für „15“ usw. senden.

Gruß,

Doc

Hallo,
vielen Dank für Eure Hilfe. Habe mit HEX, DEC, BINÄR - Zahlen versucht. Die Platine lässt sich über IP-Symcon nicht steueren.

Nun gebe ich auf, sollte jemand eine Idee noch habe, bzw. diese Platine im Einsatz habe, so möge er mir doch sagen wie es funktioniert.

Nochmals Danke
Luggi

PS.: Ich bin mir fast sicher es muss mit dem RS232 Protokoll zusammen hängen.

Hallo Luggi,

die Relais-Karte ist für universellen Einsatz vorgesehen und aus diesem Grunde auch vollständig dokumentiert.

!! Die Karte ist mit Sicherheit über IPS ansteuerbar !!

Der Vorschlag von Tommi war völlig richtig und sollte daher auch zum erwünschten Ergebnis führen.
Leider hast Du Dich aber nicht an seine Vorgaben gehalten.

Es gibt in PHP (wie in anderen Programmiersprachen auch) sowohl logische als auch Bit-Operatoren.
Diese darfst Du nicht miteinander verwechseln.

  • Logische Operatoren erzeugen ein Ergebnis von TRUE oder FALSE (Boole’sche Variable). Diese werden üblicherweise in „If“-Abfragen verwendet.

  • Bit-Operatoren dagegen manipulieren die einzelnen Bits einer Variablen. Genau diese Art von Operatoren musst Du hier verwenden.

Also:
$A XOR $B ergibt TRUE oder FALSE (hier unbrauchbar).
$A ^ $B ergibt wieder einen Integer-Wert.

Beide Operatoren bewirken zwar eine XOR-Verknüpfung, aber nur „^“ liefert wieder ein Byte.

Die Antwort, die Du bekommen hast, ist eindeutig eine Fehlermeldung (siehe Abschnitt 4.3 in der Anleitung). Dies ist auch nicht verwunderlich, da die Platine mit TRUE oder FALSE sicher nichts anfangen kann.

Halte Dich an das Schema von Tommi, dann wird es auch funktionieren;) .

Gruß
HJH

Hallo HJH,
vielen Dank für Deine Ermutigung!
Ich habe das komplette Script gelöscht. Den ComPort und die Register Variable gelöscht. Das kompette System neu gestartet.
Alles neu aufgebaut. Und schon läuft es.

Danke
Luggi

Poste doch noch mal bitte das fertige Skript dann kann Steier es fieleicht direckt beim nachsten update mit reinnehmen

hallo luggi,
mich interssiert es auch riesig.
Kannst du da etwas posten???

Gruß

Bastelwasti