Добавление энкодера в проект CODESYS SoftMotion, организация электронного штурвала (MC_GearIn)
Кодесюс, а точнее библиотеки SoftMotion как оказалось достаточно гибкие, если с приводами все достаточно хорошо понятно, то касаемо энкодера есть ряд вопросов.
В общем-то за подключение со стороны ПЛК отвечает группа импульсных входов, для MX300 от Optimus Drive это встроенные входа и доступ к ним идет из раздела Miscellaneous (Разнообразные) репозитория устройств, а вызвать визард (мастера добавления) можно нажав правую кнопку мыши (ПКМ) на нашем ПЛК в дереве устройств (Devices) слева и выбрав в контекстном меню Add Device (помните, важно именно на ПЛК кликнуть, а не в молоко). Листаем слайды, смотрим как выбирается нужное «устройство».





Щелкнув дважды левой кнопкой мыши (ЛКМ) на этом устройстве получим доступ к свойствам, зайдем на вкладку Internal I/O Mapping, в которой будут видны физические адреса для доступа к входам и выходам. Заполняя поле столбца Variable, можно задать ТЭГи (переменные), сразу привязанные к этим входам, обратиться можно как к слову, так и побитово (нажав + и раскрыв дерево).
При отображении структурных переменных редактор не позволяет одновременно указывать как переменную структуры (например, %QB0), так и отдельные элементы структуры (например, %QB0.1 и QB0.2). Поэтому, если в таблице отображения есть основная запись с поддеревом записей битовых каналов, то применяется следующее: тогда переменную можно указать либо в строке основной записи, либо в строках подэлементов (битовых каналов), но не в обеих сразу.
Нажав ПКМ на поле можно запустить мастер создания переменных Create I/O Variable по правилам: Default (имя от производителя) или by Prefix, когда у всех переменных будет общий префикс и разный индекс, удобный для обзывания. В поле столбца Maping выбирается тип действия: создать новую или мапить к существующей.
Чтобы добавить существующую переменную в канал, необходимо ввести имя нужной переменной проекта с полным путём. Нажмите ..., чтобы открыть помощник ввода. Выберите, например, переменную Application.PLC_PRG.xBool4, объявленную в PLC_PRG. Переменная вставлена. В столбце Mapping (сопоставление) теперь отображается символ другой символ. Адрес теперь перечеркнут. Это не означает, что адрес больше не доступен, поскольку значения существующих переменных обрабатываются в другой области памяти. Однако: во избежание неоднозначностей при записи значений, тем не менее, не следует занимать этот адрес другой переменной, особенно в случае выходных данных.
Для работы же на других ПЛК сценарий работы может быть иным, для HCFA например чтобы добавить модуль HCQ0-HC04-D (D2) проще просто подключить его к ПЛК (вставить следующим за сборкой слотом) и нажать Scan Devices, как будто мы ищем подключенные к ПЛК устройства, так вот он найдется у вас как будто он «сидит» на шине EtherCAT, ну собственно он и так подключен к ней, но не напрямую, а через Slave_1, который на внутренней шине (если читали предыдущую статью, как раз наверное видели это устройство, оно было пустым). Если захотите добавить устройство вручную, надо будет нажать ПКМ именно на Slave_1, чтобы добавить модуль (собственно все модули расширения HCFA будут там).


Настройки для доступа к адресам и сопоставление переменным полностью аналогичны, как и в ПЛК MX300 от Optimus Drive. Там же лежит доступ и к настройкам модулей, но нужно будет поставить галочку напротив
Enable Expert Settings во вкладке General.
Далее можете почитать официальный хелп по этой теме https://content.helpme-codesys.com/en/CODESYS%20SoftMotion/_sm_drive_controller_free_encoder.html, а можете делать как написано у нас:
Теперь самое интересное, ну получили мы доступ к счетчику, а толку, а как нам сделать какую-то связку например для летучих ножниц, когда одна ось должна синхронизироваться с другой? Нужно сделать энкодерную ось (вот эта гибкость). Создать ее не трудно, нужно найти пункт SoftMotion General Axis Pool в дереве проекта (это не бассейн;) как многие подумали ), нажать ПКМ и выбрать Add Device, далее выбрать SMC_FreeEncoder в разделе Free Encoders. Далее у вас в проекте появится ось (название вы придумываете сами или переделываете с помощью Refactoring, которое вызывается ПКМ).



Это не какое-то отдельное устройство, к которому подключается энкодер или устройство, которой обслуживает быстрые входа ПЛК, это некая абстракция, работающая по определенным правилам, для работы с ней нужен функциональный блок, в котором на каждом цикле работы шины EtherCAT (либо на каждом цикле работы ПЛК, если того требует инструкция модуля или ПЛК) в определенную переменную писались значения со счетчика (то есть либо пишем это в POU который уже привязан, либо привязываем его к циклу EtherCAT).


В обоих случаях мы видим, как значение, считанное со счетчика пишется в поле diEncoderPosition настройки Оси, вот так все просто, мы сами обслуживаем эту ось. Но зато получив ось мы получаем доступ к полям «ускорение», и «скорость», а самое главное мы можем указать нашу ось как мастер для функциональных блоков MC_GearIn.
Указав свои значения электронного редуктора добьемся нужного соотношения скоростей (для стабилизации положения есть инструкция MC_GearInPos, но работа с ней сложнее, а наша MC_GearIn настолько точно поддерживает скорость, что положение часто отличается от мастер-оси не более чем на 1%, по данным из Интернета у людей было соотношение 1:1,0002).
Если нужно поменять фазу (сдвиг между засинхронизированными осями) используем инструкцию MC_Phasing, но есть ньюанс, когда она включается, отключается инструкция синхронизации MC_GearIn/MC_GearInPos и нужно будет снова по сигналу готовности от MC_Phasing включить синхронизацию.
Кстати по поводу инструкции MC_GearInPos, самая главная загвоздка случается по поводу указания данных для полей MasterSyncPosition, SlaveSyncPosition и MasterStartDistance. При возникновении единицы на входе Execute, блок начинает считать рассогласование между положениями ведущей и ведомой осей. Как только рассогласование становится меньше указанного в MasterStartDistance, ведомая ось начинает двигаться по определённому закону зависимости от положения ведущей, чтобы безударно выбрать рассогласование. Когда рассогласование выбрано полностью, положение ведомой оси полностью синхронизируется с положением ведущей. Судя по картинке ниже нужно для начала определиться с направлением движения оси, если движение вперед, то нужно добавить к текущей координате/положению оси какое-то небольшое значение (если конечно стоит задача сцепиться по координате как есть), либо рассчитать положение слейва, которое он должен нагнать за время синхронизации и записать в координату SlaveSyncPosition, для кареточных летучих ножниц это обычно строится и рассчитывается по принципу разгона каретки при штатном ускорении, какую координату займет мастер и какая будет у слейва можно прикинуть, получив время разгона t=V/a, где а-ускорение, а V-скорость движения материала, который будут резать ножницы.
В случае движения назад, наоборот для синхронизации по положению из текущих координат вычитают какое-то значение.
IF Enc_Axis2.fActVelocity > 0 THEN
wMasterSyncPos := Enc_Axis2.fActPosition + 0.0007;
wSlaveSyncPos := Axis1.fActPosition + 0.0007;
ELSIF Enc_Axis2.fActVelocity > 0 THEN
wMasterSyncPos := Enc_Axis2.fActPosition - 0.0007;
wSlaveSyncPos := Axis1.fActPosition - 0.0007;
ELSE
wMasterSyncPos := Enc_Axis2.fActPosition;
wSlaveSyncPos := Axis1.fActPosition;
END_IF
Проблема правда существует, если скорость равна нулю, тогда нужно логически понять куда поедет привод, тк введение значений текущих координат осей в MasterSyncPosition и SlaveSyncPosition не приведет к синхронизации в текущий момент, а синхронизация произойдет, когда привод мастера «проедет круг» по координате и снова окажется в точке с указанной координатой.
Для того, чтобы ведомая ось начинала движение сразу после подачи сигнала Execute, надо указать в MasterStartDistance нулевое или отрицательное значение.
