+ Antworten
Ergebnis 1 bis 7 von 7
  1. #1
    Registriert seit
    Mar 2019
    Beiträge
    14

    Standard 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/...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

  2. #2
    Registriert seit
    Apr 2019
    Ort
    Etelsen bei Bremen
    Beiträge
    775

    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
    IPS 5.5 Unlimited / Docker / Synology DS415+

  3. #3
    Registriert seit
    Mar 2019
    Beiträge
    14

    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.

    Code:
    <?
    $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

  4. #4
    Registriert seit
    Mar 2019
    Beiträge
    14

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

    Code:
    $word = ModBus_RequestRead(34173);
    Jetzt ist nur noch das erste Bit True. Was aber immer noch nicht den Daten im DWord entspricht.

  5. #5
    Registriert seit
    Mar 2014
    Ort
    Mücke (Hessen)
    Beiträge
    1,053

    Hi,

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

    Gruß
    IP-Symcon 5.5 Ninja Unlimited - Ubuntu 20.04 / Proxmox 6.2 / Dell T40
    PSView | EnOceanPi | Z-Wave (Razberry) | Sonos | Fritzbox 7390 | 1-Wire | DMX | Dali | Pokeys57E | Siemens Logo 8 | Siemens S7 | Wago SPS | KNX | Onkyo AVR | ModBus | HomeMatic@piVCCU | ESP8266 | MQTT | Ubiquiti | und noch viel mehr geplant

  6. #6
    Registriert seit
    Mar 2019
    Beiträge
    14

    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:
    Code:
    <?
    $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,

  7. #7
    Registriert seit
    Apr 2019
    Ort
    Etelsen bei Bremen
    Beiträge
    775

    gelöscht weil zu spät
    IPS 5.5 Unlimited / Docker / Synology DS415+

Ähnliche Themen

  1. Worx Landroid CSV wie Werte in einzelne Variablen schreiben
    Von Maeffjus im Forum Skripte, PHP, SQL
    Antworten: 20
    Letzter Beitrag: 05.05.19, 15:35
  2. Einzelne Werte aus einem Array einer Variable zuordnen
    Von GEMAG im Forum Skripte, PHP, SQL
    Antworten: 2
    Letzter Beitrag: 17.12.17, 18:31
  3. 16-Bit Wert in zwei 8-Bit Werte auftrennen
    Von paresy im Forum Anleitungen / Nützliche PHP Skripte
    Antworten: 0
    Letzter Beitrag: 01.08.17, 11:40
  4. Dezimalwert auf 8 Bit Variablen aufteilen (DEZ nach BIN)
    Von stfan1409 im Forum Allgemeine Diskussion (2.x/3.x)
    Antworten: 9
    Letzter Beitrag: 27.04.17, 20:38
  5. ModBus und 32-bit Werte (Dword)
    Von and im Forum SPS Automatisierungstechnik
    Antworten: 10
    Letzter Beitrag: 21.11.10, 23:40