Глупые вопросы новичка
-
- Любитель
- Сообщения: 36
- Зарегистрирован: 06 дек 2017, 11:18
Re: Глупые вопросы новичка
А почему бы не избавиться от REAL? Использовать INT или DINT. Считать, что точка расположена в определенном месте целого числа. Например, 1 единица будет равна 0.01 мм., а 1 мм = 100 единиц.
Re: Глупые вопросы новичка
Современные ЦПУ быстрые, не так актуально как на первых S7-300 (например). Вынужден предупредить, что при таком варианте можно поиметь проблем при архивировании такого числа в Log-и и отображении его на трендах (особенно на панелях). Где-то придется пересчитывать.Бардичев Виктор писал(а):А почему бы не избавиться от REAL? Использовать INT или DINT. Считать, что точка расположена в определенном месте целого числа. Например, 1 единица будет равна 0.01 мм., а 1 мм = 100 единиц.
Re: Глупые вопросы новичка
вот это сейчас к какой теме?Бардичев Виктор писал(а):А почему бы не избавиться от REAL? Использовать INT или DINT. Считать, что точка расположена в определенном месте целого числа. Например, 1 единица будет равна 0.01 мм., а 1 мм = 100 единиц.
Re: Глупые вопросы новичка
Здравствуйте!
Подскажите, пожалуйста, в чем моя ошибка при вычислении?
#output := (#Hour * #fCount)/ (#Koef_wf * #fInterval);
Значения переменных:
Hour= 3600000.0 (real)
fCount - это преобразованное с помощью word_to_Dword и dword_to_real число входных импульсов датчика (Real).
Koef_wf - коэффициент 55.466 (real)
finterval - значение времени, преобразованное в real с помощью TIME_TO_DWORD и DWORD_TO_REAL.
output - real.
На мой взгляд, ошибки в согласовании типов данных нет, но результат всегда output = 7FC0 0000.
Для наглядности прикладываю скан выполнения программы. (скрин 1)
Для проверки сделала следующее: расписала по отдельности частные #Hour / #Koef_wf и #fCount/ #fInterval, но результат тот же. (скрин 2)
Подскажите, пожалуйста, в чем моя ошибка при вычислении?
#output := (#Hour * #fCount)/ (#Koef_wf * #fInterval);
Значения переменных:
Hour= 3600000.0 (real)
fCount - это преобразованное с помощью word_to_Dword и dword_to_real число входных импульсов датчика (Real).
Koef_wf - коэффициент 55.466 (real)
finterval - значение времени, преобразованное в real с помощью TIME_TO_DWORD и DWORD_TO_REAL.
output - real.
На мой взгляд, ошибки в согласовании типов данных нет, но результат всегда output = 7FC0 0000.
Для наглядности прикладываю скан выполнения программы. (скрин 1)
Для проверки сделала следующее: расписала по отдельности частные #Hour / #Koef_wf и #fCount/ #fInterval, но результат тот же. (скрин 2)
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Re: Глупые вопросы новичка
POV, FInterval не будет равен 0 в принципе. По условию не может быть менее 40 с
Re: Глупые вопросы новичка
Попробуйте использовать:
WORD_TO_DINT
DINT_TO_REAL
WORD_TO_DINT
DINT_TO_REAL
Re: Глупые вопросы новичка
Word и DWord - это типы данных для случаев, когда вы в слове и двойном слове размещаете наборы битов (флагов). Эти типы для хранения чисел не следует использовать. Для чисел Int, Uint, Dint, Udint.
Re: Глупые вопросы новичка
С DINT_TO_REAL - все должно работать
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Re: Глупые вопросы новичка
Спасибо! Михайло, SMax
Re: Глупые вопросы новичка
Здравствуйте только начал осваивать TIA. Столкнулся с проблемой, что в проекте при наличии сигнала на выходе q0.0
нет сигнала на открытом контакте q0.0 так же дальше по проекту этот сигнал не приходит, хотя выход активен Но потом он появляется. Подскажите пожалуйста, в чём может быть проблема.
нет сигнала на открытом контакте q0.0 так же дальше по проекту этот сигнал не приходит, хотя выход активен Но потом он появляется. Подскажите пожалуйста, в чём может быть проблема.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Re: Глупые вопросы новичка
начать хотя бы с того, что операция приравнивания выходной переменной, коей является дискретный выход Q
например
А I0.0
= Q0.0
должна использоваться ТОЛЬКО ОДИН РАЗ вов сем тексте программы!!!
Почему? спросите Вы...
Для того, чтобы правильно строить логику вычислений ЦПУ надо научиться "думать" как ЦПУ, а это не так просто, как кажется.
ЦПУ выполняет все операции ПОСЛЕДОВАТЕЛЬНО до конца текста программы, НО...
ЦПУ не выполняет наши команды последовательно, как мы их прописали и не выдаёт нам выходные сигналы так же последовательно по мере их исполнения...
После старта в начале цикла в течении нескольких микросекунд ЦПУ производит сканирование сразу всех входных сигналов и записывает их во входную область памяти. Затем последовательно делает вычисления всех логических и арифметических операций с обновленными входными данными в течении нескольких миллисекунд или микросекунд (в зависимости от быстродействия и сложности программы) от начала до конца и записывает результаты вычислений в выходную область памяти. Происходит обновление выходных сигналов опять ДО МОМЕНТА получения новых значений входов и новых результатов вычислений и выхода опять переписываются.
Это первый момент!
Теперь второе: рассмотрим пример
A I0.0
=Q0.0
A I0.1
= Q0.0
Как происходит исполнение этой программы? Рассмотрим пару циклов. Пока не будем принимать во внимание то, что выдача выходных сигналов происходит сначала цикла работы, чтобы не путаться...
Цикл 1
1. Происходит сканирование входов. Пусть на момент сканирования I0.0 истина, а I0.1 ложь.
2. Программа сначала приравнивает значение входа I0.0 выходу Q0.0 и после второй строчки Q0.0 так же становится истина , а потом приравнивает ему же значение входа I0.1 и на 4 строчке Q0.0 становится ложь .
3. Выдаёт на выход получившееся значение. Q0.0 в нуле (ложь)
Цикл 2.
1. Происходит сканирование входов. I0.0 ложь, а I0.1 истина.
2. Программа сначала приравнивает значение входа I0.0 выходу Q0.0 и после второй строчки Q0.0 теперь становится ложь, а на 4 строчке Q0.0 становится истина.
3. Выдаёт на выхода получившееся значение. Q0.0 в единице (истина)
Видим, что первые 2 строчки нам ничего не дают... Все равно приравнивание ПЕРЕПИСЫВАЕТ нашу переменную последним значением.
С этой точки зрения Ваш алгоритм с приравниванием 2 раза одного и того же ВЫХОДНОГО бита Q0.2 фактически двум различным логическим цепочкам бессмысленен.
На выход в конце концов пропишется результат только второго таймера.
Не исключено, что в вашей программе между указанными отрывками есть некие промежуточные логические цепочки, которые меняют к необходимым вам точкам программы нужные вам переменные на непонятные значения.
Просмотрите информацию об использовании проблемного тэга в тексте программы.
Просмотрите весь Ваш код и для начала исправьте с описанной точки зрения. Это не придираясь вообще к остальному тексту...
например
А I0.0
= Q0.0
должна использоваться ТОЛЬКО ОДИН РАЗ вов сем тексте программы!!!
Почему? спросите Вы...
Для того, чтобы правильно строить логику вычислений ЦПУ надо научиться "думать" как ЦПУ, а это не так просто, как кажется.
ЦПУ выполняет все операции ПОСЛЕДОВАТЕЛЬНО до конца текста программы, НО...
ЦПУ не выполняет наши команды последовательно, как мы их прописали и не выдаёт нам выходные сигналы так же последовательно по мере их исполнения...
После старта в начале цикла в течении нескольких микросекунд ЦПУ производит сканирование сразу всех входных сигналов и записывает их во входную область памяти. Затем последовательно делает вычисления всех логических и арифметических операций с обновленными входными данными в течении нескольких миллисекунд или микросекунд (в зависимости от быстродействия и сложности программы) от начала до конца и записывает результаты вычислений в выходную область памяти. Происходит обновление выходных сигналов опять ДО МОМЕНТА получения новых значений входов и новых результатов вычислений и выхода опять переписываются.
Это первый момент!
Теперь второе: рассмотрим пример
A I0.0
=Q0.0
A I0.1
= Q0.0
Как происходит исполнение этой программы? Рассмотрим пару циклов. Пока не будем принимать во внимание то, что выдача выходных сигналов происходит сначала цикла работы, чтобы не путаться...
Цикл 1
1. Происходит сканирование входов. Пусть на момент сканирования I0.0 истина, а I0.1 ложь.
2. Программа сначала приравнивает значение входа I0.0 выходу Q0.0 и после второй строчки Q0.0 так же становится истина , а потом приравнивает ему же значение входа I0.1 и на 4 строчке Q0.0 становится ложь .
3. Выдаёт на выход получившееся значение. Q0.0 в нуле (ложь)
Цикл 2.
1. Происходит сканирование входов. I0.0 ложь, а I0.1 истина.
2. Программа сначала приравнивает значение входа I0.0 выходу Q0.0 и после второй строчки Q0.0 теперь становится ложь, а на 4 строчке Q0.0 становится истина.
3. Выдаёт на выхода получившееся значение. Q0.0 в единице (истина)
Видим, что первые 2 строчки нам ничего не дают... Все равно приравнивание ПЕРЕПИСЫВАЕТ нашу переменную последним значением.
С этой точки зрения Ваш алгоритм с приравниванием 2 раза одного и того же ВЫХОДНОГО бита Q0.2 фактически двум различным логическим цепочкам бессмысленен.
На выход в конце концов пропишется результат только второго таймера.
Не исключено, что в вашей программе между указанными отрывками есть некие промежуточные логические цепочки, которые меняют к необходимым вам точкам программы нужные вам переменные на непонятные значения.
Просмотрите информацию об использовании проблемного тэга в тексте программы.
Просмотрите весь Ваш код и для начала исправьте с описанной точки зрения. Это не придираясь вообще к остальному тексту...
Re: Глупые вопросы новичка
Простое правило для новичка: в программе не должно быть одноименных катушек. Одноименные катушки - это противоречие в программе, ты не смог определиться, чему все-таки равна переменная. И в конечном итоге контроллер пересчитывает все цепочки сверху вниз, а на выход выдает сигнал только когда завершит пересчет всей программы. Какое последнее значение было в переменной, то и выдаст на выход. Об этом mr_Frodo написал подробно.
Ну и зеленая подсветка мониторинга работает просто: она отображает состояние переменных в конце скана программы. Иногда, бывает, видишь не то, что хотелось.
Но если программу писать корректно, то все эти эффекты пропадают.
Катушка ---( ) должна быть один раз, катушки ---(R) и ---(S) сколько угодно раз.
Ну и зеленая подсветка мониторинга работает просто: она отображает состояние переменных в конце скана программы. Иногда, бывает, видишь не то, что хотелось.
Но если программу писать корректно, то все эти эффекты пропадают.
Катушка ---( ) должна быть один раз, катушки ---(R) и ---(S) сколько угодно раз.