DWord Variable in einzelne Bit Variablen

Moin Moin,

ich habe ein Problem welches ich aufgrund meiner eingeschränkten Script-Programmier-Fähigkeiten leider nicht selbst lösen kann. Ich benötige zur Minimierung meiner Intervall abfragen ein Script welches mir aus einem Modbus DWORD 32 Einzelne Bool Variablen erstellt, welches ich dann über eine Zyklische Abfrage dann permanent durchlaufen lassen kann.

Das Script von Attein scheint ja schon in die richtige Richtung zu gehen, hiemit komme ich aber leider nicht weiter.
https://www.symcon.de/forum/threads/17190-Word-in-Bit-s-zerlegen

Ich habe auch schon einmal was passendes gefunden gehabt, aber leider versehentlich gelöscht.

Ich hoffe Ihr könnt mir helfen.

Grüße,
Martin

Hi,
wo scheitert es denn? Bei 32 Bit sollte die 15 durch eine 31 ersetzt werden.

Am Ende hast Du ein Feld mit 1 und 0. Wenn Du z.B. auf dem 13. Bit eine Bool machen willst:

if ($bit[13]) SetValue(Variable13, true);
else SetValue(Variable13, false);

Ralf

Neuer Tag neues Hirn,

habe heute noch mal weiter probiert. Mein Script sieht nun so aus und schreibt auch Daten in die eigens dafür angelegten Bit-Variablen.


<?
$bit = array();
$word = 18060;
for ($i=31; $i>=0; $i--){
    $bit[$i] = ($word >> $i) & 1;           // liefert 0 oder 1
} //endfor
SetValue(40456,$bit[0]);
SetValue(58151,$bit[1]);
SetValue(47196,$bit[2]);
SetValue(12197,$bit[3]);
SetValue(50082,$bit[4]);
SetValue(12699,$bit[5]);
SetValue(15696,$bit[6]);
SetValue(36697,$bit[7]);
SetValue(36564,$bit[8]);
SetValue(10069,$bit[9]);
SetValue(38905,$bit[10]);
SetValue(16162,$bit[11]);
SetValue(31390,$bit[12]);
SetValue(36513,$bit[13]);
SetValue(25155,$bit[14]);
SetValue(59338,$bit[15]);
SetValue(30869,$bit[16]);
SetValue(16439,$bit[17]);
SetValue(11827,$bit[18]);
SetValue(48802,$bit[19]);
SetValue(38582,$bit[20]);
SetValue(16499,$bit[21]);
SetValue(42116,$bit[22]);
SetValue(58170,$bit[23]);
SetValue(32558,$bit[24]);
SetValue(33100,$bit[25]);
SetValue(49756,$bit[26]);
SetValue(30841,$bit[27]);
SetValue(28449,$bit[28]);
SetValue(19125,$bit[29]);
SetValue(57401,$bit[30]);
SetValue(57489,$bit[31]);
?>

Jetzt gibt es aber noch ein neues Problem. Die Daten in den Bits entsprechen nicht den Daten aus dem DWord. Die ID im $word ist richtig. Aber selbst bei einer 0 im DWord sind einige Bits noch True.

Grüße,
Martin

Ok 1 Schritt bin ich schon weiter.
Bei $word Steht der Wert und nicht die Variable. :wink:
Also den Eintrag mit einem Modbus Request ersetzt:

$word = ModBus_RequestRead(34173);

Jetzt ist nur noch das erste Bit True. Was aber immer noch nicht den Daten im DWord entspricht.

Hi,

ich vermute das Low & High Byte gedreht werden müssen.

Gruß

ich vermute das Low & High Byte gedreht werden müssen.

Leider ist es nicht ganz so simpel.

Habe das ganze nun auf einen praktikablen Weg gebracht.

Das Script sieht nun wie folgt aus:

<?
$word = GetValueInteger(18060);

$bit = array();
for ($i=15; $i>=0; $i--){
    $bit[$i] = ($word >> $i) & 1;           // liefert 0 oder 1
} //endfor
SetValue(40456,$bit[0]);
SetValue(58151,$bit[1]);
SetValue(47196,$bit[2]);
SetValue(12197,$bit[3]);
SetValue(50082,$bit[4]);
SetValue(12699,$bit[5]);
SetValue(15696,$bit[6]);
SetValue(36697,$bit[7]);
SetValue(32558,$bit[8]);
SetValue(33100,$bit[9]);
SetValue(58170,$bit[10]);
SetValue(49756,$bit[11]);
SetValue(30841,$bit[12]);
SetValue(28449,$bit[13]);
SetValue(19125,$bit[14]);
SetValue(57401,$bit[15]);
?>

Vom Auslesen des Doppenwortes musste ich mich verabschieden da Symcon zwar über Modbus 32Bit abfragen kann, aber nur in den ersten 16Bit Daten enthalten sind.
Bei $word mit Modbusrequest zu arbeiten brachte zudem auch nicht zum Erfolg. Ich mußte mir die Daten per GetValueInteger direkt aus dem Wert der Variable rausziehen.
Einmal Bytedrehung noch und alles kommt da an wo ich es haben will.

Jetzt hoffe ich das das ganze auch noch was bringt und ich mit zusammenfassen der Bool Variablen in ein Wort meine Modbus Intervallabfragen beschleunigen kann.

Grüße,

gelöscht weil zu spät