- •Введение
- •Создание функциональных блоков Создание новой библиотеки функциональных блоков
- •Последовательность разработки функциональных блоков
- •Использование групп, набор входов которых определяется пользователем.
- •Определение группы free_pingroup_def в фб.
- •Инструкция по внедрению шаблона cfbPropPageImpl в страничку свойств функционального блока.
- •Атрибуты входов, находящихся в группе free_pingroup_def.
- •Получение событий от таймера
- •Получение текущего времени
- •Проверка правильности в страничках свойств.
- •Использование таймера в функциональных блоках.
- •Признаки качества в Функциональных блоках Коды признака качества значения
- •Установка признаков качества выходов фб
- •Получение признака качества
- •Передача признаков качества входа выходу
- •Сообщения в фб.
- •Вывод информация об ошибках в фб в протокол работы.
- •Восстановление состояния фб при горячем рестарте.
- •Страницы свойств фб
- •Справка к фб
- •Справка к страницам свойств фб
- •Разработка визуальных фб на основе существующей библиотеки фб
- •Создание общего h-файла (подкл в файл описания фб и файл описания контрола)
- •Изменения в создании фб
- •Создание ActiveX контрола
- •Чтобы создать свойства нужно:
Проверка правильности в страничках свойств.
Проверка правильности должна производится в функции Apply. Если обнаружена ошибка, то нужно вывести предупреждающее сообщение и вернуть E_FAIL.
Под страничками свойств располагаются кнопки «Применить» и «Отменить». «Применить» нажимается автоматически при попытке перейти на другую страничку свойств (если не включен режим «редактирования»). По кнопке «Применить» вызывается функция Apply. Если она возвращает ошибку, то переход на другую страничку свойств запрещается. По кнопке «Отменить» настраиваемый элемент дерева (или функциональный блок) автоматически восстанавливает свое состояние на момент до активизации странички свойств (все настройки при неудачных попытках Apply отменяются!).
Использование таймера в функциональных блоках.
В классе CFBImp (базовый класс для всех ФБ) определена переменная m_piTimeCounter, в которую при переходе в Run time записывается указатель на таймер. Поэтому в Runtime-режиме блок может использовать таймер.
Получение событий от таймера
В классе ФБ, использующем таймер для получения событий, производятся следующие изменения:
В классе, в котором будет производиться обработке событий от таймера, необходимо реализовать интерфейс _IVavTimerEvents. Для этого:
К списку наследования добавляется: ,public _IVavTimerEvents.
Между BEGIN_COM_MAP и END_COM_MAP добавляется: COM_INTERFACE_ENTRY(_IVavTimerEvents).
В заголовке класса определяется функция: STDMETHOD(OnTimer)(DWORD dwCookie);
В cpp-файле класса она реализуется:
STDMETHODIMP CMyClass::OnTimer(DWORD dwCookie){
//код обработки события
return S_OK;
}
В классе определите переменную DWORD dwKey;
Определите функцию BOOL ToRuntime(). В ней для старта приема событий необходимо инициализировать таймер.
BOOL ToRuntime()
{
CComQIPtr<IVavTimer> piTimer (m_piTimeCounter);
piTimer->Add (GetUnknown(), nHour, nMinutes, nSeconds, nMilliseconds, &dwKey);
return TRUE;
}
//nHour, nMinutes, nSeconds, nMilliseconds – интервал между событиями в часах, минутах, секундах и миллисекундах; dwKey – ключ. (Можно период целиком указывать в миллисекундах).
После этого будет вызываться функция OnTimer с указанным периодом.
Если необходимо получать сообщения в определенный момент времени ( будильник ), то вместо функции Add нужно использовать функцию SetAlarm ( с такими же параметрами). После этого в указанное время каждый день будет вызвана функция OnTimer. Функцию Remove необходимо вызвать для выключения будильника.
Определите функцию void ToDesign(). В ней для отключения таймера необходимо вызвать
void ToDesign()
{
CComQIPtr<IVavTimer> piTimer (m_piTimeCounter);
piTimer‑>Remove(dwKey) //dwKey – ключ, который вернула функция Add или SetAlarm.
}
Получение текущего времени
Использовать таймер можно в Runtime-режиме и функциях ToRuntime и ToDesign.
Для получения текущего абсолютного времени достаточно воспользоваться функцией
m_piTimeCounter->Now(&pFileTime);
,где pFileTime – переменная типа FILETIME
2. Разница в миллисекундах между двумя абсолютными временами (pFileTime-ами) вычисляется функцией
m_piTimeCounter->Difference (FILETIME *pfileTime1, FILETIME *pfileTime2, DWORD *pdwDiff);
3. Функция
m_piTimeCounter->Next (FILETIME* pFileTime , DWORD *pdwDiff);
выполняет сразу оба этих действия: вычисляет разницу между текущим временем и pFileTime (передается в pdwDiff), после чего устанавливает pFileTime в текущее время.
4. Функция таймера GetTime получается текущее время (часы, минуты, секунды, миллисекунды).
CComQIPtr<IVavTimer> piTimer (m_piTimeCounter);
piTimer-> GetTime (short *pnHour, short *pnMinutes, short *pnSeconds, short *pnMilliseconds);
