Алгоритм формирования блоковых запросов

Блоковые запросы позволяют МРВ за один сеанс обмена данными с контроллером получить значения для нескольких каналов. Такие запросы применяются только для чтения данных из контроллера, т.е. для каналов INPUT. Рассмотрим ситуацию, когда в контроллере есть несколько регистров (ячеек памяти), которым мы хотим сопоставить столько же каналов TRACE MODE. Пусть контроллер позволяет одной командой считать значения всех интересующих нас регистров. Обычно такие команды есть для регистров, расположенных по последовательным адресам в памяти контроллера. В команде тогда задается адрес первого регистра и количество регистров. Блоковый запрос позволяет драйверу использовать такие команды. В драйверах t12 всегда используются блоковые запросы.

Для реализации блоковых запросов МРВ должен до начала пересчета базы каналов "знать", какие каналы образуют группы. Таких групп может быть произвольное число. Группа также может состоять и из единственного канала. На представленном рисунке можно видеть три группы каналов и соответствующие блоки регистров, обозначенные разными цветами. Все каналы одной группы, естественно, имеют одинаковый тип (INPUT), подтип и дополнение к подтипу. Кроме того, у них совпадают два младших байта удаленного адреса. Об этом надо помнить при разработке структуры удаленного адреса (настроек канала).

При пересчете базы каналов функции Set, Check и Get будут вызываться по одному разу для каждой группы каналов. В функции Set известно число регистров, которые нужно считать из контроллера – оно равно q_rec (см. объявление функции). Поэтому Set может сформировать команду для контроллера на чтение этого числа регистров. Удаленный адрес (ia), передаваемый в эту функцию – это удаленный адрес первого канала из группы.

Функции Check нет необходимости знать число запрашиваемых значений. Она должна просто проверить правильность формата пришедшего ответа (например, она может посчитать контрольную сумму).

От функции Get требуется расшифровать ответ контроллера и поместить полученные значения в массив структур RSDATA. Каждому значению соответствует один элемент массива. В функцию передается указатель на этот массив. Также функция должна через аргумент q_rec (передаваемый по ссылке) сообщить МРВ количество значений, полученных в ответе. Кроме того, функция должна сообщить через аргумент type_cnv (также передаваемый по ссылке), какой алгоритм применять для разбора значений, переданных в массиве структур RSDATA. Существует два алгоритма – DATA и BLOCKDATA.

Функция zCompare вызывается для каждого канала в группе после функции Get. Точнее, она вызывается для всех каналов, у которых совпадают тип, подтип, дополнение к подтипу и два младших байта удаленного адреса. Если канал не принадлежит данному запросу, функция должна возвратить 0. Если канал принадлежит данному запросу, то возвращаемое значение зависит от того, какой алгоритм используется – DATA или BLOCKDATA. В случае использования алгоритма DATA достаточно вернуть не ноль. В случае алгоритма BLOCKDATA нужно вернуть число, на 1 большее, чем индекс элемента массива структур RSDATA, в котором находится значение канала (помещенное туда функцией Get).