TCOM5. Функции драйвера t11, вызываемые МРВ

  TCOM5 Prepare_xxx. Первое обращение к драйверу

  TCOM5 zCompare_xxx. Функция сравнения

  TCOM5 Set_xxx. Функция формирования сообщения

  TCOM5 zReadAny_xxx. Функция приема произвольного числа символов

  TCOM5 Check_xxx. Функция проверки

  TCOM5 Get_xxx. Функция расшифровки сообщения

Все перечисленные ниже функции (за исключением zReadAny_xxx) обязательно должны быть определены в драйвере.

TCOM5 Prepare_xxx. Первое обращение к драйверу

Эта функция вызывается при инициализации работы МРВ с драйвером. В ней можно прописать операции установки начальных условий для обмена данными, а также полную инициализацию драйвера. В частности, из этой функции можно передать МРВ указание сформировать блоковые запросы (не более 128 каналов).

 

int Prepare_xxx(int type, char *str, int &type_cnv, int &q_out);

 

где

type – номер драйвера;

str – передаваемая драйвером строка, содержащая название протокола (не более 31 байта). Профайлер пишет эту строку в свой протокол;

type_cnv – признак формирования блоковых запросов. Эта константа задается при разработке драйвера; при вызове функции передается МРВ:

0 – формировать;

не 0 – не формировать;

q_out – ограничение на величину буферов для приема и передачи данных в контроллер (передается в драйвер, но может быть изменено). Максимальное значение – 2048 байт.

Возвращаемое функцией значение, равное 0, говорит о нормальном ее выполнении. Отличие возвращаемого значения от 0 воспринимается как ошибочное завершение. В этом случае каналы с соответствующим дополнением к подтипу отключаются.

TCOM5 zCompare_xxx. Функция сравнения

Эта функция используется при формировании и расшифровке блоковых запросов. Она определяет принадлежность каналов к блокам (группам).

 

int zCompare_xxx(IA &ia, IA &ia1, int &count);

 

где

ia – удаленный адрес первого канала;

ia1 – удаленный адрес сравниваемого канала;

count – число каналов, уже попавших в текущий блок. Этот параметр формируется МРВ и передается в драйвер. По нему можно вносить ограничение на добавление новых элементов в блоковый запрос. Для алгоритма DATA11 (при расшифровке ответа) этот параметр равен индексу элемента массива структур RSDATA, содержащего значение для записи в канал. Этот массив заполняется функцией Get_xxx.

В процессе формирования блоковых запросов функция всегда вызывается для двух различных каналов. При этом count >= 1. При разборе блокового запроса при первом вызове функции для данного блока аргументы ia и ia1 оба относятся к первому каналу блока, при этом параметр count равен нулю. Если возвращаемое данной функцией значение больше 0, канал принадлежит к данному запросу; если при этом осуществляется обработка группового запроса по алгоритму BLOCKDATA11, возвращаемое значение должно быть на 1 больше индекса размещения данных в массиве структур RSDATA.

Если возвращаемое данной функцией значение равно 0, то анализируемый канал не попадает в данный запрос.

TCOM5 Set_xxx. Функция формирования сообщения

Эта функция вызывается МРВ при пересчете значений канала, связанного с драйвером.

 

void Set_xxx(IA &ia, unsigned int &max_send, unsigned int &max_rec, int &q_rec, RSDATA *p, char *sbuf);

 

где

ia – удаленный адрес канала (передается в драйвер);

max_send – количество байтов для посылки (формируется в драйвере);

max_rec – количество байтов в ответе (формируется в драйвере);

q_rec – число посылаемых или запрашиваемых значений (передается в драйвер);

p – указатель на массив структур RSDATA, содержащий данные и их форматы. Этот параметр требуется, если канал имеет тип OUTPUT, – в этом случае элемент 0 массива содержит значение для записи в контроллер.

Если канал типа OUTPUT, то

p[0].F.fmt[3]=1;

для данных в формате FLOAT:

p[0].V.v – посылаемое значение,

p[0].F.fmt[0]=0;

для данных в формате HEX:

p[0].V.i[0] – посылаемое значение,

p[0].F.fmt[0]=0x40.

Тип значения (HEX или FLOAT), посылаемого из канала в устройство, не связан с классом канала, который пользователь указал в редакторе базы каналов. p[0].F.fmt[0] нужен только для корректной интерпретации p[0].V внутри драйвера.

Если канал типа INPUT, то

p[0].F.fmt[3]=0.

sbuf – буфер для посылки (формируется в драйвере). Память под этот буфер выделяет МРВ, драйверу требуется только заполнить его нужными значениями. Длина буфера передается драйверу при вызове функции Prepare_xxx через ее аргумент q_out.

Данная функция вызывается для формирования сообщений, посылаемых по последовательному интерфейсу в контроллер. Сформированное сообщение должно быть размещено в буфере sbuf.

С помощью функции Set_xxx можно установить значение каналу, обратившемуся к драйверу. Если эта функция возвращает max_send=max_rec=[младший байт буфера sbuf]=0, то МРВ присваивает каналу значение, взятое из первого элемента массива структур RSDATA.

TCOM5 zReadAny_xxx. Функция приема произвольного числа символов

Данная функция предназначена для организации приема с заранее не известным числом символов.

 

int zReadAny_xxx(IA &ia, unsigned int &count_rec, unsigned int &all_c, char *rbuf);

 

где

ia удаленный адрес канала;

count_rec – указывает, сколько байтов еще принять;

all_с указывает, сколько байтов принято всего;

rbuf буфер приема.

Если драйвер поддерживает эту функцию, то в протокол профайлера пишется строка

RS: Loaded Protocol(5.11) <название протокола>

Функция вызывается МРВ после функции Set_xxx. Если zReadAny_xxx возвращает 0, то считается, что все байты от устройства приняты и далее будет вызвана функция Check_xxx. Если zReadAny_xxx возвращает не 0, то МРВ примет еще count_rec байтов от устройства и опять вызовет zReadAny_xxx. Таким образом можно получить от устройства сообщение, длина которого заранее (т.е., на момент вызова Set_xxx) не известна.

TCOM5 Check_xxx. Функция проверки

Эта функция вызывается после приема ответа от контроллера перед функцией расшифровки полученных данных. Она проверяет корректность полученного ответа. Она имеет следующий формат:

 

int Check_xxx(IA &ia, unsigned int &count_rec, unsigned int &max_rec, unsigned int &max_send, char *rbuf);

 

где

ia – удаленный адрес канала (передается в драйвер);

count_rec – число принятых байтов (передается в драйвер);

max_rec – количество байтов в ответе (передается драйверу и формируется в нем);

max_send – количество байтов для посылки (передается драйверу и формируется в нем);

rbuf – буфер, содержащий принятое сообщение (передается драйверу и формируется в нем).

Если возвращаемое функцией значение равно 0, то принятые данные считаются корректными и осуществляется вызов функции расшифровки принятого сообщения.

При отличии возвращаемого функцией значения от 0 анализируется величина параметра max_rec. Если он больше 0, то осуществляется прием дополнительных байтов. Количество этих байтов равно значению параметра max_rec.

Если возвращаемое значение параметра max_rec равно 0, то каналу, для которого осуществлялся вызов драйвера, устанавливается признак аппаратной недостоверности. Если при этом значение параметра max_send больше 0, то осуществляется посылка по последовательному порту строки из буфера rbuf. Количество посылаемых байтов равно величине параметра max_send.

TCOM5 Get_xxx. Функция расшифровки сообщения

Эта функция вызывается для расшифровки полученного от контроллера ответа. Она имеет следующий формат:

 

int Get_xxx(IA &ia, unsigned int &count_rec, int &q_rec, RSDATA *p, char *rbuf, int &type_cnv);

 

где

ia – удаленный адрес канала (передается в драйвер);

count_rec – число принятых символов (передается в драйвер);

q_rec – число посылаемых или запрашиваемых значений (передается в драйвер, может быть изменено);

p – указатель на массив структур RSDATA, содержащий данные и их форматы;

rbuf – буфер, содержащий принятые символы  (передается в драйвер);

type_cnv – этот параметр формируется в драйвере, его значение соответствует типу разборки данных (см. ниже).

Значения, полученные от контроллера, должны быть присвоены элементам массива p следующим образом: p[i].V.v = <значение> (даже если значение целое).

Возвращаемое значение указывает время ожидания до следующего запроса (в миллисекундах) по данному порту. Если функция Check_xxx возвращает значение, отличное от 0, перехода к Get_xxx не произойдет, и повторный запрос уйдет без задержки.