Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Русский
  3. ioBroker
  4. Скрипты
  5. ioBroker скрипты
  6. По-битный разбор десятичного числа

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    645

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    18
    1
    5.7k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.5k

По-битный разбор десятичного числа

Geplant Angeheftet Gesperrt Verschoben ioBroker скрипты
6 Beiträge 3 Kommentatoren 1.5k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • P Offline
    P Offline
    Palko
    schrieb am zuletzt editiert von
    #1

    Добрый день.

    К сожалению Beckhoff дает считать с себя данные только словами, а это 16 бит.

    Читаю из Remanent области и для получения 50 бит данных разбазаривать 100 байт совсем не комильфо, когда можно считать одним словом булевы данные по целому разделу.

    в JS не силен, курил булевы операции но так и не понял как правильно перевести число в двоичный вид и раскидать данные по отдельным переменным… точнее так: как правильно сделать побитовый сдвиг и "&" с маской...

    iobroker+Beckhoff_BC9000+…

    1 Antwort Letzte Antwort
    0
    • I Offline
      I Offline
      instalator
      schrieb am zuletzt editiert von
      #2

      @Palko:

      Добрый день.

      К сожалению Beckhoff дает считать с себя данные только словами, а это 16 бит.

      Читаю из Remanent области и для получения 50 бит данных разбазаривать 100 байт совсем не комильфо, когда можно считать одним словом булевы данные по целому разделу.

      в JS не силен, курил булевы операции но так и не понял как правильно перевести число в двоичный вид и раскидать данные по отдельным переменным… точнее так: как правильно сделать побитовый сдвиг и "&" с маской... `
      Как ты читаешь данные?

      не твой случай? http://forum.iobroker.net/viewtopic.php?f=26&t=8629

      Высокий уровень Децибел вреден для здоровья!

      http://blog.instalator.ru/

      1 Antwort Letzte Antwort
      0
      • P Offline
        P Offline
        Palko
        schrieb am zuletzt editiert von
        #3

        Читаю просто, двухбайтное слово через modbus TCP с контроллера.

        Благодарю, щас раскурю ссылку.

        iobroker+Beckhoff_BC9000+…

        1 Antwort Letzte Antwort
        0
        • I Offline
          I Offline
          instalator
          schrieb am zuletzt editiert von
          #4

          @Palko:

          Читаю просто, двухбайтное слово через modbus TCP с контроллера.

          Благодарю, щас раскурю ссылку. `
          т.е. обычная строка? разбей её посимвольно

          Высокий уровень Децибел вреден для здоровья!

          http://blog.instalator.ru/

          1 Antwort Letzte Antwort
          0
          • P Offline
            P Offline
            Palko
            schrieb am zuletzt editiert von
            #5

            вроде все получилось.

            разбил по-символьно, засунул в массив.

            получилось как то так:

            ! ````
            var bin16;
            var length1;
            var data = [];
            createState('MOV.FLT',0);
            createState('MOV.KUH',0);
            createState('MOV.KOR',0);
            createState('MOV.BDR',0);
            createState('MOV.DET',0);
            createState('MOV.VAN',0);
            createState('MOV.TLT',0);
            createState('MOV.PRH',0);
            ! schedule("*/15 * * * * *", function () {
            ! bin16 = getState("modbus.0.holdingRegisters.56411_MOV_FLT").val.toString(2); // получаем из ячейки modbus 2-х байтное слово и переводим в двоичное представление, слово типа "1010011101"
            ! length1 = 6;
            while (length1>=0) { // обнуляем весь массив для того чтоб не было undefined при массиве размером меньше 6
            data[length1]=0;
            length1--;
            }
            ! switch (parseInt (bin16)) {
            ! case 0: //если ключевой бит снят то все обнуляем
            setState("javascript.0.MOV.FLT", 0);
            setState("javascript.0.MOV.KUH"/MOV.KUH/, 0);
            setState("javascript.0.MOV.KOR"/MOV.KOR/, 0);
            setState("javascript.0.MOV.BDR"/MOV.BDR/, 0);
            setState("javascript.0.MOV.DET"/MOV.DET/, 0);
            setState("javascript.0.MOV.VAN"/MOV.VAN/, 0);
            setState("javascript.0.MOV.TLT"/MOV.TLT/, 0);
            setState("javascript.0.MOV.PRH"/MOV.PRH/, 0);
            break;
            ! case 1: // если установлен только ключевой бит то отмечаем только его
            setState("javascript.0.MOV.FLT", 1);
            setState("javascript.0.MOV.KUH"/MOV.KUH/, 0);
            setState("javascript.0.MOV.KOR"/MOV.KOR/, 0);
            setState("javascript.0.MOV.BDR"/MOV.BDR/, 0);
            setState("javascript.0.MOV.DET"/MOV.DET/, 0);
            setState("javascript.0.MOV.VAN"/MOV.VAN/, 0);
            setState("javascript.0.MOV.TLT"/MOV.TLT/, 0);
            setState("javascript.0.MOV.PRH"/MOV.PRH/, 0);
            break;

            default:        // во всех других случаях разбираем бинарное старшее слово 
            length1 = (bin16.length)-9;
                 while (length1>=0) { //5 и меньше
                    data[length1] = parseInt (bin16.charAt(length1),2); // пишем в массив побитно (с 9-го бита слова вверх)
                    length1--;
                   }
              setState("javascript.0.MOV.FLT", 1);
              setState("javascript.0.MOV.KUH"/*MOV.KUH*/, data[0]);
              setState("javascript.0.MOV.KOR"/*MOV.KOR*/, data[1]);
              setState("javascript.0.MOV.BDR"/*MOV.BDR*/, data[2]);
              setState("javascript.0.MOV.DET"/*MOV.DET*/, data[3]);
              setState("javascript.0.MOV.VAN"/*MOV.VAN*/, data[4]);
              setState("javascript.0.MOV.TLT"/*MOV.TLT*/, data[5]);
              setState("javascript.0.MOV.PRH"/*MOV.PRH*/, data[6]);        
            

            }

            ! });

            
            не сильно оптимально, но работает)

            iobroker+Beckhoff_BC9000+…

            1 Antwort Letzte Antwort
            0
            • C Offline
              C Offline
              Copycat
              schrieb am zuletzt editiert von
              #6

              Спасибо за скрипт, коллега. Как раз решал такую же задачу. Немного доработал его, возможно, будет полезно последователям.

              ! ````
              var bin16;
              ! // Состояния входящих регистров в порядке их размещения в памяти ПЛК Beckhoff BC9000
              createState('D3KitchenLight1',0); // %QX128.0
              createState('D3LibraryLight1',0); // %QX128.1
              createState('D3KitchenLight2',0); // %QX128.2
              createState('D3LibraryLight2',0); // %QX128.3
              createState('D3BedroomLight1',0); // %QX128.4
              createState('D3LibraryLight3',0); // %QX128.5
              createState('D3BedroomLight2',0); // %QX128.6
              createState('D3LibraryLight4',0); // %QX128.7
              createState('D3DressingRoomLight',0); // %QX129.0
              createState('D3TankLight',0); // %QX129.1
              createState('D3LobbyLight',0); // %QX129.2
              createState('D3BathroomRadiator',0); // %QX129.3
              createState('DLadderLight',0); // %QX129.4
              createState('D3TankroomRadiator',0); // %QX129.5
              createState('D3BathroomLight',0); // %QX129.6
              createState('D3BathroomTowelHeater',0); // %QX129.7
              ! // код срабатывает только в случае, когда изменился какой либо из регистров
              on('modbus.0.inputRegisters.0', function (obj) {
              ! // получаем из ячейки modbus 2-х байтное слово и переводим в двоичное представление,
              // слово типа "1010011101"
              bin16 = getState("modbus.0.inputRegisters.0").val.toString(2);
              ! // здесь дополняем строку до 16 симоволов лидирующими нулями
              // и получаем строку типа "0000001010011101"
              while (bin16.length < 16) {
              bin16 = '0' + bin16;
              }
              ! // Разбираем состояния в соотвествии с порядком битов unsigned 16 bit (little endian)
              setState("javascript.0.D3KitchenLight1", bin16[7]);
              setState("javascript.0.D3LibraryLight1", bin16[6]);
              setState("javascript.0.D3KitchenLight2", bin16[5]);
              setState("javascript.0.D3LibraryLight2", bin16[4]);
              setState("javascript.0.D3BedroomLight1", bin16[3]);
              setState("javascript.0.D3LibraryLight3", bin16[2]);
              setState("javascript.0.D3BedroomLight2", bin16[1]);
              setState("javascript.0.D3LibraryLight4", bin16[0]);
              setState("javascript.0.D3DressingRoomLight", bin16[15]);
              setState("javascript.0.D3TankLight", bin16[14]);
              setState("javascript.0.D3LobbyLight", bin16[13]);
              setState("javascript.0.D3BathroomRadiator", bin16[12]);
              setState("javascript.0.DLadderLight", bin16[11]);
              setState("javascript.0.D3TankroomRadiator", bin16[10]);
              setState("javascript.0.D3BathroomLight", bin16[9]);
              setState("javascript.0.D3BathroomTowelHeater", bin16[8]);
              ! });

              Beckhoff BC9000/MegaD-328/ioBroker@Orange PI Plus2

              1 Antwort Letzte Antwort
              0

              Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

              Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

              Mit deinem Input könnte dieser Beitrag noch besser werden 💗

              Registrieren Anmelden
              Antworten
              • In einem neuen Thema antworten
              Anmelden zum Antworten
              • Älteste zuerst
              • Neuste zuerst
              • Meiste Stimmen


              Support us

              ioBroker
              Community Adapters
              Donate

              146

              Online

              32.7k

              Benutzer

              82.6k

              Themen

              1.3m

              Beiträge
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
              ioBroker Community 2014-2025
              logo
              • Anmelden

              • Du hast noch kein Konto? Registrieren

              • Anmelden oder registrieren, um zu suchen
              • Erster Beitrag
                Letzter Beitrag
              0
              • Home
              • Aktuell
              • Tags
              • Ungelesen 0
              • Kategorien
              • Unreplied
              • Beliebt
              • GitHub
              • Docu
              • Hilfe