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

Тема: мистическая комбинация в ПЛК150

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию мистическая комбинация в ПЛК150

    Добрый день,

    В программе на ST написанной для ПЛК 150, булевская переменная принимает странное значение и показывает ошибку для переменной xInit. Саму программу в которой это было обнаружено я упростил, убрал все лишнее, чтобы продемонстрировать ошибку. Если написать программу четко, как на скрине, то будет ошибка.

    Ошибка возникает только если iCount:=6 и массив aBuffer: ARRAY [1..5] OF WORD из пяти элементов.

    Можно подумать, что массив из 5 элементов, а iCount равен 6 и поэтому запись в массив некорректная, но во-первых причем тут булевская переменная xInit, которую вообще не трогают, а во-вторых при любых других значения iCount больших 6, такой ситуации не возникает.
    И в принципе никогда больше такой ситуации не возникает, в которой булевская переменная принимает не свойственное ее типу ошибочное значение, какие бы комбинации размеров массива и iCount я не делал. То есть только комбинация когда массив из 5 элементов и iCount:=6 дает ошибочное значение xInit ни каким боком не относящейся к этому массиву и переменной iCount. Если массив и переменную wX сделать типа INT то ошибки также не возникает даже при комбинации iCount=6 и массива aBuffer: ARRAY [1..5] OF INT.

    Прошу пояснить эту мистику на ПЛК150.


    В приложении скрины.

    С уважением, Михаил
    Изображения Изображения

  2. #2
    Супер Модератор Аватар для Евгений Кислов
    Регистрация
    27.01.2015
    Адрес
    Москва
    Сообщений
    7,008

    По умолчанию

    Вопрос был почему так выходит только при такой комбинации когда массив из пяти, пишется значение в шестой и возникает неправильное значение в булевской переменной, которая не относится к этому массиву. Если писать в седьмой или любой другой, которого тоже нет, то ошибки не возникает. Ошибка если только в шестой.
    Потому что компилятор размещает переменную xInit по адресу памяти, расположенному следом за адресом последнего элемента массива.
    Cедьмой, восьмой и другие несущестующие элементы соответствуют другим адресам памяти, которые не имеют отношения к переменной xInit.

    То что значение переменной wX попадает в xInit это сразу было понятно. Непонятно почему оно туда попадает только когда массив из 5 элементов и значение пишется в шестой. Если сделать массив из 4 элементов, и писать в пятый или в любой другой, то ошибка не появляется. В этом и мистика для меня лично.
    Вы, видимо, просто не выполняете команду Проект - Очистить все при внесении изменений - в этом случае компилятор, вероятно, не перераспределяет адреса.

    2021-04-15_6-27-10.png

    Естественно, никакой "мистической комбинации" нет, и такое поведение будет воспроизводиться при любой размерности массива:

    2021-04-15_6-23-42.png 2021-04-15_6-25-38.png 7777777777.png

  3. #3

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Естественно, никакой "мистической комбинации" нет, и такое поведение будет воспроизводиться при любой размерности массива:
    Да у вас нет мистики, а на моем плк она к сожалению есть. Вероятно потому что плк-150 2007 года выпуска с прошивкой того же года(обновить не получается ни у меня ни у тех.отдела OWEN). Прилагаю мистические скрины, на них видно что ошибки нет при других комбинациях.
    Изображения Изображения

  4. #4
    Пользователь
    Регистрация
    28.08.2008
    Адрес
    23..93..123
    Сообщений
    1,495

    По умолчанию

    Цитата Сообщение от Ian Посмотреть сообщение
    Да у вас нет мистики, а на моем плк она к сожалению есть. Вероятно потому что плк-150 2007 года выпуска с прошивкой того же года(обновить не получается ни у меня ни у тех.отдела OWEN). Прилагаю мистические скрины, на них видно что ошибки нет при других комбинациях.
    А вы, Батенька, жулик... xInit на первую строчку поставил и ... все данные в массив переливаются хрен знает куда, теперь, ради хохмы попробуйте прочитать значение в массиве с индексом [7].
    Это не ПЛК и не среда разработки, это называется культура программирования и очень часто вижу такие опусы, что их аффтаров хочется бить по голове палкой из виноградной лозы(она не ломается).

  5. #5

    По умолчанию

    Цитата Сообщение от Sergey666 Посмотреть сообщение
    А вы, Батенька, жулик... xInit на первую строчку поставил и ... все данные в массив переливаются хрен знает куда, теперь, ради хохмы попробуйте прочитать значение в массиве с индексом [7].
    Это не ПЛК и не среда разработки, это называется культура программирования и очень часто вижу такие опусы, что их аффтаров хочется бить по голове палкой из виноградной лозы(она не ломается).
    Нервные все тут на форуме) Жулик, палкой бить... Эти выпады в мою сторону удивляют и забавляют. Я в этой теме две недели, а отвечающие с 2008 года судя по регистрации на форуме. Вопросы задаю потому что мне реально непонятно. Поменял порядок потому что пробовал разные варианты и забыл. Поставил на место, опять ошибка, но уже без мистики на всех комбинациях. В итоге получается два момента: 1) От мистики избавился за счет очистить все. 2) Если xInit на первой строке ошибки нет, а если на последней то есть. Только непонятно почему все так.

  6. #6
    Пользователь Аватар для A.Simonov
    Регистрация
    11.07.2017
    Адрес
    Москва
    Сообщений
    373

    По умолчанию

    Цитата Сообщение от Ian Посмотреть сообщение
    Нервные все тут на форуме) Жулик, палкой бить... Эти выпады в мою сторону удивляют и забавляют. Я в этой теме две недели, а отвечающие с 2008 года судя по регистрации на форуме. Вопросы задаю потому что мне реально непонятно. Поменял порядок потому что пробовал разные варианты и забыл. Поставил на место, опять ошибка, но уже без мистики на всех комбинациях. В итоге получается два момента: 1) От мистики избавился за счет очистить все. 2) Если xInit на первой строке ошибки нет, а если на последней то есть. Только непонятно почему все так.
    Что не понятного то?
    Вы создали массив из пяти элементов (они в памяти занимают 5 ячеек памяти).
    Когда вы обращаетесь к 6-му элементу массива, которого нет, то попадаете в соседнюю ячейку памяти, а в ней находится ваша булевская переменная.
    А находится она там по тому, что память выделяется в момент объявления переменной, причем это, очевидно, происходит в той последовательности в которой переменные объявлены.
    Если вы следом объявите еще одну переменную. то обращаясь к 7-му элементу массива сможете перезаписать и её.

    Вообще, если уже на то пошло. То обращаться к несуществующим элементам массива не стоит, это некорректно и приводит к тому, что вы наблюдаете.
    Александр Андреевич Симонов
    Инженер по продуктам «ПЛК, модули и OwenCloud»
    e-mail: support@owen.ru
    e-mail: a.simonov@owen.ru

  7. #7

    По умолчанию

    Цитата Сообщение от Евгений Кислов Посмотреть сообщение
    Вы, видимо, просто не выполняете команду Проект - Очистить все при внесении изменений - в этом случае компилятор, вероятно, не перераспределяет адреса.
    Делал сто раз вчера очистить все, потому что прежде чем написать в чат перепроверил все что можно. Но решил еще раз сегодня очистить все и ошибка пропала теперь даже при комбинации 6 и 5 нет ошибки. Опять все очистил, пересохранил, перекомпилировал, выключил включил и прочие танцы исполнил. Ошибки нет. Бред какой то. Должен же он записывать в соседнюю ячейку или нет если элемент вываливается, если должен то почему сейчас все не записывает.

    Подскажите где-то описано в какой нибудь литературе как работает компилятор в Codesys?
    Изображения Изображения

  8. #8

    По умолчанию

    Цитата Сообщение от Ian Посмотреть сообщение
    Делал сто раз вчера очистить все, потому что прежде чем написать в чат перепроверил все что можно. Но решил еще раз сегодня очистить все и ошибка пропала теперь даже при комбинации 6 и 5 нет ошибки. Опять все очистил, пересохранил, перекомпилировал, выключил включил и прочие танцы исполнил. Ошибки нет. Бред какой то. Должен же он записывать в соседнюю ячейку или нет если элемент вываливается, если должен то почему сейчас все не записывает.

    Подскажите где-то описано в какой нибудь литературе как работает компилятор в Codesys?
    Кончай ерундой заниматься.

  9. #9
    Пользователь
    Регистрация
    31.07.2013
    Адрес
    Аркаим
    Сообщений
    944

    По умолчанию

    Ради интереса повторил программу. Результат другой:
    2.jpg

  10. #10
    Пользователь
    Регистрация
    28.08.2008
    Адрес
    23..93..123
    Сообщений
    1,495

    По умолчанию

    Цитата Сообщение от Sulfur Посмотреть сообщение
    Ради интереса повторил программу. Результат другой:
    2.jpg
    Так это в симуляции...

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

Похожие темы

  1. ПЛК150 + ПЧВ
    от NikeTM в разделе Эксплуатация
    Ответов: 2
    Последнее сообщение: 23.09.2014, 04:00
  2. ПЛК150
    от Денис_NTS в разделе Эксплуатация
    Ответов: 3
    Последнее сообщение: 30.07.2013, 20:35
  3. ПЛК150!
    от Broka в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 27.11.2011, 20:21
  4. ПЛК150 и ТХК(L)
    от exbit в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 06.01.2011, 15:28
  5. ПЛК150+ПКП 1Т
    от Руслан2 в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 11.03.2008, 14:15

Ваши права

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