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

Тема: код смены участков программы

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #4

    По умолчанию

    Цитата Сообщение от Владимир Ситников Посмотреть сообщение
    И массивы.
    Я бы делал так:

    Предположим, у Вас есть глобальная константа, содержащая количество участков в системе
    Код:
    VAR_GLOBAL CONSTANT
    	g_c_usiMaxSectorsCount			: USINT			:= 10;		(* Максимальное количество участков *)
    END_VAR
    Объявите структуру, которая описывает все данные, которые необходимы для управления участком
    Код:
    (* Данные, относящиеся к одному участку *)
    TYPE Sector :
    STRUCT
    	rSetpoint 		: REAL; (* Уставка *)
    	timMinExecution 	: TIME; (* Время выполнения "работы" на участке *)
    END_STRUCT
    END_TYPE
    ФБ, управляющий системой при этом может выглядеть вот так:
    Интерфейс:

    Код:
    FUNCTION_BLOCK SystemControl
    VAR_INPUT
    	xStart				: BOOL;
    	astSystemSectors		: ARRAY [1..g_c_usiMaxSectorsCount] OF Sector;
    END_VAR
    VAR_OUTPUT
    	xBusy				: BOOL;
    	xDone				: BOOL;
    END_VAR
    VAR
    	m_fb_StartCommand			: R_TRIG;
    	m_usiCurrentSectorId			: USINT;
    	m_stCurrentSector			: Sector;
    	m_fb_SectorExectutionFinish		: TON;	(* Таймер времени выполнения сектора *)
    END_VAR
    Реализация:

    Код:
    m_fb_StartCommand.CLK := xStart;
    m_fb_StartCommand();
    
    (* Если получена команда на старт и ФБ еще не в работе *)
    IF (m_fb_StartCommand.Q) AND (NOT xBusy) THEN
    	(* Начнем с первого сектора *)
    	m_usiCurrentSectorId := 1;
    	(* Сбросим время наработки сектора *)
    	m_fb_SectorExectutionFinish.IN := FALSE;
    	m_fb_SectorExectutionFinish();
    	xDone := FALSE;
    	xBusy := TRUE;
    END_IF
    
    IF xBusy THEN
    	m_stCurrentSector := astSystemSectors[m_usiCurrentSectorId];
    	m_fb_SectorExectutionFinish.IN := TRUE;
    	m_fb_SectorExectutionFinish.PT := m_stCurrentSector.timMinExecution;
    	m_fb_SectorExectutionFinish();
    	(* Регулирование где-то здесь *)
    
    	(* Если закончилось время выполнения перейти к следующему участку.
    	Возможно Вам нужно будет доработать это условие в соответствии с Вашими требованиями *)
    	IF m_fb_SectorExectutionFinish.Q THEN
    		m_usiCurrentSectorId := m_usiCurrentSectorId + 1;
    		m_fb_SectorExectutionFinish.IN := FALSE;
    		m_fb_SectorExectutionFinish();
    	END_IF
    
    	(* Если закончились все сектора *)
    	IF m_usiCurrentSectorId > g_c_usiMaxSectorsCount THEN
    	(* Работа завершена *)
    		xDone := TRUE;
    		xBusy := FALSE;
    	END_IF
    END_IF
    То же самое, но в виде проекта:
    Вложения Вложения
    Последний раз редактировалось Осинский Алексей; 27.06.2018 в 09:47.
    OSCAT.ru читать стандарты и статьи по автоматизации на русском без регистрации и СМС

Похожие темы

  1. Ответов: 5
    Последнее сообщение: 26.07.2018, 19:01
  2. Ответов: 0
    Последнее сообщение: 25.05.2016, 21:25
  3. Номер смены. Вывод на экран
    от Fre5h в разделе Master SCADA 3
    Ответов: 1
    Последнее сообщение: 28.01.2015, 13:02
  4. Проблемы с ПЛК 160 после смены прошивки
    от desperadoes в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 03.10.2013, 18:57

Ваши права

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