Vladimir
Junior Member / Новичок
Участник № / Member № 1029
отправлено / posted
Я пытаюсь прикрутить к механизму архивирования TM такую схему: есть счетчик, который сам ведет архивы (часовой, месячный, годовой). Этот счетчик подключен к контроллеру. На контроллере крутится самописная программа, которая снимает архив и текущие показания. Контроллер обменивается данными с управляющим компьютером под управлением ТМ по протоколу MODBUS. Можно ли настроить ТМ так, чтобы по MODBUS'у с контроллера в ТМ (по запросу ТМ) передавался требуемый архив (по выбору) и записывался в СПАД архив в ТМ? Если нельзя по MODBUS'у, тогда как это можно сделать?
Сообщения / Posts 10 | Из / From: Poccия
| IP / IP: IP адрес / IP address |
Vladimir
Junior Member / Новичок
Участник № / Member № 1029
отправлено / posted
У меня есть вопрос по разработке такого драйвера: предположим я хочу записать а СПАД архив значения 10 каналов (из месячного архива в счетчике). При этом драйвер формирует блоковый запрос к контроллеру. Контроллер возвращает месячный архив для 10 каналов. Архив для каждого канала содержит 36 значений. Затем, в Функции Get_xxx драйвера, я устанавлюваю type_сnv = 12. Вопросы: 1. type_сnv = 12 соответсвует записи в архив только одного канала, можно ли его использовать для записи в архив нескольких каналов, как в моем случае? Или нужно использовать другое значение, тогда какое? 2. Откуда МРВ, при type_сnv = 12, в момент вызова Get_XXX в драйвере, знает сколько драйвер заполнит значений RSDATA? Насколько я понял q_rec соответвует количеству каналов в блоковом запросе, но количество значений для записи в архив ни где не указывается? 3. Контролирует ли МРВ, при записи в СПАД архив, метки времени, т.е. если я считаю с контроллера архив за один и тот же месяц 2 раза, то сколько записей будет в СПАД архиве - две или одна?
Сообщения / Posts 10 | Из / From: Poccия
| IP / IP: IP адрес / IP address |
Vladimir
Junior Member / Новичок
Участник № / Member № 1029
отправлено / posted
1. В имеющейся спецификации функций вызова драйверов нет возможности в одном групповом запросе поднять архивные блоки для нескольких каналов.
2. Из нашей документации: "Если в массиве p содержатся метки времени (type_cnv больше 3) значение q_rec необходимо увеличить в два раза, так как для передачи каждого значения канала и метки времени для архива нужно два элемента массива структур RSDATA (q_rec = 2 * (ia.c[5]+1)).
Если получено значение type_cnv, равное 12 или 13, МРВ просматривает все каналы базы, совпадающие с каналом, инициировавшим запрос, по типу, подтипу и дополнению к подтипу и вызывает драйвер с функцией zCompare_xxx с count = -1. На первом же канале, по которому драйвер ответил положительно, из буфера RSDATA считываются записи В КОЛИЧЕСТВЕ Q_REC (выдано функцией Get_xxx) и записываются в архив с индексом этого канала. Объем настроек, используемых при этом функцией zCompare_xxx (включая номер RS и адрес устройства) определяется драйвером. В канале, инициировавшем запрос, записывается значение q_rec."
3. Если в подобной ситуации метки времени совпадут, то запись будет одна - последняя, если не совпадут, то - две.
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Vladimir
Junior Member / Новичок
Участник № / Member № 1029
отправлено / posted
Появились еще вопросы: 1. Получается, если я хочу записывать значения канала в архив, то в этом случае, понятие блокового запроса неприменимо, и в функции Prepare_xxx type_cnv > 0, так? 2. Когда МРВ вызывает Get_xxx, кто выделяет память под массив RSDATA - МРВ или драйвер? Если МРВ, то мне непонятно, откуда МРВ знает сколько в массиве будет значений - в каком месте драйвера ей это указывается, ведь на момент вызова Get_xxx, type_cnv еще не определено? Я перечитал документацию, но не нашел там таких строк "Если в массиве p содержатся метки времени (type_cnv больше 3) значение q_rec необходимо увеличить в два раза, так как для передачи каждого значения канала и метки времени для архива нужно два элемента массива структур RSDATA (q_rec = 2 * (ia.c[5]+1))." Это относится к какой функции?
Сообщения / Posts 10 | Из / From: Poccия
| IP / IP: IP адрес / IP address |
отправлено / posted
1. Из документации. "Алгоритм обработки данных DATA11 Данный алгоритм следует использовать при ЕДИНИЧНЫХ запросах или при блоковых, если заранее известен порядок размещения значений, которые будут переданы устройством в ответе.
При разборе ответа от контроллера по данному алгоритму МРВ выполняет следующие операции:
1. Осуществляет проход по базе с ее начала. (Повторный проход выполняется с места окончания предыдущего блокового запроса). При этом выбираются каналы с тем же подтипом, дополнением к подтипу и двумя младшими байтами удаленного адреса (ia.i[0] == ia1.i[0]). КОЛИЧЕСТВО ВЫЗЫВАЕМЫХ КАНАЛОВ ОПРЕДЕЛЯЕТСЯ ЗНАЧЕНИЕМ ПАРАМЕТРА Q_REG, ВОЗВРАЩАЕМЫМ GET_xxx." Выдача GET_xxx type_cnv=12 автоматически отменяет разбор запроса, как группового.
2. Из документации. "Первое обращение к драйверу. Prepare_xxx Эта функция вызывается при инициализации работы МРВ с драйвером. ...
int Prepare_xxx(int type, char *str, int &type_cnv, int &q_out); где .... .... q_out – ограничение на величину буферов для приема и передачи данных в контроллер (передается в драйвер, но может быть изменено). Максимальное значение – 2048 байт."
Процитированное в п.2 вопроса предложение относится к функции GET_xxx.