Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 16

Тема: Как сделать карту входов выходов в массиве.

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    Пользователь Аватар для Serhioromano
    Регистрация
    15.09.2015
    Адрес
    Бишкек
    Сообщений
    265

    По умолчанию Как сделать карту входов выходов в массиве.

    Допустим у меня куча входов и выходов как на плк так и на модуля. Они обслуживают установки однотипные. Каждая установка занимает 2 входа и 2 выхода. Я хочу создать массив этих установок и обрабатывать их в массиве. Первое я создаю структуру.

    Код:
    TYPE SR_ZONE :
    STRUCT
    	xStart: POINTER TO BOOL;
    	xReset: POINTER TO BOOL;
    	xTempr: POINTER TO WORD;
    	xPV: POINTER TO WORD;
    END_STRUCT
    END_TYPE
    Теперь я объявляю глобальную переменную

    Код:
    VAR_GLOBAL
        glbZones: ARRAY[1..10] OF SR_ZONE; 
    END_VAR
    Уже в коде я могу просто сделать код в цикле.

    Код:
    VAR
        i: INT;
    END_VAR
    
    FOR i := 1 TO 10 DO
        IF (glbZones[i].xTempr^ < glbZones[i].xPV^) THEN
            glbZones[i].Start := TRUE;
        END_IF;
    END_FOR
    Все написано от руки, это не реальный код, а что бы продемонстрировать идею. Так вот что бы это работало, в начале программы на первом запуске нужно сделать карту или привязать значения к входам и выходам. Это получается хорошо с не булевыми переменными.

    Код:
    glbZones[1].xTempr:= ADR(wTemperZone1);
    glbZones[1].xPV:= ADR(wTemperZone1);
    glbZones[2].xTempr:= ADR(wTemperZone1);
    glbZones[2].xPV:= ADR(wTemperZone1);
    Но как назначить переменную типа BOOL что бы потом можно было сделать glbZones[i].Start := TRUE; и выходу назначалось значение?

  2. #2
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,575

    По умолчанию

    там где есть %QX2.3, там же значит должен быть и %QB2, если этот байт именуете, например value, то к третьему разряду можно обращаться как value.3 Надеюсь это не вызывает вопросов, теперь
    на одной находится на %QX2.3 у другой на %QX0.1
    о каком цикле в этом случае может идти речь, если бы были одинаково %QX2.3 %QX0.3 тогда другое дело, ну или выкинуть Вашу идею и создать массив структуры, включающую в себя адрес байта, адрес бита и значение, первые два аргумента константные, а значение меняется в зависимости от ситуации. А дальше все просто, указатель на первый элемент, далее из соответствующего индекса массива смотрим какое смещение в адресе байта структуры, затем кейс из восьми элементов и в зависимости от адреса бита и присваиваем заданное значение
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  3. #3
    Пользователь Аватар для Serhioromano
    Регистрация
    15.09.2015
    Адрес
    Бишкек
    Сообщений
    265

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    ну или выкинуть Вашу идею и создать массив структуры, включающую в себя адрес байта, адрес бита и значение...
    Ну если посмотрите мой пост, это и есть моя идея. У меня есть структура устройства, я создаю массив, делаю привязку. Допустим у меня есть адрес байта и бита, как я получу его значение? Можно пример кода?

  4. #4
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,575

    По умолчанию

    наверное здесь что то должно быть http://www.owen.ru/forum/showthread....l=1#post142016
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  5. #5
    Пользователь Аватар для Serhioromano
    Регистрация
    15.09.2015
    Адрес
    Бишкек
    Сообщений
    265

    По умолчанию

    Цитата Сообщение от capzap Посмотреть сообщение
    наверное здесь что то должно быть http://www.owen.ru/forum/showthread....l=1#post142016
    Жаль что вы не поняли моего вопроса, потому что я чувствую что как раз вы бы могли помочь. Но я не знаю как объяснить. Я знаю что можно через точку получить доступ биту. Вопрос как сделать динамическое имя переменной. Для примера РНР

    Код:
    $MyVar = 10;
    $var = "MyVar";
    echo ${$var};
    Тоже самое тут. Например у меня есть переменные Zone1, Zone2 и в цикле я хочу использовать i для составления имени

    Код:
    for (i = 0; i < 2; i++) {
         echo ${"Zone".$i}
    }
    Подобная техника в ST не возможна. По этому нужно использовать массив и тогда i будет просто иметь доступ к массиву. Если это не биты то я могу элементы массива заранее привязать к ячейкам памяти через указатели, и работать одинаково с массивом, но разные переменные разных входов выходов будут использоваться. Но когда речь заходит о битах входов и выходов не понятно как это реализовать. Через указатель ADR не получается. Ну допустим я знаю что в этом элементе массива мой бит хранится в AdrOfBit := '%QB0' в бите NumOfBit := 3. Как мне получить значение бита из этих 2х переменных?

  6. #6
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,575

    По умолчанию

    Жаль что вы не поняли моего вопроса
    не рассказывайте сказки
    Вложения Вложения
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

    среди успешных людей я не встречала нытиков
    Барбара Коркоран

  7. #7
    Пользователь
    Регистрация
    01.12.2007
    Адрес
    Воронеж
    Сообщений
    238

    По умолчанию

    Ну раз на булевскуя нельзя, то можно указатель на байт/слово + № бита

    Код:
    TYPE SR_ZONE :
    STRUCT
        xStart_WORD: POINTER TO WORD;
        xStart_Nbit: WORD;
        ...
    END_STRUCT
    END_TYPE
    
    glbZones[1].xStart_WORD := ADR( INPUT_WORD1);
    glbZones[1].xStart_Nbit := 5;
    
    
    #Set bit
    glbZones[1].xStart_WORD^ := glbZones[1].xStart_WORD^ OR SHL( 1, glbZones[1].xStart_Nbit);
    
    #Clear bit
    glbZones[1].xStart_WORD^ := glbZones[1].xStart_WORD^ AND ( NOT SHL( 1, glbZones[1].xStart_Nbit));

  8. #8

    По умолчанию

    Здравствуйте, у меня вопрос, похожий с Serhioromano, с которым также не могу разобраться, что не так.

    Дано: Сборочная линия автомобилей с 20-ю станциями. На каждой станции стоят световая колонна(Красный, желтый, зеленый, зуммер) и кнопочные посты (Аварийная кнопка, подтверждение).

    Задача: Данные элементы выполняют однотипные действия: в зависимости от времени включаются лампы на световой колонне, и в зависимости от ситуации на станции используются кнопки.

    Чтобы не писать 20 блоков и не вызывать их 20 раз в главной программе, решил это реализовать через массивы и цикл.

    Написал универсальный блок управления световыми колоннами и кнопками. Далее в главной программе объявил массивы ламп световых колонн и кнопок, и вызываю данный блок в цикле 20 раз (20 сборочных станций). В соотнесении входов/выходов модулей привязываю элементы массивов.

    Заливаю программу в ПЛК 210 (по ModBus TCP подключены 5 МВ210-202, 5 МУ210-403 и панель СП310Р). При срабатывании условия модули и ПЛК уходят в ошибку, далее перезагрузка и перестают отвечать. Помогает сброс по питанию.

    Никак не могу понять, что не так.

    ФБ световых колонн и кнопок.png Вызов ФБ в главной программе.png Пример соотнесения переменных с выходами.png

  9. #9

    По умолчанию

    Проверяйте значения индексов массивов в циклах.
    Если выложите проект - может кто-нибудь даже найдёт конкретную проблему

  10. #10

    По умолчанию

    Mikhail_NNT Идея правильная!
    1exan говорит верно. Скорее всего где-то есть выход за границы массивов.
    Если искать лень - можно добавить специальную функцию CheckBounds, а в ней сделать вызов исключения, чтобы потом понять, где именно что случилось.
    Как это сделать, было описано у меня статье со скриншотами: https://cs-cs.net/codesys-kultura-ko...icy-massivov#7 (заголовок 7)
    PS. CheckBounds тормозит готовый проект. Поэтому потом её оттуда надо удалить. Или исключить из компиляции.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

Страница 1 из 2 12 ПоследняяПоследняя

Похожие темы

  1. Ответов: 6
    Последнее сообщение: 12.03.2015, 15:00
  2. СПК207, запись данных на флеш-карту или SD-карту памяти
    от ОАО"Органика" в разделе СПК2xx (архив)
    Ответов: 4
    Последнее сообщение: 03.02.2013, 18:23
  3. опрос входов и выходов
    от soi в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 15.03.2011, 17:55
  4. упаковка входов/выходов
    от Old_Lucky в разделе ПЛК1хх
    Ответов: 4
    Последнее сообщение: 26.04.2010, 15:06
  5. Модули входов-выходов
    от Labean & K* в разделе Подбор Оборудования
    Ответов: 15
    Последнее сообщение: 28.07.2009, 19:00

Ваши права

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