Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
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
    690

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

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

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

Scheduled Pinned Locked Moved ioBroker скрипты
6 Posts 3 Posters 1.5k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • P Offline
    P Offline
    Palko
    wrote on last edited by
    #1

    Добрый день.

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

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

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

    iobroker+Beckhoff_BC9000+…

    1 Reply Last reply
    0
    • I Offline
      I Offline
      instalator
      wrote on last edited by
      #2

      @Palko:

      Добрый день.

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

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

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

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

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

      http://blog.instalator.ru/

      1 Reply Last reply
      0
      • P Offline
        P Offline
        Palko
        wrote on last edited by
        #3

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

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

        iobroker+Beckhoff_BC9000+…

        1 Reply Last reply
        0
        • I Offline
          I Offline
          instalator
          wrote on last edited by
          #4

          @Palko:

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

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

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

          http://blog.instalator.ru/

          1 Reply Last reply
          0
          • P Offline
            P Offline
            Palko
            wrote on last edited by
            #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 Reply Last reply
            0
            • C Offline
              C Offline
              Copycat
              wrote on last edited by
              #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 Reply Last reply
              0

              Hello! It looks like you're interested in this conversation, but you don't have an account yet.

              Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

              With your input, this post could be even better 💗

              Register Login
              Reply
              • Reply as topic
              Log in to reply
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes


              Support us

              ioBroker
              Community Adapters
              Donate

              319

              Online

              32.7k

              Users

              82.6k

              Topics

              1.3m

              Posts
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
              ioBroker Community 2014-2025
              logo
              • Login

              • Don't have an account? Register

              • Login or register to search.
              • First post
                Last post
              0
              • Home
              • Recent
              • Tags
              • Unread 0
              • Categories
              • Unreplied
              • Popular
              • GitHub
              • Docu
              • Hilfe