Добавилась кнопка с помощью которой можно быстро задавать тип ручных перемещений (по шагам или непрерывно, с трекингом и без). con – (Continue) непрерывное движение. Пока нажата клавиша. Теперь мы можем задать какие размерности шагов мы …
Добавилась настройка трекинга при движении в ручном режиме. Мы можем включить его установив параметр WLJoystickAxisTrack в 1. Трекинг – это непрерывное движение оси при смене направления. ТО есть не нужно ждать когда ось завершит движение …
У нас есть станок с ЧПУ у которого две координаты X ,Y. И две оси Z, которые могут перемещаться независимо друг от друга и имеют разные датчики поиска положения, приводы и.т.д.. . Например два шпинделя …
Обновился контроллер WLM155S. Основные изменения описаны ниже. Увеличен размер платы контроллера до 125х150 (с 100х100). Увеличено количество стоек для крепления контроллера до 6. Разделено питание контроллера, входов, выходов и интерфейсов (CAN RS485). Для питания контроллера …
В последнее время стали возникать проблемы с установкой WLMill на одноплатники Rasberry Pi4B. Это было вызвано изменением пакетов на которых работали сборки для Linux.
Теперь всё что нужно для установки есть на нашем сайте. Подключение к интернету НЕ ОБЯЗАТЕЛЬНО!
Например для запуска WLMill на Rasberry Pi4B нужно сделать:
Записать образ на SD карту. (https://wldev.ru/data/oslinux/rasberry/ubuntu/ubuntu-mate-22.04-desktop-armhf+raspi.img.xz). Это можно сделать с помощью программы win32diskimage (её также можно скачать с сайта). Вставить SD карту в Rasberry Pi4, включить его и дождаться завершения установки ОС выбирая нужные параметры.
Перенести файлы *.deb на Rasberry Pi4 и установить их (4шт). (https://wldev.ru/data/oslinux/rasberry/ubuntu/dpkg/)
Перенести архив c WLMill на Rasberry Pi4. Распаковать (правая кнопка мыши) его в удобное место и сделать ярлык на рабочий стол. https://wldev.ru/data/soft/wlmill/linux/ (_armh)
Добавились данные в таблицу инструментов . При котором отключается автоизмирение длины инструмента если этот параметр 1 (WLToolAutoHDis)
Добавлены данные в таблицу инструментов. Смещение для измерения длины инструмента по X (WLToolAutoHXofst) и У (WLToolAutoHYofst). Используются для измерения длины больших диаметров фрез. У которых измирение по центру шпинделя некорректно.
Мы уже давно пользуемся программой WLBend на нашем производстве. C неё началось создание собственного контроллера.
Программа была ориентирована на определённы тип станков. Например подъём и опускание гибочной головки поршнем. Но как оказалось способы реализации станков разные (подъём гибочной головки сервоприводом например) и нам приходится дорабатывать нашу программу так , чтобы были инструменты для настройки WLBend на определённый тип станка.
В последний месяц мы сильно продвинулясиь в этом направлении. И сняли несколько видео новой версии:
В программе 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 мы создадим два слайдера для задания этих параметров.
В процессе работы приходится сталкиваться с недочётами у наших устройств, которые конечно исправляются. Однако можно исправить некоторые недочёты у ранних версий устройств.
Например:
Организация раздельного питания
Дополнительный резистор входа
Для устранения этих недочётов были дополнены инструкции (мануалы). С описанием необходимых действий. Если вы сомневаетесь, то можете выслать контроллер нам на доработку.
Добавлена поддержка пульта управления XHC (WHB04…). Основные особенности:
Ручной маховик.
Два селектора выбора режимов.
16 кнопок. + поддержка комбинации двух кнопок (когда удерживается одна и нажимается другая)
Проводная и беспроводная версия. (Внимание требуется хорошее питание по USB)
Для работы с пультом был создан объект XHB (в обоих скриптах LScript/MScript):
Можно узнавать состояние кнопок и селекторов пульта. Выводить некоторые данные на дисплей пульта.
При изменении состояния маховика, кнопок, селекторов. Вызываются функции для обработки этих событий (LScript).
Был написан базовый скрипт WLXHC.js (и добавлен в стандартный набор) в котором реализованы основные операции работы с ним.
Ручное перемещение (с точным позиционированием). Согласно установленным селекторам
Реализованы кнопки:
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
Реализованы вызовы макросов 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+")")
}