Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 16 из 16

Тема: FIFO для булевых переменных в CDS 3.5

  1. #11
    Пользователь
    Регистрация
    05.07.2015
    Адрес
    Орехово-Зуево
    Сообщений
    224

    По умолчанию

    Цитата Сообщение от Сергей0308 Посмотреть сообщение
    А что за выгрузку по биту Вы придумали и зачем, в смысле, вроде товарищу такого не нужно, он только загрузку по очереди хотел, про выгрузку он вообще ничего не говорил, может её вручную делают?!
    А вот сигнал загрузки бункера, что он полностью загрузился мне кажется просто необходим, по нему будет пропадать бит необходимости загрузки бункера, прекращаться загрузка текущего бункера и переход к загрузке следующего в очереди бункера.
    На каждой линии два датчика уровня, два сигнала управления переключателем потока, два сигнала положения переключателя и сигнал, что линия в работе. FB обрабатывает их и взводит сигнал например x5DownloadRequired (пятой линии нужна загрузка), этот сигнал встает в очередь. Бункер загрузился - сигнал снялся - вылетел из очереди.
    Если у проблемы есть решение - то волноваться не о чем. Если у проблемы нет решения - то волноваться бессмысленно.

  2. #12

    По умолчанию

    Массив сделать и в цикле его крутить. Я так очередь SMSок на приём и отправку делал.
    У меня был массив структур (чтобы много данных хранить). А в структуре поле .Active. Если TRUE - элемент добавлен и не обработан. Если FALSE - обработан.
    Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живёте. © Steve McConnell
    Мой рабочий блог со статьями про щиты и автоматику ОВЕН - Cs-Cs.Net | Почта: Info@Cs-Cs.Net | Канал в ТГ @CsCsNetLab

  3. #13
    Пользователь
    Регистрация
    05.07.2015
    Адрес
    Орехово-Зуево
    Сообщений
    224

    По умолчанию

    Цитата Сообщение от Cs-Cs Посмотреть сообщение
    Массив сделать и в цикле его крутить. Я так очередь SMSок на приём и отправку делал.
    У меня был массив структур (чтобы много данных хранить). А в структуре поле .Active. Если TRUE - элемент добавлен и не обработан. Если FALSE - обработан.
    Интересно...
    Если у проблемы есть решение - то волноваться не о чем. Если у проблемы нет решения - то волноваться бессмысленно.

  4. #14

    По умолчанию

    Не уверен, что правильно понял задание. Предлагаю свою версию решения, если Вы сможете разобраться и перенести в CDS.
    Queue.jpg

    Код:
    function_block Queue
        
        var_input
            i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16 : bool;   // true - нужна загрузка, false - уже не нужна
        end_var
        
        var_output 
            Q : udint;                          // Номер бункера под загрузкой, 0 - очередь пуста
        end_var
        
        var 
            In, Fix : udint;                    // Номер встающего в очередь c фиксацией
            Dim : array [1..16] of udint;       // Очередь в виде массива
            Free : udint;                       // Свободное место
        end_var
    
        // Ставим в очередь запросившего загрузку
        In := 0;
        if i1 and not Fix.0 then In := 1; Fix.0 := true;
        elsif i2 and not Fix.1 then In := 2; Fix.1 := true;
        elsif i3 and not Fix.2 then In := 3; Fix.2 := true;
        elsif i4 and not Fix.3 then In := 4; Fix.3 := true;
        elsif i5 and not Fix.4 then In := 5; Fix.4 := true;
        elsif i6 and not Fix.5 then In := 6; Fix.5 := true;
        elsif i7 and not Fix.6 then In := 7; Fix.6 := true;
        elsif i8 and not Fix.7 then In := 8; Fix.7 := true;
        elsif i9 and not Fix.8 then In := 9; Fix.8 := true;
        elsif i10 and not Fix.9 then In := 10; Fix.9 := true;
        elsif i11 and not Fix.10 then In := 11; Fix.10 := true;
        elsif i12 and not Fix.11 then In := 12; Fix.11 := true;
        elsif i13 and not Fix.12 then In := 13; Fix.12 := true;
        elsif i14 and not Fix.13 then In := 14; Fix.13 := true;
        elsif i15 and not Fix.14 then In := 15; Fix.14 := true;
        elsif i16 and not Fix.15 then In := 16; Fix.15 := true;
        end_if
        
        if In > 0 then  // Есть очередной желающий
            // Ищем свободное место в очереди и ставим его в очередь
            for Free := 1 to 16 do
                if Dim[Free] = 0 then
                    Dim[Free] := In; exit;
                end_if
            end_for
        end_if
    
        // Выбрасываем из очереди, если загрузка уже не требуется
        In := 0;
        if not i1 and Fix.0 then In := 1; Fix.0 := false;
        elsif not i2 and Fix.1 then In := 2; Fix.1 := false;
        elsif not i3 and Fix.2 then In := 3; Fix.2 := false;
        elsif not i4 and Fix.3 then In := 4; Fix.3 := false;
        elsif not i5 and Fix.4 then In := 5; Fix.4 := false;
        elsif not i6 and Fix.5 then In := 6; Fix.5 := false;
        elsif not i7 and Fix.6 then In := 7; Fix.6 := false;
        elsif not i8 and Fix.7 then In := 8; Fix.7 := false;
        elsif not i9 and Fix.8 then In := 9; Fix.8 := false;
        elsif not i10 and Fix.9 then In := 10; Fix.9 := false;
        elsif not i11 and Fix.10 then In := 11; Fix.10 := false;
        elsif not i12 and Fix.11 then In := 12; Fix.11 := false;
        elsif not i13 and Fix.12 then In := 13; Fix.12 := false;
        elsif not i14 and Fix.13 then In := 14; Fix.13 := false;
        elsif not i15 and Fix.14 then In := 15; Fix.14 := false;
        elsif not i16 and Fix.15 then In := 16; Fix.15 := false;
        end_if
            
        if In > 0 then  // Есть вышедший из очереди
            // Ищем его место в очереди
            for Free := 1 to 16 do
                if Dim[Free] = In then exit; end_if
            end_for
            // Сдвигаем оставшуюся очередь
            while Free < 16 do
                Dim[Free] := Dim[Free + 1]; Free := Free + 1;
            end_while
            Dim[Free] := 0;     // Последнее место в очереди освобождается точно
        end_if
        
        Q := Dim[1];            // Первый в очереди стоит под загрузкой
    
    end_function_block

  5. #15

    По умолчанию

    Цитата Сообщение от EFrol Посмотреть сообщение
    Не уверен, что правильно понял задание. Предлагаю свою версию решения, если Вы сможете разобраться и перенести в CDS.
    Поленился дописать пару строк, чтоб сравнение EQ убрать )))
    А так всё работает.
    Последний раз редактировалось kondor3000; 31.03.2026 в 20:42.

  6. #16
    Пользователь
    Регистрация
    23.09.2008
    Адрес
    Центророссийск
    Сообщений
    3,126

    По умолчанию

    FIFO для булевых переменных в CDS 3.5
    Цитата Сообщение от B.S.V Посмотреть сообщение
    А что еще надо? Истина - в очереди, лож - вылетаешь.
    основное - что CDS.


    Код:
    FUNCTION_BLOCK ??  //обязательно FB...
    VAR_INPUT
       in1, ...., inXX: BOOL; //XX здесь и дальше - сами. Но и 254 можно запилить
    END_VAR
    VAR_OUTPUT
       Out: BYTE; //номер того кто на выходе, 0 - никто
    END_VAR
    VAR
       Pin: POINTER TO ARRAY[1..XX] OF BOOL; //.. потому что FB
       P: POINTER TO BYTE;
       Str1: STRING(1) := '*';
       Очередь: STRING(XX);
       Pos: INT;
    END_VAR
    -------------------------------------------
    Pin := ADR(in1);
    P := ADR(Str1);
    FOR P^ := 1 TO XX DO
       Pos := FIND(Очередь, Str1);
       IF Pos <> 0 AND NOT Pin^[P^] THEN //был и лож - вылетаешь (жопу поднял - место потерял)
          Str := DELETE(Очередь, 1, Pos);   
       ELSIF Pos = 0 AND Pin^[P^] THEN //не был, но Истина - в очереди(ь)
          Str := CONCAT(Очередь, Str1); //но FIFO
       END_IF
    END_FOR
    P := ADR(Очередь);
    Out := P^;
    всё

Страница 2 из 2 ПерваяПервая 12

Похожие темы

  1. FIFO (очередь) ПЛК110-60 MS4D
    от Vadik2881 в разделе ПЛК (среда MasterSCADA 4D)
    Ответов: 47
    Последнее сообщение: 16.02.2025, 11:54
  2. нужна битовая FIFO на Owen Logic
    от Dias2004 в разделе Программируемые реле
    Ответов: 9
    Последнее сообщение: 23.09.2019, 08:29
  3. Ответов: 1
    Последнее сообщение: 04.09.2019, 09:04
  4. Упаковка переменных ПЛК
    от ramilgim в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 28.04.2013, 21:06
  5. Очередь Fifo для передачи на пк
    от gr_vl в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 24.12.2010, 22:54

Ваши права

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