Тема / Topic: Драйвер t11 - формирование блоковых запросов
DEA
Forum Member / Участник форума
Участник № / Member № 1572
отправлено / posted
Добрый день! Не могу понять, как формируются блоковые запросы! В редакторе создал 4 группы каналов соответственно тип подтип и ia[0], ia[1] у каждой группы свои. Число каналов в группе допустим по 4. Запускаю МРВ с драйвером t11s30.dll на этапе формирования блоковых запросов функцией zCompare_xxx сравниваю ia[0], ia[1] с ia1[0], ia1[1] при первом проходе весё нормально count - счетчик каналов равен числу каналов. Но дальше идут чудеса функция zCompare_xxx вызывается повторно для этой группы каналов при этом откидывается первый канал, который попал в блоковый запрос, он становится инициатором запроса дальше второй и так до последнего соответственно в функции Set_xxx в структуру ia передаются параметры всех каналов. Вопрос как правильно сформировать блоковые запросы?
Сообщения / Posts 37 | Из / From: Россия
| IP / IP: IP адрес / IP address |
ASUeng
Junior Member / Новичок
Участник № / Member № 1958
отправлено / posted
Добрый! Я тоже столкнулся с этой "задачкой". Решение простое: в функции zSET нужно проверить номер канала (ia.i[0]) и, если он равен номеру канала-инициатора (т.е. первого в группе), параметры max_send и max_rec задать такие, какие нужно, если же номер канала другой, задать их равными нулю, а кроме того и q_rec обнулить.
Сообщения / Posts 3 | Из / From: Россия
| IP / IP: IP адрес / IP address |
M@V
Forum Professor / Завсегдатай форума
Участник № / Member № 1800
отправлено / posted
Добрый! Я тоже столкнулся с этой "задачкой" но поступил по другому, просто при блоковом запросе рубил инициативу дочерних каналов в функции zCompare_xxx:
function zCompare_xxx(var iad1,iad2: IA; var count: SmallInt): SmallInt; cdecl; begin Result:=1; if (block_query=0) and (iad1.word2<>0) then //рубим инициативу дочерних каналов Result:=0; end;
Сообщения / Posts 167 | Из / From: УКРАИНА
| IP / IP: IP адрес / IP address |
Anastasiya
Junior Member / Новичок
Участник № / Member № 2136
отправлено / posted
Здравствуйте! Не могли бы вы по-подробнее разъяснить: Как именно и что именно необходимо писать в Set_xxx либо в zCompare? Какой именно номер канала находиться в ia.i[0]? Когда я хоть каким-то образом в z_Compare трогаю ia0, то профайлер вообще отказывается запускаться и выдает ошибку. Пробовала в Set_xxx задавать условие (третьему байту канала-инициатора в TraseMode присваивала 1): if (ia.c[2]!=1) { max_send=0; max_rec=0; q_rec=0; } else max_rec=12; и т.д. В этом случае инициатором запроса другие каналы не становятся, но значения всех последующих каналов кроме инициатора сразу же после передачи изменяются на другие, совершенно непонятно откуда выходящие. Эти значения и остаются в канале. Подскажите, как можно решить проблему с блоковыми запросами.
Сообщения / Posts 20 | Из / From: Беларусь
| IP / IP: IP адрес / IP address |
Anastasiya
Junior Member / Новичок
Участник № / Member № 2136
отправлено / posted
Добрый день. Неужели никто не поможет ! Я всё ещё надеюсь на ваш совет. Заранее благодарна.
Сообщения / Posts 20 | Из / From: Беларусь
| IP / IP: IP адрес / IP address |
отправлено / posted
Мы не можем расширять расшифровку спецификации функций вызова драйверов. Это формальное описание. Опыт многолетнего использования этого описания пользователями Trace Mode при написании собственных драйверов показывает, что оно является достаточным. Кроме того, в соответствующей главе имеются примеры исходников работающих драйверов. Что касается Ваших попыток изиенения передаваемых параметров в функциях Compare и SET, то обращаю Ваше внимание на следующий фрагмент из описания функции SET: ia – удаленный адрес канала (передается в драйвер); max_send – количество байтов для посылки (формируется в драйвере); max_rec – количество байтов в ответе (формируется в драйвере); q_rec – число посылаемых или запрашиваемых значений (передается в драйвер);
Anastasiya
Junior Member / Новичок
Участник № / Member № 2136
отправлено / posted
Спасибо. Однако замечу, что ни в Compare, ни в Set удаленный адрес я не изменяла. Я его использовала лишь в условии. С q_rec - это моё допущение,спасибо, исправила, но всё равно на результат это не повлияло. Что же касательно примеров исходников работающих драйверов, то я пробовала писать в Compare абсолютно тот же код, что и в примере драйвера для контроллера OMRON по протоколу HOSTLINK. Результат такой же, как я указывала выше - профайлер при запуске сразу выдает ошибку и закрывается. А мне нужно отсечь инициативу других каналов, чтобы только первый канал был инициатором запроса. В противном случае при передаче значений в канал эти значения при первой посылке присваиваются сразу с 1-го по n каналу(как и должно быть),при следующей посылке значения присваиваются каналам со 2-го по n и т.д. Никак не получается выйти из такой ситуации.
Сообщения / Posts 20 | Из / From: Беларусь
| IP / IP: IP адрес / IP address |
Anastasiya
Junior Member / Новичок
Участник № / Member № 2136
отправлено / posted
Уважаемые, помогите, пожалуйста! Вы же сталкивались с подобным. Как проверить этот удаленный адрес первого канала-инициатора? Я пробовала на других компьютерах запускать свой проект, результат - тот же. Профайлер выдает ошибку и не запускается, если в zCompare в условии использую ia0.i[0] или ia0.i[1], например if (ia0.i[1]!=0) { return (0); } else return (1);
Сообщения / Posts 20 | Из / From: Беларусь
| IP / IP: IP адрес / IP address |
DEA
Forum Member / Участник форума
Участник № / Member № 1572
отправлено / posted
Добрый день! А правильно ли вы определили параметры функции ia? Обращение как на ссылку
Сообщения / Posts 37 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Anastasiya
Junior Member / Новичок
Участник № / Member № 2136
отправлено / posted
Какая функция? ia - это же аргумент функции, удаленный адрес канала.
Сообщения / Posts 20 | Из / From: Беларусь
| IP / IP: IP адрес / IP address |
Anastasiya
Junior Member / Новичок
Участник № / Member № 2136
отправлено / posted
Какая функция? ia - это же аргумент функции, удаленный адрес канала.
Сообщения / Posts 20 | Из / From: Беларусь
| IP / IP: IP адрес / IP address |
DEA
Forum Member / Участник форума
Участник № / Member № 1572
отправлено / posted
Я имею ввиду правильно ли объявлен параметр ia в функции. Например IA &ia или IA ia. Это очень большая разница может, поэтому и зависает DLL при обращении к структуре ia.
Сообщения / Posts 37 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Anastasiya
Junior Member / Новичок
Участник № / Member № 2136
отправлено / posted
Конечно, IA &ia. Это же указано в стандартном заголовке текста драйвера. Вот мой заголовок: int zCompare_xxx(IA &ia,IA &ia1,int &count)
Сообщения / Posts 20 | Из / From: Беларусь
| IP / IP: IP адрес / IP address |
Anastasiya
Junior Member / Новичок
Участник № / Member № 2136
отправлено / posted
Конечно, IA &ia. Это же указано в стандартном заголовке текста драйвера. Вот мой заголовок: int zCompare_xxx(IA &ia,IA &ia1,int &count)
Сообщения / Posts 20 | Из / From: Беларусь
| IP / IP: IP адрес / IP address |
DEA
Forum Member / Участник форума
Участник № / Member № 1572
DEA
Forum Member / Участник форума
Участник № / Member № 1572
отправлено / posted
Вообще рекомендую написать тестовую программу, что бы протестировать на непогрешимость вашу DLL. По крайне мере я так делал, очень помогает.
Сообщения / Posts 37 | Из / From: Россия
| IP / IP: IP адрес / IP address |
M@V
Forum Professor / Завсегдатай форума
Участник № / Member № 1800
отправлено / posted
Добрый день, Анастасия. Есть еще довольно мощьное средство для тестирования драйверов, это короткий LOOPBACK. Берете от старой мышки 9-ти контактный разъем и закорачиваете в нем 2-й и 3-й контакты (RxD и TxD). Вставляете эту штуку в COM порт. Далее в драйвере передаете в порт блок данных(Set_xxx) и в том же драйвере его-же и принимаете(Get_xxx). Для наглядности смотрите процесс в Portmon. Успехов.
Сообщения / Posts 167 | Из / From: УКРАИНА
| IP / IP: IP адрес / IP address |
andreas
Junior Member / Новичок
Участник № / Member № 1561
отправлено / posted
Доброе утро! И еще вопрос по драйверам. Есть такой Моксовский NPort5430, который создает виртуальные RealCOM порты, через которые Trace Mode может общаться с удаленными устройствами, т.е. фактически работает через драйвер. Так вот, будет ли работать таким образом написанный нами драйвер устройства? Задача следующая: прочитать с удаленного обьекта три устройства: водосчетчик Эргомера-120 тепловодосчетчик Эргомера-125 счетчик электроэнергии Каскад Протоколы есть. Естественно все разные... ИМХО надо писать три драйвера и они одновременно должны работать с виртуальными портами NPort, т.е. тоже через драйвер. Вопрос: работать то будет сие творение?
Сообщения / Posts 7 | Из / From: Украина
| IP / IP: IP адрес / IP address |