WLDAxis8 (DC-DC).

Была обновлена плата выравнивания портала.

Теперь для питания логической части можно использовать встроенный DC-DC преобразователь. Который может работать от напряжения 7-30В. (DC2/0v)

Но также возможно использовать питание 5В. (5v/0v) Для совместимости со старыми версиями.

Доработана документация. https://wldev.ru/data/doc/WLDAxis8.pdf

Linux + WLDEV. Rasberry Pi4 (Ubuntu Mate).

В последнее время стали возникать проблемы с установкой WLMill на одноплатники Rasberry Pi4B. Это было вызвано изменением пакетов на которых работали сборки для Linux.

Теперь всё что нужно для установки есть на нашем сайте. Подключение к интернету НЕ ОБЯЗАТЕЛЬНО!

Файлы для установки Linux и пакетов для работы наших программ находятся в разделе: https://wldev.ru/data/oslinux/

Программы находятся в соотв. папках https://wldev.ru/data/soft/.

Например для запуска WLMill на Rasberry Pi4B нужно сделать:

  1. Записать образ на SD карту. (https://wldev.ru/data/oslinux/rasberry/ubuntu/ubuntu-mate-22.04-desktop-armhf+raspi.img.xz). Это можно сделать с помощью программы win32diskimage (её также можно скачать с сайта). Вставить SD карту в Rasberry Pi4, включить его и дождаться завершения установки ОС выбирая нужные параметры.
  2. Перенести файлы *.deb на Rasberry Pi4 и установить их (4шт). (https://wldev.ru/data/oslinux/rasberry/ubuntu/dpkg/)
  3. Перенести архив c WLMill на Rasberry Pi4. Распаковать (правая кнопка мыши) его в удобное место и сделать ярлык на рабочий стол. https://wldev.ru/data/soft/wlmill/linux/ (_armh)

Видео: скоро…

WLMill. Поворот СК

Для поворота СК используются данные из таблицы инструментов.

  • Rot – угол поворота.
  • Xrot0,Yrot0 – базовая точка поворота. вокруг нее происходит поворот.
  • Xrot1,Yrot1 – вспомогательная точка для коррекции поворота СК.

Эти данные возможно внести:

  • Через команду в G коде (G68 (X,Y,R),G69 )
  • С помощью интерфейса задания поворота.
  • Через макросы GCODE.setRotSC или данные СК

Также можно включить отображение точек поворота текущей СК

Про коррекцию СК рассказывается в видео:

WLMill. distWear (Tool) – износ инструмента

В данных инструмента появился новый параметр distWear, который считает дистанция которую прошла фреза. То есть её “рабочий пробег”.

Данный параметр увеличивается автоматически для инструмента который сейчас установлен. Он считается если включен шпиндель и идут рабочие перемещения.

https://youtu.be/0FflhcNq5CY

WLTool.js обновление (AutoHDis,AutoH*ofst).

Небольшие обновления сделаны для WLTool.js

  1. Добавились данные в таблицу инструментов . При котором отключается автоизмирение длины инструмента если этот параметр 1 (WLToolAutoHDis)
  2. Добавлены данные в таблицу инструментов. Смещение для измерения длины инструмента по X (WLToolAutoHXofst) и У (WLToolAutoHYofst). Используются для измерения длины больших диаметров фрез. У которых измирение по центру шпинделя некорректно.
https://youtu.be/5yLXMd21pGw

WLBend. Перезагрузка

Мы уже давно пользуемся программой WLBend на нашем производстве. C неё началось создание собственного контроллера.

Программа была ориентирована на определённы тип станков. Например подъём и опускание гибочной головки поршнем. Но как оказалось способы реализации станков разные (подъём гибочной головки сервоприводом например) и нам приходится дорабатывать нашу программу так , чтобы были инструменты для настройки WLBend на определённый тип станка.

В последний месяц мы сильно продвинулясиь в этом направлении. И сняли несколько видео новой версии:

Видео от пользователя. Который сделал свой станок для 3D гибки проволоки.

WLMill. Туман в импульсном режиме.

В программе WLMill можно организовать работу системы охлаждения в импульсном режиме. То есть когда подача тумана и/или воздуха происходит с некоторой периодичностью.

Для этого мы будем использовать LScript и функцию контроллера – создание импульса заданной длинны на его выходе.

Создадим в LScript глобальные переменные и 2 функции

var colPause=1000
var colPulse=1000
var colEnable=0 //1-запущена выключена
var colNOut=2

function setEnableCol(enable)
{
	if(colEnable!=enable)
	{
		colEnable=enable

		if(enable)
		{
			updateCol()
		}
	}
}

function updateCol()
{
	if(colEnable)
	{
		MACHINE.setOutPulse(colNOut,1,colPulse)
		SCRIPT.setTimeout("updateCol()",colPulse+colPause)
	}
}

Отлично теперь у нас есть переменные определяющие время импульса, паузы а также включено ли охлаждение или нет.

Теперь c помощью MScript мы создадим два слайдера для задания этих параметров.

function updateCol()
{
	LSCRIPT.setValue("colPause",SLIDERPA.getValue())
	LSCRIPT.setValue("colPulse",SLIDERPU.getValue())
	
	SCRIPT.console("updateCol() pause="+SLIDERPA.getValue()+" pulse="+SLIDERPU.getValue())
}

function initCol()
{
	TOOLBAR2.addSlider("SLIDERPU","updateCol()","pulse")
	TOOLBAR2.addSlider("SLIDERPA","updateCol()","pause")

	SLIDERPU.setMinMaxValue(50,500)
	SLIDERPA.setMinMaxValue(500,3000)

	SLIDERPU.setValue(200)
	SLIDERPA.setValue(1000)
	
	SLIDERPA.setInverse(1)

	updateCol()
}

И добавим вызов initCol() в функцию init()

Так же в M8() – добавим включение аспирации

function M8()
{
	LSCRIPT.runFunction("setEnableCol(1)")
}

Так же в M9() – добавим выключение аспирации

function M9()
{	
	LSCRIPT.runFunction("setEnableCol(0)")
}

Теперь мы можем включать и отключать аспирацию а также задавать и менять параметры в процессе работы.

Используйте версию WLMil 2.2.36+

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

В процессе работы приходится сталкиваться с недочётами у наших устройств, которые конечно исправляются. Однако можно исправить некоторые недочёты у ранних версий устройств.

Например:

  • Организация раздельного питания
  • Дополнительный резистор входа

Для устранения этих недочётов были дополнены инструкции (мануалы). С описанием необходимых действий. Если вы сомневаетесь, то можете выслать контроллер нам на доработку.

Мануалы:

  • WLDAxis8 (можно применить к ранним версиям)
  • WLM55E
  • WLM55J (можно применить и для 35J)
  • WLM155S

WHB04 Пульт ЧПУ. WLMill (2.0.2.21)

Добавлена поддержка пульта управления XHC (WHB04…). Основные особенности:

  1. Ручной маховик.
  2. Два селектора выбора режимов.
  3. 16 кнопок. + поддержка комбинации двух кнопок (когда удерживается одна и нажимается другая)
  4. Проводная и беспроводная версия. (Внимание требуется хорошее питание по USB)

Для работы с пультом был создан объект XHB (в обоих скриптах LScript/MScript):

Можно узнавать состояние кнопок и селекторов пульта. Выводить некоторые данные на дисплей пульта.

Подсказки

При изменении состояния маховика, кнопок, селекторов. Вызываются функции для обработки этих событий (LScript).

Был написан базовый скрипт WLXHC.js (и добавлен в стандартный набор) в котором реализованы основные операции работы с ним.

  1. Ручное перемещение (с точным позиционированием). Согласно установленным селекторам
  2. Реализованы кнопки:
    • RESET
    • Stop
    • Start/pause
    • Fn+Feed+
    • Fn+Feed-
    • Fn+Spindle+
    • Fn+Spindle-
    • Fn+M_HOME (переезд в G54 X0 Y0 Z0)
    • Fn+Safe-Z
    • Fn+W_HOME
    • Fn+Probe-Z
  3. Реализованы вызовы макросов 1-10 с помощью кнопок. Вызывается макрос “macroXXWLXHC()” в скрипте MScript (добавлены подсказки в редакторе скриптов)

PS также был расширен функционал скриптов. Теперь возможно добавлять функции “wek” которые будут высвечиваться в редакторе скриптов. Например в скрипте WLXHC.js:

MSCRIPT.addIncludeWeakFunction(“macro”+(i+1)+”WLXHC”) //добавляем прjтотип функции в MScript

Текст первой версии:

/*
WLXHC - пример работы с пультом XHC

Установка:
1.Для работы с пультом XHC нужно определить функции которые вызываются при изменение данных от него.

2.Ниже будут примеры функций. Которые могут быть использованы вами. 

3. Копируем этот файл (WLXHCk.js) в папку /wlmillconfig/script/include
Подключаем,  добавляя в LScript.
function init()
{
	SCRIPT.includeFile("/include/WLXHC.js")
	....	   
}

при нажатии на кнопки Macro-1...Macro10 будут вызываться функции скрипта MScript.
Например обнуление по X,Y,Z,A по кнопкам пульта

function macro1WLXHC()
{
	if(!MACHINE.isActiv())
	MACHINE.setCurPositionSC("X",0)	
}

function macro2WLXHC()
{
	if(!MACHINE.isActiv())
	MACHINE.setCurPositionSC("Y",0)	
}

function macro3WLXHC()
{
	if(!MACHINE.isActiv())
	MACHINE.setCurPositionSC("Z",0)	
}

function macro4WLXHC()
{
	if(!MACHINE.isActiv())
	MACHINE.setCurPositionSC("A",0)	
}

22/04/2024 - добавлена стандартная реализация

*/

var XHCTimeout = -1
var XHCContMode = 0

var XHCIncF = 2.5
var XHCDecF = 2.5

var XHCIncS = 2.5
var XHCDecS = 2.5

function WLXHCStop()
{
	MACHINE.stopMov();
	XHCTimeout = -1
}

function WLXHCInit()
{
	SCRIPT.console("WLXHCInit()")

	SCRIPT.setTimeout("updateDisplayWLXHC()",50)

	var i=5
	for(i=0;i<10;i++) 
	MSCRIPT.addIncludeWeakFunction("macro"+(i+1)+"WLXHC")
}

function updateDisplayWLXHC()
{
	if(XHC.getSelectorA()==20  //A || B ||C
	||XHC.getSelectorA()==21 
	||XHC.getSelectorA()==22)
	XHC.setDisplayData(MACHINE.getCurPositionSC("A")
	,MACHINE.getCurPositionSC("B")
	,MACHINE.getCurPositionSC("C")
	,GCODE.getValue("F").toFixed(3))
	else
	XHC.setDisplayData(MACHINE.getCurPositionSC("X")
	,MACHINE.getCurPositionSC("Y")
	,MACHINE.getCurPositionSC("Z")
	,GCODE.getValue("F").toFixed(3))


	SCRIPT.setTimeout("updateDisplayWLXHC()",50)
}

function changedWhellXHC(dist)
{
	SCRIPT.console("changedWhellXHC("+dist+")"+XHC.getJogVelocity()/100.0)

	var distXYZ=0

	switch(XHC.getSelectorX())
	{
		case 13: //2%
		distXYZ=0.001
		break;

		case 14: //5%
		distXYZ=0.010
		break;

		case 15://10% 
		distXYZ=0.100
		break;

		case 16: //30%
		distXYZ=1.000
		break;

		case 26: //60%
		distXYZ=1.000
		break;

		case 27: //100%
		distXYZ=1.000
		break;

		case 155: //Lead
		distXYZ=1.000
		break;
	}

	var F=0

	if(MACHINE.isPossiblyManual())
	{
		if(XHCContMode)//if mpg int cont mode
		{
			if(XHCTimeout !=-1)
			SCRIPT.clearTimeout(XHCTimeout)

			XHCTimeout = SCRIPT.setTimeout("WLXHCStop()",100)
		}


		switch(XHC.getSelectorA())
		{
			case 17: //X
			DRIVEX.setKSpeed(1)
			DRIVEX.runMovRel(dist*distXYZ,F,1)
			break;

			case 18: //Y
			DRIVEY.setKSpeed(1)
			DRIVEY.runMovRel(dist*distXYZ,F,1)
			break;

			case 19: //Z
			DRIVEZ.setKSpeed(1)
			DRIVEZ.runMovRel(dist*distXYZ,F,1)
			break;

			case 20: //A
			DRIVEA.setKSpeed(1)
			DRIVEA.runMovRel(dist*distXYZ,F,1)
			break;
		}


	}

}

function changedStopJogXHC()
{
	switch(XHC.getSelectorA())
	{
		case 17: //X
		MACHINE.goGDriveManual("X",0,0)
		SCRIPT.console("Stop Jog")
		break;

		case 18: //Y
		MACHINE.goGDriveManual("Y",0,0)
		break;

		case 19: //Z
		MACHINE.goGDriveManual("Z",0,0)
		break;

		case 20: //A
		MACHINE.goGDriveManual("A",0,0)
		break;
	}
}

function changedButtonsXHC(button1,button2)
{
	SCRIPT.console("changedButtonsXHC("+button1+","+button2+")")
	SCRIPT.console("MpgMode("+XHC.getMpgMode() +")")

	switch(button1) 
	{
		case 1: //RESET
		MACHINE.reset();
		break;

		case 2: //Stop
		MACHINE.stopMov()
		break;

		case 3: //Start/pause
		if(MACHINE.isPause())                             
		MACHINE.setPause(0)
		else
		MACHINE.setPause()
		break;

		case 12: //Fn key + button2
		switch(button2)
		{
			case 3: //Start/pause
			if(!MACHINE.isActiv())		
			MSCRIPT.runScript("MACHINE.runGProgram()");
			break;		
			case 4: //Feed+
			MACHINE.setPercentF(MACHINE.getPercentF()+XHCIncF)
			break;
			case 5: //Feed -
			MACHINE.setPercentF(MACHINE.getPercentF()-XHCDecF)
			break;
			case 6: //Spindle+
			MACHINE.setPercentS(MACHINE.getPercentS()+XHCIncS)
			break;
			case 7: //Spindle-
			MACHINE.setPercentS(MACHINE.getPercentS()-XHCDecS)
			break;
			case 8: //M_HOME <--
			if(!MACHINE.isActiv())
			{
				if(MACHINE.getCurPosition("Z")<0)  
				MACHINE.runGCode("G53 G90 G0 Z0")
				MACHINE.runGCode("G53 G90 G0 X0 Y0")
			}
			break;
			case 9: //Safe-Z
			if(!MACHINE.isActiv())
			{
				if(MACHINE.getCurPosition("Z")<0)  
				MACHINE.runGCode("G91 G28 G0 Z0")
			}
			break;
			case 10: //W_HOME <--
			if(!MACHINE.isActiv())
			{
				if(MACHINE.getCurPositionSC("Z")<0)  
				MACHINE.runGCode("G90 G0 Z0")
				MACHINE.runGCode("G90 G0 X0 Y0")
			}
			break;

			case 11: //W_HOME <--
			if(MACHINE.getStateSpindle()!=0)
			MACHINE.runMCode(5);
			else
			MACHINE.runMCode(3);
			break;

			case 13: //Probe-Z
			if(!MACHINE.isActiv())
			{
				MSCRIPT.runScript("WLTabletFastZ0()")
			}
			break;
		}
		break;

		case 4: 
		case 5:
		case 6:
		case 7:
		case 8:
		case 9:
		case 10:
		case 11:
		case 12:MSCRIPT.runFunction("macro"+(button1-3)+"WLXHC()",1);
		break
		case 13:MSCRIPT.runFunction("macro9WLXHC()",1);
		break
		case 16:MSCRIPT.runFunction("macro10WXHC()",1);
		break
		case 14: XHCContMode=1
		break
		case 15: XHCContMode=0
		break

	}

}

function changedSelectorXXHC(pselect)
{
	SCRIPT.console("changedSelectorXXHC("+pselect+")")
}

Видео:

https://youtu.be/AjLnI4M2Pu8

WLMill (2.0.2.8)

Исправлена ошибка при работе с G83 + выполнение скриптов (M6 например).

В момент выполнения скрипта были неверные данные G кода – будущие, от просмотра вперед.

Это важно при смене инструмента!

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

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

Сейчас можно включить авто-исправление. Задав максимальную ошибку радиуса. Если ошибка задана равной нулю, то авто-исправление отключено.

В процессе исправления берется средний радиус и находятся новые координаты центра дуги.