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

Тема: Работа "POINTER TO" обрывает связь

  1. #1

    По умолчанию Работа "POINTER TO" обрывает связь

    Добрый день!

    Столкнулся со следующей проблемой при разработке своего кода: попытка чтения значения переменной типа POINTER TO REAL приводит к сбросу контроллера. Проблема воспроизводится на ПЛК-100 и ПЛК-160.

    В коде объявляется массив из байт, в который принимаются данные из UDP-сокета. Байты в начале массива (4 шт) представляют собой число типа Real. Объявлена переменная PtR типа POINTER TO REAL и она выставляется на начало массива:

    Код:
    PtR:=ADR(UDPData);
    До этого места всё работает без нареканий - проект загружается, запускается, если "разворачивать" переменную PtR, то для PtR^ отображается корректное значение переменной с плавающей точкой. Но! Стоит только дописать (раскомментировать) следующую строчку (Rl : REAL):

    Код:
    Rl:=PtR^;
    -- как при её исполнении контроллер уходит в перезагрузку. Как бороться с таким поведением?

    Заранее спасибо.

  2. #2

    По умолчанию

    Что интересно, с типами BYTE и WORD таких проблем нет - считывание проходит штатно. А вот именно при попытке считать Real по ссылке - происходит перезагрузка ПЛК с обрывом связи.

  3. #3

    По умолчанию

    Попробуй выделить побольше памяти для переменных.

  4. #4

    По умолчанию

    Цитата Сообщение от JIexa21 Посмотреть сообщение
    Попробуй выделить побольше памяти для переменных.
    Увеличил с 16#3F8 до 16#1000 - результата нет.

    Интересно, что с типами WORD и INT - работает, а вот с DWORD и DINT - зависает как и с Real.

    Для строк разных размеров (1-5) всё работает, но, наверное, потому что сейчас это значение - 00000000, т.е. при преобразовании сразу получается пустая строка.

  5. #5

    По умолчанию

    Заметил ещё одну интересную вещь: если ссылка идёт не на этот массив, а на другую четырёхбайтную структуру - преобразование работает.

    Поставил костыль - считываю сначала WORD из начала массива, потом - WORD из начала массива +2 байта, считаю DWORD как W1 SHL 16 + W2, потом привожу Real к ссылке на этот DWORD. Работает. Но это же - не нормально?..

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

    По умолчанию

    нету кода, нет и ответа
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

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

    По умолчанию

    Адрес под указателем должен быть кратным размеру типа под указателям. То есть в случае с REAL указатель должен указывать на адрес, кратный 4. Иначе да, контроллер будет перезагружаться. Предполагаю, что процессор в контроллерах этого семейства один из тех, что не работают без выравнивания. Так что забудьте про указатели и используйте SysLibMem (а именно SysMemCpy).
    Последний раз редактировалось Yegor; 12.07.2016 в 19:55.

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

    По умолчанию

    Цитата Сообщение от Yegor Посмотреть сообщение
    Адрес под указателем должен быть кратным размеру типа под указателям. То есть в случае с REAL указатель должен указывать на адрес, кратный 4. Иначе да, контроллер будет перезагружаться. Предполагаю, что процессор в контроллерах этого семейства один из тех, что не работают без выравнивания. Так что забудьте про указатели и используйте SysLibMem (а именно SysMemCpy).
    что за не обоснованный наезд на указатель, ТС же пишет
    если "разворачивать" переменную PtR, то для PtR^ отображается корректное значение переменной с плавающей точкой
    здесь какая то элементарная ошибка в коде, который не предоставлен
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  9. #9

    По умолчанию

    однозначно выравнивание! UDPdata нужно объявлять как массив dword - посчитать чтобы все байты влезали, ну или REAL и наступит счастье!

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

    По умолчанию

    Цитата Сообщение от Дмитрий Артюховский Посмотреть сообщение
    однозначно выравнивание! UDPdata нужно объявлять как массив dword - посчитать чтобы все байты влезали, ну или REAL и наступит счастье!
    Почему Вы все не читаете ТС, он же пишет что реал расположен в начале массива, кроме как с нулевого индекса это невозможно интерпретировать, при чем тут выравнивание. Без исходников тут всё что угодно может быть, например массив используется еще где нибудь, а присвоение переменной реал идет постоянно и поэтому где то в коде, вместо адекватного значения в вычислениях присутствует нечисло, приводяещее к зависанию
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

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

Похожие темы

  1. Ответов: 16
    Последнее сообщение: 15.02.2017, 11:39
  2. Ответов: 4
    Последнее сообщение: 11.04.2016, 13:54
  3. Ответов: 1
    Последнее сообщение: 15.01.2016, 14:59
  4. Ответов: 20
    Последнее сообщение: 15.04.2015, 11:02
  5. ПЛК110 Самопроизвольное выключение режима "Работа"
    от ОАО"Органика" в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 20.12.2011, 11:19

Метки этой темы

Ваши права

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