This is topic Драйвер t11 - формирование блоковых запросов in forum TRACE MODE 6 бесплатная Базовая версия / TRACE MODE 6 free Base version at Форум TRACE MODE: техническая поддержка.
Добрый день! Не могу понять, как формируются блоковые запросы! В редакторе создал 4 группы каналов соответственно тип подтип и ia[0], ia[1] у каждой группы свои. Число каналов в группе допустим по 4. Запускаю МРВ с драйвером t11s30.dll на этапе формирования блоковых запросов функцией zCompare_xxx сравниваю ia[0], ia[1] с ia1[0], ia1[1] при первом проходе весё нормально count - счетчик каналов равен числу каналов. Но дальше идут чудеса функция zCompare_xxx вызывается повторно для этой группы каналов при этом откидывается первый канал, который попал в блоковый запрос, он становится инициатором запроса дальше второй и так до последнего соответственно в функции Set_xxx в структуру ia передаются параметры всех каналов. Вопрос как правильно сформировать блоковые запросы?
Posted by ASUeng (Участник № / Member № 1958) on :
Добрый! Я тоже столкнулся с этой "задачкой". Решение простое: в функции zSET нужно проверить номер канала (ia.i[0]) и, если он равен номеру канала-инициатора (т.е. первого в группе), параметры max_send и max_rec задать такие, какие нужно, если же номер канала другой, задать их равными нулю, а кроме того и q_rec обнулить.
Posted by M@V (Участник № / Member № 1800) on :
Добрый! Я тоже столкнулся с этой "задачкой" но поступил по другому, просто при блоковом запросе рубил инициативу дочерних каналов в функции 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;
Posted by Anastasiya (Участник № / Member № 2136) on :
Здравствуйте! Не могли бы вы по-подробнее разъяснить: Как именно и что именно необходимо писать в 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; и т.д. В этом случае инициатором запроса другие каналы не становятся, но значения всех последующих каналов кроме инициатора сразу же после передачи изменяются на другие, совершенно непонятно откуда выходящие. Эти значения и остаются в канале. Подскажите, как можно решить проблему с блоковыми запросами.
Posted by Anastasiya (Участник № / Member № 2136) on :
Добрый день. Неужели никто не поможет ! Я всё ещё надеюсь на ваш совет. Заранее благодарна.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Мы не можем расширять расшифровку спецификации функций вызова драйверов. Это формальное описание. Опыт многолетнего использования этого описания пользователями Trace Mode при написании собственных драйверов показывает, что оно является достаточным. Кроме того, в соответствующей главе имеются примеры исходников работающих драйверов. Что касается Ваших попыток изиенения передаваемых параметров в функциях Compare и SET, то обращаю Ваше внимание на следующий фрагмент из описания функции SET: ia – удаленный адрес канала (передается в драйвер); max_send – количество байтов для посылки (формируется в драйвере); max_rec – количество байтов в ответе (формируется в драйвере); q_rec – число посылаемых или запрашиваемых значений (передается в драйвер);
Ни в Compare, ни в SET изменение удаленного адреса и q_rec не является корректным.
Posted by Anastasiya (Участник № / Member № 2136) on :
Спасибо. Однако замечу, что ни в Compare, ни в Set удаленный адрес я не изменяла. Я его использовала лишь в условии. С q_rec - это моё допущение,спасибо, исправила, но всё равно на результат это не повлияло. Что же касательно примеров исходников работающих драйверов, то я пробовала писать в Compare абсолютно тот же код, что и в примере драйвера для контроллера OMRON по протоколу HOSTLINK. Результат такой же, как я указывала выше - профайлер при запуске сразу выдает ошибку и закрывается. А мне нужно отсечь инициативу других каналов, чтобы только первый канал был инициатором запроса. В противном случае при передаче значений в канал эти значения при первой посылке присваиваются сразу с 1-го по n каналу(как и должно быть),при следующей посылке значения присваиваются каналам со 2-го по n и т.д. Никак не получается выйти из такой ситуации.
Posted by Anastasiya (Участник № / Member № 2136) on :
Уважаемые, помогите, пожалуйста! Вы же сталкивались с подобным. Как проверить этот удаленный адрес первого канала-инициатора? Я пробовала на других компьютерах запускать свой проект, результат - тот же. Профайлер выдает ошибку и не запускается, если в zCompare в условии использую ia0.i[0] или ia0.i[1], например if (ia0.i[1]!=0) { return (0); } else return (1);
Posted by DEA (Участник № / Member № 1572) on :
Добрый день! А правильно ли вы определили параметры функции ia? Обращение как на ссылку
Posted by Anastasiya (Участник № / Member № 2136) on :
Какая функция? ia - это же аргумент функции, удаленный адрес канала.
Posted by Anastasiya (Участник № / Member № 2136) on :
Какая функция? ia - это же аргумент функции, удаленный адрес канала.
Posted by DEA (Участник № / Member № 1572) on :
Я имею ввиду правильно ли объявлен параметр ia в функции. Например IA &ia или IA ia. Это очень большая разница может, поэтому и зависает DLL при обращении к структуре ia.
Posted by Anastasiya (Участник № / Member № 2136) on :
Конечно, IA &ia. Это же указано в стандартном заголовке текста драйвера. Вот мой заголовок: int zCompare_xxx(IA &ia,IA &ia1,int &count)
Posted by Anastasiya (Участник № / Member № 2136) on :
Конечно, IA &ia. Это же указано в стандартном заголовке текста драйвера. Вот мой заголовок: int zCompare_xxx(IA &ia,IA &ia1,int &count)
Posted by DEA (Участник № / Member № 1572) on :
На чем вы пишите DLL?
Posted by DEA (Участник № / Member № 1572) on :
Вообще рекомендую написать тестовую программу, что бы протестировать на непогрешимость вашу DLL. По крайне мере я так делал, очень помогает.
Posted by M@V (Участник № / Member № 1800) on :
Добрый день, Анастасия. Есть еще довольно мощьное средство для тестирования драйверов, это короткий LOOPBACK. Берете от старой мышки 9-ти контактный разъем и закорачиваете в нем 2-й и 3-й контакты (RxD и TxD). Вставляете эту штуку в COM порт. Далее в драйвере передаете в порт блок данных(Set_xxx) и в том же драйвере его-же и принимаете(Get_xxx). Для наглядности смотрите процесс в Portmon. Успехов.
Posted by andreas (Участник № / Member № 1561) on :
Доброе утро! И еще вопрос по драйверам. Есть такой Моксовский NPort5430, который создает виртуальные RealCOM порты, через которые Trace Mode может общаться с удаленными устройствами, т.е. фактически работает через драйвер. Так вот, будет ли работать таким образом написанный нами драйвер устройства? Задача следующая: прочитать с удаленного обьекта три устройства: водосчетчик Эргомера-120 тепловодосчетчик Эргомера-125 счетчик электроэнергии Каскад Протоколы есть. Естественно все разные... ИМХО надо писать три драйвера и они одновременно должны работать с виртуальными портами NPort, т.е. тоже через драйвер. Вопрос: работать то будет сие творение?