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

Добавлена кнопка закрытия программы в полноэкранном режиме.

В таблице инструментов(систем координат) добавлены кнопки для переключения отображаемых параметров.

В таблицах стала обязательной колонка GCode. — как инструмент или СК доступны из G кода.

В таблице инструментов появилось обязательная колонка Name (имя инструмента).

С помощью подсветки (красный фон) происходит подсказка:

Name — текущий инструмент (Фреза1)

GCode — значение G кода. (T0)

Также в колонке GCode происходит выделение ( <T?>) инструмента или СК которые будут использоваться в загруженной программе.

<T5>,<T7> — Будут использоваться в программе.

В таблице инструментов добавлен параметр timeWear — износ инструмента в секундах .

Считается время когда включен шпиндель и происходит движение по G коду.

Добавилась раскраска рельефа по высоте.

Данная функция помогает отображать и понимать сложные рельефы.

Исправлен (Linux) баг — утечка памяти. При записи debug файла.

В предыдущих версиях рекомендуется отключать «включить Debug»

Прочие доработки и исправления

Свой плагин для 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 имени) ещё не была проверена при работе в программе