malvin писал(а):Движки крутят на скорости до 4000 герц на каждую из трех осей
А чем обусловлено ограничение (или это не ограничение?) 4кГц? Возможных осей 3?
malvin писал(а):Загрузка проца незначительная
Какая программа управляет?
malvin писал(а):Код: Выделить всё
int __stdcall CncCmd(UCHAR uType, int Value1, int Value2)
Value1 - время в десятых долях милисекунды (100 - это 10 мс, и т д) между командами.
Value2 - команда типа:
Код: Выделить всё
// Y Z X
// 7 6 5 4 3 2 1 0
// D S D S D S D S
uType - всегда 1
Возможно два типа команд - установка направления на оси командой D_D_D_D_ или шагов по осям _S_S_S_S. Если нужен шаг на ось, то устанавливается S=1. Если шагов на оь не делать - 0.
malvin! и все читающие:
!!! есстественно функция CncCmd не универсальна, т.е. ни этой функции (ни её аналогов) однозначно нет в стандартных библиотеках LPT-порта - применяя такую функцию проект ограничивается использованием программы GIGAMESH в качестве управляющей программы, что обусловит небольшую воможность вовлечения новых участников проекта. С другой стороны применение специальной функции при наличии реального успеха, привлечет разработчиков программного обеспечения (которых, правда, совсем мало). Мое мнение - ориентироваться нужно на пользователя, т.е. сделать универсальный мост, который будетторый будет работать и с GIGAMESH, и с KCAM, и с VRIcnc и с другими, использующими стандартные библиотеки ввода-вывода LPT. А разработчиков вовлекать дополнительными бонусами типа управления временем (при отсутствии такого управления мост работает в режиме усреднения).
Что думаете товарищи?
Если все-таки есть непреодолимое желание или серьезная аргументация в пользу ухода от совместимости (с большим интересом ознакомился бы с вашими мыслями), по техническим вопросам взаимодействия есть такие мысли:
- для переменной Value1 использовать тип longword (unsigned 32-bit integer), при этом полностью покрывается диапазон возможных временных интервалов, с бОльшим разрешением (микросекунды) и c неисчерпаемым резервом для скорости моторов (до 4Ггц )ak( ).
- в описание команды приведена распиновка для одного байта информации..., предлагаю применить также 32(или 16)-битную переменную - с ее помощью можно будет закодировать перемещения до 16(8) приводов.
- управление электроавтоматикой не описано, предлагаю для описания этого управления использовать также 32(или 16)-битную переменную - управление до 32 (16) устройств
к чему я подвожу?... к
этому, см. раздел "Код управления".
подчеркну: речь идет о взаимодействии управляющей программы с модулем движения, т.е. реальная функциональность железки есстественным образом может быть ограничена возможностями чипа или чего-то еще... т.е. декларируем при передаче 32-битную переменную, реально используем - 8 или даже 6 (для XYZ) бит. Но при этом имеем возможность расширения.
подчеркну: в саму железку передается конкретно нужное (работающее) количество бит - это забота программного адаптора устройства. Реализация этого "узкого" протокола - забота только лишь разработчика устройства и адаптора. Таким образом через узкие места системы (интерфейс связи, буффер устройства) не пропускается избыточная информация. Передача информации от управляющей программы программе-адаптору по "широкому" протоколу не представляет трудностей ни по быстродействию ни по доступной памяти, при этом в таком "широком" протоколе заложен отличный резерв.
malvin писал(а):uType - всегда 1
Возможно два типа команд - установка направления на оси командой D_D_D_D_ или шагов по осям _S_S_S_S. Если нужен шаг на ось, то устанавливается S=1. Если шагов на оь не делать - 0.
Насчет uType совсем не понятно, что это? видимо 1 означает "шагать"? какие еще команды предполагаются?
По поводу команд _D_D_D_D и _S_S_S_S поподробнее можно, просто чтобы разночтения не было.
malvin, вот, мысль пришла.... можт ты мне на нее и намекал, а я не понял.... )bk(
Надо мне так сделать:
(верхняя схемка - так есть, нижняя - так надо сделать)
сделать самому подмену вызовов, а из твоей библиотеки вызывать функцию выполнения команды. В связи с вышесказанным предлагаю такой вызов:
Код: Выделить всё
unsigned int __stdcall CncCmd(UCHAR uType, unsigned long int Val1, unsigned long int Val2)
Только надо разобраться с uType... например возможны такие варианты:
1 - управляем приводами: Val1 - время импульса шага (беззнаковое длинное (32 бит) целое), Val2 - коды управления приводами в виде STEP/DIR (беззнаковое длинное (32 бит) целое)
2 - управляем электроавтоматикой: Val1 - время задержки, Val2 - коды управления электроавтоматикой
что такое UCHAR?
malvin писал(а):Программа управления должна следить чтобы в буфере было не больше 1000 байт информации.
Управление передачей в буффер все-таки дело драйвера железки, а другим с ним управляться негоже... )bl( ну, например, потому что тайминги надо подбирать конкретные и размер буффера может быть разным... да и вообще...
malvin писал(а):Вопрос в студию. Кто может сваять в железе мост? Нужна схема и печатка.
Ты схемку-то накропай, хоть от руки... или сфоткай хотяб детально свою макетку...
З.Ы.: три часа ответ писал... )ai(