Вход на форум 
В начало e-Mail

Форум

Ресурсы Rockwell

Product Directory

Essential Components

Literature Library

Knowledge Base

Electronic News&Magazines

Блог

Encompass Program

Product Certification

  
Smart Solutions VDT :: Просмотр темы - Помощь с циклом.
 FAQFAQ   ПоискПоиск   ГруппыГруппы   ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 

Помощь с циклом.
На страницу 1, 2  След.
 
Начать новую тему   Ответить на тему    Список форумов Smart Solutions VDT -> Программные средства систем автоматизации
Предыдущая тема :: Следующая тема  
Автор Сообщение
mp3corp
Эксперт
Эксперт


Зарегистрирован: Dec 12, 2012
Сообщения: 164
Рейтинг: +2/-0

СообщениеДобавлено: Пн 06 Июн, 2016 9:03:37    Заголовок сообщения: Помощь с циклом. Ответить с цитатой

Всем доброго дня. Что-то не могу понять в чем ошибка. Пытаюсь подсчитать определенную сумму в цикле, для этого использую следующий код:

Код:

for i:=Begin to end by 1
do
AVR:=(Temper.T1[i] + AVR)/Count;
end_for;

Где, Begin и End начальная и конечная переменная для цикла, с ними все нормально. Однако при отладке на симуляторе в переменную AVR - "падают" неправильные значения, которые там ну никак не могут быть.
Тип задачи в проекте - "Continuous".
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
oldDad
Site Admin
Site Admin


Зарегистрирован: May 05, 2005
Сообщения: 2773
Рейтинг: +89/-5

СообщениеДобавлено: Пн 06 Июн, 2016 9:53:41    Заголовок сообщения: Ответить с цитатой

Все переменные используются только в этой задаче и больше ни в одном месте проекта не упоминаются?
_________________
Обращайтесь к профессионалам.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
mp3corp
Эксперт
Эксперт


Зарегистрирован: Dec 12, 2012
Сообщения: 164
Рейтинг: +2/-0

СообщениеДобавлено: Пн 06 Июн, 2016 10:38:12    Заголовок сообщения: Ответить с цитатой

Да, только в этой задаче. Создал пустой проект и в нем отлаживаю. Только переменную "i" использую еще в неск. местах, но все они находятся выше по коду рутины.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
VoSurf
Новичок
Новичок


Зарегистрирован: Oct 22, 2008
Сообщения: 1
Рейтинг: +0/-0

СообщениеДобавлено: Пн 06 Июн, 2016 10:49:24    Заголовок сообщения: Ответить с цитатой

В самом первом цикле переменная AVR, вероятно, имеет случайное значение.
Инициализируйте её в значение 0 перед началом цикла.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
mp3corp
Эксперт
Эксперт


Зарегистрирован: Dec 12, 2012
Сообщения: 164
Рейтинг: +2/-0

СообщениеДобавлено: Пн 06 Июн, 2016 10:58:34    Заголовок сообщения: Ответить с цитатой

VoSurf писал(а):
В самом первом цикле переменная AVR, вероятно, имеет случайное значение.
Инициализируйте её в значение 0 перед началом цикла.

Это сразу делал, не помогло.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
mp3corp
Эксперт
Эксперт


Зарегистрирован: Dec 12, 2012
Сообщения: 164
Рейтинг: +2/-0

СообщениеДобавлено: Пн 06 Июн, 2016 11:19:34    Заголовок сообщения: Ответить с цитатой

Тип переменной AVR - real. Элементы массива Temper - INT. Пытался менять типы данных, но результат всегда один.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
mp3corp
Эксперт
Эксперт


Зарегистрирован: Dec 12, 2012
Сообщения: 164
Рейтинг: +2/-0

СообщениеДобавлено: Пн 06 Июн, 2016 11:57:33    Заголовок сообщения: Ответить с цитатой

Так же использую цикл в др. месте:
Код:

for i:=1 to 10 by 1
do
if TT_L.[i] then
Begin:=i;
end_if;
end_for;

Странно но здесь все работает корректно, и правильный бит выставляется при проходе данного цикла. Такое подозрение что проблема связана с типами данных, из за чего происходит неправильное деление.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
mp3corp
Эксперт
Эксперт


