Страница 1 из 4 123 ... ПоследняяПоследняя
Показано с 1 по 10 из 33

Тема: Макрос индексации входных переменных

  1. #1

    По умолчанию Макрос индексации входных переменных

    подскажите как реализовать следующий алгоритм на Owenlogic (для ПР200):
    (индексация входных переменных)
    на вход макроса подается несколько переменных типа "целое" (udint) - моточасы насоса -
    A, B, C, D, E, F и соответствующие им выходные переменные Pa, Pb, Pc, Pd, Pe, Pf - очередность запуска насоса
    значение каждой входной переменной: 0 (не готов к работе) или любое положительное число (наработка)
    задача - присвоить каждой выходной переменной значения: ноль или возрастающее число от 1 до количества ненулевых входов:
    0, если входная переменная равна 0
    1, если входная переменная минимальная из всех положительных входных значений
    2, если входная переменная минимальная из оставшихся переменных (без учета минимальной переменной, которой уже присвоили номер 1)
    и т.д.
    т.е. если на входе все >0, то на выходе должны быть значения от 1 до 6, без повторов (нулевых входов и выходов может быть несколько)
    если на входе есть одинаковые значения, то меньший индекс получит вход, который ближе к началу алфавита
    пример: вход -> выход
    356 -> 4
    16 -> 1
    0 -> 0
    88 -> 3
    0 -> 0
    16 -> 2

  2. #2
    Пользователь Аватар для Сергей0308
    Регистрация
    25.06.2011
    Адрес
    Галактика Андромеды (M31)
    Сообщений
    8,240

    По умолчанию

    Цитата Сообщение от maratin Посмотреть сообщение
    подскажите как реализовать следующий алгоритм на Owenlogic (для ПР200):
    (индексация входных переменных)
    на вход макроса подается несколько переменных типа "целое" (udint) - моточасы насоса -
    A, B, C, D, E, F и соответствующие им выходные переменные Pa, Pb, Pc, Pd, Pe, Pf - очередность запуска насоса
    значение каждой входной переменной: 0 (не готов к работе) или любое положительное число (наработка)
    задача - присвоить каждой выходной переменной значения: ноль или возрастающее число от 1 до количества ненулевых входов:
    0, если входная переменная равна 0
    1, если входная переменная минимальная из всех положительных входных значений
    2, если входная переменная минимальная из оставшихся переменных (без учета минимальной переменной, которой уже присвоили номер 1)
    и т.д.
    т.е. если на входе все >0, то на выходе должны быть значения от 1 до 6, без повторов (нулевых входов и выходов может быть несколько)
    если на входе есть одинаковые значения, то меньший индекс получит вход, который ближе к началу алфавита
    пример: вход -> выход
    356 -> 4
    16 -> 1
    0 -> 0
    88 -> 3
    0 -> 0
    16 -> 2
    Начну из далека: СССР(надеюсь помните или знаете) взял на себя обязательства не применять первым ядерное оружие, на практике это означает, если все страны возьмут такое обязательство - запрещение применения ядерного оружия! Как это относится к нашей задаче, как я предварительно понимаю чисто теоретической, в смысле, нигде не видел более четырёх насосов, сейчас в большинстве случаев народ вообще больше двух не ставит, судя по сообщениям на форуме, короче, Вам достаточно будет запускать насос с наименьшей наработкой(значением) из числа готовых к работе при пуске или ротации(работающий насос не входит в список готовых к работе насосов), всё!
    Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
    справиться с проблемами, либо это не твои проблемы.

  3. #3

    По умолчанию

    Задача практическая. Для codesys она решена, теперь ищу решение для owenlogic.
    Управление будет каскадное. В работу поэтапно будет вводится по одному доп. насосу, в зависимости от давления или уровня. Нужно сразу отобразить приоритеты запуска всех насосов.
    Реальный проект 1:
    Установка - копия.png
    Реальный проект 2:
    2018-12-17_152409 - копия.png
    Последний раз редактировалось maratin; 29.10.2022 в 07:53.

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

    По умолчанию

    В ваших хотелках вряд ли, но для самой задачи был макрос от AI! на 8 насосов, который рассчитывал время наработки, а дальше ваша логика до макроса. Битовая маска требуемых рабочих насосов, аварии, датчики и т.д.

  5. #5
    Пользователь Аватар для Сергей0308
    Регистрация
    25.06.2011
    Адрес
    Галактика Андромеды (M31)
    Сообщений
    8,240

    По умолчанию

    Цитата Сообщение от maratin Посмотреть сообщение
    Задача практическая. Для codesys она решена, теперь ищу решение для owenlogic.
    Управление будет каскадное. В работу поэтапно будет вводится по одному доп. насосу, в зависимости от давления или уровня. Нужно сразу отобразить приоритеты запуска всех насосов.
    Реальный проект 1:
    Установка - копия.png
    Реальный проект 2:
    2018-12-17_152409 - копия.png
    Хорошо, давайте обозначим условия(разберёмся), в смысле, мне кажется Вы даже ТЗ не можете сформулировать, имеется 6(на картинке 8 насосов), каскадное регулирование, поддерживаем заданное давление в определённом диапазоне, например 5-6 бар, делаем ротацию по наработке, наработка - целочисленное значение в часах, каждый час у вас должна происходить ротация одного из работающих насосов, я правильно понимаю?
    Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
    справиться с проблемами, либо это не твои проблемы.

  6. #6
    Пользователь
    Регистрация
    09.12.2013
    Адрес
    Ставрополь
    Сообщений
    1,132

    По умолчанию

    Вот, набросал макрос по вашей задаче

    Безымянный.jpg
    Вложения Вложения

  7. #7

    По умолчанию

    Задача была озвучена в первом сообщении. Экраны приведены в качестве примера, что такие проекты бывают.
    Остальное не имеет отношение к ТЗ - без давления, ротации и т.д.
    Есть только моточасы и приоритеты как в первом сообщении.

  8. #8

    По умолчанию

    Цитата Сообщение от Dimensy Посмотреть сообщение
    Вот, набросал макрос по вашей задаче

    Безымянный.jpg
    Браво, Dimensy!
    Это то, что нужно.
    Проверил - работает нормально. Само решение еще не проанализировал.
    Огромное вам спасибо за помощь!
    Писал в форум без особой надежды что мне помогут.

  9. #9
    Пользователь Аватар для Сергей0308
    Регистрация
    25.06.2011
    Адрес
    Галактика Андромеды (M31)
    Сообщений
    8,240

    По умолчанию

    Цитата Сообщение от maratin Посмотреть сообщение
    Браво, Dimensy!
    Это то, что нужно.
    Проверил - работает нормально. Само решение еще не проанализировал.
    Огромное вам спасибо за помощь!
    Писал в форум без особой надежды что мне помогут.
    Так Вы можете вразумительно объяснить для чего это надо? Если не знаете, можно же так и написать, в смысле, я не знаю для чего, но так надо, так начальник хочет, короче, это делается в принципе для выравнивания наработки, допустим Вы добились своей цели, наработка выровнена, тогда, как я уже написал, ротация будет происходить каждый час! Может проще сделать ротацию каждый час работы насосов, Вы что, действительно не понимаете, что не будет разницы в работе? Кроме того там ещё много всяких нюансов, допустим у вас насос полгода был в ремонте или вы новый поставили(ничего вечного не бывает), он что должен молотить без отдыха полгода или пять лет, пока наработка со старыми насосами не сравняется?
    И, в принципе, для чего выравнивать наработку? Чтобы все насосы умерли одновременно и это добавило Вам проблем?
    Последний раз редактировалось Сергей0308; 29.10.2022 в 17:17.
    Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
    справиться с проблемами, либо это не твои проблемы.

  10. #10

    По умолчанию

    Цитата Сообщение от maratin Посмотреть сообщение
    подскажите как реализовать следующий алгоритм на Owenlogic (для ПР200):
    (индексация входных переменных)
    на вход макроса подается несколько переменных типа "целое" (udint) - моточасы насоса -
    A, B, C, D, E, F и соответствующие им выходные переменные Pa, Pb, Pc, Pd, Pe, Pf - очередность запуска насоса
    значение каждой входной переменной: 0 (не готов к работе) или любое положительное число (наработка)
    задача - присвоить каждой выходной переменной значения: ноль или возрастающее число от 1 до количества ненулевых входов:
    0, если входная переменная равна 0
    1, если входная переменная минимальная из всех положительных входных значений
    2, если входная переменная минимальная из оставшихся переменных (без учета минимальной переменной, которой уже присвоили номер 1)
    и т.д.
    т.е. если на входе все >0, то на выходе должны быть значения от 1 до 6, без повторов (нулевых входов и выходов может быть несколько)
    если на входе есть одинаковые значения, то меньший индекс получит вход, который ближе к началу алфавита
    пример: вход -> выход
    356 -> 4
    16 -> 1
    0 -> 0
    88 -> 3
    0 -> 0
    16 -> 2
    Код:
    FUNCTION out: UDINT;
        VAR_INPUT
            In_Time1, In_Time2, In_Time3, In_Time4, In_Time5, In_Time6 : UDINT;
            enabl: BOOL;
        END_VAR
        
        VAR
            Queue, Data1, Data2 : ARRAY[1..6] OF UDINT;
            swOrder, swNumber, i, j, mini    : UDINT;
            f, sort    : BOOL;
        END_VAR
        
        IF enabl THEN
            Data1[1] := 1;
            Data1[2] := 2;
            Data1[3] := 3;
            Data1[4] := 4;
            Data1[5] := 5;
            Data1[6] := 6;
        
            Data2[1] := In_Time1;
            Data2[2] := In_Time2;
            Data2[3] := In_Time3;
            Data2[4] := In_Time4;
            Data2[5] := In_Time5;
            Data2[6] := In_Time6;
        
            FOR j:=1 TO 6 DO
                IF Data2[j] = 0 THEN Data2[j] := 4294967295; END_IF;
            END_FOR;
        
        
            FOR j:=1 TO 6 DO
                f := FALSE; mini := j;
                FOR i:=j TO 6-j DO
                    IF Data2[i] > Data2[i+1] THEN
                        swOrder:= Data2[i];         swNumber:= Data1[i];
                        Data2[i] := Data2[i+1];    Data1[i] := Data1[i+1];
                        Data2[i+1] := swOrder;     Data1[i+1] := swNumber;
                        f := TRUE;
                    END_IF;
                    IF Data2[i] < Data2[mini] THEN mini := i; END_IF;
                END_FOR;
                IF NOT f THEN EXIT; END_IF;
                IF mini <> j THEN
                    swOrder:= Data2[j];         swNumber:= Data1[j];
                    Data2[j] := Data2[mini];     Data1[j] := Data1[mini];
                    Data2[mini] := swOrder;     Data1[mini] := swNumber;
                END_IF;
            END_FOR;
        
            FOR j:=1 TO 6 DO
                IF Data2[j] = 4294967295 THEN
                    Queue[Data1[j]] := 0;
                ELSE
                    Queue[Data1[j]] := j;
                END_IF;
            END_FOR;
        
            out := Queue[1] * 100000 + Queue[2] * 10000 + Queue[3] * 1000 + Queue[4] * 100 + Queue[5] * 10 + Queue[6];
        
        END_IF;
        
    END_FUNCTION
    Порядок - в соответствующих десятичных разрядах

Страница 1 из 4 123 ... ПоследняяПоследняя

Похожие темы

  1. Пересечение входных условий, конструкция If Then
    от neoarey в разделе Среда программирования OWEN Logic
    Ответов: 11
    Последнее сообщение: 29.10.2019, 00:36
  2. Подключение входных устройств ПЛК110-32
    от Dima77 в разделе Подбор Оборудования
    Ответов: 2
    Последнее сообщение: 17.05.2019, 15:32
  3. 4 варианта работы в зависимости от входных данных.
    от kuznetsov в разделе Подбор Оборудования
    Ответов: 11
    Последнее сообщение: 26.02.2018, 13:03
  4. Функция чтения входных регистров в СМИ1
    от askpify в разделе Панели оператора (HMI)
    Ответов: 3
    Последнее сообщение: 14.09.2015, 09:48
  5. Эмуляторы входных сигналов для Мх110
    от Arthur.Aleksandrov в разделе Разработки
    Ответов: 3
    Последнее сообщение: 25.01.2011, 10:54

Ваши права

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