Показано с 1 по 5 из 5

Тема: Маскарадное программирование ПЛК %)

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

    По умолчанию Маскарадное программирование ПЛК %)

    Смарите посоны чо я выдумал...

    1. Вместо подписывания в конфигурации каждого выхода берём их всех как битовую маску D_OUTS.
    2. В разделе глобальных констант делаем ещё кучу масок для всех выходов отдельно или для их комбинаций. Например, DO3: DWORD := 4 (единичка в третьем разряде).
    3. Теперь вместо DO1 := DO2 := DO3 := TRUE можно писать D_OUTS := DO1 + DO2 + DO3.
    Само по себе не намного короче, но это здорово облегчает код когда в автоматическом режиме комбинации выходов на разных шагах сильно меняются. Фишка в том, что на очередном шаге уже не надо сбрасывать то, что включилось на предыдущем. То есть как оно раньше было:
    Код:
    Step1:
    DO1 := DO2 := TRUE;
    
    Step2:
    DO1 := FALSE;
    DO3 := TRUE;
    А масочным способом можно так:
    Код:
    Step1:
    D_OUTS := DO1 + DO2;
    
    Step2:
    D_OUTS := DO2 + DO3;
    Но это ещё цветочки. Вот когда надо постоянно включать-выключать одни и те же комбинации по каким-то условиям, то получается супер-пупер-лаконично и семантично:
    Код:
    Step1:
    	D_OUTS :=
    		STEAMER * BOOL_TO_DWORD(temp < 40) +
    		COOLER * BOOL_TO_DWORD(temp > 60);
    
    Step2:
    	D_OUTS :=
    		DECONDENS * BOOL_TO_DWORD(timer.ET < timer.PT);
    , где STEAMER, COOLER и DECONDENS — маски для двух и более клапанов или иных узлов, работающих по логическим сигналам.

    Если ещё ввести примитивную функцию и писать, например, when вместо громоздкого BOOL_TO_DWORD, то совсем лепота:
    Код:
    Step1:
    	D_OUTS :=
    		STEAMER * when(temp < 40) +
    		COOLER * when(temp > 60);
    
    Step2:
    	D_OUTS :=
    		DECONDENS * when(timer.ET < timer.PT);
    Сам в шоке. Код для ПЛК на человеческом английском O_o

    Для сравнения этот же по смыслу код в традиционном исполнении:
    Код:
    Step1:
    	STEAM_IN := STEAM_OUT := temp < 40;
    	COOLANT_IN := COOLANT_OUT := temp > 60;
    
    Step2:
    	STEAM_IN := STEAM_OUT :=
    	COOLANT_IN := COOLANT_OUT := FALSE;
    	DECOND_OUT := timer.ET < timer.PT;
    Я уж молчу про «веточный» подход, где многие стали бы огород городить:
    Код:
    Step1:
    IF temp < 40 THEN
    	STEAM_IN := TRUE;
    	STEAM_OUT := TRUE;
    ELSE
    	STEAM_IN := FALSE;
    	STEAM_OUT := FALSE;
    [...]
    Конечно, в масочном подходе свои минусы. Например, трудно выяснять состояние выхода за пределами блока, где он переключается — приходится обращаться к конкретному биту D_OUTS операциями сдвига или вводить ещё кучу констант для нумерации битов. И код становится уродливым если используется более 32 дискретных выходов. Но пригодиться этот метод вполне может. Мне уже пригодился в одном проекте.

    Спасибо за внимание.
    Последний раз редактировалось Yegor; 04.04.2013 в 12:04.

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

    По умолчанию

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

  3. #3
    Пользователь
    Регистрация
    28.08.2008
    Адрес
    23..93..123
    Сообщений
    1,693

    По умолчанию

    Да здравствует Yegor!
    Великий изобретатель велосипеда!
    Там еще надо писать типа Mask_out.Do0:= ...; .Только если флажок Replace constant в настройках КДС не поставить компилятор заругается.
    Реально использовать для передачи битовых адресов на Слэйв(Панель ,ПК).

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

    По умолчанию

    Я вообще-то про возможность писать mask_out := do1, а не mask_out.do1 := ...; Замена констант не требуется.

  5. #5
    Пользователь
    Регистрация
    28.08.2008
    Адрес
    23..93..123
    Сообщений
    1,693

    По умолчанию

    Ну да,правильно.
    Прогрессия 1-2-4-8-16-...
    Для включения 16ти выходов надо записать 65535.
    Для выключения выхода надо присвоить соотв. DoX:=0 ;
    В принципе прикольно ... надо попробовать , если проект надо кому-то отдавать - пусть у него мозги взорвутся.
    Молодесь ! Yegor. Ти красаучик.

Похожие темы

  1. программирование на Ld
    от кубоша в разделе ПЛК1хх
    Ответов: 17
    Последнее сообщение: 06.04.2013, 18:28
  2. программирование на ПЛК 150
    от Fix_m в разделе ПЛК1хх
    Ответов: 9
    Последнее сообщение: 22.11.2012, 12:59
  3. Программирование ПЧВ
    от ЕвгенийНК в разделе Эксплуатация
    Ответов: 1
    Последнее сообщение: 06.12.2011, 07:11
  4. Программирование СИ-8
    от rozhko76 в разделе Эксплуатация
    Ответов: 1
    Последнее сообщение: 10.10.2011, 10:51
  5. St программирование
    от TouchS в разделе ПЛК1хх
    Ответов: 28
    Последнее сообщение: 19.02.2010, 16:37

Ваши права

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