Зарегистрирован: Dec 12, 2012
Сообщения: 164
Рейтинг: +2/-0

СообщениеДобавлено: Вт 07 Июн, 2016 7:34:57    Заголовок сообщения: Ответить с цитатой

Проблема локализовалась. Цикл проходит всего 1 итерацию, т.е. допустим он начинается при Temper.T[i]=4 проходит 1 цикла прибавляется значение следующее за 4 т.е. 5 и все, следующие значения "i" не срабатывают.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AlexV
Эксперт
Эксперт


Зарегистрирован: Jan 10, 2007
Сообщения: 126
Рейтинг: +6/-0
Откуда: г.Мирный, Якутия

СообщениеДобавлено: Ср 08 Июн, 2016 1:04:42    Заголовок сообщения: Ответить с цитатой

mp3corp писал(а):
Проблема локализовалась. Цикл проходит всего 1 итерацию, т.е. допустим он начинается при Temper.T[i]=4 проходит 1 цикла прибавляется значение следующее за 4 т.е. 5 и все, следующие значения "i" не срабатывают.


Вы уверены, что большинству тут нравится играть в экстрасенсов?
Было бы не плохо к странностям приводить непосредственные значения переменных на входе, а также привести ожидаемое Вами значение в результате на выходе и то, которое получается в результате фактических вычислений.

Скорее всего ларчик просто открывается Wink
если разница между Begin и end составляет один шаг, то так и должно быть.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
mp3corp
Эксперт
Эксперт


Зарегистрирован: Dec 12, 2012
Сообщения: 164
Рейтинг: +2/-0

СообщениеДобавлено: Ср 08 Июн, 2016 4:38:49    Заголовок сообщения: Ответить с цитатой

Да не так и просто ларчик) Значение Begin -4, End-9.
Вот скриншот из Onlain с текущими значениями переменных.
[/list]
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AlexV
Эксперт
Эксперт


Зарегистрирован: Jan 10, 2007
Сообщения: 126
Рейтинг: +6/-0
Откуда: г.Мирный, Якутия

СообщениеДобавлено: Ср 08 Июн, 2016 7:11:33    Заголовок сообщения: Ответить с цитатой

Где обнуляется AVR?
Лучше весь код в студию.
И если брать значение переменной на редактирование, то оно не обновляется...
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
mp3corp
Эксперт
Эксперт


Зарегистрирован: Dec 12, 2012
Сообщения: 164
Рейтинг: +2/-0

СообщениеДобавлено: Ср 08 Июн, 2016 7:26:16    Заголовок сообщения: Ответить с цитатой

Код:

AVR:=0;
Vysota:=10000;
i:=0;
Temper.T1[1]:=1;
Temper.T1[2]:=2;
Temper.T1[3]:=3;
Temper.T1[4]:=4;
Temper.T1[5]:=5;
Temper.T1[6]:=6;
Temper.T1[7]:=7;
Temper.T1[8]:=8;
Temper.T1[9]:=9;
Temper.T1[10]:=10;

High :=Vysota-LT1;
Low:=Vysota-LT2;

if High <=1000 then
TT_H:=0;
TT_H.0:=1;  elsif High<=2000 then
TT_H:=0; TT_H.1:=1; elsif High<=3000 then
TT_H:=0; TT_H.3:=1; elsif High<=4000 then
TT_H:=0; TT_H.4:=1; elsif High<=5000 then
TT_H:=0; TT_H.5:=1; elsif High<=6000 then
TT_H:=0; TT_H.6:=1; elsif High<=7000 then
TT_H:=0; TT_H.7:=1; elsif High<=8000 then
TT_H:=0; TT_H.8:=1; elsif High<=9000 then
TT_H:=0; TT_H.9:=1; elsif High<=10000 then
TT_H:=0; TT_H.10:=1; else TT_H:=0;
end_if;
if Low <=1000 then
TT_L:=0;
TT_L.0:=1;  elsif Low<=2000 then
TT_L:=0; TT_L.1:=1; elsif Low<=3000 then
TT_L:=0; TT_L.3:=1; elsif Low<=4000 then
TT_L:=0; TT_L.4:=1; elsif Low<=5000 then
TT_L:=0; TT_L.5:=1; elsif Low<=6000 then
TT_L:=0; TT_L.6:=1; elsif Low<=7000 then
TT_L:=0; TT_L.7:=1; elsif Low<=8000 then
TT_L:=0; TT_L.8:=1; elsif Low<=9000 then
TT_L:=0; TT_L.9:=1; elsif Low<=10000 then
TT_L:=0; TT_L.10:=1; else TT_L:=0;
end_if;
///////////////////////////////////////////////////

