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