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

Тема: Обращение через указатель. Перезагрузка

  1. #1

    По умолчанию Обращение через указатель. Перезагрузка

    PROGRAM PLC_PRG
    VAR
    i:UINT;
    ptw,ptwi:POINTER TO WORD;

    In_1 : ARRAY [1..255] OF BYTE; (* Входной массив номер 1*)
    Out_1: ARRAY [1..255] OF BYTE; (* Выходной массив номер 1*)


    END_VAR


    ptw:=ADR(Out_1[8]);
    ptw^:=2015;


    Перезагрузка на последнем шаге.
    ПЛК 110-30. 2.15.3.

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

    Сейчас в одном проекте не смог обойти привычным способом:
    В чем причина перезагрузок. Как не допускать?
    Последний раз редактировалось mkhm; 29.04.2015 в 09:52.

  2. #2

    По умолчанию

    может быть POINTER TO BYTE? или ARRAY [1..XXX] OF WORD?

    или

    FUNCTION SetWord : DWORD

    VAR_INPUT
    i_dwAddress: POINTER TO BYTE;
    i_wVal: WORD;
    END_VAR

    (* res *)
    i_dwAddress^ := WORD_TO_BYTE( i_wVal / 256 );
    i_dwAddress := i_dwAddress + 1;
    i_dwAddress^ := WORD_TO_BYTE( i_wVal );

    SetWord := i_dwAddress + 1;

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

    По умолчанию

    Цитата Сообщение от mkhm Посмотреть сообщение
    PROGRAM PLC_PRG
    VAR
    i:UINT;
    ptw,ptwi:POINTER TO WORD;

    In_1 : ARRAY [1..255] OF BYTE; (* Входной массив номер 1*)
    Out_1: ARRAY [1..255] OF BYTE; (* Выходной массив номер 1*)


    END_VAR


    ptw:=ADR(Out_1[8]);
    ptw^:=2015;


    Перезагрузка на последнем шаге.
    ПЛК 110-30. 2.15.3.

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

    Сейчас в одном проекте не смог обойти привычным способом:
    В чем причина перезагрузок. Как не допускать?
    на самом деле бред какой то, массив байтовый а указатель на word, что Вы этим хотели добится?
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  4. #4

    По умолчанию

    "на самом деле бред какой то, массив байтовый а указатель на word, что Вы этим хотели добится?"

    все типы данных в компьютерах передают через байтовые потоки ))) обычно ! битовые, также выравнивают по байтам !

  5. #5

    По умолчанию

    Спасибо,этот вариант понятен.

    Исходный с несовпадением типа массива и указателя использовать нельзя?
    (В нескольких проектах работает без проблем)

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

    По умолчанию

    Цитата Сообщение от Дмитрий Артюховский Посмотреть сообщение
    "на самом деле бред какой то, массив байтовый а указатель на word, что Вы этим хотели добится?"

    все типы данных в компьютерах передают через байтовые потоки ))) обычно ! битовые, также выравнивают по байтам !
    сейчас речь не о передаче данных, а о присвоении данных внутри программы, смотрите внимательно, массив начинается с индекса 1, значит два байта присвоенного ворда через указатель на восьмой индекс создают полный хаос и никакое выравнивание тут ни причем. Первым делам надо объявления привести в порядок, тогда и вся остальная цепочка вплоть до передачи по сети возможно пройдет нормально без ошибок
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  7. #7

    По умолчанию

    Цитата Сообщение от Дмитрий Артюховский Посмотреть сообщение
    "на самом деле бред какой то, массив байтовый а указатель на word, что Вы этим хотели добится?"

    все типы данных в компьютерах передают через байтовые потоки ))) обычно ! битовые, также выравнивают по байтам !
    Бред "все типы ... передают через байтовые потоки )))"
    Заполнение любого массива потоками "слов", соответствующих разрядности процессора - стандартная вещь, хотя возможны и байтовые потоки.
    Например, в 16 разрядном процессоре переписывать массив 16 битными словами (lodsw stosw).

  8. #8

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    сейчас речь не о передаче данных, а о присвоении данных внутри программы, смотрите внимательно, массив начинается с индекса 1, значит два байта присвоенного ворда через указатель на восьмой индекс создают полный хаос и никакое выравнивание тут ни причем. Первым делам надо объявления привести в порядок, тогда и вся остальная цепочка вплоть до передачи по сети возможно пройдет нормально без ошибок
    Спасибо, понятно.( Для избежания проблем типы привести в соответствие.)

    Но для полноты картины: такие же объявления и код в других проектах работают без проблем.
    Например, и указанный пример заработал без перезагрузок в таком виде:test.png
    Вложения Вложения
    • Тип файла: pro !test.pro (42.0 Кб, Просмотров: 4)

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

    По умолчанию

    Цитата Сообщение от mkhm Посмотреть сообщение
    Спасибо, понятно.( Для избежания проблем типы привести в соответствие.)

    Но для полноты картины: такие же объявления и код в других проектах работают без проблем.
    Например, и указанный пример заработал без перезагрузок в таком виде:test.png
    не смотрел проект, но то что иногда перегрузки нет, так например ноль какому бы типу не принадлежал он везде будет ноль, а если в ворде изменить один байт, то можно получить так называемое нечисло, которое перегружает плк
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  10. #10
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    2,256

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    никакое выравнивание тут ни причем
    Тут именно выравнивание. Разлет с типами - как раз и не имеет значения

    Пусть топик вставит
    var ek : bool;

    ptw:=ADR(Out_1[8]);
    ek := (ptw mod 2) = 1; //вот тута и увидит
    ptw^:=2015;

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

Похожие темы

  1. Ответов: 18
    Последнее сообщение: 08.10.2021, 22:54
  2. Обращение к переменной из MasterLink
    от OrionK в разделе Master SCADA 3
    Ответов: 5
    Последнее сообщение: 28.02.2013, 11:23
  3. Ответов: 2
    Последнее сообщение: 13.01.2011, 15:47
  4. бит через указатель
    от Freddy в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 20.07.2010, 09:08
  5. Ответов: 5
    Последнее сообщение: 02.04.2010, 10:05

Ваши права

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