RELAISPLATINE 8-fach Seriell Com C

Hallo,
irgendwie checke ich es nicht es geht um eine „RELAISPLATINE 8-fach Seriell“

Rahmenaufbau
Byte0 Kommando
Byte1 Kartenadresse
Byte2 Daten
Byte3 Prüfsumme XOR aus Byte 0 bis Byte 3

Wenn ich den Debugger Laufen lasse dann bekomme ich nur Wirre Zeichen.

Danke für Eure Hilfe
Gruß
Grizzly

So also die Karte geht nun mit der Initialisierung

$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(37499, $send_to_cart01);

Karte alle 8 Ports an
$byte1=3;//initialisiering
$byte2=1;//adresse

$byte3=255;//egal
$byte4=$byte1 ^ $byte2 ^ $byte3;

$send_to_cart01=chr($byte1).chr($byte2).chr($byte3).chr($byte4);
COMPort_SendText(37499, $send_to_cart01);

Karte alle 8 Ports aus
$byte1=3;//initialisiering
$byte2=1;//adresse

$byte3=0;//egal
$byte4=$byte1 ^ $byte2 ^ $byte3;

$send_to_cart01=chr($byte1).chr($byte2).chr($byte3).chr($byte4);
COMPort_SendText(37499, $send_to_cart01)

Nur wie lese ich den Inhalt der Register Variable vernünftig aus?

Die zeigt mir nur Müll an :frowning:

Hallo Christian,

schalte mal die HEX Ansicht ein.

Ok hier bitte der Screenshot

Jetzt hast Du doch was Du wolltest, vernünftige Daten.

Script anlegen, und RegVar zuweisen.

Mit $IPS_VALUE hast Du die Daten im Script. Den Rest entsprechend verhackstückeln.

wie kann ich mir den den Hex Wert anzeigen lassen aus $IPS_VALUE ?

PHP dechex - Umwandlung, Konvertierung und Umrechnung einer Zahl von Dezimalsystem in Hexadezimalsystem

echo „Ergebniss“.dechex($IPS_VALUE);

Ist 0 kann aber net sein.

Naja, wenn die Daten in Byte 2 stehen, musst Du auch das auswerten.

Außerdem sollte im Handbuch stehen was was ist.

Ja was es ist weiß ich ja. Auch auswerten will ich es aber eigentlich sollte es mir ja
z.b. FC 01 FF 02 anzeigen.

Hallo,
du musst Zeichen für Zeichen auswerten

… hier mal ein Beispiel für eine Debugausgabe

$buffer = $IPS_VALUE;
$ascii_hex_string = "";

for($i=0;$i <= strlen($buffer) - 1;$i++)
    {
      if ((ord($buffer[$i]) >= 33) && (ord($buffer[$i]) <= 122))
         {
			 //wenn anzeigbares Zeichen [HEX-WERT / DECIMALWERT / ASCII-Zeichen] z.B. [0x7A-122-z]
          $ascii_hex_string .= " [0x".  strtoupper(str_pad(dechex(ord($buffer[$i])),2,"0",STR_PAD_LEFT)) . "-" . str_pad(ord($buffer[$i]),3,"0",STR_PAD_LEFT) . "-" . chr(ord($buffer[$i])) ."]";
        }
     else
        {
			 //ansonsten [HEX-WERT / DECIMALWERT] z.B. [0x7A-122  ]
			 //jedoch zwei Leerzeichen, damit es im Logfile gleich formatierung ergibt
          $ascii_hex_string .= " [0x".  strtoupper(str_pad(dechex(ord($buffer[$i])),2,"0",STR_PAD_LEFT)) . "-" . str_pad(ord($buffer[$i]),3,"0",STR_PAD_LEFT) . "  ]";
        }
    }

echo ("BUFFERINHALT = " . $ascii_hex_string);

tgusi74

Hallo,

so kannst Du das 2.byte darstellen:

$wert = $IPS_VALUE
echo ord($wert{2})

Gruß

Also des Ding zeit mir ja alles an aber net des was es soll :frowning:

  • Was zeigt es den an ??
  • Was willst Du haben ??

tgusi74

Den HEXcode FC 01 F1 0C z.B

Die 4 Byte will ich dann umwandeln in Dezimal als Variable Byte1 Byte2 Byte3 Byte4

Sorry,
war leider ein Fehler im meinen Code (habe ich auch oben geändert)

… hier dein gewünschter Code

//$buffer = chr(0xFC).chr(0x01).chr(0xF1).chr(0x0C) ;
$buffer = $IPS_VALUE;
for($i=0;$i <= strlen($buffer) - 1;$i++)
    {
     $VarName = "Byte". ($i+1);
     $$VarName = ord($buffer[$i]);
    }

