Советую по возможности заранее считать данные при поступлении или удалении их из массива. Можно сэкономить уйму процессорного времени, т.к. не придётся проходить весь массив.
Советую по возможности заранее считать данные при поступлении или удалении их из массива. Можно сэкономить уйму процессорного времени, т.к. не придётся проходить весь массив.
Дбрг-Дня. По массивам. Допустим есть массив из REAL-переменных и есть массив из WORD-переменных. Нужно сравнить каждую переменную массива с "нулём" (или другим значением, больше/меньше/равно) и установить контрольный бит в TRUE.
У меня набор параметров из 10 real и 9 word, а их, !каждого!, нужно проверить и перечислять каждый параметр ... ну слишком большая строчка в ST получается =)))
Я запутался как это сделать, - подскажите! Спасибо!
Последний раз редактировалось goldenlife; 01.05.2025 в 12:43. Причина: точки и запЯтые
For i:= 1 to 10 do
If Aaa[i]....
Next i
Как то так, вернее в конце end-for, не помню
Контрольный бит один для всех, или у каждой переменной ? если общий, то выйти можно и раньше.
VAR
i: INT :=0;
start: BOOL;
stop: BOOL;
rParam_: ARRAY [1..6] OF REAL := 2.2, 3.2, 2.5, 3.4, 6.7, 0.21;
END_VAR
-------------------------------
IF (start = TRUE) THEN
FOR i:=1 TO 6 DO
IF (rParam_[i] = 0.00) THEN
stop := TRUE;
ELSE
stop := FALSE;
END_IF
END_FOR
END_IF
Я шото накинул, но ... не пойму, нужно ли i сбрасывать перед последним END_IF? В таком случае (как сейчас) у меня мой stop всегда FALSE, и неважно какое значение rParam_, хоть нули, хоть троечку...
а симулятор показывает, что после одного "прохода", i-шка становится равная 7, и в следующий забег со start она всё равно равна 7... знач там нужно видимо её обнулять...
и мне бы так, чтоб проверка проводилась каждый цикл выполнения POU, а не с бита start.
Последний раз редактировалось goldenlife; 01.05.2025 в 21:13.
RETURN ; допишите и будет выход из цикла, после определения 0 1 Выбор переменной.jpg на скрине i =3, так как 3 переменная в массиве равна 0
i сбрасывать не надо, она сама проходит каждый цикл от 1 до 6, если нет переменной с нулём, i =7
Последний раз редактировалось kondor3000; 01.05.2025 в 21:38.
Шагаем дальше...
Если сделать так:
IF (start=TRUE) THEN
int1:= int1 + 1;
END_IF
FOR i:=1 TO 6 DO
IF (rParam_[i] = 0.00) THEN
stop := TRUE;
RETURN;
ELSE
stop := FALSE;
END_IF
END_FOR
IF (start=TRUE) THEN
int2:= int2 + 1;
END_IF
Выходит так, что если сделать в таком ключе, и проверка не происходит, т.е. STOP = FALSE, то и int2 плюсует нормально, а как только проверка rParam_ завершилась и нашлись нули где-то в массиве, то int2 останавливается и не считает как положено, и всё это изза ReTurn-а , который стоит в середине и отправляет обратно в начало... а если Return поставить в сааамый конец, то никакой реакции на нули в массиве =( кхе.
А можно так
Код:IF start THEN FOR i:=1 TO 6 DO IF (rParam_[i] = 0) THEN stop := TRUE; int2:= int2 + 1; stop:= FALSE; start:= FALSE; RETURN; ELSE stop := FALSE; END_IF END_FOR END_IF