Тема / Topic: Программирование Ш711 (драйвер для работы с COM-портом)
Styxx
Forum Member / Участник форума
Участник № / Member № 74
отправлено / posted
Все таки, при работе с драйвером Ш711/60 без программирования мы никак не можем обойтись. Само программирование Ш711 не есть задачей реального времени, да и само программирование очень простое: посылка 2 байт (начало программирования), прием 1-4 байт (готов к приему), посылка программы, посылка конца программирования, прием 1-4 байт (успешное программирования).
Все сводится к тому как с минимальными затратами это реализовать? Мы видим, что модификация существующего - наилучший способ. Так ли это? Кто может поделиться опытом в этой области? consat@zp.urtel.net Пойдет ли для отработки драйвера TM5 демо версии?
отправлено / posted
Я полагаю, что Вы можете использовать в качестве прототипа исходный текст драйвера для контроллера Ш-711, приведенный в документации Трейс Моуд (и справочной системе). Однако, видимо, целесообразнее создать простой дополнительный драйвер для выполнения этой функции, т.к. она должна работать эпизодически, от случая к случаю.
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |
CONSAT
Forum Member / Участник форума
Участник № / Member № 51
отправлено / posted
Если можно по подробнее? Файл в примере - работает, но размеры этого в 2 раза меньше чем тот, что уже есть в ТМ - почему?
Непонятно как по значению канала выполнить действие в драйвере. (привязка значения канала к if)? ? ? Не понятно по тексту исходника.
Какова связь между этим драйвером (из примера + модификация) и протоколом Ш711 в форме связь по порту по протоколу...?
Как быть с тем что драйвер один а программировать необходимо какой-то из 8-ми Ш711 (неполностью видим связь между тем что в <file>.drv и проверки этого в драйвере по удаленному адресу)?
отправлено / posted
В штатном драйвере для Ш-711 не использовались команды, не предполагалось использование каналов OUT. Поэтому Вам надо в функции Set_xxx анализировать тип вызывающего канала, который зафиксирован в элементе структуры RSDATA p[0].F.fmt[3]=1 (см. алгоритм вызова драйвера в нашей документации). И удаленный адрес, и значение вызывающего канала могут быть использованы для формирования команды, посылаемой контроллеру. Контроллеры Ш-711 подключаются к разным RS-портам, поэтому один общий драйвер будет посылать команды в разные контроллеры, если в соответствующих командных каналах будут указаны разные номера COM-портов.
<Какова связь между этим драйвером (из примера + модификация) и протоколом Ш711 в форме связь по порту по протоколу...?> Очевидно, речь идет о механизме автопостроения "Связь по последовательным интерфейсам". При автоматической генерации каналов с помощью этого механизма Вы для каждого контроллера создаете один объект, в котором указываете, к какому COM-порту подключен данный контроллер и сколько каналов у него предполагается опрашивать. При этом номер устройства не используется (связь радиальная). Например, если контроллеры поключены к портам COM1 и COM2, Вы для dev0 устанавливаете COM1, а для dev1 - COM2. При этом будут сгенерированы только каналы опроса. Командные (программирующие) каналы надо создавать вручную. Еще раз предлагаю рассмотреть возможность создания специального драйвера, только для программирования контроллеров. Для опроса использовать штатный драйвер.
CONSAT
Forum Member / Участник форума
Участник № / Member № 51
отправлено / posted
Попробовали по вашему совету(выше по тексту) анализировать тип вызывающего канала, который зафиксирован в элементе структуры RSDATA p[0].F.fmt[3]=1, - создали канал типа OUTPUT/HEX послали туда 0x70 (для пробы). получили p[0].F.fmt[3] везде нули. Ведется лог, ф-ция Get_xxx вообще ни разу не вызвалась.
V.i[cfe8 3beb 0] - стало отличным от нуля после появления достоверность = 1 (INPUT), канал OUTPUT - достоверность осталась = 0. Значения всегда разные при новом старте, но не меняется до выхода из Трейс Моуд. Больше никаких изменений в структуре RSDATA и IA нет.
Предпологалось получить какие-либо данные о посланном значении примерно так:
void Set_xxx(...) { ...
int i=0; q_rec=64;
for (i=0;i<=q_rec;i++) { if (p[i].F.fmt[3] == 1) // канал типа OUTPUT if (p[i].F.fmt[0] == 0x40) // данные типа HEX if ( (p[0].V.i[0] == 0x70) // полученные данные { // режим программирования return; } } ...
}
Просим дать пример как по событию (значения Х в канале) выполнить блок программы... Проект и исходнике у Вас по почте.
отправлено / posted
Уважаемый CONSAT! В присланном Вами материале отсутствуют 2 файла: файл описания настроек каналов *.drv Вашего драйвера и откорректированный Вами файл Type11.ini. Мы не можем ни прочитать Ваш проект, ни запустить его. Дошлите, пожалуйста, недостающие файлы.
Сообщения / Posts 17317 | Из / From: Россия
| IP / IP: IP адрес / IP address |
CONSAT
Forum Member / Участник форума
Участник № / Member № 51
отправлено / posted
Да... извините. В Файл Type11.ini - добавилась строка №13 - TestDrv (исходя из имени присланной Вам dll-файла), ----Type11.ini---- ... Danfoss TestDrv <- Новая строка @ 9 ---- и Файл TestDrv.drv полная копия Вашего Ш711-60.drv -----TestDrv.drv---- TestDrv 2 №порта 1 0 №канала 3 2 -----
CONSAT
Forum Member / Участник форума
Участник № / Member № 51
отправлено / posted
Кроме этого в Вашем драйвере для Ш711-60 неправильный алгоритм работы: Перед каждым запросом значений из каналов. Всегда идет установка в режим работы "Тип ЭВМ", а эту команду необходимо послать только один раз перед работой... И эта команда воспринимается Ш711 не так уж и быстро.... Вот и получается что устройство медленное. Правы ли мы по поводу алгоритма?
Сообщения / Posts 58 | Из / From: Украина
| IP / IP: IP адрес / IP address |
отправлено / posted
Увы! Несмотря на полученные дополнения, у меня МРВ не воспринимает предложенный Вами драйвер (при попытке загрузить этот драйвер он возвращает системную ошибку 126 - что это значит, надо смотреть в ОС). Сам интерфейс к драйверам в МРВ многократно проверен и нами, и нашими пользователями, поэтому сейчас речь могла бы идти лишь о ревизии Вашего кода. У нас нет возможности анализировать Ваши исходные тексты, однако, на одну ошибку (с не очень ясными последствиями) необходимо указать: Вы обращаетесь к элементам удаленного адреса от ia.c[0] до ia.c[6], в то время как у нас удаленный адрес имеет размерность не более 6 байт.
По поводу "установки режима работы". Эта операция выполняется в нашем драйвере только 1 раз. Имеется массив int first[16], в котором анализируется и запоминается признак инициализации: при первом вызове драйвера с указанием на номер COM-порта (0-й символ удаленного адреса) производится инициализации соответствующего Ш-711 и в массиве устанавливается признак "1". При последующих обращениях к тому же контроллеру этот признак блокирует инициализацию.