echo ("Byte1 = " . $Byte1 . " / Byte2 = " . $Byte2  . " / Byte3 = " . $Byte3  . " / Byte4 = " . $Byte4 );

gibt folgendes aus

Byte1 = 252 / Byte2 = 1 / Byte3 = 241 / Byte4 = 12

tgusi74

Hallo,
habe mir jetzt nochmals die Post’s durchgelesen ==> bei deinen vorhaben musst Du aufpassen, das die Werte sauber in die RegisterVariable geschrieben werden, denn es heisst ja nicht das alle 4 Bytes aufeinmal empfangen werden, es könnte ja passieren das hier der Script mehrmals aufgerufen wird

… daher folgender Code (COM-Port-RegisterVar-Read)

<?
$RegVar_COM3_READ  = 35886 /*[LOGO\RegisterVariable_COM3_READ]*/  ;
$ID_Semaphore= 17047 /*[LOGO\LOGO_READ\LOGO_SEMAPHORE]*/;

//BUFFER FUELLEN --> Daten lesen von COM-Port
$buf = RegVar_GetBuffer($RegVar_COM3_READ);

  //Semaphore setzen wenn der Buffer leer ist und neue Daten empfangen werden
  if (strlen($buf) == 0)
    {
     SetValueInteger($ID_Semaphore ,1);
    }

$buf .= $IPS_VALUE;
RegVar_SetBuffer($RegVar_COM3_READ,$buf);
//*******************************************

if (strlen($buf)>= 4)
  {
   for($i=0;$i<=strlen($buf)-1;$i++)
       {
         $VarName = "Byte". ($i+1);
         $$VarName = ord($buf[$i]);
       }

    echo ("Byte1=" . $Byte1 . " / Byte2=" . $Byte2  . " / Byte3=" . $Byte3  . " / Byte4=" . $Byte4);

   //hier deine ganzen Berechnungen einfuegen


   //********************************

   //Nach erfolgreicher Verarbeitung SEMAPHORE zurücksetzen (Freigabe für neuen Request)
   SetValueInteger($ID_Semaphore ,0);

  }

… in den Anforderungsscript ==> welcher Befehle zur Karte schickt

$ComPortID         = 33848 /*[Serial_Port_COM3]*/ ;
$RegVar_COM3_READ  = 35886 /*[LOGO\RegisterVariable_COM3_READ]*/ ;
$RegVar_COM3_WRITE = 39138 /*[LOGO\RegisterVariable_COM3_WRITE]*/ ;
$ID_Semaphore = 17047 /*[LOGO\LOGO_READ\LOGO_SEMAPHORE]*/;

if (GetValueInteger($ID_Semaphore) <=0)
  {
   //LeseBuffer leeren bevor neuen Request
   RegVar_SetBuffer($RegVar_COM3_READ,"");
   IPS_Sleep(50);


   //hier ein Muster welches auf die Karte geschrieben wird !!
   $byte1=1;//initialisiering
   $byte2=1;//adresse
   $byte3=0;//egal
   $byte4=$byte1 ^ $byte2 ^ $byte3;
   $send_to_cart01=chr($byte1).chr($byte2).chr($byte3 ).chr($byte4);

   //Schreibe BEFEHL auf Karte
   RegVar_SendText($RegVar_COM3_WRITE, $send_to_cart01);
  }
else
  {
    echo ("Empfang wurde zuvor nicht beendet !!!
");
    SetValueInteger($ID_Semaphore ,GetValueInteger($ID_Semaphore)+1);

    if (GetValueInteger($ID_Semaphore) >= 10)
      {
        echo ("Semaphore sitzt schon mehr als 10 Anforderversuche ==> Zwangslöschung durchgeführt !!!
");
        //LeseBuffer leeren bevor neuen Request
        RegVar_SetBuffer($RegVar_COM3_READ,"");
        SetValueInteger($ID_Semaphore ,0);
      }
  }

… den Semaphore habe ich ganz bewusst auch schon bei dir eingebaut, weil es sonst Probleme gibt !! (siehe folgenden Post http://www.ip-symcon.de/forum/f18/speicherueberlauf-konstellation-7374/)

tgusi74

Hi tgusi74

also habe das hier nun mal nachgestellt leider muss ich das Skribt immer 10 mal ausführen und bei einer Zwangslöschung gehts dann.

Und im 2. Skribt ist folgende Zeile noch falsch

SetValueInteger(17047 /[LOGO\LOGO_READ\LOGO_SEMAPHORE]/ ,0);

sollte heißen

SetValueInteger($ID_Semaphore ,0);

Gruß
Christian

Wenn ich im LOGO_READ die SetValueInteger($ID_Semaphore ,0); gleich auf Null setze dann gehts.