| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
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


Зарегистрирован: May 05, 2005 Сообщения: 2773 Рейтинг: +89/-5
|
Добавлено: Пн 06 Июн, 2016 9:53:41 Заголовок сообщения: |
|
|
Все переменные используются только в этой задаче и больше ни в одном месте проекта не упоминаются? _________________ Обращайтесь к профессионалам. |
|
| Вернуться к началу |
|
 |
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" не срабатывают. |
Вы уверены, что большинству тут нравится играть в экстрасенсов?
Было бы не плохо к странностям приводить непосредственные значения переменных на входе, а также привести ожидаемое Вами значение в результате на выходе и то, которое получается в результате фактических вычислений.
Скорее всего ларчик просто открывается
если разница между 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
абсолютно предсказуемый результат
корень зла может быть в 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 |
|
| Вернуться к началу |
|
 |
|