8-Bit-Eingang lesen

Das folgende Skript zeigt, wie man den 8-Bit-Wert (Interer: 0 bis 255) eines beliebigen Eingang (1-Wire oder andere I/O Geräte)
in 8 einzelne Variablen (Boolean: An/Aus) „zerlegt“.
Getriggert wird das Skript z.B. mit der Variable „IO8_Port_In“ mit „OnChange“.
In der For-Next-Schleife wird 8 mal eine Bitmaske über den Integer-Wert gelegt und somit Zustand der einzelnen Eingänge (An/Aus bzw. True/ False) bestimmt.
Wenn die jeweilige Variable noch nicht existiert, so wird sie angelegt: „IO8_Port_In_BitX“ (X steht für 0 bis 7)

MST

 //Nur Trigger durch Variable erlauben
 if($IPS_SENDER != "Variable")
 {
  return;
 }

 //Port Wert auslesen
 $value = GetValueInteger($IPS_VARIABLE);

 //Port Integer Wert auf einzelne Pin Variablen verteilen
 for($i=0; $i<8; $i++)
 {
  $bitvalue = (($value & (1 << $i)) == (1 << $i));
  $varname = $IPS_VARIABLE."_Bit".$i;

  //Falls Variable nicht vorhanden -> anlegen
  if(!IPS_VariableExists($varname))
  {
   IPS_CreateVariable($varname, "Boolean");
  }
  SetValueBoolean($varname, $bitvalue);
 }

Gilt das auch für WAGO über die Modbus.DLL ?

Das geht mit jeder Integer Variable. Wenn du eine höhere Auflösung als 8Bit brauchst, musst du die For-Schleife verändern.

paresy

Gibt es da keine elegantere lösung ?
left(sprintf(integer,arg)),1) = b7
usw…

bin zu mude heute um noch etwas .php aus dem kopf zu schutteln

wie ich gerade im Parallelthread erwähnte: Für C-Programmierer ist das der normale Weg. nicht wie in Basic->erst Zeichenkette aus 0 und 1 machen und dann die Stringfunktionen drauf los lassen. DAS ist umständlich. Ein Glück, das wir alle Computer mit Ghz-Prozessoren haben, sonst würden sich die Programierer letzteres von ganz alleine verkneifen.

Tommi
(Der gerade versucht, Prozessoren mit 128Byte Ram und 8Mhz zu Programmieren)

Das folgende Skript haben wir für die V2 angepasst…

//Nur Trigger durch Variable erlauben
if($IPS_SENDER != "Variable") {
	return;
}

$value = GetValue($IPS_VARIABLE);   // BYTE > Trigger

for($i=0; $i<8; $i++) {
	$bitvalue = (($value & (1 << $i)) == (1 << $i));
	$varname = IPS_GetName($IPS_VARIABLE)."_Bit".$i;
  	$vid = CreateVariableByName($IPS_VARIABLE, $varname, 0);
 	SetValue($vid, $bitvalue);
}

function CreateVariableByName($id, $name, $type){
   global $IPS_SELF;
   $vid = @IPS_GetVariableIDByName($name, $id);
   if($vid===false) {
      $vid = IPS_CreateVariable($type);
      IPS_SetParent($vid, $id);
      IPS_SetName($vid, $name);
      IPS_SetInfo($vid, "This Variable was created by Script #$IPS_SELF");
   }
   return $vid;
}

Hallo Steiner,

genau das war es! Ich hatte im Forum immer nach Byte auf Bit gesucht, auf 8-Bit-Eingang war ich nciht gekommen.
Vielen Dank

Gruß
Bastelfrosch

Hallo Steiner,

wie bereits beschrieben, läuft das Script für das Auslesen und aufteilen der Werte super. :smiley:
Geht das vielleicht auch anders herum?
Also DB1.DBX1.0 und DB1.DBX1.1 auf 1 entspricht DB1.DBB1=3 etc.

So könnte man in der Visu die einzelnen Bits für die Schaltvorgänge verwenden und diese würden dann als Byte zur SPS übertragen.

viele Grüße

Bastelfrosch

Hallo Bastefrosch,

ich habe ein Ethernet I/O von W&T da kann man es ähnlich machen. Dort setze ich einzelne IPS BoolVariablen zu einem Byte wie folgt zusammen:


$Value = 0;
for ($i=0; $i<=7; $i++){       //low Byte      Ausgang 0-7
  if (GetValueBoolean("Ausgang".$i)){  // Wenn "Ausgang0"...."Ausgang7" = true
    $Value = $Value + pow(2,$i);
  }
}

$Value ist dann der Bytewert.
Ist noch V1 Code. Du mußt halt nur das einlesen der Bool Variablen anpassen.

Gruß

… siehe auch Bit > Byte

Update für Version 4


<?

//Nur Trigger durch Variable erlauben
if($_IPS['SENDER'] != "Variable") {
    return;
}

for($i=0; $i<12; $i++) {
    $bitvalue = (($_IPS['VALUE'] & (1 << $i)) == (1 << $i));
    $varname = IPS_GetName($_IPS['VARIABLE'])."_Bit".$i;
    $vid = CreateVariableByIdent($_IPS['VARIABLE'], $varname, 0);
    SetValue($vid, $bitvalue);
}

function CreateVariableByIdent($id, $name, $type){
   global $IPS_SELF;
   $vid = @IPS_GetObjectIDByIdent($name, $id);
   if($vid===false) {
      $vid = IPS_CreateVariable($type);
      IPS_SetParent($vid, $id);
      IPS_SetName($vid, $name);
      IPS_SetIdent($vid, $name);
      IPS_SetInfo($vid, "This Variable was created by Script");
   }
   return $vid;
}

paresy

1 „Gefällt mir“