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);
}
}