Страница 1 из 3 123 ПоследняяПоследняя
Показано с 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

    По умолчанию

    Зачем было так тратиться на лишние слова и эмоции, после которых ничего не стало яснее.

    Цитата Сообщение от Валенок Посмотреть сообщение
    А причем тут ПЛК150 ? У вас массив 1..5 а пишете хрен знает куда, и хрень будет в любом языке на любом плк, пк, и прочем утюге.
    Вопрос был почему так выходит только при такой комбинации когда массив из пяти, пишется значение в шестой и возникает неправильное значение в булевской переменной, которая не относится к этому массиву. Если писать в седьмой или любой другой, которого тоже нет, то ошибки не возникает. Ошибка если только в шестой.

    Цитата Сообщение от Валенок Посмотреть сообщение
    Уверены ? Залейте поллитру в стакан и подумайте - причем тут пол который вообще не трогают.
    Если бы я в чем то был уверен, то вопросы бы не задавал, а искал бы по форумам на кого бы вызвериться. Если хотите помочь понять, то лучше как то пояснее, без поллитра, а побольше конкретики.

    Цитата Сообщение от Валенок Посмотреть сообщение
    Да что вы, а не досуг было hex в dec перевести, сравнить с чем нить и немного подумать ?
    То что значение переменной wX попадает в xInit это сразу было понятно. Непонятно почему оно туда попадает только когда массив из 5 элементов и значение пишется в шестой. Если сделать массив из 4 элементов, и писать в пятый или в любой другой, то ошибка не появляется. В этом и мистика для меня лично.
    Последний раз редактировалось Ian; 14.04.2021 в 23:13.

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

    По умолчанию

    Вопрос был почему так выходит только при такой комбинации когда массив из пяти, пишется значение в шестой и возникает неправильное значение в булевской переменной, которая не относится к этому массиву. Если писать в седьмой или любой другой, которого тоже нет, то ошибки не возникает. Ошибка если только в шестой.
    Потому что компилятор размещает переменную 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

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

    По умолчанию

    Цитата Сообщение от Валенок Посмотреть сообщение
    А причем тут ПЛК150 ? У вас массив 1..5 а пишете хрен знает куда, и хрень будет в любом языке на любом плк, пк, и прочем утюге.
    Вообще-то любой нормальный ПЛК при таких инцестах в стоп вываливается...даже ПЛК на КДС 2.3 от другого Российского производителя, а то что позволяет наливать поллитру в стакан и на пол это может быть хорошо где-то на уровне учебных стендов, а ПЛК для промышленности (любой) должен давать подзатыльник за попытки переливов.
    Тут разница в подходе производителя, один взял "как есть" и тру-ля-ля, а другой допилил ту-же КДС под свое понимание жизни.
    Последний раз редактировалось Sergey666; 15.04.2021 в 08:34.

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

    По умолчанию

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

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

    По умолчанию

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

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

    По умолчанию

    Нет под рукой ПЛК150. И не предвидится.
    А не проще ли программно ограничить переменную индекса массива, и при выходе её за пределы вывешивать флаг ошибки, как пример.
    Код:
    IF iCount<=5 AND iCount=>1 THEN bIndexOk:=TRUE; 
    ELSE bIndexOk:=FALSE;
    END_IF;
    
    
    
    IF bIndexOk THEN
    aBuffer[iCount]:=xW;
    ELSE (*свистать всех наверх, приготовиться к торпедной атаке!*)
    END_IF;
    ---
    -Доктор, когда я вот так делаю, мне больно.
    -Дык не делайте так.
    Последний раз редактировалось Sulfur; 15.04.2021 в 09:11.

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

    По умолчанию

    Тогда уж проще iCount ограничивать принудительно
    if iCount<1 then
    iCount:=1;
    elsif iCount>5 then
    iCount:=5;
    end_if;

    Просто не все так законтролировать можно, напр. тот же фокус с делением на 0, все используют какие-то бибки, где гарантия, что там внутри никогда в знаменателе "0" не появится.

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

    По умолчанию

    Принудительно ограничение тоже имеет место быть. Но зависит от задачи. Если в проекте индекс получается по результатам вычислений или состоянию входов\переменных, то мой метод предпочтительнее.

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

    По умолчанию

    Цитата Сообщение от Sulfur Посмотреть сообщение
    Принудительно ограничение тоже имеет место быть. Но зависит от задачи. Если в проекте индекс получается по результатам вычислений или состоянию входов\переменных, то мой метод предпочтительнее.
    Ага, каждому его метод предпочтительнее, см. притчу о лисе и журавле.

    У вас предусмотрено (млин вот все как у Овена, вы часом не у них на курсах учились) какое-то не понятное поведение системы - если bIndexOk=False что тогда? Что в массиве?

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

Похожие темы

  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

Ваши права

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