Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 17

Тема: ПРИМЕНЕНИЕ ADR

  1. #1

    По умолчанию ПРИМЕНЕНИЕ ADR

    Добрый день, уважаемые форумчане!
    Постепенно осваиваю CoDeSys и его возможности, вот добрался до ADR и никак не могу разобраться как, где и для чего можно применять эту функцию. В документации ее описание очень слабое без достаточных примеров. Могли бы вы привести примеры применения этой функции и объяснить простым языком что и как. Где лучше всего ее применять и в каких случаях и при каких задачах. Буду очень признателен за помощь!

  2. #2

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    В таком случае не нужна она тебе. Поверь.

    Насколько простым ? Аортокоронарное шунтирование своими руками это очень просто - берешь скальпель, вскрываешь грудную клетку ..... Пойдет ?
    Прогугли&освой общее понятие "указатель в программировании", без этого все остальное - беспонтово. Если ниже приведут примеры, и тупо скопируешь без понимания - станешь очередным мифотворцем о проблемах с указателями.
    Шутки - это конечно хорошо=), но все же, можете привести простой пример в котором описать, что делает эта функция, какие значения возвращает и для чего можно применять ее. Она часто применяется при чтении и записи данных по сети.

  3. #3
    Пользователь
    Регистрация
    11.01.2009
    Адрес
    Кострома
    Сообщений
    3,144

    По умолчанию

    к примеру можно изменить значение подмодуля счетчика в плк конфигураторе
    Последний раз редактировалось lara197a; 13.04.2017 в 18:16.

  4. #4
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,248

    По умолчанию

    в справке к КДС разве она не расписана, нет?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  5. #5

    По умолчанию

    Для подавляющего числа задач для промышленных контроллеров указатели не нужны. Ведь у нас есть VAR_IN_OUT, который их почти заменяет и не приводит к ошибкам обращения к ячейкам памяти, занятыми другими переменными. Единственная задача, где я не нашел другого решения - функция записи в файл структуры, когда в функцию передается указатель и размер структуры.

  6. #6

    По умолчанию

    Цитата Сообщение от slonegd Посмотреть сообщение
    Для подавляющего числа задач для промышленных контроллеров указатели не нужны. Ведь у нас есть VAR_IN_OUT, который их почти заменяет и не приводит к ошибкам обращения к ячейкам памяти, занятыми другими переменными. Единственная задача, где я не нашел другого решения - функция записи в файл структуры, когда в функцию передается указатель и размер структуры.
    Спасибо, что откликнулись на мою тему! Может Вы сможете рассказать простым и понятным языком на простом примере что и для чего, а то что-то никто не хочет помогать и подсказывать. Я вот всегда стараюсь помогать людям, которым могу помочь.

  7. #7

    По умолчанию

    Вкратце. Все переменные лежат в памяти контроллера определенным образом. Когда мы пишем iVar:=128. Мы записываем в ячейку памяти, к которой привязано имя этой переменной число 128. Это для машины, человеку удобнее пользоваться именем переменной. Функция adr(iVar) возвращает как раз адрес этой переменной. Если вы в функциональный блок передали адрес переменной, а не переменную, то меняя её внутри блока (там свои правила написания через указатели тогда), вы меняете её именно в этой ячейке памяти, а не её копию внутри блока, а значит меняешь внутри - меняется и снаружи. Подобное поведение и у var_in_out, рекомендую пользоваться именно var-in-out, ошибок будет меньше.
    Указатели необходимы, к примеру, для создания функций работы с массивами. Только с помощью указателей можно написать универсальную функцию, к которой не привязан конкретный размер массива. В функцию надо передать указатель на первую ячейку массива с помощью ADR() и его размер с помощью SIZEOF() (еще и SIZEOF() ячейки массива - но это уже детали реализации). var-in-out для этого не подходит, потому что необходимо указывать размер массива в описании этого массива, а значит для массивов разной длины будет своя функция.
    Попробуйте написать функцию сортировки массива с любыми целочисленными типами данных, где размер массива может быть любой, не используя указатели.

  8. #8

    По умолчанию

    Цитата Сообщение от slonegd Посмотреть сообщение
    Вкратце. Все переменные лежат в памяти контроллера определенным образом. Когда мы пишем iVar:=128. Мы записываем в ячейку памяти, к которой привязано имя этой переменной число 128. Это для машины, человеку удобнее пользоваться именем переменной. Функция adr(iVar) возвращает как раз адрес этой переменной. Если вы в функциональный блок передали адрес переменной, а не переменную, то меняя её внутри блока (там свои правила написания через указатели тогда), вы меняете её именно в этой ячейке памяти, а не её копию внутри блока, а значит меняешь внутри - меняется и снаружи. Подобное поведение и у var_in_out, рекомендую пользоваться именно var-in-out, ошибок будет меньше.
    Указатели необходимы, к примеру, для создания функций работы с массивами. Только с помощью указателей можно написать универсальную функцию, к которой не привязан конкретный размер массива. В функцию надо передать указатель на первую ячейку массива с помощью ADR() и его размер с помощью SIZEOF() (еще и SIZEOF() ячейки массива - но это уже детали реализации). var-in-out для этого не подходит, потому что необходимо указывать размер массива в описании этого массива, а значит для массивов разной длины будет своя функция.
    Попробуйте написать функцию сортировки массива с любыми целочисленными типами данных, где размер массива может быть любой, не используя указатели.
    Спасибо Вам что рассказали мне как работает эта функция и что она делает. Основная суть ясна. Получается эта функция применяется чтобы изменить значение регистра в котором хранится значение нашей переменной? А если просто присвоить ей значение она ведь тоже изменится. В чем разница не могу понять...
    Программа сортировки массива (это вырезка из основной программы):
    VAR
    POINT:ARRAY[1..20] OF REAL := 2,10,10,65,1,1,17,10,2,4,6,7,1,10,54,1,2,35,0,21;
    SORT_POINT:ARRAY[1..20] OF REAL;
    B:WORD;
    B_MAX:WORD := 19;
    X:REAL;
    END_SORT:BOOL;
    END_VAR
    WHILE NOT END_SORT DO
    B := B + 1;
    IF B >=1 AND B <= B_MAX THEN
    IF SORT_POINT[ B ] >= SORT_POINT[ B+1] THEN
    X := SORT_POINT[ B +1 ];
    SORT_POINT[ B +1 ] := SORT_POINT[ B ];
    SORT_POINT[ B ] := X;
    END_IF
    ELSIF B >= B_MAX THEN
    IF B_MAX > 0 THEN
    B_MAX := B_MAX - 1;
    ELSE
    END_SORT := TRUE;
    B_MAX := 19;
    END_IF
    B := 0;
    END_IF
    END_WHILE

  9. #9

    По умолчанию

    Цитата Сообщение от slonegd Посмотреть сообщение
    Вкратце. Все переменные лежат в памяти контроллера определенным образом. Когда мы пишем iVar:=128. Мы записываем в ячейку памяти, к которой привязано имя этой переменной число 128. Это для машины, человеку удобнее пользоваться именем переменной. Функция adr(iVar) возвращает как раз адрес этой переменной. Если вы в функциональный блок передали адрес переменной, а не переменную, то меняя её внутри блока (там свои правила написания через указатели тогда), вы меняете её именно в этой ячейке памяти, а не её копию внутри блока, а значит меняешь внутри - меняется и снаружи. Подобное поведение и у var_in_out, рекомендую пользоваться именно var-in-out, ошибок будет меньше.
    Указатели необходимы, к примеру, для создания функций работы с массивами. Только с помощью указателей можно написать универсальную функцию, к которой не привязан конкретный размер массива. В функцию надо передать указатель на первую ячейку массива с помощью ADR() и его размер с помощью SIZEOF() (еще и SIZEOF() ячейки массива - но это уже детали реализации). var-in-out для этого не подходит, потому что необходимо указывать размер массива в описании этого массива, а значит для массивов разной длины будет своя функция.
    Попробуйте написать функцию сортировки массива с любыми целочисленными типами данных, где размер массива может быть любой, не используя указатели.
    Как прочитать эти строки...
    a_char:=ADR(rcvBuf[iter]); (*записываем в a_char адрес ячейки массива с индексом iter*) -> а если напишем a_char:=(rcvBuf[iter]); что изменится?
    rcvStr:=CONCAT(rcvStr,LEFT(a_char^,1) ); (*записываем в rcvStr объединяем строку с той что находится в rcvStr с левой значимой частью строки из одного символа в a_char*)

  10. #10
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,248

    По умолчанию

    Цитата Сообщение от deniska13 Посмотреть сообщение
    Как прочитать эти строки...
    a_char:=ADR(rcvBuf[iter]); (*записываем в a_char адрес ячейки массива с индексом iter*) -> а если напишем a_char:=(rcvBuf[iter]); что изменится?
    Вы не различаете разницу, что такое адрес области памяти ОЗУ, где расположена переменная и что такое содержимое переменной?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Применение OPC-сервера CoDeSys
    от Спорягин Кирилл в разделе ПЛК1хх
    Ответов: 10
    Последнее сообщение: 15.06.2016, 19:25
  2. применение указателей
    от Дмитрий Артюховский в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 09.02.2016, 18:07
  3. Применение БКК1-220
    от HeeP в разделе Подбор Оборудования
    Ответов: 6
    Последнее сообщение: 05.04.2012, 11:52
  4. нестандартное применение буст
    от Sniper007 в разделе Подбор Оборудования
    Ответов: 13
    Последнее сообщение: 01.12.2009, 09:16
  5. применение ас3
    от Григорий Ф в разделе Сетевые технологии
    Ответов: 2
    Последнее сообщение: 08.05.2009, 11:56

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •