Продвинутые темы по станкам
Эта страница покрывает части создания станка, выходящие за пределы базовой кинематической схемы из Дескрипторов станков: как позиционировать узлы матрицами, как строить переключаемые / съёмные узлы (блоки револьверной головы, присоединяемые головки, …), полный разбор револьверной головы и каналы управления и субстанки для многоканальных станков.
Большинство станков создаются в MachineMaker (см. Дескрипторы станков);
приёмы здесь — для особых случаев, которые по‑прежнему создаются или дорабатываются вручную.
Типы‑строительные‑блоки находятся в Machines/MachineTypes.xml,
шаблоны револьверной головы/патрона — в Machines/TurretTypes.xml,
а шаблон многоканального примера — в Machines/SwissTemplate.xml.
Полные станки поставляются в $(SCHEMAS_FOLDER) и являются лучшим справочником.
1 Позиционирование узлов матрицами
Каждый узел в Schema (TMachineNode и его потомки) несёт Matrix, размещающую его
относительно своего родительского узла. Вся кинематическая цепочка — это произведение этих
матриц вниз по дереву. Заполнить Matrix можно двумя способами, плюс есть отдельная матрица,
используемая только для 3D‑модели.
Тип матрицы (TMatrix) имеет селектор BaseCS — Parent (по умолчанию) или World — и
строится либо из серии шагов преобразования, либо из явного базиса (OrtX/OrtY/OrtZ +
Move).
Способ 1 — относительно СК родителя (серия перемещений и поворотов)
Обычный способ. Оставьте базовую матрицу единичной и добавьте серию шагов переноса и
поворота, применяемых в порядке объявления. Типы шагов — TTranslateX / TTranslateY /
TTranslateZ и TRotateX / TRotateY / TRotateZ (градусы). Каждый шаг — это член, который
вы объявляете внутри Matrix:
<SCType ID="MyNode" type="TMachineNode">
<Matrix>
<SCType ID="T1" type="TTranslateZ" DefaultValue="100"/> <!-- затем... -->
<SCType ID="T2" type="TRotateX" DefaultValue="90"/>
</Matrix>
</SCType>
Именно так устроены шаблоны револьверной головы, со смещениями, управляемыми выражениями (см. §3):
<!-- TurretTypes.xml: блок револьверной головы, размещённый на голове -->
<Matrix>
<SCType ID="T1" type="TTranslateX" DefaultValue="-[TurretParameters.Radius]"/>
<SCType ID="T2" type="TRotateZ"
DefaultValue="-[TurretParameters.RotationDirection]*360/[TurretParameters.BlocksCount]*([Parameters.BlockNumber]-1)"/>
</Matrix>
BaseCS остаётся Parent (по умолчанию), поэтому шаги интерпретируются в системе координат
родительского узла. Порядок важен — сначала применяется T1, затем T2.
Способ 2 — относительно мировой СК (пространственные углы)
Когда узел проще описать в мировой системе координат ячейки, установите BaseCS в World
и задайте одно пространственное преобразование (TComplexTransformation3d): перенос плюс три
угла в выбранном соглашении (Эйлер / фиксированные оси / кватернион / axis‑angle).
<Matrix>
<BaseCS DefaultValue="World"/>
<SCType ID="T1" type="TComplexTransformation3d">
<Translation><X DefaultValue="0"/><Y DefaultValue="0"/><Z DefaultValue="300"/></Translation>
<Rotation>
<Convention DefaultValue="EulerZYX"/> <!-- FixedXYZ, Quaternion, AxisAngleDeg, ... -->
<R1 DefaultValue="0"/>
<R2 DefaultValue="45"/>
<R3 DefaultValue="0"/>
<R4 DefaultValue="0"/> <!-- 4-е значение только для кватерниона / axis-angle -->
</Rotation>
</SCType>
</Matrix>
Базис можно также задать явно через
OrtX/OrtY/OrtZ(три вектора осей) иMove(начало координат), но на практике вы будете использовать две формы выше.
Матрица 3D‑модели (VisualProperties.VisMatrix)
Матрица узла выше задаёт его кинематическую систему. 3D‑модель, прикреплённая к узлу
(ImageFile, файл .osd или .stl), позиционируется отдельной матрицей VisMatrix внутри
VisualProperties. Используйте её, чтобы выровнять импортированную модель с системой узла, не
нарушая кинематику:
<SCType ID="MyNode" type="TMachineNode">
<ImageFile DefaultValue="Images\head.osd"/>
<VisualProperties>
<VisMatrix>
<SCType ID="T1" type="TRotateZ" DefaultValue="180"/>
</VisMatrix>
</VisualProperties>
</SCType>
(Визуализация станка обрабатывается отдельно от кинематики; VisMatrix влияет только на то,
как отрисовывается модель.)
2 Переключаемые / съёмные узлы
У реальных станков есть взаимозаменяемые части — блоки револьверной головы, присоединяемые фрезерные головки, адаптеры субшпинделя, варианты патрона. В пределах XML‑схемы станка существует два механизма моделирования «узла, который может присутствовать или нет», с разными компромиссами.
Область применения. Этот раздел покрывает только два механизма XML‑схемы. Другие виды съёмного содержимого обрабатываются на уровне проекта отдельными, не‑XML механизмами и не связаны с описанной здесь схемой — например, приспособления (оснастка заготовки, хранящаяся в собственном бинарном контейнере вместе с 3D‑моделями) и сборки инструмента (строятся в собственных структурах данных и подключаются к коннекторам магазина станка). Не используйте
TCaseNodeили скрытие узлов для их моделирования.
Механизм A — TCaseNode (одна ветвь загружается при разборе)
Узел, наследующийся от TCaseNode, содержит несколько альтернативных дочерних ветвей, но
предоставляет ActiveNode, называющий ту, что «в работе». При разборе дескриптора станка
загружается только активная ветвь; остальные полностью пропускаются.
<SCType ID="HeadBlockSelector" type="TCaseNode">
<ActiveNode DefaultValue="EmptyBlock"/> <!-- какую дочернюю ветвь загрузить -->
<Parameters>
<SCType ID="BlockNumber" type="Integer" DefaultValue="1"/>
</Parameters>
<SCType ID="EmptyBlock" Caption="Empty" type="TAbstractTurretHeadBlock"/>
<SCType ID="DrillBlock" Caption="Drill" type="TTurretDrillToolHolder"/>
<!-- ...другие альтернативы... -->
</SCType>
- Плюсы: неактивные ветви не потребляют память — критично, когда у станка много необязательных блоков (револьверная голова с десятками позиций, инструментальный магазин, …).
- Ограничение: активная ветвь выбирается один раз, при загрузке/разборе. Проект владеет единственным экземпляром станка, поэтому переключить активный блок во время проекта нельзя — только инициализировать в начале. Это классический механизм для револьверных голов (см. §3).
TCaseNode несёт ActiveNode (ID активного потомка) и необязательный блок Parameters; оба
пропускаются загрузчиком, когда он спускается в выбранную ветвь.
Механизм B — скрытие неактивных узлов (переключаемые во время работы)
Здесь загружаются все узлы, но узел показывается/активен только когда он принадлежит текущему выбранному коннектору инструмента или заготовки. Поскольку ничего не выгружается, активный блок может меняться посреди проекта. Этим управляют три атрибута:
| Атрибут | Тип | Узел с ним активен только когда… |
|---|---|---|
VisToolHolderID |
строка | его значение равно ID активного коннектора инструмента |
VisWorkpieceHolderID |
строка | его значение равно ID активного коннектора заготовки |
HideIfInactive |
лог. | узел лежит на ветви активного инструмента или заготовки (более простой переключатель, чем явное указание ID) |
<!-- этот адаптер показывается только когда активен коннектор инструмента "Tool3" -->
<SCType ID="Adapter3" type="TMachineNode" VisToolHolderID="Tool3">
...
</SCType>
<!-- эта ветвь показывается только пока несёт активный инструмент/заготовку -->
<SCType ID="OptionalHead" type="TMachineNode" HideIfInactive="True">
...
</SCType>
HideIfInactive — это простой эквивалент VisToolHolderID / VisWorkpieceHolderID, когда вы
не хотите жёстко прописывать ID коннекторов (которые могут меняться): вместо указания ID вы
просто помечаете узел, и он активен всякий раз, когда является предком текущего коннектора
инструмента или заготовки.
Что выбрать
TCaseNode (A) |
Скрытие (B) | |
|---|---|---|
| Загружается в память | только активная ветвь | все ветви |
| Когда делается выбор | один раз, при разборе/загрузке | в любой момент, посреди проекта |
| Память при многих вариантах | низкая | выше |
| Типичное применение | блоки револьверной головы, большие наборы опций | присоединяемые головки/адаптеры, переключаемые во время работы |
3 Револьверные головы
Револьверная голова — хрестоматийное применение §1
(параметрические матрицы), §2 Механизм A
(выбор блока через TCaseNode) и параметризации (чтобы ID узлов оставались уникальными
среди одинаковых блоков). Поставляемые шаблоны — в
Machines/TurretTypes.xml; некоторые старые станки строят
револьверную голову без шаблона, но по тому же принципу (шаблон добавили позже).
Составные части
1. Голова револьверной головы — поворотная индексная ось. Она содержит блок
TurretParameters (префикс, число позиций, радиус, ID линейных осей, на которых едет голова,
направление вращения) и индексный параметр состояния. Scale отображает один шаг индекса в
360 / BlocksCount градусов:
<SCType ID="TAbstractTurretHead" Caption="Turret head" type="TMachineAxis">
<ID DefaultValue="[TurretParameters.Prefix]TurretHead"/>
<ParameterName DefaultValue="[TurretParameters.Prefix]TurretAxisPos"/>
<AxisType DefaultValue="Rotary"/>
<Scale DefaultValue="360/[TurretParameters.BlocksCount]"/>
<SCType ID="TurretParameters" Caption="Turret parameters" type="ComplexType">
<SCType ID="Prefix" type="String" DefaultValue=""/>
<SCType ID="BlocksCount" type="Integer" DefaultValue="12"/>
<SCType ID="Radius" type="Double" DefaultValue="120"/>
<SCType ID="XAxisID" type="String" DefaultValue="[Prefix]AxisX"/>
<SCType ID="ZAxisID" type="String" DefaultValue="[Prefix]AxisZ"/>
<SCType ID="RotationDirection" type="Integer" DefaultValue="1"/>
</SCType>
<SCType ID="TurretAxisPos" type="TMachineStateParameter">
<ID DefaultValue="[TurretParameters.Prefix]TurretAxisPos"/>
<Address DefaultValue="[TurretParameters.Prefix]T"/>
<AxisControl DefaultValue="Indexed"/>
<Group DefaultValue="RotaryAxis"/>
</SCType>
</SCType>
2. Блок — размещён на голове параметрической матрицей. Каждая позиция повёрнута на свой угол и вынесена наружу на радиус головы (§1, Способ 1):
<SCType ID="TAbstractTurretHeadBlock" Caption="Turret head block" type="TMachineNode">
<Matrix>
<SCType ID="T1" type="TTranslateX" DefaultValue="-[TurretParameters.Radius]"/>
<SCType ID="T2" type="TRotateZ"
DefaultValue="-[TurretParameters.RotationDirection]*360/[TurretParameters.BlocksCount]*([Parameters.BlockNumber]-1)"/>
</Matrix>
</SCType>
3. Держатель инструмента на блоке — с параметрическими уникальными ID. Каждый блок должен
давать уникальные ID узлов и номера инструмента; параметризация от [Parameters.BlockNumber]
и [TurretParameters.Prefix] это гарантирует:
<SCType ID="TTurretToolHolder" Caption="Tool holder" type="TToolHolderNode">
<ID DefaultValue="[TurretParameters.Prefix]Tool[Parameters.BlockNumber]"/>
<ToolAxisID DefaultValue="[TurretParameters.Prefix]TurretHead"/>
<ToolAxisValue DefaultValue="[TurretParameters.RotationDirection]*([Parameters.BlockNumber]-1)"/>
<ToolNumber DefaultValue="[Parameters.BlockNumber]"/>
<XAxisID DefaultValue="[TurretParameters.XAxisID]"/>
<ZAxisID DefaultValue="[TurretParameters.ZAxisID]"/>
</SCType>
4. Селектор блока — TCaseNode. Каждая позиция — это селектор, чей Parameters.BlockNumber
отличает её, а ActiveNode выбирает установленный тип блока (пусто, токарный резец, приводное
сверло, …). Загружается только активный блок каждой позиции:
<SCType ID="TAbstractTurretHeadBlockSelector" type="TCaseNode">
<ActiveNode DefaultValue="EmptyBlock"/>
<Parameters>
<SCType ID="BlockNumber" type="Integer" DefaultValue="1"/>
</Parameters>
<SCType ID="EmptyBlock" Caption="Empty" type="TAbstractTurretHeadBlock"/>
<!-- конкретный станок добавляет: держатель токарного резца, держатель сверла, ... как альтернативы -->
</SCType>
Почему здесь необходима параметризация
У револьверной головы много одинаковых позиций. Если бы у их узлов были фиксированные ID, они
бы конфликтовали. Управляя каждым ID, ToolNumber, Address и смещением матрицы от
[Parameters.BlockNumber] (на позицию) и [TurretParameters.Prefix] (на голову, чтобы две
головы на одном станке не сталкивались), один шаблон чисто инстанцируется любое число раз. Это
тот же язык выражений [...], что и везде (см.
язык выражений); дескрипторы станков сильно на него
опираются.
Шаблоны патрона/кулачков в том же файле следуют идентичному образцу — параметрический блок
ChuckParametersи матрицы по кулачкам, управляемые[JawIndex].
Собираем вместе — сборка револьверной головы из шаблона
Теперь объединим части шаблона в полную переиспользуемую револьверную голову. Всё наследуется от
типов TurretTypes.xml, поэтому шаговый угол головы, матрицы
блоков и все ID создаются автоматически из параметров.
1. Определите блоки станка — каждый блок наследуется от TAbstractTurretHeadBlock
(наследуя его матрицу радиального/углового позиционирования) и содержит подходящий
параметрический держатель:
<SCType ID="LatheCutterBlock" Caption="Lathe cutter holder" type="TAbstractTurretHeadBlock">
<SCType ID="ToolHolder" type="TTurretLatheCutterHolder"/>
</SCType>
<SCType ID="DrivenDrillBlock" Caption="Driven drill holder" type="TAbstractTurretHeadBlock">
<SCType ID="ToolHolder" type="TTurretDrillToolHolder"/>
</SCType>
Держатели выше — это готовые к револьверной голове держатели шаблона, тоже объявленные в
TurretTypes.xml:TTurretToolHolder(от обобщённого коннектораTToolHolderNode),TTurretLatheCutterHolder(отTLatheCutterHolder) иTTurretDrillToolHolder(отTMillToolHolder). Каждый лишь добавляет параметрические ID инструмента револьверной головы —ID = [TurretParameters.Prefix]Tool[Parameters.BlockNumber], плюсToolAxisID,ToolNumberи связанныеXAxisID/YAxisID/ZAxisID— поверх своего типа коннектора. Именно это позволяет блоку просто вставить один из них и автоматически унаследовать уникальные, префиксованные имена.
2. Определите селектор блоков станка — унаследуйте его от шаблонного селектора
TAbstractTurretHeadBlockSelector (TCaseNode, уже предоставляющий ActiveNode,
Parameters.BlockNumber и унаследованную альтернативу EmptyBlock) и добавьте блоки, которые
этот станок поддерживает:
<SCType ID="TMyBlockSelector" Caption="Turret block selector" type="TAbstractTurretHeadBlockSelector">
<SCType ID="LatheCutter" Caption="Lathe cutter" type="LatheCutterBlock"/>
<SCType ID="DrivenDrill" Caption="Driven drill" type="DrivenDrillBlock"/>
<!-- "EmptyBlock" унаследован от TAbstractTurretHeadBlockSelector -->
</SCType>
3. Постройте револьверную голову как тип — унаследуйте её от TAbstractTurretHead (который
даёт поворотную индексную ось и вычисляет за вас Scale = 360 / BlocksCount), задайте её
TurretParameters и навесьте 12 селекторов позиций. BlockNumber каждой позиции делает её ID
уникальными; её ActiveNode говорит, какой блок там установлен:
<SCType ID="TMyTurret" Caption="Turret" type="TAbstractTurretHead">
<TurretParameters>
<BlocksCount DefaultValue="12"/> <!-- Scale головы становится 360/12 = 30° -->
<Radius DefaultValue="120"/>
</TurretParameters>
<SCType ID="T1" Caption="Position 1" type="TMyBlockSelector">
<ActiveNode DefaultValue="LatheCutter"/> <!-- позиция 1: токарный резец -->
<Parameters><BlockNumber DefaultValue="1"/></Parameters>
</SCType>
<SCType ID="T2" Caption="Position 2" type="TMyBlockSelector">
<ActiveNode DefaultValue="DrivenDrill"/> <!-- позиция 2: приводное сверло -->
<Parameters><BlockNumber DefaultValue="2"/></Parameters>
</SCType>
<SCType ID="T3" Caption="Position 3" type="TMyBlockSelector">
<ActiveNode DefaultValue="EmptyBlock"/> <!-- позиция 3: пусто (унаследованный блок) -->
<Parameters><BlockNumber DefaultValue="3"/></Parameters>
</SCType>
<!-- ...позиции T4 … T11, каждая — TMyBlockSelector со своим
ActiveNode и BlockNumber = 4 … 11 ... -->
<SCType ID="T12" Caption="Position 12" type="TMyBlockSelector">
<ActiveNode DefaultValue="LatheCutter"/>
<Parameters><BlockNumber DefaultValue="12"/></Parameters>
</SCType>
</SCType>
Вот и вся идея от начала до конца:
- Один тип селектора перечисляет все возможные блоки; двенадцать его экземпляров
(
T1…T12) — это физические позиции на голове. ActiveNodeкаждой позиции выбирает один загружаемый там блок — остальные альтернативы не стоят памяти (§2 A).BlockNumberкаждой позиции вместе сTurretParametersголовы параметризует угол матрицы блока и егоID/ToolNumberинструмента, так что двенадцать одинаковых позиций дают двенадцать различных, неконфликтующих инструментов.- Конфигурация фиксируется при разборе станка; чтобы переоснастить позицию, пользователь редактирует станок, который перезагружается.
Размещение револьверной головы(голов) в станке — зачем нужен Prefix
TMyTurret теперь — переиспользуемый тип. Разместите его в Schema станка в конце суппорта,
который его несёт, чтобы он двигался с этими осями. С одной револьверной головой её Prefix
можно оставить пустым:
<Schema>
<SCType ID="AxisX" type="TToolAxisX">
<SCType ID="AxisZ" type="TToolAxisZ">
<SCType ID="Turret" Caption="Turret" type="TMyTurret"/>
</SCType>
</SCType>
</Schema>
Но токарный/токарно‑фрезерный станок может нести две револьверные головы (верхнюю/нижнюю), а
станок загружается в единое пространство имён, поэтому каждый ID узла должен быть уникален
в пределах станка (как загружается станок).
Две копии TMyTurret каждая выдала бы TurretHead, Tool1…Tool12, TurretAxisPos, … —
конфликт. Именно поэтому TAbstractTurretHead параметризует каждое генерируемое имя
Prefix‑ом: дайте каждому экземпляру свой префикс, и все его ID станут уникальными:
<Schema>
<!-- нижняя револьверная голова на нижнем суппорте X/Z -->
<SCType ID="LowerX" type="TMachineAxis"> <ParameterName DefaultValue="LowerAxisXPos"/>
<SCType ID="LowerZ" type="TMachineAxis"> <ParameterName DefaultValue="LowerAxisZPos"/>
<SCType ID="LowerTurret" Caption="Lower turret" type="TMyTurret">
<TurretParameters>
<Prefix DefaultValue="Lower"/> <!-- -> LowerTurretHead, LowerTool1, LowerTurretAxisPos -->
<XAxisID DefaultValue="LowerX"/>
<ZAxisID DefaultValue="LowerZ"/>
</TurretParameters>
</SCType>
</SCType>
</SCType>
<!-- верхняя револьверная голова на собственном суппорте -->
<SCType ID="UpperX" type="TMachineAxis"> <ParameterName DefaultValue="UpperAxisXPos"/>
<SCType ID="UpperZ" type="TMachineAxis"> <ParameterName DefaultValue="UpperAxisZPos"/>
<SCType ID="UpperTurret" Caption="Upper turret" type="TMyTurret">
<TurretParameters>
<Prefix DefaultValue="Upper"/> <!-- -> UpperTurretHead, UpperTool1, UpperTurretAxisPos -->
<XAxisID DefaultValue="UpperX"/>
<ZAxisID DefaultValue="UpperZ"/>
</TurretParameters>
</SCType>
</SCType>
</SCType>
</Schema>
Каждый экземпляр переиспользует то же определение TMyTurret (все 12 позиций и их блоки), но
благодаря своему отличному Prefix выдаёт собственные неконфликтующие ID — LowerTurretHead /
LowerTool1… против UpperTurretHead / UpperTool1… — и ссылается на свои оси суппорта через
параметризованные XAxisID / ZAxisID. (В случае одной револьверной головы Prefix можно
оставить пустым.) На многоканальных станках две головы обычно также сидят на разных Channel —
см. §6.
4 Коннекторы инструмента — оси позиционирования и активация
Коннектор — это место, где инструмент или заготовка крепятся к кинематической цепочке —
коннектор инструмента (TToolHolderNode) и коннектор заготовки (TWorkpieceHolderNode)
интерфейса (см. строительные блоки). Оба
наследуются от общего гнезда и потому разделяют свойства шпинделя/зажима из
Шпиндель и зажим. На станках (не роботах)
инструментальный коннектор дополнительно несёт свойства, сообщающие решателю кинематики, как
его инструмент движется и как он выбирается.
Полные таблицы свойств коннекторов собраны в справочнике узлов → Коннекторы инструмента и заготовки; этот раздел объясняет поведение за этими свойствами.
Оси позиционирования и базовая СК — XAxisID / YAxisID / ZAxisID
XAxisID, YAxisID, ZAxisID называют оси станка, которые позиционируют вершину этого
инструмента в пространстве. Они дают решателю пригодную цепочку даже без явного субстанка
(§5) — по сути каждый коннектор уже описывает небольшой
«виртуальный субстанок». Они также определяют базовую систему координат этой цепочки.
Явные субстанки позже добавили OriginG54BaseNode / OriginG54, чтобы задавать эту базовую СК
напрямую. Когда их нет, базовая СК выводится:
- её начало совпадает с началом мировой СК станины станка;
- её направления осей берутся из направлений перемещения
XAxisID/YAxisID/ZAxisID.
Результат должен быть правой тройкой, поэтому задавайте направления перемещения осей аккуратно. Ветвь, в которой сидит ось, имеет значение:
- ось в инструментальной ветви вносит своё направление перемещения напрямую (положительно);
- ось в заготовочной ветви вносит противоположное направление (отрицательно) — перемещение детали в одну сторону эквивалентно перемещению инструмента в другую.
Отрицательный Scale оси (справочник узлов) тоже переворачивает
направление перемещения, поэтому он также влияет на эту базовую СК.
Активация коннектора — ToolAxisID / ToolAxisValue
Это основной механизм за инструментальными магазинами вообще и револьверными головами в
частности. Коннектор заявляет: чтобы сделать инструмент в этом коннекторе активным, переместите
ось ToolAxisID в значение ToolAxisValue. Это работает одинаково для поворотных магазинов
(револьверная голова индексируется к углу позиции) и линейных (магазин сдвигается в позицию).
<SCType ID="Tool5" type="TMillToolHolder">
<ToolAxisID DefaultValue="TurretHead"/> <!-- ось, индексирующая магазин -->
<ToolAxisValue DefaultValue="4"/> <!-- значение, вводящее эту позицию -->
<ToolNumber DefaultValue="5"/>
</SCType>
В шаблоне револьверной головы они параметрические —
ToolAxisID = [TurretParameters.Prefix]TurretHead и
ToolAxisValue = [TurretParameters.RotationDirection]*([Parameters.BlockNumber]-1) — так что
каждая позиция автоматически указывает на ось револьверной головы и свой индекс.
ToolAxisIDможно опустить. Когда активный субстанок (§5) определяет ось инструмента, система использует её; к собственномуToolAxisIDконнектора она откатывается, только когда у субстанка её нет. Так что коннектор может оставитьToolAxisIDпустым и позволить активному субстанку её предоставить.
Номер инструмента и поддерживаемые применения
ToolNumber— позиция в магазине этого коннектора, обычно известная как номер инструмента; именно его постпроцессор выводит в УП. В шаблоне револьверной головы он параметризован индексом позиции. Если оставить0(не задано), номер коннектора не используется, и УП вместо этого выводит номер, взятый из собственных свойств режущего инструмента.SupportedToolTypes(поддерживаемые применения) — виды обработки, которые может выполнять инструмент, установленный в этот коннектор:MillTool(фрезерование),LatheCutter(токарная обработка),JetCutter(струйная резка),Punch,Wire(проволочная EDM),Cutter6D(6D‑резка),Welder(сварка),AdditiveTool(аддитивный),Painter(окраска распылением),HeatTreatment,Gripper(захват). Система использует этот набор, чтобы фильтровать списки операций и инструментов, предлагаемых для коннектора, до тех, что поддерживаются его применениями.Channel— канал управления, к которому принадлежит этот коннектор (§6).ToolChangeTimeCalcLawIndex— индекс закона времени смены инструмента (заданного в секции Tool Change станка), применяемого к этому коннектору (0= закон по умолчанию).
Шпиндель и зажим (общие для обоих коннекторов)
Поскольку коннекторы инструмента и заготовки наследуются от одного гнезда, эти свойства применимы к обоим:
SpindleParamID— ID параметра состояния станка (параметры состояния станка), приводящего поворотную ось шпинделя, которая вращает инструмент или деталь. Это ID параметра состояния, а неIDузла оси.HolderType—Unknown,LeftLatheSpindleилиRightLatheSpindle; помечает гнездо токарного шпинделя.DefaultClampID— ID зажима по умолчанию для этого гнезда, на который ссылаются операции передачи/перехвата детали; по умолчанию выводится изHolderType(левый шпиндель →1, правый →2, иначе-1).
Коннекторы заготовки
Коннектор заготовки (TWorkpieceHolderNode) удерживает деталь (на патроне, шпинделе или
приспособлении) и несёт только общие свойства шпинделя/зажима выше — ни одного из полей
позиционирования инструмента, активации или ToolNumber / SupportedToolTypes, которые
описывают, как позиционируется и выбирается инструмент, и неприменимы к держателю детали. Его
полный список свойств и оговорку о размещении (Matrix узла игнорируется — коннектор
заготовки всегда принимает размещение своего родительского узла) см. в
справочнике узлов → Коннектор заготовки.
5 Субстанки (попеременная работа)
Каналы vs. субстанки — ключевое различие. Каналы (§6) описывают части станка, работающие одновременно. Субстанки описывают альтернативные кинематические цепочки, используемые по одной за раз (попеременно) — они решают, какие оси приводят инструмент. Они встречаются даже на одноканальных станках, поэтому это отдельное понятие.
Решатель обратной кинематики (ОК) работает с цепочкой фиксированной формы: три линейные оси
плюс две поворотные оси (X Y Z + RotaryAxis1 + RotaryAxis2). Когда дерево узлов станка
предлагает больше — дополнительные поворотные оси или несколько ветвей инструмента/заготовки
(шпиндели, револьверные головы) — цепочка становится избыточной, и решатель не может выбрать.
Субстанок устраняет неоднозначность, называя активную ветвь: узел инструмента, узел
заготовки и ровно то, какие линейные и поворотные оси участвуют.
Канонический пример — 6‑осевой фрезерный (XYZ + ABC)
У распространённого обрабатывающего центра есть линейные X Y Z плюс три поворотные оси
A, B, C — но решатель ОК всегда приводит лишь две поворотные. Три поворотные избыточны. Вы
разрешаете это, объявив два субстанка, каждый закрепляет пригодную цепочку XYZ + две
поворотные:
XYZ + A + CXYZ + B + C
Затем операция (или пользователь) выбирает, какой субстанок использовать для данной работы.
Используйте вариант SubMachine5x, добавляющий два поля поворотных осей:
<SubMachinesList>
<SCType ID="XYZ_AC" Caption="A + C" type="SubMachine5x">
<ToolNode DefaultValue="Spindle"/> <!-- узел, несущий инструмент -->
<WrkNode DefaultValue="Table"/> <!-- узел, несущий деталь -->
<XAxisID DefaultValue="AxisX"/>
<YAxisID DefaultValue="AxisY"/>
<ZAxisID DefaultValue="AxisZ"/>
<R1AxisID DefaultValue="AxisA"/> <!-- первая поворотная -->
<R2AxisID DefaultValue="AxisC"/> <!-- вторая поворотная -->
</SCType>
<SCType ID="XYZ_BC" Caption="B + C" type="SubMachine5x">
<ToolNode DefaultValue="Spindle"/>
<WrkNode DefaultValue="Table"/>
<XAxisID DefaultValue="AxisX"/>
<YAxisID DefaultValue="AxisY"/>
<ZAxisID DefaultValue="AxisZ"/>
<R1AxisID DefaultValue="AxisB"/>
<R2AxisID DefaultValue="AxisC"/>
</SCType>
</SubMachinesList>
Каждый субстанок — это одна решаемая цепочка XYZ + 2 поворотные; вместе они покрывают весь 6‑осевой станок, ни разу не прося решатель обработать три поворотные сразу. Этот станок — одноканальный: субстанки нужны независимо от каналов.
Второй пример — двухшпиндельный / двухревольверный токарно‑фрезерный
Очень распространённый токарно‑фрезерный центр имеет два носителя инструмента (верхнюю и нижнюю револьверные головы) и два носителя детали (левый и правый шпиндели). Любая револьверная голова может обрабатывать деталь, удерживаемую любым шпинделем, поэтому пригодные пары инструмент + заготовка перечисляются как субстанки — плюс ещё одна запись для работы шпиндель‑в‑шпиндель:
- SubMachine 1 — UpperTurret → LeftSpindle
- SubMachine 2 — UpperTurret → RightSpindle
- SubMachine 3 — LowerTurret → LeftSpindle
- SubMachine 4 — LowerTurret → RightSpindle
- SubMachine 5 — RightSpindle как держатель инструмента → LeftSpindle как держатель заготовки — для осевого сверления или передачи/перехвата детали между двумя шпинделями.
<SubMachinesList>
<SCType ID="UpperOnLeft" Caption="Upper turret → Left spindle" type="SubMachine">
<ToolNode DefaultValue="UpperTurret"/> <!-- ГОЛОВА револьверной головы, не отдельный держатель -->
<WrkNode DefaultValue="LeftSpindle"/> <!-- узел шпинделя, удерживающий деталь -->
<XAxisID DefaultValue="UpperX"/>
<ZAxisID DefaultValue="UpperZ"/>
<ToolAxisID DefaultValue="UpperTurret"/> <!-- ось индексации револьверной головы -->
<Channel DefaultValue="0"/>
</SCType>
<!-- ...UpperOnRight, LowerOnLeft, LowerOnRight — остальные пары револьверная голова×шпиндель... -->
<SCType ID="RightToLeft" Caption="Right spindle → Left spindle" type="SubMachine">
<ToolNode DefaultValue="RightSpindle"/> <!-- правый шпиндель выступает как носитель инструмента -->
<WrkNode DefaultValue="LeftSpindle"/> <!-- левый шпиндель удерживает деталь -->
</SCType>
</SubMachinesList>
ToolNode/WrkNodeназывают узел‑носитель, а не отдельный держатель. Указывайте ближайшего общего родителя задействованных держателей — голову револьверной головы (родитель всех её держателей инструмента) или узел шпинделя — а не отдельныйTToolHolderNode/TWorkpieceHolderNode. В этом и весь смысл (настоящих) субстанков: оси ветви (XAxisID/ZAxisID/ToolAxisID) указываются один раз, на субстанке, а не повторяются на каждом держателе инструмента, как требовал более старый «виртуальный субстанок» (коннекторныеXAxisID… из §4). Полный реальный список см. в поставляемомMachines\LatheMilling\MultiChannel\Puma MX2100ST\DOOSAN_PUMA_MX2100ST.xml(например,ToolNode=AxisTдля револьверной головы,WrkNode=AxisCдля шпинделя).
Итак, каждая запись называет, какой носитель держит инструмент, а какой — деталь, давая решателю одну однозначную пару; оператор (или операция) выбирает активный субстанок. Последняя запись показывает, что сам шпиндель может быть носителем инструмента — например, контршпиндель надвигает деталь на неподвижное сверло или перенимает деталь у главного шпинделя. Там, где случай XYZ+ABC использовал субстанки для разрешения избыточных поворотных осей, этот случай использует их, чтобы выбрать, какие из нескольких носителей инструмента/заготовки образуют активную пару.
Объявление и поля
Субстанки перечисляются в SubMachinesList станка; каждая запись — это SubMachine или
вариант (более старая форма‑массив SubMachines устарела).
| Поле | Смысл |
|---|---|
ToolNode / WrkNode |
Узлы‑носители, несущие инструмент и заготовку (ближайший общий родитель держателей — голова револьверной головы, шпиндель), а не отдельный держатель. |
XAxisID / YAxisID / ZAxisID |
Линейные оси этой цепочки. |
ToolAxisID |
Ось инструмента / шпинделя. |
OriginG54BaseNode |
Узел, к которому привязана базовая система координат субстанка. |
OriginG54 |
Произвольная ориентация (преобразование) для этой базовой СК — обычно используется на станках с контршпинделем, где Z базовой СК нужно инвертировать. |
ApproachRule / ReturnRule |
Общее правило подхода / возврата для этой ветви (см. ниже). |
DetailedApproachRules / DetailedReturnRules |
Варианты этих правил по режиму обработки, выбираемые автоматически по типу операции (см. ниже). |
Channel |
Канал, к которому принадлежит этот субстанок — актуально только на многоканальных станках (§6). |
Типы субстанков. Какой тип SubMachine использовать, зависит от решателя кинематики,
который нужен ветви, или от дополнительных опций, специфичных для вида оборудования. Обычный
SubMachine несёт общие поля выше; специализированные типы добавляют поля, которые требует их
решатель. Набор открыт и будет расти со временем; на данный момент существуют две
специализации помимо базовой:
SubMachine5x— для 5‑осевых станков. ДобавляетR1AxisID/R2AxisID, две поворотные оси, которыми управляет 5‑осевой решатель (использовано в примере XYZ+ABC выше).TrevisanSubMachine— для станков с функцией точения осью U (типичные представители — станки типа Trevisan). Добавляет радиальнуюUAxisID.
Правила подхода и возврата
ApproachRule / ReturnRule (и их детальные формы) описывают, как станок движется между
точкой смены инструмента и телом траектории для этого субстанка: правило подхода от позиции
смены инструмента к началу траектории операции и правило возврата от её конца обратно к
позиции смены инструмента.
Правило — это упорядоченная последовательность перемещений осей, записанная как группы,
разделённые ;, которые выполняются по очереди; буквы, сгруппированные вместе, движутся вместе,
а Axis(value) перемещает ось в заданное значение. Например, ApproachRule = "BC; Y Z(10); X"
означает: сначала повернуть B и C, затем переместить Y и Z (в 10), затем подвести
X.
Шаг может быть и командным токеном, а не перемещением оси. В частности, LCS включает
или выключает локальную систему координат в этой точке последовательности — или, для
соответствующего типа 5‑осевой обработки, режим TCPM — как видно в вариантах MillLCS /
MillTCPM ниже (BC;Z;X;LCS;XY;Z).
ApproachRule/ReturnRuleдают одно общее правило.DetailedApproachRules/DetailedReturnRulesдают варианты по режиму обработки, так что нужное правило выбирается автоматически по типу текущей операции:TurnRadial/TurnAxial— радиальное / осевое точение;MillRadial/MillAxial— радиальное / осевое обычное 3‑осевое фрезерование;MillLCS— индексная 5‑осевая обработка (локальная СК);MillTCPM— непрерывная 5‑осевая обработка (TCPM).
<SCType ID="MainMill" type="SubMachine">
...
<ApproachRule DefaultValue="BC; Y Z(10); X"/>
<ReturnRule DefaultValue="Z(10); X; Z"/>
<DetailedApproachRules>
<TurnRadial DefaultValue="BS;Z;X"/>
<TurnAxial DefaultValue="BS;Z(10);X;"/>
<MillRadial DefaultValue="BC;Z;X"/>
<MillAxial DefaultValue="BC;Z;X"/>
<MillLCS DefaultValue="BC;Z;X;LCS;XY;Z"/>
<MillTCPM DefaultValue="BC;Z;X;LCS;XY;Z"/>
</DetailedApproachRules>
<DetailedReturnRules> ... </DetailedReturnRules>
</SCType>
(реальный пример: Machines\LatheMilling\MultiChannel\Puma MX2100ST\DOOSAN_PUMA_MX2100ST.xml)
Выбирайте тип, соответствующий кинематике ветви; один станок может смешивать типы среди своих субстанков.
6 Каналы управления (одновременная работа)
Канал — это независимый поток движения/УП, выполняющийся одновременно с другими. На
многоканальном станке (двухшпиндельные / многоревольверные токарные, токарно‑фрезерные центры,
станки швейцарского типа) разные узлы, оси и параметры состояния принадлежат разным каналам,
а некоторые оси общие. Принадлежность вы назначаете целочисленным членом Channel на
соответствующих узлах/осях/параметрах состояния (и ChannelWorkpiece, где сторона заготовки
отличается):
<MachineStateParameters>
<SCType ID="AxisX1Pos" type="TMachineStateParameter"><Channel DefaultValue="0"/> ... </SCType>
<SCType ID="AxisX2Pos" type="TMachineStateParameter"><Channel DefaultValue="1"/> ... </SCType>
</MachineStateParameters>
Channel="0" и Channel="1" помещают два поперечных суппорта на разные каналы; ось, оставленная
на общем канале, является общей. Многоканальные станки — не только швейцарского типа — см.
поставляемые примеры в $(SCHEMAS_FOLDER)\LatheMilling\MultiChannel (например, IndexG160,
Puma MX2100ST, PumaTT2000SY). SwissTemplate.xml — один
распространённый готовый частный случай (2‑канальный швейцарский токарный), который также
показывает селекторы TCaseNode револьверной головы/адаптера в контексте; станки, построенные на
нём — например, токарные станки швейцарского типа Hanwha в $(SCHEMAS_FOLDER)\LatheMilling\SwissType
— реальные примеры использования этого шаблона.
Коротко: каналы работают одновременно и говорят, какому независимому потоку принадлежит узел; субстанки используются попеременно и говорят, какое подмножество узлов/осей образует одну решаемую цепочку инструмент+заготовка. Одноканальный станок всё равно может нуждаться в субстанках (фрезерный XYZ+ABC выше); многоканальный токарно‑фрезерный использует оба — субстанки внутри каждого канала.
Назад к Дескрипторам станков | указатель станков