Просмотр полной версии : Как форсировать переменные?
научите как форсировать в режиме симуляции переменные
привожу screehoot'ы когда они отказываются подчиняться
здесь keyLocker1a является глобальной переменной
http://img708.imageshack.us/img708/7334/cfcerr.jpg
Как видим keyLocker1 устанавливается программно до вызова CFC-блока. И уже внутри программного блока её изменить невозможно.
При конвертации в язык загрузочных диаграмм ситуация выглядит ещё более абсурдней.
http://img594.imageshack.us/img594/3708/lderr.jpg
Причиной такого поведения симулятора CoDeSys является именно операция присваивания переменной keyLocker1 значения до вызова блока. Это я могу себе объяснить только выполнением блоков прежде выполнения основного блока программы - другого ничего придумать не могу. Поэтому была предпринята попытка свести всё к локальным переменным функционального блока. Ситуация не изменилась:
http://img31.imageshack.us/img31/9871/fb2err.jpg
Следующим естественным движение был переход на железо. А вдруг в железе всё-таки работает. Нет, всё сурово, не работает!
Вопрос, а как тогда работать? Научите как отладить программу, а тем более просимулировать её на железке. Может где-то надо поставить галочку для компиляции с сохранением debug-записей?
ситуация когда на входах лог.схемы И поступают TRUE, а на выходе схемы FALSE может быть по причине не нажата онлайн -> старт, долго вчитывался и смотрел картинки и всеравно не понял вопроса
по причине не нажата онлайн -> старт, 8=)
долго вчитывался и смотрел картинки и всеравно не понял вопросаТогда подробнее:
1 - в основном блоке PLC_PRG присваиваем глобальной пременной значение ( другой переменной, железного входа, константу и все что угодно )
2 - рисуем программый блок, в котором используем глобальную переменную как входную
3 - вызываем новый блок из основного для работы с нашей переменной
4 - компилируем, запускаем
5 - вызываем конкретный экземпляр программного блока и пытаемся форсировать её значение - результата нет. Форсирование не является актуальным, хотя всё красит в синий цвет.
6 - пытаемся форсировать глобальную на уровне присвоения ей значения в PLC_PRG. Результат тоже.
В общем получается, если глобальной переменной присвоено значение, все остальные просто неактуальны. В каком бы блоке она не была вызвана, действующим будет программно присвоенное значение.
http://img828.imageshack.us/img828/7511/globerr.jpg
Вот здесь global_var, где бы вы её не форcировали, не приводит к установке в TRUE переменной result
Вот здесь global_var, где бы вы её не форcировали, не приводит к установке в TRUE переменной result
А с какого перепугу, если перед использованием global_var в andy, вы присваиваете globar_var локальный any_var, а any_var неинициализирован, а значит, по умолчанию - false.
В общем получается, если глобальной переменной присвоено значение, все остальные просто неактуальны. В каком бы блоке она не была вызвана, действующим будет программно присвоенное значение.
Ну да. Как хотели-то ?. Она - переменная. А то что глобальная неимеет никакого значения
перед использованием global_var в andy, вы присваиваете globar_var локальный any_var, а any_var неинициализирован, а значит, по умолчанию - false.Это к чему-то обязывает? Я хочу изменить значение переменной в конкретной точке программы, и совершенно не интересуюсь где она там и чем занималась. Если вам не нравиться false, присвойте true и попробуйте выключить result.
Даже если следовать вашей логике, то форсирование global_var в первой точке присвоения значения должно приводить к результату, поскольку на то оно и форсирование.
неужто я до сих пор не могу понять о чем речь
Снизу то мы дергать ноги можем 8=)
Реально ситуация выглядет где-то так см. прицеп
В результате нет возможности модифицируя keyLock получить что-либо на выходе
у Вас в проекте одни программы, слышали что нибудь о функциональных блоках и функциях. Просто у программ нет экземпляров, так написано в документации
во вторых чем писать
keyLock:=%IX1.0;
keyUnLock:=%IX1.1;
можно напрямую в конфигураторе входу задать имя
это касается и выходов
%QX2.0:=Locker;
И кстати все переменный указанные в конфигураторе, автоматически являются глобальными
у Вас в проекте одни программы, слышали что нибудь о функциональных блоках и функциях. Просто у программ нет экземпляров, так написано в документации
Это всё фигня, функционал и функции ведут себя также - адекватно 8=)
Реально форсировать можно только самые самые входы, то есть непосредственно %-адреса. Если я читаю битовую маску, то для симулирования локального кода обязан на пальцах прикидывать комбинацию из 12 входных бит, преводить их в 16#число и форсировать этим числом %IW-адрес, наблюдая при этом уже его десятичную версию.
какой у Вас вообще контроллер, у меня нет на Ваш проект таргет-файла, поэтому все адреса начинающиеся с % незнают откуда брать свои значения и всегда false поэтому, наверное в этом вся причина
какой у Вас вообще контроллер,Target settings -> None
ну так поставте, тот который планируете использовать и на нем делайте проект, либо не используйте АТ-адреса, кстати
Если вы хотите поместить переменную по определенному адресу, то нужно объявить ее с ключевым
словом AT. Преимущество такого объявления состоит в том, что можно дать значащее имя любому ад-
ресу и изменять значение по этому адресу где угодно (например, в разделе объявлений).
Да! AT облегчает жизнь...
Но мысль как раз состояла в том, чтобы абстрагироваться от конкретных адресов, всё отладить, а потом создать конфигурацию и подцепить её к абстрактному коду простым присвоением чегодадут к своемуродному. И вот не заладилось... Без конкретики то мы работаем на ура, а теперь всё переделывать надо.
уберите в VAR_GLOBAL, все ваши переменные которым присваиваются и которые присваивают %...
И делайте свою не зависимую программу, когда будет оборудование, удаляете все из VAR_GLOBAL и выставляете в конфигураторе по своим местам соответствующие переменные
И делайте свою не зависимую программу,
8=D
Не работает кнопка и нет возможности быть сразу в двух местах. Казалось бы кликни мышкой и проверь где тут залипон, а вот поди-ка посмотри, а то не кликается никак. Да ещё и входы почти все на инверсии.
Игорь Петров
19.09.2011, 16:39
Реально форсировать можно только самые самые входы...
Вы неправильно понимаете назначение фиксации. Каждой зафиксированной переменной присваивается заданная константа перед вызовом PLC_PRG и после нее, а не после каждой ассемблерной команды. Т.е. внутри программы переменную можно поменять хоть 100 раз и она там внутри 100 раз будет меняться. Но, в конце рабочего цикла ПЛК она вернется в фиксированное значение. После этого идет установка физических выходов и чтение значений отладчиком (естественно, в отладчике промежуточных изменений невидно)!
Смысл фиксации:
Для входа всегда читаем фиксированное значение, независимо от физического.
Для выхода на железо отдаем фиксированное, независимо от вычисленного в программе.
Для обычных переменных – их значения не попадут в следующий рабочий цикл, а будут предварительно заменены на фиксированные.
Вот спасибо. целый год работаю с кодесис, а этим не пользовался, ставил заглушки для отладки))
Powered by vBulletin® Version 4.2.3 Copyright © 2026 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot