Алгоритм взаимодействия с драйвером t12

  Инициализация

  Построение блоковых запросов

  Работа в реальном времени

  Завершение работы драйверов

Инициализация

На этом этапе МРВ инициализирует протоколы исходя из наличия каналов с соответствующими дополнениями к подтипу. Затем для этих протоколов вызываются функции Open_yyy. Далее инициализируются все интерфейсы, которые используются включенными протоколами. Для этого вызываются функции OpenMedia для каждого из интерфейсов.

Построение блоковых запросов

По каждому из используемых протоколов строятся блоковые запросы. Алгоритм построения этих запросов приведен выше в разделе, посвященном описанию разработки драйверов t11.

Работа в реальном времени

1. Поиск канала, для которого требуется обмен

2. Вызов функции формирования строки посылки. Set_yyy

Если значение параметра max_send, переданное функцией Set_yyy, больше 0, МРВ осуществляет вызов функции WriteMedia для посылки по соответствующему интерфейсу содержимого буфера sbuf. Длина посылаемой строки в байтах равна значению max_send.

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

3. Прием строки ответа. ReadMedia

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

4. Проверка корректности полученного ответа

На этом этапе вызывается функция Check_yyy.

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

5. Расшифровка полученного ответа

На этом этапе осуществляется вызов функции Get_yyy.

Характеристика завершения передачи или приема данных описывается в элементе p[0].F.fmt[1] массива структур RSDATA:

0 – нормальное завершение передачи данных;

1 – сбой при передаче. Выставить каналу флаг аппаратной недостоверности;

2 – сбой при передаче. Выставить каналу флаг аппаратной недостоверности и флаг повторной передачи.

Элементу p[0].F.fmt[0] необходимо присвоить 0, иначе МРВ не обновит значение канала.

Для каналов INPUT при помощи аргумента type_cnv функции Get_yyy в МРВ передается следующая информация: 

0 – использовать алгоритм обработки запросов DATA12;

1 – использовать алгоритм обработки запросов BLOCKDATA12;

8,10 – получены корректные значения для каналов блокового запроса (8 – запись полученных значений в архив запрещена, 10 – разрешена). Использовать алгоритм обработки данных DATA12. Элементы p[i] (где i=2k, k=0.1,2...) содержат полученные значения, элементы p[i+1] – соответствующие этим значениям метки времени:

p[i+1].V.d – число секунд с 1 января 1970 года

p[i+1].F.ind[0] – число миллисекунд

12 –  получен блок корректных данных для одного канала для записи в архив. Использовать алгоритм обработки данных DATA12. Элементы p[i] (где i=2k, k=0.1,2...) содержат полученные значения, элементы p[i+1] – соответствующие этим значениям метки времени:

p[i+1].V.d – число секунд с 1 января 1970 года

p[i+1].F.ind[0] – число миллисекунд

9,11 – то же, что 8, 10, но использовать алгоритм обработки данных BLOCKDATA12. 9 – запись полученного значения канала в архив запрещена, 11– разрешена.

13 –  то же, что 12, но использовать алгоритм обработки данных BLOCKDATA12.

Если в массиве p содержатся метки времени (type_cnv больше 1) значение q_rec необходимо увеличить в два раза, так как для передачи  каждого значения канала и метки времени для архива нужно два элемента массива структур RSDATA (q_rec = 2 * q_rec).

Если получено значение type_cnv, равное 12 или 13, МРВ просматривает все каналы базы, совпадающие с каналом, инициировавшим запрос, по типу, подтипу и дополнению к подтипу, и вызывает драйвер с функцией zCompare_yyy с count = -1. На первом же канале, по которому драйвер ответил положительно, из буфера RSDATA считываются записи в количестве q_rec (выдано функцией Get_yyy) и записываются в архив с индексом этого канала. Объем настроек, используемых при этом функцией zCompare_yyy (включая номер RS и адрес устройства) определяется драйвером. В канале, инициировавшем запрос, записывается значение  q_rec.

Алгоритмы обработки данных DATA12 и BLOCKDATA12 совпадают с аналогичными алгоритмами для обработки данных по последовательным интерфейсам (DATA11 и BLOCKDATA11), описание которых приведено выше в разделе, посвященном разработке драйверов t11. Отметим, что для алгоритмов обработки данных DATA12 и BLOCKDATA12 при проходе по базе выбираются каналы, имеющие указанные тип, подтип, дополнение к подтипу и два младшие байта удаленного адреса.

6. Перейти к пункту 1.

Завершение работы драйверов

При остановке монитора реального времени сначала по всем интерфейсам вызываются функции StopMedia. Затем по каждому используемому протоколу вызывается функция Close_yyy. После этого по каждому интерфейсу вызывается функция CloseMedia.