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

Тема: FIFO (очередь) ПЛК110-60 MS4D

  1. #1

    По умолчанию FIFO (очередь) ПЛК110-60 MS4D

    Ребята приветствую, помогите с алгоритмом, кто может.
    На ПЛК110-60 MS4D хочу реализовать очередь. Есть 32 входа и 32 выхода. Кто первый пришёл - тот первый и ушёл.
    На OwenLogic тут нашёл готовый макрос, сделанный Сергей0308
    https://owen.ru/forum/showthread.php...E5%F0%E5%E4%FC
    Работает в общем как надо. Правда конечно сложная структура...
    В общем хотел всё это реализовать в MS4D и встрял на операторе шифратор CD32 (преобразование позиционного кода в двоичный), так и не понял что это и как-то связано в логарифмами...
    Мне казался изначально более простое решение: это считать время присутствия каждого входа и пропускать в первую очередь того кто больше, но тут нужно какое-то много канальное сравнение и пока затык.
    В MS4D в библиотеке OSCAT в принципе есть оператор очереди FIFO_32 но у него вход/выход - целые числа и нужно как то это всё преобразовывать...
    Правда у меня планируется более продвинутый алгоритм с выбором количества одновременного обслуживания.
    Вообще весьма странно, что нет частого использования этой задачи в паблике. Этиж очереди сейчас везде и всюду)
    Подскажите хотя бы направление по которому лучше пойти, хотя одно я точно конечно знаю
    Вложения Вложения
    Последний раз редактировалось Vadik2881; 31.01.2025 в 12:00.

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

    По умолчанию

    CD32 просто показывает положение старшего бита в числе. При чем у него нет понятия на выходе "не число". То есть на значения 0 и 1 на выходе он будет показывать 0.
    1 = 0
    2 = 1
    4 = 2
    8 = 3
    И так далее. Введете число 12 - на выходе получите 3, так как есть старший бит (число 8).

  3. #3

    По умолчанию

    Цитата Сообщение от Vadik2881 Посмотреть сообщение
    Ребята приветствую, помогите с алгоритмом, кто может.
    На ПЛК110-60 MS4D хочу реализовать очередь. Есть 32 входа и 32 выхода. Кто первый пришёл - тот первый и ушёл.
    На OwenLogic тут нашёл готовый макрос, сделанный Сергей0308
    Вообще весьма странно, что нет частого использования этой задачи в паблике. Этиж очереди сейчас везде и всюду)
    Подскажите хотя бы направление по которому лучше пойти, хотя одно я точно конечно знаю
    То же самое делается проще на ST и расширяется до 32 бит без проблем. При чём варианты могут быть разные, на IF на CASE с приоритетом и без, со сбросом и без.
    Тут примеры https://owen.ru/forum/showthread.php...504#post431504
    На следующей странице ещё несколько вариантов.
    Последний раз редактировалось kondor3000; 31.01.2025 в 12:40.

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

    По умолчанию

    Вам наверное лучше поискать примеры на C#. Правда вот не знаю, что там с лицензиями в MS4D, а то может быть недоступным.

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

    По умолчанию

    Цитата Сообщение от Vadik2881 Посмотреть сообщение
    Ребята приветствую, помогите с алгоритмом, кто может.
    На ПЛК110-60 MS4D хочу реализовать очередь. Есть 32 входа и 32 выхода. Кто первый пришёл - тот первый и ушёл.
    На OwenLogic тут нашёл готовый макрос, сделанный Сергей0308
    https://owen.ru/forum/showthread.php...E5%F0%E5%E4%FC
    Работает в общем как надо. Правда конечно сложная структура...
    В общем хотел всё это реализовать в MS4D и встрял на операторе шифратор CD32 (преобразование позиционного кода в двоичный), так и не понял что это и как-то связано в логарифмами...
    Мне казался изначально более простое решение: это считать время присутствия каждого входа и пропускать в первую очередь того кто больше, но тут нужно какое-то много канальное сравнение и пока затык.
    В MS4D в библиотеке OSCAT в принципе есть оператор очереди FIFO_32 но у него вход/выход - целые числа и нужно как то это всё преобразовывать...
    Правда у меня планируется более продвинутый алгоритм с выбором количества одновременного обслуживания.
    Вообще весьма странно, что нет частого использования этой задачи в паблике. Этиж очереди сейчас везде и всюду)
    Подскажите хотя бы направление по которому лучше пойти, хотя одно я точно конечно знаю
    Вот здесь усовершенствовали, в смысле, можно просматривать очередь на всё глубину и делать, что захочется: https://owen.ru/forum/showthread.php?t=36452&page=4
    Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
    справиться с проблемами, либо это не твои проблемы.

  6. #6

    По умолчанию

    Ребята, ну вроде кое что удалось сделать. Сидел долго, даже ST пришлось немного освоить. Кстати крутая штука, но для сложных проектов...
    Гляньте проект. Очередь сделал как и хотел - на принципе измерения времени ожидания, т.е. первый проходит у кого оно больше. И достаточно не сложный алгоритм.
    Кому не лень, протестируйте пожалуйста на баги. Основной затык был в операторе сравнения на 3 и более входа. И получилось это только в ST!!!
    Вложения Вложения
    Последний раз редактировалось Vadik2881; 04.02.2025 в 19:45.

  7. #7

    По умолчанию

    Цитата Сообщение от Vadik2881 Посмотреть сообщение
    Ребята, ну вроде кое что удалось сделать. Сидел долго, даже ST пришлось немного освоить. Кстати крутая штука, но для сложных проектов...
    Гляньте проект. Очередь сделал как и хотел - на принципе измерения времени ожидания, т.е. первый проходит у кого оно больше. И достаточно не сложный алгоритм.
    Кому не лень, протестируйте пожалуйста на баги.
    Извините! Я чего-то пропустил?
    А где здесь ПЛК110-60?
    И конкретно FIFO-буфер?

  8. #8

    По умолчанию

    Ну ты читай между строк же ) MS4D я только в руки взял и она достаточно громоздкая. А не простые проекты лучше делать на том, что лучше знаешь! Потом перенести алгоритм совсем не проблема. В конечном счёте, проект будет на ПЛК110-60.
    Ну а с FIFO функция первый пришёл - первый ушёл - вроде как реализована. Будем считать это альтернативным вариантом исполнения. Но думаю на настоящем FIFO данную задачу тоже можно и нужно делать!
    Народ, ну чё, никто не потестил?
    Сейчас думаю как доработать очередь и сделать выбор для одновременного обслуживания двух и более (хотя бы двух) абонентов и пока что-то нет мыслей...

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

    По умолчанию

    Цитата Сообщение от Vadik2881 Посмотреть сообщение
    Народ, ну чё, никто не потестил? .
    за народ тестировали фифо авторитетные программисты из оскат сообщества, ихним кодом и пользуемся
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

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

  10. #10

    По умолчанию

    Цитата Сообщение от Vadik2881 Посмотреть сообщение
    Ну ты читай между строк же ) MS4D я только в руки взял и она достаточно громоздкая. А не простые проекты лучше делать на том, что лучше знаешь! Потом перенести алгоритм совсем не проблема. В конечном счёте, проект будет на ПЛК110-60.
    Ну а с FIFO функция первый пришёл - первый ушёл - вроде как реализована. Будем считать это альтернативным вариантом исполнения. Но думаю на настоящем FIFO данную задачу тоже можно и нужно делать!
    Народ, ну чё, никто не потестил?
    Сейчас думаю как доработать очередь и сделать выбор для одновременного обслуживания двух и более (хотя бы двух) абонентов и пока что-то нет мыслей...
    Ну, я потестил! Я в упор не вижу FIFO.
    Owen1.jpg
    Подсчет длительности импульсов (*0,2сек) на каждом входе и потом поиск входа с максимальной длительностью и всё!
    Может надо запихивать длительность каждого импульса на одном входе в буфер?
    Owen2.jpg

    Если хочется буфер на ST?
    Owen3.jpg
    cделайте на ST
    В чём проблема-то ?
    Код:
    function_block FIFO
    
        var_input
            in : udint;
            shift : bool;
        end_var
    
        var_output
            out: udint;
        end_var
    
        var
            out0, out1, out2, out3, out4, out5, out6, out7, out8 : udint;
        end_var
    
        if shift then
            out := out8;
            out8 := out7;
            out7 := out6;
            out6 := out5;
            out5 := out4;
            out4 := out3;
            out3 := out2;
            out2 := out1;
            out1 := out0;
            out0 := in;
        end_if
    
    end_function_block
    Если речь о фиксации входа с исключением, то:
    Owen4.jpg
    самый простой вариант
    Код:
    function_block Push
    
        var_input
            I1, I2, I3, I4, I5, I6, I7, I8 : bool;
        end_var
        
        var_output
            Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8 : bool;
        end_var
    
        var 
            State, newState : udint;
        end_var
    
        newState.0 := I1; newState.1 := I2;  newState.2 := I3;  newState.3 := I4;
        newState.4 := I5; newState.5 := I6;  newState.6 := I7;  newState.7 := I8;
    
        if newState > 0 then
            if newState <> State then
                State := newState;
                Q1 := I1; Q2 := I2; Q3 := I3; Q4 := I4;
                Q5 := I5; Q6 := I6; Q7 := I7; Q8 := I8;
            end_if
        end_if
        
    end_function_block
    Тоже без ST:
    Owen5.jpg

    Фиксация следующего при условии что он единственный активный:
    Код:
    function_block Push
    
        var_input
            I1, I2, I3, I4, I5, I6, I7, I8 : bool;
        end_var
        
        var_output
            Q1, Q2, Q3, Q4, Q5, Q6, Q7, Q8 : bool;
        end_var
    
        var 
            State, newState : udint;
            Cnt : udint;    // Кол-во активных входов
        end_var
    
        newState.0 := I1; newState.1 := I2;  newState.2 := I3;  newState.3 := I4;
        newState.4 := I5; newState.5 := I6;  newState.6 := I7;  newState.7 := I8;
    
        Cnt := 0;
        if I1 then Cnt := Cnt + 1; end_if
        if I2 then Cnt := Cnt + 1; end_if
        if I3 then Cnt := Cnt + 1; end_if
        if I4 then Cnt := Cnt + 1; end_if
        if I5 then Cnt := Cnt + 1; end_if
        if I6 then Cnt := Cnt + 1; end_if
        if I7 then Cnt := Cnt + 1; end_if
        if I8 then Cnt := Cnt + 1; end_if
    
        if newState > 0 and Cnt = 1 and newState <> State then
            State := newState;
            Q1 := I1; Q2 := I2; Q3 := I3; Q4 := I4;
            Q5 := I5; Q6 := I6; Q7 := I7; Q8 := I8;
        end_if
        
    end_function_block
    Последний раз редактировалось EFrol; 07.02.2025 в 12:19.

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

Похожие темы

  1. Сокеты на ПЛК110 MS4D
    от Спорягин Кирилл в разделе ПЛК (среда MasterSCADA 4D)
    Ответов: 12
    Последнее сообщение: 20.01.2023, 16:06
  2. ПЛК110 MS4D и МЭ110-1М
    от win2014 в разделе ПЛК (среда MasterSCADA 4D)
    Ответов: 8
    Последнее сообщение: 18.12.2019, 15:10
  3. ПЛК110 MS4D + ПМ210
    от KrAssor в разделе ПЛК (среда MasterSCADA 4D)
    Ответов: 9
    Последнее сообщение: 31.05.2019, 13:33
  4. ПЛК110 MS4D + ПМ01
    от Спорягин Кирилл в разделе ПЛК (среда MasterSCADA 4D)
    Ответов: 2
    Последнее сообщение: 30.05.2019, 21:27
  5. Очередь Fifo для передачи на пк
    от gr_vl в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 24.12.2010, 22:54

Ваши права

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