This is topic Драйвер t11 - формирование блоковых запросов in forum TRACE MODE 6 бесплатная Базовая версия / TRACE MODE 6 free Base version at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/31/t/000195.html

Posted by DEA (Участник № / Member № 1572) on :
 
Добрый день!
Не могу понять, как формируются блоковые запросы!
В редакторе создал 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 :
 
Добрый день. Неужели никто не поможет [Недоумение / Confused] ! Я всё ещё надеюсь на ваш совет.
Заранее благодарна.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Мы не можем расширять расшифровку спецификации функций вызова драйверов. Это формальное описание.
Опыт многолетнего использования этого описания пользователями Trace Mode при написании собственных драйверов показывает, что оно является достаточным.
Кроме того, в соответствующей главе имеются примеры исходников работающих драйверов.
Что касается Ваших попыток изиенения передаваемых параметров в функциях Compare и SET, то обращаю Ваше внимание на следующий фрагмент из описания функции SET:
ia – удаленный адрес канала (передается в драйвер); [clever / умный]
max_send – количество байтов для посылки (формируется в драйвере);
max_rec – количество байтов в ответе (формируется в драйвере);
q_rec – число посылаемых или запрашиваемых значений (передается в драйвер); [clever / умный]

Ни в 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
счетчик электроэнергии Каскад
Протоколы есть. Естественно все разные... [Неодобрение / Frown]
ИМХО надо писать три драйвера и они одновременно должны работать с виртуальными портами NPort, т.е. тоже через драйвер.
Вопрос: работать то будет сие творение?
 


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2