Страница 2 из 4 ПерваяПервая 1234 ПоследняяПоследняя
Показано с 11 по 20 из 34

Тема: Работа с массивами

  1. #11
    Пользователь
    Регистрация
    13.10.2011
    Адрес
    Златоуст
    Сообщений
    1,021

    По умолчанию

    Советую по возможности заранее считать данные при поступлении или удалении их из массива. Можно сэкономить уйму процессорного времени, т.к. не придётся проходить весь массив.

  2. #12

    По умолчанию

    Дбрг-Дня. По массивам. Допустим есть массив из REAL-переменных и есть массив из WORD-переменных. Нужно сравнить каждую переменную массива с "нулём" (или другим значением, больше/меньше/равно) и установить контрольный бит в TRUE.
    У меня набор параметров из 10 real и 9 word, а их, !каждого!, нужно проверить и перечислять каждый параметр ... ну слишком большая строчка в ST получается =)))
    Я запутался как это сделать, - подскажите! Спасибо!
    Последний раз редактировалось goldenlife; 01.05.2025 в 12:43. Причина: точки и запЯтые

  3. #13

    По умолчанию

    For i:= 1 to 10 do
    If Aaa[i]....
    Next i

    Как то так, вернее в конце end-for, не помню

  4. #14
    Пользователь
    Регистрация
    27.11.2011
    Адрес
    Краснодар
    Сообщений
    12,332

    По умолчанию

    Контрольный бит один для всех, или у каждой переменной ? если общий, то выйти можно и раньше.

  5. #15

    По умолчанию

    Цитата Сообщение от melky Посмотреть сообщение
    Контрольный бит один для всех, или у каждой переменной ? если общий, то выйти можно и раньше.
    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.

  6. #16

    По умолчанию

    Цитата Сообщение от goldenlife Посмотреть сообщение
    Я шото накинул, но ... не пойму, нужно ли i сбрасывать перед последним END_IF? В таком случае (как сейчас) у меня мой stop всегда FALSE, и неважно какое значение rParam_, хоть нули, хоть троечку...
    а симулятор показывает, что после одного "прохода", i-шка становится равная 7, и в следующий забег со start она всё равно равна 7... знач там нужно видимо её обнулять...
    и мне бы так, чтоб проверка проводилась каждый цикл выполнения POU, а не с бита start.

    RETURN ; допишите и будет выход из цикла, после определения 0 1 Выбор переменной.jpg на скрине i =3, так как 3 переменная в массиве равна 0
    i сбрасывать не надо, она сама проходит каждый цикл от 1 до 6, если нет переменной с нулём, i =7
    Последний раз редактировалось kondor3000; 01.05.2025 в 21:38.

  7. #17

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    RETURN ; допишите и будет выход из цикла, после определения 0 1 Выбор переменной.jpg на скрине i =3, так как 3 переменная в массиве равна 0
    i сбрасывать не надо, она сама проходит каждый цикл от 1 до 6
    Шагаем дальше...

    Если сделать так:

    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 поставить в сааамый конец, то никакой реакции на нули в массиве =( кхе.

  8. #18

    По умолчанию

    А можно так
    Код:
    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

  9. #19

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    stop := stop OR (FALSE или TRUE);
    Наверное так начнет получаться
    в какое место его вкрячивать?

    int = int +1 - это я для наглядности сделал, т.к. проверку массива хочу поставить в середине кода, а то что "ДО" или "ПОСЛЕ" проверки должно работать, т.е. эти плюсования в int.

  10. #20

    По умолчанию

    Цитата Сообщение от kondor3000 Посмотреть сообщение
    А можно так
    Код:
    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
    избавляемся от START-а , эту проверку в середину кода хочу вложить...

Страница 2 из 4 ПерваяПервая 1234 ПоследняяПоследняя

Похожие темы

  1. Работа с массивами
    от Леонид в разделе ПЛК1хх
    Ответов: 31
    Последнее сообщение: 30.05.2020, 23:13
  2. CoDeSys работа с массивами.
    от Роман26 в разделе Эксплуатация
    Ответов: 13
    Последнее сообщение: 10.08.2019, 07:52
  3. Работа с рецептами
    от Aleksandr в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 23.01.2012, 12:36
  4. Работа с массивами
    от MerlinLegacy в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 08.08.2011, 13:41
  5. подскажите по работе с массивами
    от alexval2006 в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 11.03.2010, 15:36

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •