# Servo Drivers

# HCFA Integration KUKA

# ПОЛНАЯ ИНСТРУКЦИЯ ПО ИНТЕГРАЦИИ HCFA SV-X5 + KUKA KRC4 (EtherCAT)

**На основе 3-х технических логов проекта**

---

## СОДЕРЖАНИЕ

1. [Электрическое подключение (Hardware)](#1-%D1%8D%D0%BB%D0%B5%D0%BA%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B5-%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-hardware)
2. [Настройка драйвера HCFA (Параметры)](#2-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-%D0%B4%D1%80%D0%B0%D0%B9%D0%B2%D0%B5%D1%80%D0%B0-hcfa-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B)
3. [Распайка кабеля энкодера](#3-%D1%80%D0%B0%D1%81%D0%BF%D0%B0%D0%B9%D0%BA%D0%B0-%D0%BA%D0%B0%D0%B1%D0%B5%D0%BB%D1%8F-%D1%8D%D0%BD%D0%BA%D0%BE%D0%B4%D0%B5%D1%80%D0%B0)
4. [Настройка EtherCAT в WorkVisual](#4-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0-ethercat-%D0%B2-workvisual)
5. [Модификация XML (PDO Mapping)](#5-%D0%BC%D0%BE%D0%B4%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F-xml-pdo-mapping)
6. [Программирование KRL](#6-%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-krl)
7. [Решение типовых проблем](#7-%D1%80%D0%B5%D1%88%D0%B5%D0%BD%D0%B8%D0%B5-%D1%82%D0%B8%D0%BF%D0%BE%D0%B2%D1%8B%D1%85-%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC)

---

## 1. ЭЛЕКТРИЧЕСКОЕ ПОДКЛЮЧЕНИЕ (Hardware)

### 1.1. Организация питания (КРИТИЧНО!)

**Раздельное питание силовой и управляющей части:**

- **L1C / L2C (Control Power):**
    - Подключить к **220В** (Фаза + Ноль) **напрямую** от автомата питания (ДО контакторов безопасности)
    - Обеспечивает работу логики и связи EtherCAT при E-Stop
- **L1 / L2 (Main Power):**
    - Подключить к **220В** через контактор безопасности робота
    - ⚠️ **ВАЖНО:** Драйвер рассчитан только на 220В, НЕ подключать к 3-фазной сети 400В!

### 1.2. Подключение тормоза

⚠️ **ЗАПРЕЩЕНО** подключать тормоз напрямую в выход DO драйвера (сгорит транзистор, макс. 50мА)!

**Правильная схема:**

<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg" id="bkmrk--2"><div class="sticky opacity-0 group-hover/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><div class="relative"><div class="transition-all opacity-100 scale-100">  
</div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50">  
</div></div></div></div></div><div class="overflow-x-auto"></div></div>```
Выход DO1 (CN6: Pin 1 DO+ / Pin 6 DO-) → Катушка реле 24В → Контакты реле → Тормоз
```

**Настройка драйвера:**

- **P04.21 = 6** (Функция Brake Release)

### 1.3. STO (Safe Torque Off)

На разъеме **CN2** установить перемычки для деактивации аппаратной блокировки (временное решение для пусконаладки).

---

## 2. НАСТРОЙКА ДРАЙВЕРА HCFA (Параметры)

### 2.1. Программное обеспечение

**Использовать:**

- **HCS-Studio(Cn) V2.13** или
- **HCServoWorks 1.2.9**

⚠️ Новые версии (Sysctrl Studio) этот привод НЕ ВИДЯТ!

### 2.2. ОБЯЗАТЕЛЬНЫЕ параметры для EtherCAT

**Базовая конфигурация:**

<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg" id="bkmrk--4"><div class="sticky opacity-0 group-hover/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><div class="relative"><div class="transition-all opacity-100 scale-100">  
</div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50">  
</div></div></div></div></div><div class="overflow-x-auto"></div></div>```
P00.01 = 7          // Режим EtherCAT
P06.28 = 1          // Отключить концевики P-OT/N-OT (КРИТИЧНО!)
P09.13 = H0015      // Единицы: RPM (скорость), ms (ускорение)
                    // или H0005 в зависимости от версии прошивки
P00.19 = 0          // Отключить контроль рассогласования (при пусконаладке)
```

**⚠️ КРИТИЧНО - Настройка цифровых входов:**

Для работы через EtherCAT **ОБЯЗАТЕЛЬНО** убрать назначение функций концевиков:

<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg" id="bkmrk--5"><div class="sticky opacity-0 group-hover/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><div class="relative"><div class="transition-all opacity-100 scale-100">  
</div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50">  
</div></div></div></div></div><div class="overflow-x-auto"></div></div>```
P04.01 = 0 или другая функция (не 14, не 15)
P04.02 = 0 или другая функция (не 14, не 15)
P04.03 = 0 или другая функция (не 14, не 15)
P04.04 = 0 или другая функция (не 14, не 15)
P04.05 = 0 или другая функция (не 14, не 15)
P04.06 = 0 или другая функция (не 14, не 15)
P04.07 = 0 или другая функция (не 14, не 15)
P04.08 = 0 или другая функция (не 14, не 15)

Где: 14 = P_OT (положительный концевик)
     15 = N_OT (отрицательный концевик)
```

**Причина:** Если оставить функции 14 или 15, драйвер будет ждать сигналы концевиков и останется в состоянии **Switch On Disabled** (StatusWord = 592), игнорируя команды включения.

### 2.3. "Взлом" защиты для стороннего мотора

Если используется неродной мотор (например, GSK 150SJTRE):

**Строго по порядку:**

1. **P07.21 = 1** (Снятие защиты от записи)
2. **Выключить/Включить питание**
3. **P18.00 = 0000FFFF** (HEX) или **65535** (DEC) — код "Универсальный двигатель"
4. **Выключить/Включить питание**

### 2.4. Параметры мотора (P18 Group)

Заполнить с шильдика мотора:

<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg" id="bkmrk--6"><div class="sticky opacity-0 group-hover/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><div class="relative"><div class="transition-all opacity-100 scale-100">  
</div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50">  
</div></div></div></div></div><div class="overflow-x-auto"></div></div>```
P18.05 = 13.00      // Номинальный ток (A)
P18.06 = 10.00      // Номинальный момент (Nm)
P18.08 = 2000       // Номинальная скорость (rpm)
P18.11 = 4          // Количество пар полюсов (КРИТИЧНО!)
                    // Для моторов 150-й серии = 4 (8 полюсов)
                    // При неправильном значении: рывки, Err.047
P18.19 = 0, 1 или 2 // Протокол энкодера (подбирать)
```

**После изменения P18.11 ОБЯЗАТЕЛЬНО:**

<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg" id="bkmrk--7"><div class="sticky opacity-0 group-hover/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><div class="relative"><div class="transition-all opacity-100 scale-100">  
</div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50">  
</div></div></div></div></div><div class="overflow-x-auto"></div></div>```
P20.03 = 5          // Поиск начального электрического угла
```

### 2.5. Настройка инерции и жесткости

**Автоматический замер инерции:**

<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg" id="bkmrk--8"><div class="sticky opacity-0 group-hover/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><div class="relative"><div class="transition-all opacity-100 scale-100">  
</div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50">  
</div></div></div></div></div><div class="overflow-x-auto"></div></div>```
P20.03 = 1 или 2    // Автоопределение инерции нагрузки
```

После замера система установит значение в **P00.04** (обычно 5-15).

**Жесткость регулятора:**

<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg" id="bkmrk--9"><div class="sticky opacity-0 group-hover/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><div class="relative"><div class="transition-all opacity-100 scale-100">  
</div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50">  
</div></div></div></div></div><div class="overflow-x-auto"></div></div>```
P00.02 = 2          // Режим автонастройки (рекомендуется)
P00.03 = 10-12      // Жесткость (для высокой скорости)
                    // Низкое значение (5) = мягко, отставание
                    // Высокое значение (10-12) = жестко, точно
```

**Скоростное упреждение (если есть отставание):**

<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg" id="bkmrk--10"><div class="sticky opacity-0 group-hover/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><div class="relative"><div class="transition-all opacity-100 scale-100">  
</div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50">  
</div></div></div></div></div><div class="overflow-x-auto"></div></div>```
P01.12 = 30-50      // Feedforward (%)
```

### 2.6. Обнуление абсолютного энкодера

Если нужно установить текущую позицию как "0":

1. Выключить Servo OFF (мотор свободен)
2. Убедиться: **P06.47 = 1** (Абсолютный режим)
3. **P20.06 = 7** (Команда сброса)
4. Перезагрузить питание

**Если не работает (Hард-ресет):**

1. Выключить привод
2. Вынуть батарейку на 1 минуту
3. Включить → Получить ошибку **Err.012**
4. В состоянии ошибки: **P20.06 = 7**
5. Перезагрузить питание

---

## 3. РАСПАЙКА КАБЕЛЯ ЭНКОДЕРА

### 3.1. Проблема разъемов

- **Мотор:** D-Sub (DB15)
- **Драйвер CN7:** IEEE 1394 (FireWire 6-pin)

**Решение:** Кастомный кабель с перепайкой.

### 3.2. Правильная распиновка

<div class="overflow-x-auto w-full px-2 mb-6" id="bkmrk-%D0%A1%D0%B8%D0%B3%D0%BD%D0%B0%D0%BB-%D0%9F%D0%B8%D0%BD-%D0%BD%D0%B0-cn7-%28i"><table class="min-w-full border-collapse text-sm leading-[1.7] whitespace-normal"><thead class="text-left"><tr><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">Сигнал</th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">Пин на CN7 (IEEE1394)</th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">Пин на моторе (D-Sub)</th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">Цвет (проверить!)</th></tr></thead><tbody><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**+5V**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**1**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**2**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">Красный</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**GND**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**2**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**3**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">Черный</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**Data+**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**5**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**4**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">Белый</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**Data-**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**6**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**5**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">Желтый</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**Экран**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**Корпус (Shell)**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**Корпус/9**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">Оплетка</td></tr></tbody></table>

</div>### 3.3. КРИТИЧЕСКИЕ требования к монтажу

**1. НИКАКИХ СКРУТОК!**

- Линии данных работают на частоте 2.5 МГц
- Скрутка = отражение сигнала + помехи (Err.013)
- Только пайка, минимальная разделка

**2. Экранирование:**

- Экран припаять к металлическому корпусу CN7 **вкруговую**
- Или зажать хомутом
- "Свиной хвостик" = антенна для помех

**3. Диагностика энкодера:**

- Замерить ток по линии +5В: норма **30-80 мА**
- 0 мА = обрыв
- > 200 мА = КЗ

### 3.4. Борьба с помехами (Err.013)

Если при включении или вращении вылетает **Err.013**:

**Аппаратные меры:**

1. Надеть **ферритовое кольцо** на силовой кабель UVW возле привода
2. Заземлить корпус мотора отдельным проводом на PE привода

**Программный фильтр (крайняя мера):**

<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg" id="bkmrk--12"><div class="sticky opacity-0 group-hover/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><div class="relative"><div class="transition-all opacity-100 scale-100">  
</div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50">  
</div></div></div></div></div><div class="overflow-x-auto"></div></div>```
P06.40 = 10-39      // Фильтр помех энкодера
                    // Заводское: 0
                    // Увеличивать при Err.013
                    // ⚠️ Высокое значение = задержка = хуже динамика
```

---

## 4. НАСТРОЙКА ETHERCAT В WORKVISUAL

### 4.1. Топология сети

Драйвер подключить в порт **X44** контроллера KRC4:

<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg" id="bkmrk--14"><div class="sticky opacity-0 group-hover/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><div class="relative"><div class="transition-all opacity-100 scale-100">  
</div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50">  
</div></div></div></div></div><div class="overflow-x-auto"></div></div>```
KRC4 (X44) → Beckhoff EK1100 (Coupler) → HCFA SV-X5E
```

Порядок устройств в дереве WorkVisual = физическое подключение.

### 4.2. ESI-файл (XML)

Использовать оригинальный XML от производителя:

<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg" id="bkmrk--15"><div class="sticky opacity-0 group-hover/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><div class="relative"><div class="transition-all opacity-100 scale-100">  
</div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50">  
</div></div></div></div></div><div class="overflow-x-auto"></div></div>```
HCFA_X5B_Servo_Driver2.1.27.1.xml
```

### 4.3. Первичная диагностика

Через WorkVisual → Диагностика входов:

- Код **0x7305** = Ошибка связи с энкодером (проверить кабель)
- После правильной пайки ошибка должна исчезнуть

---

## 5. МОДИФИКАЦИЯ XML (PDO MAPPING)

### 5.1. Проблема

В стандартном XML отсутствуют объекты для передачи скорости и ускорения:

- **0x6081** (Profile Velocity)
- **0x6083** (Profile Acceleration)
- **0x6084** (Profile Deceleration)

Без них драйвер получает команду на движение со скоростью 0 → мотор стоит.

### 5.2. Решение — Модификация 1st RxPdo

**Анализ:**

- **1st RxPdo (#x1600)** имеет `<Access>rw</Access>`
- Нет флага `Fixed="true"`
- → Драйвер поддерживает динамическую реконфигурацию

**Правки в XML:**

Найти секцию `<Object Index="1600">` и добавить:

<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg" id="bkmrk-xml"><div class="sticky opacity-0 group-hover/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><div class="relative"><div class="transition-all opacity-100 scale-100">  
</div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50">  
</div></div></div></div></div><div class="text-text-500 font-small p-3.5 pb-0">xml</div><div class="overflow-x-auto"></div></div>```xml
<Entry>
  <Index>#x6081</Index>
  <SubIndex>0</SubIndex>
  <BitLen>32</BitLen>
  <Name>Profile Velocity</Name>
  <DataType>UDINT</DataType>
</Entry>
<Entry>
  <Index>#x6083</Index>
  <SubIndex>0</SubIndex>
  <BitLen>32</BitLen>
  <Name>Profile Acceleration</Name>
  <DataType>UDINT</DataType>
</Entry>
<Entry>
  <Index>#x6084</Index>
  <SubIndex>0</SubIndex>
  <BitLen>32</BitLen>
  <Name>Profile Deceleration</Name>
  <DataType>UDINT</DataType>
</Entry>
```

Найти секцию `<RxPdo Index="#x1600">` и добавить соответствующие Entry.

После импорта нового XML и компиляции → переменные появятся в WorkVisual.

### 5.3. ⚠️ Что НЕ работает

**Попытка 1 (Неудачная) — 5th PDO:**

- 5-й набор помечен `Fixed="true"` (жестко зашит)
- Изменение размера → потеря связи

**Попытка 2 (Неудачная) — Target Velocity:**

- Существует в 5-м наборе
- Работает только в режиме скорости (Mode 3)
- В режиме позиционирования (Mode 1) игнорируется

---

## 6. ПРОГРАММИРОВАНИЕ KRL

### 6.1. Конфигурация ($CONFIG.DAT)

Создать `SIGNAL` для объединения битов:

<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg" id="bkmrk-krl"><div class="sticky opacity-0 group-hover/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><div class="relative"><div class="transition-all opacity-100 scale-100">  
</div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50">  
</div></div></div></div></div><div class="text-text-500 font-small p-3.5 pb-0">krl</div><div class="overflow-x-auto"></div></div>```krl
SIGNAL do_HCFA_ControlWord $OUT[1] TO $OUT[16]     ; UINT
SIGNAL do_HCFA_TargetPos $OUT[17] TO $OUT[48]      ; DINT
SIGNAL do_HCFA_ProfileVel $OUT[49] TO $OUT[80]     ; UDINT
SIGNAL do_HCFA_ProfileAcc $OUT[81] TO $OUT[112]    ; UDINT

SIGNAL di_HCFA_StatusWord $IN[1] TO $IN[16]        ; UINT
SIGNAL di_HCFA_ActPos $IN[17] TO $IN[48]           ; DINT
SIGNAL di_HCFA_OpMode $IN[49] TO $IN[56]           ; INT
```

### 6.2. Алгоритм включения (Servo ON)

Автомат состояний CiA 402:

<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg" id="bkmrk-krl-1"><div class="sticky opacity-0 group-hover/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><div class="relative"><div class="transition-all opacity-100 scale-100">  
</div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50">  
</div></div></div></div></div><div class="text-text-500 font-small p-3.5 pb-0">krl</div><div class="overflow-x-auto"></div></div>```krl
DEF HCFA_ServoON()
  ; Проверка текущего статуса
  INT status
  status = di_HCFA_StatusWord
  
  ; Если есть ошибка (Bit 3 = 1)
  IF (status B_AND 'H0008') == 'H0008' THEN
    ; Fault Reset
    do_HCFA_ControlWord = 128  ; Бит 7
    WAIT SEC 0.2
    do_HCFA_ControlWord = 0
    WAIT SEC 0.2
  ENDIF
  
  ; State Machine: Shutdown → Switch On → Enable Operation
  
  ; 1. Shutdown (если не в Ready to Switch On)
  IF (status B_AND 'H006F') <> 'H0021' THEN
    do_HCFA_ControlWord = 6
    WAIT FOR (di_HCFA_StatusWord B_AND 'H006F') == 'H0021'  ; Ready to Switch On
  ENDIF
  
  ; 2. Switch On
  do_HCFA_ControlWord = 7
  WAIT FOR (di_HCFA_StatusWord B_AND 'H006F') == 'H0023'  ; Switched On
  
  ; 3. Enable Operation
  do_HCFA_ControlWord = 15
  WAIT FOR (di_HCFA_StatusWord B_AND 'H006F') == 'H0027'  ; Operation Enabled
END

DEF HCFA_ServoOFF()
  do_HCFA_ControlWord = 6  ; Shutdown (отключает момент)
END
```

### 6.3. Функция движения (Move)

**Режим: Profile Position (Mode 1) — Абсолютное позиционирование**

<div class="relative group/copy bg-bg-000/50 border-0.5 border-border-400 rounded-lg" id="bkmrk-krl-2"><div class="sticky opacity-0 group-hover/copy:opacity-100 top-2 py-2 h-12 w-0 float-right"><div class="absolute right-0 h-8 px-2 items-center inline-flex z-10"><div class="relative"><div class="transition-all opacity-100 scale-100">  
</div><div class="absolute inset-0 flex items-center justify-center"><div class="transition-all opacity-0 scale-50">  
</div></div></div></div></div><div class="text-text-500 font-small p-3.5 pb-0">krl</div><div class="overflow-x-auto"></div></div>```krl
DEF HCFA_MoveToAngle(angle :REAL)
  ; Константы
  INT encoder_resolution = 131072  ; 17-bit энкодер
  REAL gear_ratio = 100.0          ; Редуктор 1:100
  
  ; Расчет импульсов
  INT target_pulses
  target_pulses = (angle / 360.0) * encoder_resolution * gear_ratio
  
  ; === SMART CHECK & AUTO RECOVERY ===
  
  INT status
  status = di_HCFA_StatusWord
  
  ; 1. Проверка на ошибку
  IF (status B_AND 'H0008') == 'H0008' THEN
    ; Fault Reset + Включение
    do_HCFA_ControlWord = 128
    WAIT SEC 0.2
    do_HCFA_ControlWord = 0
    WAIT SEC 0.2
    HCFA_ServoON()
  ENDIF
  
  ; 2. Проверка включения
  IF (status B_AND 'H006F') <> 'H0027' THEN
    HCFA_ServoON()
  ENDIF
  
  ; 3. Проверка режима (OpMode должен быть 1)
  IF di_HCFA_OpMode <> 1 THEN
    do_HCFA_OpMode = 0  ; Сброс
    WAIT SEC 0.1
    do_HCFA_OpMode = 1  ; Установка Profile Position
    WAIT SEC 0.1
  ENDIF
  
  ; 4. Сброс зависшего бита подтверждения (Bit 12)
  IF (status B_AND 'H1000') == 'H1000' THEN
    do_HCFA_ControlWord = 15  ; Сброс в базовое состояние
    WAIT SEC 0.1
  ENDIF
  
  ; === ЗАПИСЬ ПАРАМЕТРОВ ДВИЖЕНИЯ ===
  
  do_HCFA_ProfileVel = 500      ; Скорость: 500 rpm
  do_HCFA_ProfileAcc = 100      ; Ускорение: 100 ms
  do_HCFA_TargetPos = target_pulses
  
  ; === HANDSHAKE (Двухступенчатый старт) ===
  
  ; Шаг 1: Подготовка (Absolute, New Set-point)
  do_HCFA_ControlWord = 47      ; Биты: 0,1,2,3,4,5 (без Change Immediately)
  WAIT SEC 0.05
  
  ; Шаг 2: Старт (Rising Edge бита 4)
  do_HCFA_ControlWord = 63      ; Биты: 0,1,2,3,4,5,6 (с Change Immediately)
  
  ; Ждем подтверждения (Bit 12 = Set-point Acknowledge)
  WAIT FOR (di_HCFA_StatusWord B_AND 'H1000') == 'H1000' TIMEOUT 2
  
  ; Сброс бита New Set-point
  do_HCFA_ControlWord = 15
  
  ; Ждем начала движения (Bit 10 = Target Reached сбросится)
  WAIT FOR (di_HCFA_StatusWord B_AND 'H0400') == 'H0000' TIMEOUT 2
  
  ; Ждем завершения (Bit 10 = Target Reached установится)
  WAIT FOR (di_HCFA_StatusWord B_AND 'H0400') == 'H0400'
  
  ; Финиш: Отключение момента
  do_HCFA_ControlWord = 6  ; Shutdown
END
```

### 6.4. Расшифровка ControlWord

<div class="overflow-x-auto w-full px-2 mb-6" id="bkmrk-%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%91%D0%B8%D1%82%D1%8B-%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4"><table class="min-w-full border-collapse text-sm leading-[1.7] whitespace-normal"><thead class="text-left"><tr><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">Значение</th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">Биты</th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">Команда</th></tr></thead><tbody><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**6**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">0110</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">Shutdown (переход в Ready to Switch On)</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**7**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">0111</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">Switch On</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**15**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">1111</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">Enable Operation (базовое рабочее состояние)</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**47**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">0010 1111</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">Absolute + New Set-point (подготовка)</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**63**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">0011 1111</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">+ Change Immediately (старт по Rising Edge)</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**128**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">1000 0000</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">Fault Reset (сброс ошибки)</td></tr></tbody></table>

</div>### 6.5. Расшифровка StatusWord (ключевые биты)

<div class="overflow-x-auto w-full px-2 mb-6" id="bkmrk-%D0%91%D0%B8%D1%82-%D0%9C%D0%B0%D1%81%D0%BA%D0%B0-%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-3"><table class="min-w-full border-collapse text-sm leading-[1.7] whitespace-normal"><thead class="text-left"><tr><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">Бит</th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">Маска</th><th class="text-text-100 border-b-0.5 border-border-300/60 py-2 pr-4 align-top font-bold">Значение</th></tr></thead><tbody><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**3**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">0x0008</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">Fault (есть ошибка)</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**5**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">0x0020</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">Quick Stop (0 = активна блокировка)</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**10**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">0x0400</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">Target Reached</td></tr><tr><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">**12**</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">0x1000</td><td class="border-b-0.5 border-border-300/30 py-2 pr-4 align-top">Set-point Acknowledge</td></tr></tbody></table>

</div>**Состояния (биты 0-6):**

- **0x0021 (33):** Ready to Switch On
- **0x0023 (35):** Switched On
- **0x0027 (39):** Operation Enabled
- **0x0250 (592):** Switch On Disabled (блокировка)
- **0x0637 (1591):** Operation Enabled + Ready + Target Reached

---

## 7. РЕШЕНИЕ ТИПОВЫХ ПРОБЛЕМ

### 7.1. Драйвер не включается (StatusWord = 592)

**Симптомы:** Команды включения игнорируются.

**Причины:**

1. Не сняты функции концевиков (P04.01...P04.08 содержат 14 или 15)
2. Не установлен **P06.28 = 1**

**Решение:** См. раздел 2.2 (обязательные параметры).

### 7.2. Err.007 (Нет связи с энкодером)

**Причины:**

1. Неправильная распайка кабеля
2. Обрыв/КЗ в линиях Data+/Data-
3. Не подключен +5V или GND
4. Неправильный протокол (**P18.19**)

**Диагностика:**

- Замерить ток по +5V: должен быть 30-80 мА
- Проверить распайку по таблице из раздела 3.2

### 7.3. Err.013 (Помехи энкодера)

**Причины:**

1. Скрутки в линиях Data+/Data-
2. Плохое экранирование
3. Помехи от силового кабеля

**Решение:**

1. Перепаять кабель (без скруток)
2. Экран припаять к корпусу CN7 вкруговую
3. Ферритовое кольцо на силовой кабель UVW
4. Заземлить корпус мотора
5. Крайняя мера: **P06.40 = 10-39**

### 7.4. Err.043 (Position Deviation Too Large)

**Причины:**

1. Низкая жесткость регулятора (P00.03)
2. Неправильная инерция (P00.04)
3. Слишком жесткий допуск (P00.19)

**Решение:**

1. Выполнить автозамер инерции: **P20.03 = 1**
2. Увеличить жесткость: **P00.03 = 10-12**
3. На этапе пусконаладки: **P00.19 = 0**
4. При отставании: **P01.12 = 30-50** (Feedforward)

### 7.5. Err.047 (Перегрузка)

**Причины:**

1. Неправильное количество пар полюсов (**P18.11**)
2. Неправильный ток/момент мотора
3. Механическая перегрузка

**Решение:**

1. Проверить **P18.11 = 4** (для моторов 150-й серии)
2. После изменения: **P20.03 = 5**
3. Проверить параметры мотора (P18.05, P18.06, P18.08)

### 7.6. Мотор стоит на месте (нет движения)

**Причины:**

1. Отсутствуют объекты 0x6081/0x6083 в PDO
2. Неправильные единицы измерения (P09.13)
3. Скорость = 0

**Решение:**

1. Модифицировать XML (раздел 5)
2. Установить **P09.13 = H0015** (RPM/ms)
3. В коде задать **ProfileVel &gt; 0** (например, 500)

### 7.7. Зависание на WAIT FOR Bit 12

**Причины:**

1. Бит подтверждения завис с прошлого раза
2. Драйвер не в режиме позиционирования (Mode &lt;&gt; 1)

**Решение:**

1. Перед движением: сброс `OpMode = 0` → `OpMode = 1`
2. Если `Bit 12 == 1` перед стартом → сброс `ControlWord = 15`

### 7.8. Очень медленное движение (незаметное глазу)

**Причина:** **P09.13 = H1115** (единицы измерения = импульсы/сек)

**Решение:** **P09.13 = H0015** (RPM/ms)

### 7.9. Поворот на неправильный угол

**Причины:**

1. Не учтен редуктор
2. Неправильное разрешение энкодера

**Решение:**

1. Определить передаточное число экспериментально
2. В формуле расчета: `pulses = (angle / 360) * encoder_resolution * gear_ratio`

---

## ФИНАЛЬНЫЙ ЧЕКЛИСТ ПЕРЕД ЗАПУСКОМ

- [ ] Раздельное питание L1C/L2C (220В напрямую) и L1/L2 (220В через контактор)
- [ ] Кабель энкодера: пайка по таблице, экран к корпусу, без скруток
- [ ] Диагностика энкодера: ток 30-80 мА
- [ ] **P00.01 = 7** (EtherCAT)
- [ ] **P06.28 = 1** (Игнорировать концевики)
- [ ] **P04.01...P04.08**: Все значения ≠ 14 и ≠ 15
- [ ] **P09.13 = H0015** (RPM/ms)
- [ ] **P18.11 = 4** (Пары полюсов для 150-й серии)
- [ ] **P20.03 = 5** (Поиск угла) после изменения полюсов
- [ ] **P20.03 = 1** (Автозамер инерции)
- [ ] **P00.03 = 10-12** (Жесткость)
- [ ] XML модифицирован (объекты 0x6081, 0x6083 добавлены в 1st RxPdo)
- [ ] Топология EtherCAT в WorkVisual = физическое подключение
- [ ] Код KRL: включение через Shutdown → Switch On → Enable Operation
- [ ] Код KRL: движение с ProfileVel &gt; 0 и двухступенчатым стартом (47 → 63)
- [ ] Тестовое движение на малой скорости (50-100 rpm)

---

**СИСТЕМА ГОТОВА К РАБОТЕ!**

Эта инструкция основана на реальном опыте пусконаладки и содержит все критические нюансы для успешной интеграции HCFA + KUKA через EtherCAT.