Sloi:=High-Low;
Count :=TRUNC(Sloi / 1000);
/////////////////////////////////////////////////////////////////////////
for i:=1 to 10 by 1
do
if TT_L.[i] then
Begin:=i;
end_if;
end_for;
//////////////////////////////////////////////////////////////////////////
for i:=1 to 10 by 1
do
if TT_H.[i] then
end:=i;
end_if;
end_for;
///////////////////////////////////////////////////////////////////////////

for i:=Begin to end
do
AVR:=(Temper.T1[i] + AVR)/Count;
end_for;
///////////////////////////////////////////////////////////////////////////
 

В остальном коде интересующие меня переменные не участвуют.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AlexV
Эксперт
Эксперт


Зарегистрирован: Jan 10, 2007
Сообщения: 126
Рейтинг: +6/-0
Откуда: г.Мирный, Якутия

СообщениеДобавлено: Ср 08 Июн, 2016 7:39:04    Заголовок сообщения: Ответить с цитатой

Загнал по простому в контроллер
Код:

AVR:=0;
Begin:=4;
end:=9;
Count:=5;

for i:=Begin to end by 1
do
AVR:=(t1[i] + AVR)/Count;
end_for;


AVR 2.187456 Float REAL Standard
Begin 4 Decimal DINT Standard
Count 5.0 Float REAL Standard
end 9 Decimal DINT Standard
i 10 Decimal DINT Standard
t1 {...} {...} Decimal INT[10] Standard
t1[0] 0 Decimal INT Standard
t1[1] 1 Decimal INT Standard
t1[2] 2 Decimal INT Standard
t1[3] 3 Decimal INT Standard
t1[4] 4 Decimal INT Standard
t1[5] 5 Decimal INT Standard
t1[6] 6 Decimal INT Standard
t1[7] 7 Decimal INT Standard
t1[8] 8 Decimal INT Standard
t1[9] 9 Decimal INT Standard

абсолютно предсказуемый результат Smile
корень зла может быть в continuous, её прерывают все, в том числе монитор тэгов, и результат может не совсем адекватно отображаться
Но как правило, это проявляется в редком подмаргивании значения.


Последний раз редактировалось: AlexV (Ср 08 Июн, 2016 7:47:25), всего редактировалось 1 раз
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
mp3corp
Эксперт
Эксперт


Зарегистрирован: Dec 12, 2012
Сообщения: 164
Рейтинг: +2/-0

СообщениеДобавлено: Ср 08 Июн, 2016 7:43:41    Заголовок сообщения: Ответить с цитатой

Теперь вопрос, как получить корректные данные? Должно получиться 7.8 в результате.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
AlexV
Эксперт
Эксперт


Зарегистрирован: Jan 10, 2007
Сообщения: 126
Рейтинг: +6/-0
Откуда: г.Мирный, Якутия

СообщениеДобавлено: Ср 08 Июн, 2016 7:49:36    Заголовок сообщения: Ответить с цитатой

Это каким образом в том коде может получиться 7.8? получается 2.18
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов Smart Solutions VDT -> Программные средства систем автоматизации Часовой пояс: GMT + 1
На страницу 1, 2  След.
Страница 1 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах

Powered by phpBB © 2001, 2005 phpBB Group
Яндекс цитирования

Smart Solutions VDT GmbH | Friedrich-List-Allee 38, D-41844 Wegberg-Wildenrath, Germany
Tel.: +49 2432 933 57 83 | e-Mail: office@vdt-solutions.de
Все товарные знаки и торговые марки являются собственностью их владельцев.
При использовании материалов сайта ссылка на данный сайт обязательна.
Открытие страницы: 0.130 секунды
/n