Показано с 1 по 10 из 17

Тема: Не явное обращение к переменным

Комбинированный просмотр

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

    По умолчанию

    Предположим у Вас есть ФБ ValveController, который осуществляет управление задвижкой.

    ФБ выглядит примерно так:
    Код:
    FUNCTION_BLOCK ValveController
    VAR_INPUT
    	sNameToSet		: STRING;
    END_VAR
    VAR_OUTPUT
    	sName			: STRING;
    END_VAR
    VAR
    END_VAR
    
    // Тело ФБ:
    IF (sName = '') AND (sNameToSet <> '') THEN
    	sName := sNameToSet;
    END_IF
    Там, где Вам необходимо объявите массив ФБ (для примера объявлю в глобальных переменных):
    Код:
    VAR_GLOBAL CONSTANT
    	g_c_uiValvesCount	: UINT					:= 30;
    END_VAR
    VAR_GLOBAL
    	g_astValvesList		: ARRAY [1..g_c_uiValvesCount] OF ValveController;
    	i			: UINT;
    END_VAR
    и проинициализируйте его например так:
    Код:
    IF NOT m_xIsValvesInitialized THEN
    	FOR i := 1 TO g_c_uiValvesCount DO
    		g_astValvesList[i].sNameToSet := UINT_TO_STRING (i);
    		g_astValvesList[i]();
    	END_FOR
    	m_xIsValvesInitialized := TRUE;
    END_IF

    Когда станет известно к какой задвижке обратиться Вам нужно будет всего лишь найти индекс задвижки в массиве зная ее имя.
    Например так:

    Код:
    (*
    Функция возвращает индекс задвижки в массиве по ее имени.
    Если задвижка с указанным именем не найдена - вернет 0
    *)
    FUNCTION FindValveIndexByName : UINT
    VAR_INPUT
    	sValveToFindName		: STRING;
    END_VAR
    VAR
    	i						: UINT;
    END_VAR
    
    // Тело функции
    FindValveIndexByName := 0;
    i := 1;
    WHILE (FindValveIndexByName = 0) AND (i <= g_c_uiValvesCount) DO
    	IF g_astValvesList[i].sName = sValveToFindName THEN
    		FindValveIndexByName := i;
    	END_IF
    	i := i + 1;
    END_WHILE
    Когда нужно будет обратиться к задвижке выполните код
    Код:
    uiCurrentValveIndex := FindValveIndexByName ('5');
    IF uiCurrentValveIndex > 0 THEN
    	(* Тут выполняете необходимые манипуляции с задвижкой примерно так g_astValvesList[uiCurrentValveIndex].state *)
    END_IF
    Единственное что нужно помнить - перебор 30000 значений приведет к увеличению времени цикла.
    Поэтому выполняйте поиск по имени только тогда, когда это действительно важно.

    В приложении файл, содержащий код из этого сообщения.
    Вложения Вложения
    Последний раз редактировалось Осинский Алексей; 28.02.2018 в 12:26.
    OSCAT.ru читать стандарты и статьи по автоматизации на русском без регистрации и СМС

Похожие темы

  1. Ответов: 4
    Последнее сообщение: 08.05.2014, 06:10
  2. Ответов: 2
    Последнее сообщение: 27.04.2013, 16:57
  3. HD-2544.VA-управление переменным резистором
    от Ефим в разделе Твердотельное реле
    Ответов: 5
    Последнее сообщение: 22.04.2013, 06:12
  4. Ответов: 3
    Последнее сообщение: 12.04.2012, 09:31

Метки этой темы

Ваши права

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