Как запихать bool массив в память ПЛК чтобы по модбасу видеть? В том смысле как правильно объявить его. values AT%MX100.0 : ARRAY[1..28] OF BOOL; Компилятору не нравится Походу один bool хочет занимать один байт а не бит или шо

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

  1. Rustem

    Указатели читай. И массив там будет с числом ячеек = размеру переменной. Или union пользуй и промеж.переменную, которую потом отдай в модбас в формате word допустим.

    • Berkeman

      Что за команда такая, union? На практике никогда ранее не сталкивался Своими словами

      • Andrew

        Объединение. Ты смотришь на одну и ту же область памяти, но представляешь ее разными типами Это не команда, а dut

        • Berkeman

          Типа M0 UNION M1 ... UNION M7 := D0? Что?

          • Andrew

            Data user type

        • Kirill

          Кстати очень прикольная тема. В дельте есть, но, сука ее нельзя сунуть в системные функции, где на выход идет массив.

      • Rustem

        Это структура/объединение. В ней две переменные разного типа, но по факту это одна область. Допустим массив из двух вордов и реал. Пишешь в реал тег, а считываешь массив вордов и отдаешь в модбас. Так как модбас с вордами стандартно. Если хочешь с байтами, то массив байтов и тусуй их перед отправкой. По сути те же указатели но упакованы для пользователя.

        • Andrew

          Можно больше двух переменных) Сейчас компуктер запущу

          • Rustem

            Ну практически только с 2мя пользовал.

      • Andrew

        TYPE REAL_2WORD_4BYTE : UNION re : REAL; w2 : ARRAY [0..1 OF WORD; b4 : ARRAY [0..3] OF BYTE; END_UNION END_TYPE re, w2, и b4 смотрят на одно и то же место в памяти

        • Berkeman

          О, офигенно удобная штука. Это как модбас в овене же

          • Andrew

            я максимум с mb вот такое делал

          • Rustem

            Удобно. Но если сделать указателем, то меньше гемора при переносе проекта на другой ПЛК где не поддержано Юнион. Но такого я ещё не встречал.

            • Berkeman

              Указатель на что?

            • Andrew

              FUNCTION SWAP_REAL : REAL VAR_INPUT IN : REAL; END_VAR VAR P : POINTER TO DWORD; P1 : POINTER TO DWORD; END_VAR // цель - поменять местами слова в real // поскольку к REAL нельзя применить битовый сдвиг, то // получаем указатель на входное значение P := ADR(IN); // получаем указатель на результат P1 := ADR(SWAP_REAL); // дальше работаем с памятью как с DWORD P1^ := ROL(P^, 16); в кодесисе точно работает) union в 61131-3 же определён

              • Rustem

                То есть это не просто расширение?

                • Andrew

                  Блин. Уже комп погасил)) Вроде оно в стандарте определено

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

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