HWObject

HWObject — это базовый класс аппаратного объекта. Общий драйвер обращается к аппаратно-ориентированной части через этот класс. Если нужен отдельный аппаратный адрес (за пределами строки адреса периферии), из этого класс может быть унаследован расширенный объект. Если Modbus создает незапрошенное сообщение, например HWService драйвера Modbus, объект создает (Modbus-ориентированный) аппаратный объект и передает его функции toDP(…) менеджера DrvManager. Наоборот, если пользователь пытается задать значение свойства, драйвер получает от менеджера событий уведомление в виде прямой ссылки. Значение по этой прямой ссылке подвергается преобразованию со стороны драйвера, создается аппаратный объект, преобразованное значение переводится в аппаратно-ориентированную дату и передается объекту HWService. Аппаратный адрес создается при наследовании нового объекта из аппаратного объекта, который содержит дополнительные атрибуты аппаратного адреса (для Modbus, например, ссылка связи (kr) и индекс (ix)). Кроме того, функции сравнения унаследованного HWMapper должны быть настроены на аппаратные адреса унаследованного аппаратного объекта.
Аппаратный объект содержит указатель на буфер данных, в котором хранятся данные периферии, атрибут dataLen — размер этого буфера в байтах и адресная строка, соответствующая адресу, заданному в конфигурационном элементе адреса периферии. Атрибут transType содержит номер преобразования, присвоенного этому аппаратному объекту, в originTime время также может быть размещено в объекте (текущее время, если отдельное исходное время не было получено вместе с данными). Один из следующих типов данных может быть назначен objSrcType: srcSpont для незапрашиваемых данных, srcPolled для данных, полученных во время опроса, srcSingleQ для данных, полученных во время одиночного запроса, и srcGeneralQ для данных, отправленных в ответ на общий запрос. Эти типы данных используются, помимо прочего, в обработке сглаживания (режим сглаживания).
Атрибут number_of_elements дает число элементов в поле.
Для всех атрибутов существуют соответствующие методы setxxx и getxxx. Виртуальный метод setAdditionalData(const RecVar &data, PVSSushort subix), получающий в качестве первого параметра данные, а в качестве второго — субиндекс соответствующего элемента точки данных, служит для хранения в аппаратном объекте информации, дополняющей исходное значение, для которого драйвер произвел регистрацию с помощью менеджера событий. Например, если в случае, когда хотя бы один элемент точки данных задан неправильно, для полей аппаратного объекта всегда должен устанавливаться бит ошибки, функция наследуется следующим образом: 

void setAdditionalData( const RecVar &data, PVSSushort subix)
{
if ( data.getRecLength() ) // существует дополнительная информация
{
int flags = ( (UIntegerVar *)data.getFirstVar() )-
>getValue();
// первая переменная содержит флажки,
// свидетельствующие об отправке информации
if ( flags & DrvManager::DRVCONNMODE_TIME )
       { data.getNextVar(); } // игнорировать время
if ( flags & DrvManager::DRVCONNMODE_GA )
       { data.getNextVar(); } // игнорировать бит GA
if ( flags & DrvManager::DRVCONNMODE_EA )
       { data.getNextVar(); } // игнорировать бит EA
if ( flags & DrvManager::DRVCONNMODE_INVALID )
       {
       if ( (! getSbit(DRV_INVALID)) &&
       (((BitVar *)data.getNextVar())->getValue()))
           setSbit(DRV_INVALID);
       } // логическая функция или функция, касающаяся битов ошибок,
// вызывается отдельно для каждого субиндекса
  …
// игнорировать информационные биты
}
Следует заметить, что если первая запись RecVar представляет собой битовый узор (в переменной типа UIntegerVar), свидетельствующий об отправке информации, то для каждого установленного бита должна быть последовательно оценена следующая переменная (getNextVar()), даже если (см. выше) она не используется в дальнейшем (за исключением бита ошибки в примере). Однако если драйвер должен только осуществлять регистрацию с помощью менеджера событий «интересующей» информации, определяемой конфигурационным элементов адреса периферии (с помощью метода DrvManager getAttribs2Connect(..) ), то в RecVar должны устанавливаться только соответствующие флаги (например, бит ошибки в примере). Выходными данными может быть подходящее сообщение об ошибке, например, если в RecVar была занесена дополнительная информация.

 ПРИМЕЧАНИЕ
Следует заметить, что функция cutData() должна использоваться для удаления старых данных из объекта, если вы не хотите, чтобы указатель на данные в объекте был удален новой функцией setData или при удалении объекта. Например,int myFunc (){PVSSchar buffer[10];// заполнение буфера даннымиHWObject obj;obj.setData(buffer);….//обработкаobj.cutData() // избежать удаления буфера, т. к. в стеке хранится// автоматическая переменная}В этом примере должна использоваться функция cutData(), т. к. указатель на старые данные удаляется в деструкторе, если HWObject !=NULL. Этого не происходит, если функция cutData() использовалась ранее. Функция cutData() задает указатель на внутренние данные в HWObject в NULL и возвращает значение указателя, но не освобождает память (в деструкторе HWObject указатель на данные не удаляется, т. к. значение = NULL). Память необходимо освобождать вручную.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *