Свой плагин для WLMill.

Количество задач, которые иногда нужно решать достаточно большое и порой использование скриптов не всегда хватает для этого. Чтобы можно было добавлять свои инструменты в функционал WLMill был создан инструмент – создание плагинов.

Как создать свой плагин?

  • Установить среду разработки QtCreator 5.12.5 (для windows).
  • Создать проект в котором произвести отладку функционала.
  • Создать плагин, который будет интерфейсом между WLMill и вашим проектом.
  • Положить файл dll в папку plugins.

1 . Скачиваем QtCreator и устанавливаем его. Внимание сейчас недоступен исходный код WLMill!!!

2. Данный шаг пропустим. Сделаем простой плагин с базовым функционалом.

3. Создаём проект плагина в QCreator.

Выбираем: Файл>>Создать файл или проект

Далее выбираем имя проекта и папку где он будет. Сделаем проект myPlugin.

Проект открыт.

Теперь удаляем файл _global.h. С помощью правой кнопкой мыши нажав на файл, выбрать пункт удалить.

Переносим файлы WLPlugins.pri, wlscriptplugin.h, wlscriptplugin.cpp в папку с проектом.

Подключаем их к нашему проекту.

Добавляем строки в наш класс MyPlugin.

Определяем интерфейс плагина и переопределив функцию getNameObjectMScript. – задав имя в скрипте.

Добавим переменную m_count и два метода взятия и установки значения.

Префикс Q_INVOKABLE – делает доступным эти функции в MScript и LScript.

#include "wlscriptplugin.h"

class  MyPlugin: public WLScriptPlugin
{
    Q_OBJECT
    Q_INTERFACES(WLScriptPlugin)
    Q_PLUGIN_METADATA(IID WLScriptPlugin_iid)// FILE "interface.json")

private:
    int m_count = 0;

public:
    MyPlugin();

    // WLScriptPlugin interface
public:
    QString getNameObjectMScript();

    Q_INVOKABLE int getCount() const;
    Q_INVOKABLE void setCount(int count);
    Q_INVOKABLE void printConsoleLScript(QString txt);
};

#endif // MYPLUGIN_H

4 Компилируем и переносим файл myPlugin.dll в папку plugins.

После запуска проверяем. Доступен ли нам объект в MScript. Набираем MY и нажимаем Ctrl+Пробел.

Объект доступен !!!

Проект целиком.

Прочие плагины.

Плагин COM порта для WLMill (WLSerialPortPlugin)

Что такое плагин?

Плаги́н[1][2] (англ. plug-in, от plug in «подключать») — независимо компилируемый программный модуль, динамически подключаемый к основной программе и предназначенный для расширения и/или использования её возможностей. Плагины обычно выполняются в виде библиотек общего пользования.

Уже давно была добавлена возможность написания своих плагинов для WLMill. Сейчас был создан пример плагина для работы с серийным портом. Давайте разберёмся что с ними делать.

Например у нас есть задача принимать данные с COM порта и производить управление станком удалённо, например позиционировать что либо.

Как организовать работу плагина:

  1. Создаём папку plugins рядом с программой WLMill (если её нет).
  2. Копируем туда файл WLSerialPortPlugin.dll
  3. Запускаем WLMill. У нас должен появится новый объект SERIALPORT в скриптах LSCRIPT и MSCRIPT. С помощью него мы будем работать с портом.
  4. Организуем работу с портом. При нажатии на кнопку вкл/выключения мы будем открывать и закрывать порт. Для этого добавим строки в MScript, в функции функции ON() и OFF(). Открываем редактор скрипта.

Находим эти функции (если они переопределены) или вставляем их в удобное место.

Для этого за пределами других функций (например в самом верху нажимаем Ctrl+Пробел и выбираем “wek ON()”.

function ON()
{
 SCRIPT.console("ON()")
 SCRIPT.console("OPEN COM "+ SERIALPORT.open("COM182"));
}

function OFF()
{
 SCRIPT.clearInterval()
 SCRIPT.clearTimeout()

 SERIALPORT.close();
}

Если всё верно, то SERIALPORT – должен быть зелёного цвета.

По умолчанию скорость передачи 9600бит/с. Её можно переопределить с помощью SERIALPORT.setBaudRate(4800) – установили скорость 4800бит/с

В функции ON мы открывaем порт COM182 и выводим сообщение в консоль MSCRIPT.

Номер ком порта можно найти в диспетчере устройств.

При выключении мы закроем порт.

  • Теперь нужно организовать приём сообщений от ком порта. При приёме сообщений вызывается функция readDataSerialPort() скрипa LScript (фоновый скрипт). Определим её
function readDataSerialPort()
{
 var data = SERIALPORT.readAll()
 SCRIPT.console(data)

//MACHINE.runGCode(data) //если раскомментировать, то выполнится полученная строка как G код

}

В данной функции мы читаем все данные и просто выводим их в консоль LScript.

Внимание!!! Если мы уберём // то у нас будет выполняться строка которую мы приняли.

  • Для отправки сообщений используется функция

SERIALPORT.sendStr(“X45 Y123.5”)

PS. Также можно будет написать свои плагины. Как это делать? скоро…

Обновление WLMill 2.93

Добавлена поддержка переменных в G коде

Инициализация из G кода

#100  = 50 // создали переменную 100 и присвоили ей значение 50

#ZFREE  = -25 // создали переменную ZFREE и присвоили ей значение -25

Внимание!!! Определение переменной в G коде доступно только с новой строки

из Скрипта

GCODE.setValueGrid(“100”,50) // создали переменную 100 и присвоили ей значение 50

GCODE.setValueGrid(“ZFREE”,-25) // создали переменную ZFREE и присвоили ей значение -25

Пример использования в G коде

#ZFREE = -25

G0 Z#ZFREE // переедет в положение Z=-25

Также можно применять формулы при определении переменной

#A = 10   //переменной A присвоено значение 10

#B = [#A] //переменной B присвоено значение A

#C = [#A+#B] //переменной C присвоено значение A+B = 20

G0 Z[#C+(#A*2+(#B+#A))*.5] //Z переедет в положение 50

Добавлена поддержка математических функций в G коде.

PI() – возвращает число ПИ (3,14….)

ABS(var) – возвращает положительное значение  

COS(var) – возвращает косинус числа (var в градусах)

ACOS(var) – возвращает арккосинус числа в градусах

SIN(var) – возвращает синус числа (var в градусах)

ASIN(var) – возвращает арксинус числа в градусах

TAN(var) – возвращает тангенс числа (var в градусах)

TAN2(var y,var x) – возвращает угол в градусах

ATAN(var) – возвращает арктангенс в градусах

CEIL(var) – округляет в большую сторону

FLOOR(var) – округляет в меньшую сторону

ROUND(var) – округляет число

SQRT(var) – квадратный корень числа

POW(var1 ,var2) – возведение var1 в степень var2

MIN(var1,var2) – минимальное значение

MAX(var1,var2) – максимальное значение

Например

#CENTERX = [#RAD*COS(#ANG)+#OFFFSETX]

Добавлена подсветка парных скобок которые возле курсора.

Обновлена документация WLMill

добавлено описание подпрограмм

добавлено описание переменных G кода

добавлен перечень M кодов, которые определены по умолчанию и как их изменить

добавлено описание использование радиальной системы координат G15/G16

Обновился WLMill 2.91

2.91 Поддержка G64 при многоосевой обработке

Была добавлен поддержка G64 для многоосевой обработки. Также как и в 3х координатах происходит сглаживание и упрощение траектории. И был добавлен ещё один параметр “A” для G64.

A – это максимальное отклонение фрезы (в градусах) от заданного направления (это не ось А!!!).

То есть теперь мы можем задавать G64 так

G64 P0.1 Q0.1 A0.1

  • P – Сглаживание траектории в XYZ детали
  • Q – Максимальное отклонение от траектории в XYZ детали
  • A – Максимальное отклонение направления фрезы в градусах.

Результат:

При простой 3х осевой обработке используется тип элементов ULine (кривая), которые поддерживаются контроллером. Но при многоосевой обработке их сейчас необходимо разбивать на несколько прямых элементов. Количество прямых мы указываем в настройке.

Также был доработан алгоритм применения сглаживания/упрощения.

Добавили функции в скрипты

  • WLMILL.getVersionStr() – возвращает строку версии программы
  • MACHINE.getVersionDeviceStr() – – возвращает строку версии устройства

2.90 Добавлен ключ на тип линейной активации G41/42.

При его установке линия активации будет увеличена (путь) или уменьшена в зависимости от G41/42.


2.89 Добавлено использование двойного касания визуализации (сенсорный экран). Для уменьшения и увеличения масштаба.
2.88 Добавлено автозагрузка карты высот, а также параметров её отображения и использования. Добавлена поддержка нового планировщика для контроллеров WLMiotion v2.4
2.87 В таблицы инструментов добавлена возможность добавлять и удалять инструмент или СК

прочие исправления…

Обновился WLBend 2.19

Было произведено много изменений в результате чего можно улучшить производительность станка.

Использование сигнала inCutted в рубке

Было добавлено использование сигнала inCutted при работе рубки. Это сигнал означает, что произошёл отруб проволоки и станок может производить подготовку для изготовления следующего изделия.

Например при рубке с использованием поршня, этот сигнал будет установлен когда поршень будет выдвинут и по сути произошёл отруб проволоки. То есть нам не нужно ждать когда поршень вернётся назад для начала вращения Z или Y. Но подача проволоки будет заблокирована до полного выполнения рубки.

При использовании скрипта для управления рубки, можно самостоятельно установит его в нужный момент с помощью функции setCutted().(ниже пример в коде)

Для использования этого сигнала нужно установить “галочку”

Использование предварительной подготовки рубки

Когда рубка происходит с помощью гибочного узла (оси Y), то можно производить подготовку к рубке в момент протяжки проволоки на нужную длину. В результате чего мы можем распараллелить процесс и сократить время изготовления.

Для использование данной функции нужно установить “галочку”.

После установки галочки произойдёт добавление кнопки в ручном управлении для ручного вызова этой функции (красная стрелка на рис ниже).

Синяя стрелка указывает на состояние сигнала inCutted.

Данная функция в основном используется при реализации рубки скриптом. Для выяснения какой процесс происходит (рубка или подготовка) добавлена функция getTaskTypeStr(). Которая возвращает

getTaskTypeStr()==”preCutTask” – если идёт подготовка к рубке

getTaskTypeStr()==”cutTask” – если производится отруб

Тогда функция рубки “С” в LScript будет иметь примерный вид :

function updateCUTC()
{
	if(!CUTC.isMotion()) return 

	SCRIPT.console("updateCUTC()"+CUTC.getIOper()+CUTC.getTaskTypeStr())

	if(CUTC.getTaskTypeStr()=="preCutTask")
 //предварительная подготовка
	{
		switch(CUTC.getIOper()) //какая операция выполняется 0 - при старте
		{
			case 0: //опускаем PINP при необходимости
			if(!PINP.isMotion()) 
			{
				CUTC.setIOper(1);  
				PINP.setMovDown();

				if(PINP.startTask()==1)
				break;   
			}
			else{
				break;
			}

			case 1: //производим движение в точку откуда будет происходить рабочее движение отруба
			if(!DRIVEY.isMotion()
			&&PINP.isDown()
			&&!DRIVEY.isActiv())
			{
				DRIVEY.setNamePad("fast");
				DRIVEY.setKSpeed(1.0);

				DRIVEY.runMovAbs(-90,0,0);
				CUTC.setIOper(3)
			}
			break;		

			case 3: //завершили движение и значит завершили подготовку
			if(!DRIVEY.isMotion()			
			&&!DRIVEY.isActiv())
			{
				SCRIPT.console("updateCUTC(preCutTask) complete")        
				CUTC.setFinished()
			}
			break;
		}
	}
	else  if(CUTC.getTaskTypeStr()=="cutTask")
	{
		switch(CUTC.getIOper())
		{
			case 0: //опускаем PINP при необходимости
			if(!PINP.isMotion())
			{
				CUTC.setIOper(1);  
				PINP.setMovDown();

				if(PINP.startTask()==1)
				break;   
			}
			else{
				break;
			}

			case 1: //производим движение в точку откуда будет происходить рабочее движение отруба
			if(!DRIVEY.isMotion()
			&&PINP.isDown()
			&&!DRIVEY.isActiv())
			{
				DRIVEY.setNamePad("fast");
				DRIVEY.setKSpeed(1.0);

				DRIVEY.runMovAbs(-90,0,0);
				CUTC.setIOper(10)
			}
			break;

			case 10: //производим рабочий ход рубки
			if(!DRIVEY.isMotion()
			&&!DRIVEY.isActiv()
			&&PINP.isDown())
			{
				DRIVEY.setMainPad();
				DRIVEY.setKSpeed(1.0);

				DRIVEY.runMovAbs(-155,720,0);
				CUTC.setIOper(2)
			}
			break;

			case 2: //возвращаемся в начальное положение
			if(!DRIVEY.isMotion()
			&&!DRIVEY.isActiv())
			{			
				CUTC.setCutted() //установили флаг что отрубили
				
				DRIVEY.setNamePad("fast");

				DRIVEY.runMovAbs(-90,0,0);
				CUTC.setIOper(3)
			}
			break;

			case 3: //завершили движение и значит завершили подготовку
			if(!DRIVEY.isMotion()			
			&&!DRIVEY.isActiv())
			{
				SCRIPT.console("updateCUTC(cutTAsk) complete")        
				CUTC.setFinished()
			}
			break;
		}
	}
}

Правка счётчиков и инструмента не из меню

Для правки нажимаем на нужный счётчик или колонку инструмента

3 корректора радиусного элемента

Был добавлен один корректор радиусного элемента – корректор радиуса.

Радиус (красная стрелка) – правка радиуса элемента

Угол (фиолетовая стрелка) – правка угла происходит за счёт увеличения подачи радиусного элемента (с сохранением фактического радиуса)

Спираль (жёлтая стрелка) – правка спиральности (вращения вокруг проволоки)

Для инструментов оставлена одна таблица соответствия угла поворота Y – углу загиба

При радиусных элементах используется эта таблица. Также можно явно задавать положение гибки (для любого типа элемента). – Это доступно и в прежних версиях.

Например

“bp 10” – bend position 10

На bp влияет корректор радиуса у радиусного элемента

Обновился WLBend 2.16

  1. Добавлен флаг инструмента отмены поворота при обратной протяжки проволоки перед отрубкой.
  2. Добавлен новый тип инструмента doublePin – когда 2 пина расположены на одной гибочной голове.
  3. Сделана центровка изображения с учётом модели станка. При моделировании гибки.
  4. Прочие исправления и улучшения.

Обновился WLMill – 2.81

Добавилась кнопка с помощью которой можно быстро задавать тип ручных перемещений (по шагам или непрерывно, с трекингом и без).

con – (Continue) непрерывное движение. Пока нажата клавиша.

Теперь мы можем задать какие размерности шагов мы будем применять при движении по шагам.

Они задаются через запятую. Например как на рисунке выше.

Причём мы можем задать размерности движения отдельно для линейного типа оси и поворотного типа. Для этого нужно ввести два числа разделённых “/”.

Если вторая величина не зада, то используется одна для обеих типов осей.

Работа с джостиком

Если на одном ПК запустить несколько WLMill, то раньше они все перехватывали сигнал изменения от джостика скриптом одновременно. В результате этого оба станка перемещались одновременно. Сейчас добавилась возможность блокировки этого с помощью функции скрипта Lock и Enable.

Также добавилась возможность автоблокировки джостика, если окно программы стало не активным.

+ прочие исправления

Не забывайте делать архив настроек перед обновлением!!!

Обновился WLJoystick.js

Добавилась настройка трекинга при движении в ручном режиме. Мы можем включить его установив параметр WLJoystickAxisTrack в 1.

Трекинг – это непрерывное движение оси при смене направления. ТО есть не нужно ждать когда ось завершит движение в одну сторону, чтобы начать в другую.

Скрипты доступны отдельно: https://wldev.ru/data/soft/wlmill/script/script/include/

Как например сделать несколько осей Z. WLMill

У нас есть станок с ЧПУ у которого две координаты X ,Y. И две оси Z, которые могут перемещаться независимо друг от друга и имеют разные датчики поиска положения, приводы и.т.д.. .

Например два шпинделя с разными инструментами и характеристиками. Или плазма и газовый резак.

Тогда мы берём и определяем наши оси как X,Y,Z1,Z2.

Но в программе(G коде) у нас только одна Z. Для этого мы можем установить какую именно Z1 или Z2 использовать для работе в G коде. Это можно сделать в ручную:

Тогда теперь у нас Z1=Z. И если нажать на Z то высветится её имя (Z1).

Если мы хотим “подвигать” или посмотреть состояние всех осей, а не только G(XYZABC). То нужно установить галочку:

Переключение с одной Z на другую можно сделать и в скриптах. При этом не должно происходит перемещения!!! Это можно проверить возможностью ручных перемещений. Если они возможны, то меняем G имя.

MACHINE.isPossiblyManual() // 1 возможны, 0 нет
DRIVEZ1.setGName("")  //сбросили G имя оси Z1
DRIVEZ2.setGName("Z") //установили G имя оси Z2 на Z
MACHINE.initGDrives() //применили изменения. данная функция вызывается при включении станка автоматически.

Для удобства работы с G приводами были добавлены функции которые перед словом Drive имеют G (GDrive). То есть какое имя использовать…

MACHINE.goGDriveManual - будет использовать G имя 
MACHINE.goDriveManual - будет использовать имя привода (Z1/Z2 в нашем примере например)

P.S. Данная функция (изменения G имени) ещё не была проверена при работе в программе

Контроллер ЧПУ WLM155S (v9) – обновлен

Обновился контроллер WLM155S. Основные изменения описаны ниже.

Увеличен размер платы контроллера до 125х150 (с 100х100). Увеличено количество стоек для крепления контроллера до 6.

Разделено питание контроллера, входов, выходов и интерфейсов (CAN RS485).

Для питания контроллера используется DC-DC преобразователь с гальванической изоляцией и широким диапазоном входного напряжения. Данный преобразователь имеет защиты от перегрузки и перегрева.

Контроллер ЧПУ 6 осей

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

Гальваническая изоляция интерфейса RS485 и CAN. Также были добавлены защитные элементы для этих интерфейсов.

Гальваническая изоляция CAN RS485

Гальваническая изоляция выходов 1-8. Также были добавлены два преобразователя ШИМ – напряжения с гальванической изоляцией.

Увеличено количество ШИМ (PWM) выходов до 5.

Сделаны доработки входов для увеличения помехоустойчивости. Увеличены мощности резисторов ограничения тока, установлены шунтирующие резисторы и конденсаторы для фильтрации. Всё это позволило убрать ложные срабатывания в условиях помех.

Добавлена индикация выходов 1-8.

Добавлены входа 24В в общую линейку. А также выведены дополнительные входы которые дублируют входы МPG и аналоговые (работают в дискретном режиме). Данное решение позволяет использовать ещё шесть входов контроллера если не подключен MPG или не используются аналоговые входа (вход).

Использование дифференциальных сигналов Step – Dir. И защитных элементов (супрессоров).

Дифференциальные выходы контроллера ЧПУ WLM155S

Обновлена документация. https://wldev.ru/data/doc/WLM155S.pdf

Купить

Для предыдущих версий документация в архиве (папка arhive)

Для организации поддержки различных версий контроллера одной прошивкой ранее применялись настроечные (2шт с обратной стороны платы) резисторы-перемычки, комбинация которых определяла версию контроллера. Теперь версию контроллера определяется версией прошивки B0.

Для версии 9 она будет иметь версию WLM155S_B0(v9.1.1).wlfw

Для более ранних версий контроллера обновлять прошивку B1 ненужно, они также будут использовать резисторы-перемычки.