всем привет подскажите как в тиа портале 16 занулить n количество битов начиная с бита х например я хочу занулить 50 битов начиная с бита 21 тоесть присвоить false битам с 21 по 71 это не структура и не массив поэтому через fill_blk не получилось

Комментарии: 46

  1. Kirill

    Оператором move? На входе пишешь mw нужное, а выход слово в котором байты занулить

    • Egor

      ну через move тоже пишет что только для массивов как я понимаю

      • Kirill

        А что у вас тэги красным подчёркнуты мб грамматика?

        • Dyakonenkora

          Логическое умножение?

          • Egor

            ну такое себе решение каждый тег писать

            • Dyakonenkora

              Ты что обнулять то собрался. 50 булей?

              • Egor

                да допустим с адреса 20 по адрес 70 нужно занулить конкретно эти булы неужели великий тиа портал не может себе такое позволить

                • Evgeniy

                  С порталом не работаю, но как вариант через указатель, если он там есть

                  • Dyakonenkora

                    В cds есть функция mem_fill. Мож в портале тоже что-то такого есть Ну да. Или указатель

                • Gabrrr

                  Биты то в чем находятся. Авто ты говоришь не структура, не массив, а что тогда?

                  • Egor

                    просто в блоке данных db21

                    • Gabrrr

                      И там отдельные будевые переменные? Скрин

                  • Dyakonenkora

                    Это не биты а були

                • Rustem

                  По адресам пройтись и занулить в цикле начиная со стартового адреса на столько-то битов? Не знаю как в семене, возможно есть операции с адресами переменных, указателями... Перебирая адрес +1 дать нули туда. Либо есть аналог функции sysmemset.

                  • Egor

                    вроде нельзя в тиа так делать адресация P#DB1.DBX0.0 bool 1 это указатель на бул с адресом 0.0 в дб1 и нельзя вместо точного адреса указать for счетчик

      • Kirill

        Напиши на LAD должно сработать

        • Egor

          а почему на scl не пашет а на lad запашет?)

          • Kirill

            Ну у тебя теги красные

            • Egor

              так там написано почему они красные потому что это не массив

              • Kirill

                Да попробуй на ладе мувами, должно получиться

                • Egor

                  ну конечно получится если конретному тегу мувом 0 присвоить тогда получается если мне нужно 50 тегов занулить то это 50 мувов? классный код получается

                  • Kirill

                    Мув 16 битов зануляет, а не 1

                  • Kirill

                    Или 32 если MD Или reset bit на каждый

                  • Aleksandr

                    Вы можете создать переменную word с нужным адресом, присвоить 0 не биту, а word.

  2. Bogdan

    Temp := 0; For i:= 0 to 7 do For k:= 0 to 7 do If temp <50 then %Db*.dbx[i.k]:= 0; Temp := temp +1; Else Exit; End_if End_for End_for Вместо * номер своей ДБ. Как то так должно работать - Сименс поддерживает косвенную адресацию. Почитай мануал/хелп на тему косвенной адресации, если не взлетит, возможно где то напутал с синтаксисом

    • Egor

      Ваше решение имеет место быть, но опять таки выглядит как то костыльно, ну и сходу не завелась, протещу завтра уже где косяк ну я все равно думал можно как то одной строчкой сделать так сказать) все равно спасибо что помогли

      • Bogdan

        Возможно, в квадратных скобках должна быть запятая

        • Egor

          все равно ругается "Tag '%DB21.dbx' is not declared" "

          • Bogdan

            А какой контроллер то? Эта адресация вроде на 300/400 сериях работает. На 1200/1500 через поке надо делать

          • Yuriy

            Dbx - обращение к биту, что-то в формате не то, да и компилятор у вас ругается

          • Bogdan

            да, как я и думал - напутал с синтаксисом) в таком виде должна быть запись)

            • Egor

              Спасибо) Реально работает) Теперь буду знать

              • Bogdan

                с помощью косвенной адресации можно много прикольных вещей делать для общих случаев) в вашем случае (частном, разовом, когда статичны начало и конец выборки), наверное, проще будет написать что то типа такого:

                • Egor

                  Да, получилось но на 300) 1200 ругается все равно видел человек выше писал что 1200 не поддерживает и надо через poke_blk

                  • Aleksandr

                    %DB23.DBD0 := 0; Подставить свою дб и стартовую позицию. Обнулит 32 буля.

                    • Egor

                      а если надо 20?

                      • Bogdan

                        16 + 4)

                        • Egor

                          ну можно и так) да)

                • Bogdan

                  Все верно, 1200й не поддерживает поинтеры и там косвенная адресация памяти через поке реализуется Но вот эта запись должна работать и на 1200ке по идее

                  • Egor

                    и она работает да

      • Rustem

        ForI и forK не должны быть [ ].[ ].

      • Aleksandr

        Да я уже выше написал, как одной строчкой сделать.

Не нашли ответ?

Вам также может быть интересно