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

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

  1. #1

    По умолчанию код смены участков программы

    Добрый день!
    Подскажите, пожалуйста, как реализовать код на ST правильно (что бы не плодить лишние строки и уменьшить используемые ресурсы ПЛК)
    Задача такая :
    Реализовать переключение участков программы.

    В частности интересует следующее:
    Есть входные переменные
    -Start (Bool)
    -от VAL_1 до VAL_n (Real) - задание величины уставки для каждого участка
    -от Тime_1 до Time_n (INT) - время выхода на уставку, сиречь время участка от 1 до n
    Выходные переменные
    - Nr_uch (int) номер участка
    -Тime_uch(int) время участка
    - И другие не относящиеся к теме вопроса
    1) По фронту Start и ненулевому значению входной переменной Time_ начинается участок 1,
    выполняются инструкции
    2) По внутренней команде(определяется отдельной функцией, не входящей в суть вопроса) происходит переключение на участок 2
    выполняются инструкции
    .......
    .......
    n) По внутренней команде(определяется отдельной функцией, не входящей в суть вопроса) происходит переключение на участок n

    После окончания участка n цикл завершается.

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

    По умолчанию

    Case для такого и придуман

  3. #3

  4. #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, 19:57

Ваши права

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