Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 24

Тема: Использование указателей Pointer

  1. #1

    По умолчанию Использование указателей Pointer

    Добрый день. Интересует вопрос использования указателей (pointer of byte, word, dword). Моя конкретная ситуация "сохранение данных в переменную при чтении данных с модбас модулей". В модуле чтения UniRead мы задаём указатель на переменную куда будут читаться Pointer_of_byte. В моём случае на картинке-вложении ниже это переменная Ptr_Byte_Pozhar.

    И так вопрос: Каким образом, используя какую библиотеку или функциональные модули мы записываем данные в глобальную переменную, имея Pointer?

    1111111111111111111111111.jpg
    Последний раз редактировалось Андрей Плеханов; 10.07.2013 в 12:53.

  2. #2

    По умолчанию

    Подскажите пожалуйста библиотеку c элементами для перекладывания данных в переменную с помощью указателя, используя pointer_of_byte/word/dword

    язык LD

  3. #3
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Используйте оператор ^ для разыменования указателя (для обращения к переменной под указателем). Byte_Pozhar2 := Ptr_Byte_Pozhar^, например.

  4. #4

    По умолчанию

    спасибо за помощь

  5. #5

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Используйте оператор ^ для разыменования указателя (для обращения к переменной под указателем). Byte_Pozhar2 := Ptr_Byte_Pozhar^, например.
    А если необходимо наоборот присвоить указателю адрес байта, то получается Ptr_Byte_Pozhar^ := Byte_Pozhar2
    так правильно будет?

  6. #6

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Используйте оператор ^ для разыменования указателя (для обращения к переменной под указателем). Byte_Pozhar2 := Ptr_Byte_Pozhar^, например.
    После создания функционального блока с подобным скриптом при попытке запуска в онлайн режиме (эмуляция) - Индикация "Программа загружена - ИСКЛЮЧЕНИЕ" Подскажите в чём может быть проблема?

    фывфыв.jpg

  7. #7

  8. #8

    По умолчанию

    Подскажите где про указатели инфу найти можно, а то я так и не пойму как с ними работать.

  9. #9

    По умолчанию

    Цитата Сообщение от Igor.m Посмотреть сообщение
    Подскажите где про указатели инфу найти можно, а то я так и не пойму как с ними работать.
    http://ru.wikipedia.org/wiki/Указатель_(тип_данных)
    Все тоже самое для любых языков ( кроме тех, где от указателей отказались принципиально)

    Отдельного руководства по использованию указателей в CODESYS я не встречал, да оно и не особо нужно. Главное понять принцип работы с ним, а это можно по вышеприведенной ссылке.

    Основное понятие: Указатель - это адрес ячейки памяти, одного байта, не зависимо от типа содержания в той ячейки.
    Чтобы прописать или считать данные по адресу нужно обратиться по этому адресу c ^.

    пример:
    Код:
    PROGRAM PLC_PRG
    VAR
    	pX : POINTER TO BYTE;
    	pY : POINTER TO INT;
    	x : BYTE;
    	y : INT;
    	
    END_VAR
    /*---------------------------------*/
      pX := ADR(x);
      pY := ADR(y);
    
      pX^ := 1; 
      pY^ := 123;
    первые две строчки получают адреса переменных x и y и записывают их в соответствующие указатели.
    Далее по этим адресам мы записываем данные, которые отобразятся в переменных x и y (потому как указатели указывают на них);
    Повторюсь любой указатель указывает только на 1 байт. тип (to int к примеру) приписывается только для того, чтоб кодесис знал сколько байт от этого указателя и далее брать для операци с ^. Это дает удобство в работе с ними, но также кроется опасность.
    К примеру код:
    pY := adr(x); не является не корректным, в этом случае указатели pX и pY будут ссылаться на один и тот же байт, где лежит значение переменной x. Но операция pY^ := N использует первый байт (где x лежит) и затрет следующий байт за ним, потому, что pY это указатель на int, а int имеет размер 2x байтов, следовательно операция pY^ будет использовать 2 байта от указателя. Така не аккуратность приводит к параличу программы.

    Указатели на кусок памяти удобно использовать во многих случаях. Один из - передача больших массивов данных из одной функции в другую:

    arr: array[1..10000] of LWORD; - массив 8* 10000 байт
    передача параметром его в фунцию:
    someFunction(arr); - приведет к копированию всех 80 000 байт, что займет длительное время.
    передача же указателя :
    pArr : pointer to byte;
    sizeOfArr : uint := 80000;

    pArr := adr(arr);
    someFunction(pArr, sizeOfArr); - копирует всего 4 байта самого указателя и 2 байта размера, и при этом функция получает доступ к массиву в 80 000 байт.

    Это наиболее распространенный, но все же частный случай использования указателя был выделен в кодесис в отдельную группу переменных VAR_IN_OUT, что по сути является скрытым использованием указателей при передачи больших объемов данных между POU.
    Последний раз редактировалось Mikhail Shvetsov; 04.12.2013 в 11:35.

  10. #10

    По умолчанию

    Спасибо за развернутый ответ! Будем изучать... А на СFС это как будет выглядеть?

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

Похожие темы

  1. Ответов: 23
    Последнее сообщение: 22.12.2010, 23:36
  2. POINTER TO what?
    от drvlas в разделе ПЛК (среда CoDeSys V2.3)
    Ответов: 34
    Последнее сообщение: 04.12.2010, 23:46
  3. Использование АС4
    от alex_sinjawin в разделе Сетевые технологии
    Ответов: 2
    Последнее сообщение: 10.11.2009, 18:31
  4. Использование таймеров
    от alex1963 в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 21.12.2008, 16:12
  5. Получение списка/указателей на ФБ проекта
    от Аркадий в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 05.03.2008, 18:22

Ваши права

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