Блог

PLCopen SoftMotion: ось в ошибке после Home, в симуляторе всё ок

Ось прошла MC_Home в CODESYS SoftMotion, в Online статус «Homed», оператор даёт Move - ось в Fault, привод мигает ошибкой, MC_ReadStatus показывает ErrorStop. В симуляторе SoftMotion тот же проект: Home, несколько циклов позиционирования, ноль проблем. На объекте с реальным сервоприводом по EtherCAT или CANopen - стабильный сценарий «после Home всё ломается». Частая причина не в программе Move, а в конфигурации оси: неверный тип энкодера, лимиты после референса, MC_Power без Enable, или симулятор не эмулирует ответ привода на MC_SetPosition.

Статья разбирает MC_Home и MC_Power, лимиты, энкодер, состояние оси по PLCopen, отличие симулятора SoftMotion от реального привода и типовые ошибки конфигурации. Не заменяет вводную по PLCopen Motion / SoftMotion в CODESYS - там база осей и библиотек. Фокус на расхождении симулятор vs объект после процедуры Home.

Короткий ответ

Если ось в Fault после Home на объекте, а в симуляторе нет - проверьте: MC_Power (Enable, биты готовности привода); тип и масштаб энкодера в конфигурации оси vs факт датчика; положение лимитов после референса (Home offset, software limits); состояние MC_ReadStatus / MC_ReadAxisError (код ошибки привода); не выполнен ли MC_SetPosition в симуляторе «молча», а на приводе отклонён. Симулятор не моделирует крутящий момент, STO, following error привода, расхождение импульсов энкодера. Сравните Online: ActualPosition после Home с ожидаемым нулём, Difference pulse counter, DriveReady из телеграммы.

Цепочка MC_Power и MC_Home

Перед Home ось должна быть в состоянии, позволяющем референс. Типовая последовательность:

MC_Power с Enable=TRUE, дождаться Status «PowerOn» и «IsHomed» FALSE до Home. MC_Home с параметрами режима (по маркеру, по индексу, текущая позиция). После успешного Home - «IsHomed» TRUE, ActualPosition часто 0 или offset из конфигурации.

Если MC_Power сброшен между Home и Move - ось в SwitchOnDisabled или ErrorStop. Оператор видит «мы домировали», но Enable уже FALSE.

На реальном приводе MC_Power зависит от STO, разрешения с реле, готовности DC bus. Симулятор поднимает биты готовности автоматически.

Проверка на объекте: в Online биты MC_Power.Status, EnableValid, Error. При Error после Home - MC_ReadAxisError и журнал привода.

MC_Home: режимы и что ломается на объекте

Режимы Home по PLCopen (зависит от привода и настройки): движение к маркеру, к индексу Z, установка текущей позиции как нуля без движения (только если привод поддерживает и разрешено).

«Установить текущую позицию нуля» в симуляторе работает всегда. На приводе - только при определённом состоянии и часто только в Servo Off - иначе Fault 0x8xxx.

Неверный Home offset в конфигурации оси: после референса программная позиция 0, а физически вал в упор в лимит - следующий Move в «плюс» упирается в software limit и Fault.

Скорость и ускорение Home выше, чем позволяет механика - following error на реальном приводе, в симуляторе нет контроля.

Направление Home против физического упора - привод в torque limit, таймаут Home, ErrorStop.

Сверьте параметр Home в конфигурации оси CODESYS (Device → SoftMotion axis) с мануалом привода: не подставлять значения из примера проекта другого механизма.

Лимиты: software и hardware после референса

После Home ActualPosition = 0 (или offset). Software limits Min/Max заданы в конфигурации оси. Если Min = 0 и вал стоит в нуле, Move с отрицательным target - мгновенный limit fault.

Hardware limits (концевики) подключены NC/NO - при рассинхроне «ноль программы» и физики концевик уже активен - ось не выходит из ErrorStop.

В симуляторе концевики часто не подключены или всегда FALSE.

Диагностика: MC_ReadDigitalInputs или биты лимитов в Online; ручной медленный jog после Home в безопасном направлении.

После замены энкодера или редуктора пересчитать импульсы на оборот и лимиты в мм - старые лимиты в программе при новом масштабе дают ложный limit.

Энкодер: тип, масштаб, направление

Расхождение «симулятор ок / объект fault» часто в Encoder configuration: incremental vs absolute, single-turn vs multi-turn, pulses per revolution, направление (invert).

На объекте: после Home ActualPosition скачет или дрейфует - неверный масштаб или пропущен Z index.

EtherCAT/CANopen: масштаб иногда задаётся в приводе и в CODESYS - двойная настройка с разными значениями. Симулятор использует только конфиг CODESYS.

Проверка: ручной оборот вала, шаг ActualPosition vs ожидаемый периметр. MC_ReadParameter на object-specific параметры энкодера.

Абсолютный энкодер без корректной процедуры при первом пуске - Home каждый раз разный, после «успешного» Home позиция вне лимитов.

Состояние оси: MC_ReadStatus и переходы

PLCopen state machine: Disabled → StandStill → Homed (логически) → Moving → ErrorStop. MC_ReadStatus возвращает биты: Error, Disabled, Standstill, Homed, ContinuousMotion, и др.

После Home ожидаем Standstill + Homed, Error=FALSE. Если Error=TRUE - Move блокируется.

Типовой сценарий: Home завершился с внутренним warning, бит Homed TRUE, но Error тоже TRUE - программа не проверяет Error перед Move.

В Online смотреть AxisGroupStatus и отдельно MC_ReadAxisError.AxisErrorID - код для мануала привода.

Симулятор не выставляет часть кодов ошибок привода (overload, encoder wire break).

Симулятор SoftMotion vs реальный привод

Симулятор SoftMotion в CODESYS моделирует кинематику оси по конфигурации: идеальный энкодер, мгновенный отклик, лимиты только software из проекта.

Не моделирует: задержки цикла EtherCAT, lost frames, реальный following error, STO с реле, механический упор, дребезг концевика, неверный Unit в приводе, необходимость MC_Reset на приводе после fault.

Практика пуска: логику MC (Home, Move, Reset) отладить в симуляторе; конфигурацию оси и привода валидировать на стенде с реальным мотором до FAT.

При первом старте CODESYS 3.5 проверьте версию SoftMotion library и Device Description - несовпадение с рантаймом на ПЛК даёт странные статусы только на железе.

Сравнение с ENUM и симулятором ПЛК - общий принцип: симулятор не заменяет полевую проверку.

MC_Reset и цикл после Fault

После Fault нужны MC_Reset (и иногда Reset на приводе) перед новым MC_Power и Home. Оператор жмёт «Старт» без Reset - ось остаётся в ErrorStop, «после Home» в интерфейсе - устаревший индикатор HMI.

Программа: после MC_Home проверить NOT Error, затем разрешить HMI-кнопку Move. Индикатор Homed на экране связать с MC_ReadStatus.Homed AND NOT Error.

Таймаут Home: при истечении без сброса - ось в неопределённом состоянии, частично Homed.

EtherCAT / CANopen: связь и PDO

На объекте ось fault «после Home» из-за потери связи в следующем цикле - не из-за Home как такового. PDO Statusword привода показывает fault bit (например bit 3 fault).

Проверка: EtherCAT slave state OP, WC complete; осциллограф цикла; нет ли DC sync fault.

Unit mode привода не в Cyclic Position - MC_MoveAbsolute не выполняется, симулятор не проверяет mode.

После Home привод в режиме с ограничением скорости из HMI - параметр скорости 0 - таймаут движения, ErrorStop.

Статус оси / Fault и проверка на объекте

Статус / Fault Вероятная причина Проверка на объекте
ErrorStop после Home, Homed=TRUE Home с warning, Error не сброшен MC_ReadAxisError; MC_Reset; условие Move
Fault при первом Move после Home Software limit, target вне Min/Max ActualPosition, limits, target в Online
Fault на Home, в симуляторе OK Режим Home не поддержан приводом Мануал привода, смена Home mode
Following error на Home Скорость/ускорение Home, механика Снизить Home velocity; момент
Encoder fault 0x23xx Обрыв/тип энкодера Проводка, тип в конфиге vs привод
STO / not ready после Home MC_Power FALSE, реле безопасности STO цепь, MC_Power.Enable
Концевик active в Standstill Нулёвка не совпадает с механикой Jog, концевики, offset Home
Работало до перезагрузки ПЛК Абсолютный энкодер без сохранения Процедура первого пуска, battery
Fault только на быстром цикле EtherCAT jitter, lost PDO Cycle time, sync, кабель
Homed OK, позиция дрейфует Масштаб импульсов неверный Оборот вала vs ActualPosition
MC_SetPosition в программе На приводе запрещён в Servo On Убрать или выполнять в правильном state

Конфигурация оси в CODESYS: чек до выезда

Экспорт axis configuration из рабочего стенда и сравнение с объектом: scaling, modulos, encoder type, limits, home mode, jerk.

Версия библиотеки SM3_Basic / PLCopen MC совпадает с установленной на ПЛК объекта.

Device tree: правильный slave, axis linked to правильному drive channel.

Тестовая программа на объекте без HMI: Power → Home → Move 10 mm → Move back - минимальный сценарий.

Логирование ActualPosition, Status, ErrorID каждый цикл в файл на первые 30 минут пуска - разбор post-factum.

HMI и операторский сценарий

Кнопка Home на экране без interlock: Home во время Move - fault. Разрешение Home только в Standstill.

Индикатор «Готов» без бита Homed - оператор запускает цикл, программа обращается к позиции, накопленный fault.

Связь с иерархией экранов и аварий HMI - fault оси должен быть в активных авариях с текстом из MC_ReadAxisError.

Пошаговый разбор на объекте без симулятора

Когда симулятор уже «зелёный», а объект падает после Home, не меняйте программу Move первым шагом. Зафиксируйте снимок Online в момент fault: ActualPosition, TargetPosition, MC_ReadStatus (все биты), MC_ReadAxisError.AxisErrorID, MC_Power.Status, биты лимитов и STO.

Шаг 1: MC_Reset, MC_Power Enable, дождаться Standstill без Error. Шаг 2: один MC_Home с логированием. При Done - снова снимок. Если Error появился на Home - читать код привода, не запускать Move.

Шаг 3: если Home чистый, MC_MoveAbsolute на малую величину (1-5 мм или 100 импульсов) в безопасном направлении от концевика. Fault на шаге 3 - лимиты, масштаб, following error, mode привода.

Шаг 4: сравнить конфиг оси на ПЛК с PDF мануала привода: pulses/rev, gear ratio, home mode. Расхождение в одном поле часто объясняет «симулятор ок».

Запишите baseline после успешного цикла на стенде: ErrorID=0, Actual после Home, время цикла EtherCAT. На объекте сравнение с baseline быстрее, чем перебор всех MC-блоков.

Кейс: линейная ось, Home OK, Fault на отъёме 200 мм

Типовой упаковочный объект: линейная ось, референс по концевику, software limit Max = 1500 мм. В симуляторе Max не мешает. На объекте после Home ноль программы совпадает с физическим упором «минус», Move +200 мм проходит, Move к координате 1600 мм - Fault limit.

Причина: Home offset в конфигурации оси сдвинул ноль на 100 мм в сторону плюса, лимит Max не пересчитали. Симулятор использовал старый offset из примера. Исправление: пересчёт Min/Max в engineering units, проверка одного полного хода вручную, обновление констант в HMI для максимальной позиции.

Урок: после любой правки Home offset пересчитывать software limits и максимальные координаты в рецепте, не только в axis config.

Типовые ошибки конфигурации

Копировать axis config из другого механизма.
Длина шага, редуктор, тип Home - другие. Симулятор не знает механику.

Не проверять Error после MC_Home.Done.
Done TRUE не гарантирует отсутствие Error на всех приводах.

Лимиты в мм, масштаб в импульсах устарел.
После замены ремня или шкива без пересчёта.

Отладка только в Simulation.
FAT с реальным приводом - обязательный этап для SoftMotion.

MC_Reset не в программе оператора.
После fault только перезагрузка ПЛК - долгий downtime.

Вопросы с объекта

Home в симуляторе обязателен перед выездом?
Для логики MC - да. Для конфигурации привода - нет, нужен стенд.

Ось Homed, но Move не стартует.
Проверьте Error, MC_Power, разрешение с ПЛК в привод, mode привода.

После MC_Reset снова Fault на Home.
Причина не сброшена - код ошибки привода, механика, лимит.

Несколько осей, fault только на одной.
Сравнить конфиг исправной и проблемной оси в Device tree.

Обновили CODESYS - fault после Home.
Версия SoftMotion, конвертация проекта, retain осей.

Ссылки по теме

Обсуждение