8-Bit-Eingang schreiben

Das folgende Skript zeigt, wie man einen einzelnen Port (Kanal / Relais) eines beliebigen Ausgang (1-Wire oder andere I/O Geräte) setzt oder löscht.
Dazu muss vom Benutzer der Port und deren Soll-Zustand (True/False) angegeben werden.
Das Skript ließt zunächst den aktuellen IST-Zustand (Interer: 0 bis 255) danach
wird mit Hilfe einer Bitmaske der neue Soll-Zusand bestimmt. Dadurch bleiben die alten Zustände der jeweiligen Ports erhalten.
Anschließend wird der neue Wert an der Gerät übergeben (hier All4000).
Selbstverständlich kann das Skript auch über entsprechende Variablen für: $setpin / $pinvalue getriggert werden.

MST

 $instanceid=12667; // bitte anpassen
 $currentvalue=GetValueInteger("IO8_Port_Out");
 $setpin=2;// der Ausgang, der geschaltet werden soll
 $pinvalue=true; // und An oder Aus

 if($pinvalue)
 {
  $currentvalue |= (1 << $setpin);
 } else {
  $currentvalue &= ~(1 << $setpin);
 }

// den 8-Bit-Port beschreiben - hier den All400 von Allnet
ALL4000_SwitchPort($instanceid, $currentvalue);

Kommt mir doch bekannt vor…
So ähnlich sah das in meinem AVR-GCC-Code auch aus.
PHP ist eben doch nur eine Kreuzung aus Perl und C

Hallo Steiner, ich suche so etwas noch für einen DS2408! Habe leider wieder Kinderkrankheiten bei diesem neuen Baustein.

Gruss aus dem kalten Rheinhessen

Uwe

Hallo Uwe,

was für Kinderkrankheiten :confused: - und so neu ist der 2408 auch wieder nicht.
Und wie wäre es mit diesem Befehl?

MST

In der IPS V2 werden anstelle von Variablen-Namen mit ID’s gearbeitet.
Möchte man ein bestimmtes Bit in einem Byte setzen, so habe ich dies folgendermaßen gelöst:
z.B.: „Quittierung Bit6“ wird True > „Ereignis Bei Variablenaktualisierung“ > Skript wird ausgeführt
Ist die Buchstabenkombination „Bit“ enthalten? > strpos
Und wenn, ja an welcher Stelle? > substr
Somit kann der neue Byte-Wert z.B. in eine SPS geschrieben werden.

MST

$id_db70_0 = 13017 /*[ZBV_Test_QC\SPS\8Bit > Byte\Palettierer_Status DB70.0]*/;
$db_value = GetValue($id_db70_0);   		// bestehenden Wert lesen
$bit_value = GetValue($IPS_VARIABLE);   	// Bit > Trigger
$varname = IPS_GetName($IPS_VARIABLE);

$pos = strpos($varname, "Bit");
if ($pos === False) {
	echo "not found";
	return;
}else{
	$pos = substr($varname, $pos+3, 1);
	//echo "Pos: $pos
";
}

if($bit_value){
	$db_value |= (1 << $pos);
} else {
	$db_value &= ~(1 << $pos);
}

//echo "Byte: $db_value
";
SetValue($id_db70_0, $db_value);

// den 8-Bit-Port beschreiben
//ALL4000_SwitchPort($instanceid, $currentvalue);
S7_WriteByte($id_db70_0, $db_value);