Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • 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

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    18
    1
    624

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    9.0k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.3k

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

Geplant Angeheftet Gesperrt Verschoben ioBroker скрипты
6 Beiträge 3 Kommentatoren 1.4k 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
              Antworten
              • In einem neuen Thema antworten
              Anmelden zum Antworten
              • Älteste zuerst
              • Neuste zuerst
              • Meiste Stimmen


              Support us

              ioBroker
              Community Adapters
              Donate

              671

              Online

              32.5k

              Benutzer

              81.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