----------------------------------------------------------------------------- -- Name: mcCvTuningWizard -- Author: B Price -- Modified by: -- Created: 05/11/2017 -- Copyright: (c) 2017 Newfangled Solutions. All rights reserved. -- License: BSD license - This header can not be removed ----------------------------------------------------------------------------- local inst = mc.mcGetInstance() local MaxVel = 0 local IsCVangleOn = mc.mcMotionGetCVAngleEnable(inst) for v = 0, 5, 1 do local motorId, rc = mc.mcAxisGetMotorId(inst, v, 0) local CurMaxVel, rc = mc.mcProfileGetDouble(inst, string.format("Motor" .. motorId), "MaxVelocity", 0) local Counts, rc = mc.mcProfileGetDouble(inst, string.format("Motor" .. motorId), "CountsPerUnit", 0) --10000 local AxMaxVel = ((CurMaxVel * 60) / Counts) local enabled, rc = mc.mcAxisIsEnabled(inst, v) if (enabled == 1) then if (AxMaxVel > MaxVel) then MaxVel = AxMaxVel end end end function UIDefaults() UI.MyFrame1:Show(true) UI.m_sliderMaxFeedRate:SetRange (0, (MaxVel)) UI.m_staticText31:SetLabel(string.format("Maximum Feed Rate\nRange 0-%u", MaxVel)) local PreviousMaxFeed, rc = mc.mcProfileGetDouble(inst, "CVFeedrate", "MaxFeed", 900000) if (rc == mc.MERROR_NOERROR) then if (PreviousMaxFeed <= MaxVel) then UI.m_textCtrlMaxFeedRate:SetValue(tostring(PreviousMaxFeed)) UI.m_sliderMaxFeedRate:SetValue(PreviousMaxFeed) end end local PreviousMaxAngle, rc = mc.mcProfileGetDouble(inst, "CVFeedrate", "MaxAngle", 89) if (rc == mc.MERROR_NOERROR) then if (PreviousMaxAngle <= 179) then UI.m_textCtrlGreaterThan:SetValue(tostring(PreviousMaxAngle)) UI.m_sliderGreaterThan:SetValue(PreviousMaxAngle) end end SetTogButton(IsCVangleOn) end function SetTogButton(ButtonState) if (ButtonState == 1) then UI.m_buttonCVToggle:SetLabel(tostring("Disable\nCV Feed Rate")) UI.m_buttonCVToggle:SetBackgroundColour( wx.wxColour( 0, 255, 0 ) ) UI.m_buttonCVToggle:SetForegroundColour( wx.wxColour( 0, 0, 0 ) ) else UI.m_buttonCVToggle:SetLabel(tostring("Enable\nCV Feed Rate")) UI.m_buttonCVToggle:SetBackgroundColour( wx.wxColour( 255, 0, 0 ) ) UI.m_buttonCVToggle:SetForegroundColour( wx.wxColour( 255, 255, 255 ) ) end end function m_buttonCVToggleOnButtonClick() local state = UI.m_buttonCVToggle:GetLabel() if (state == "Disable\nCV Feed Rate") then SetTogButton(0) else SetTogButton(1) end end function m_sliderMaxFeedRateOnScroll() local MyVal = UI.m_sliderMaxFeedRate:GetValue() UI.m_textCtrlMaxFeedRate:SetValue(tostring(MyVal)) end function m_sliderGreaterThanOnScroll() local MyVal = UI.m_sliderGreaterThan:GetValue() UI.m_textCtrlGreaterThan:SetValue(tostring(MyVal)) end function m_buttonHelpOnButtonClick() local major, minor = wx.wxGetOsVersion() local dir = mc.mcCntlGetMachDir(inst); local cmd = "explorer.exe /open," .. dir .. "\\Docs\\mcCvTuningWizardHelp.pdf" if(minor <= 5) then -- Xp we don't need the /open cmd = "explorer.exe ," .. dir .. "\\Docs\\mcCvTuningWizardHelp.pdf" end wx.wxExecute(cmd); end function m_buttonAcceptOnButtonClick() local MaxFeedRate = UI.m_sliderMaxFeedRate:GetValue() mc.mcProfileWriteDouble(inst, "CVFeedrate", "MaxFeed", MaxFeedRate) local GreaterThan = UI.m_sliderGreaterThan:GetValue() mc.mcProfileWriteDouble(inst, "CVFeedrate", "MaxAngle", GreaterThan) local Increment = (MaxFeedRate / (GreaterThan +1)) local Start = Increment for v = 179, 1, -1 do if (v > GreaterThan) then mc.mcMotionSetCVAngle(inst, v, 0.0000) else mc.mcMotionSetCVAngle(inst, v, Start) Start = (Start + Increment) end end mc.mcMotionSetCVAngle(inst, 0, MaxVel) local state = UI.m_buttonCVToggle:GetLabel() if (state == "Disable\nCV Feed Rate") then mc.mcMotionSetCVAngleEnable(inst, 1) else mc.mcMotionSetCVAngleEnable(inst, 0) end UI.MyFrame1:Destroy() end function m_buttonCancelOnButtonClick() UI.MyFrame1:Destroy() end UI = {} -- create MyFrame1 UI.MyFrame1 = wx.wxFrame (wx.NULL, wx.wxID_ANY, "CV Tuning Wizard", wx.wxDefaultPosition, wx.wxSize( 300,554 ), wx.wxCAPTION + wx.wxSTAY_ON_TOP+wx.wxTAB_TRAVERSAL ) UI.MyFrame1:SetSizeHints( wx.wxSize( 300,554 ), wx.wxDefaultSize ) UI.MyFrame1 :SetBackgroundColour( wx.wxColour( 240, 240, 240 ) ) UI.bSizer1 = wx.wxBoxSizer( wx.wxVERTICAL ) UI.bSizer2 = wx.wxBoxSizer( wx.wxHORIZONTAL ) UI.fgSizer1 = wx.wxFlexGridSizer( 6, 1, 0, 0 ) UI.fgSizer1:SetFlexibleDirection( wx.wxBOTH ) UI.fgSizer1:SetNonFlexibleGrowMode( wx.wxFLEX_GROWMODE_SPECIFIED ) UI.bSizer3 = wx.wxBoxSizer( wx.wxVERTICAL ) UI.m_buttonCVToggle = wx.wxButton( UI.MyFrame1, wx.wxID_ANY, "Disable CV Feed Rate", wx.wxDefaultPosition, wx.wxDefaultSize, 0 ) UI.m_buttonCVToggle:SetForegroundColour( wx.wxColour( 0, 0, 0 ) ) UI.m_buttonCVToggle:SetBackgroundColour( wx.wxColour( 0, 255, 0 ) ) UI.m_buttonCVToggle:SetMinSize( wx.wxSize( -1,40 ) ) UI.bSizer3:Add( UI.m_buttonCVToggle, 0, wx.wxALIGN_CENTER, 5 ) UI.fgSizer1:Add( UI.bSizer3, 1, wx.wxEXPAND, 0 ) UI.bSizer41 = wx.wxBoxSizer( wx.wxVERTICAL ) UI.m_sliderMaxFeedRate = wx.wxSlider( UI.MyFrame1, wx.wxID_ANY, 500, 0, 2000, wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxSL_HORIZONTAL ) UI.bSizer41:Add( UI.m_sliderMaxFeedRate, 0, wx.wxALIGN_CENTER_HORIZONTAL + wx.wxALL + wx.wxEXPAND, 5 ) UI.fgSizer1:Add( UI.bSizer41, 1, wx.wxEXPAND, 5 ) UI.bSizer51 = wx.wxBoxSizer( wx.wxHORIZONTAL ) UI.m_staticText31 = wx.wxStaticText( UI.MyFrame1, wx.wxID_ANY, "Maximum Feed Rate\nRange 0-MaxVel", wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxALIGN_CENTRE ) UI.m_staticText31:Wrap( -1 ) UI.bSizer51:Add( UI.m_staticText31, 0, wx.wxALL, 5 ) UI.m_textCtrlMaxFeedRate = wx.wxTextCtrl( UI.MyFrame1, wx.wxID_ANY, "500", wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxTE_READONLY ) UI.m_textCtrlMaxFeedRate:SetMaxSize( wx.wxSize( 60,-1 ) ) UI.bSizer51:Add( UI.m_textCtrlMaxFeedRate, 0, wx.wxALIGN_CENTER_VERTICAL + wx.wxALL, 5 ) UI.m_staticText21 = wx.wxStaticText( UI.MyFrame1, wx.wxID_ANY, "Units\nPer Minute", wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxALIGN_CENTRE ) UI.m_staticText21:Wrap( -1 ) UI.bSizer51:Add( UI.m_staticText21, 0, wx.wxALIGN_CENTER_VERTICAL + wx.wxALL, 5 ) UI.fgSizer1:Add( UI.bSizer51, 1, wx.wxALIGN_CENTER, 5 ) UI.bSizer4 = wx.wxBoxSizer( wx.wxVERTICAL ) UI.m_sliderGreaterThan = wx.wxSlider( UI.MyFrame1, wx.wxID_ANY, 89, 0, 179, wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxSL_HORIZONTAL ) UI.bSizer4:Add( UI.m_sliderGreaterThan, 0, wx.wxALIGN_CENTER_HORIZONTAL + wx.wxALL + wx.wxEXPAND, 5 ) UI.fgSizer1:Add( UI.bSizer4, 1, wx.wxEXPAND, 5 ) UI.bSizer5 = wx.wxBoxSizer( wx.wxHORIZONTAL ) UI.m_staticText3 = wx.wxStaticText( UI.MyFrame1, wx.wxID_ANY, "Stop CV on angles >\nRange 0-179", wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxALIGN_CENTRE ) UI.m_staticText3:Wrap( -1 ) UI.bSizer5:Add( UI.m_staticText3, 0, wx.wxALL, 5 ) UI.m_textCtrlGreaterThan = wx.wxTextCtrl( UI.MyFrame1, wx.wxID_ANY, "89", wx.wxDefaultPosition, wx.wxDefaultSize, wx.wxTE_READONLY ) UI.m_textCtrlGreaterThan:SetMaxSize( wx.wxSize( 30,-1 ) ) UI.bSizer5:Add( UI.m_textCtrlGreaterThan, 0, wx.wxALIGN_CENTER_VERTICAL + wx.wxALL, 5 ) UI.m_staticText2 = wx.wxStaticText( UI.MyFrame1, wx.wxID_ANY, "Degrees", wx.wxDefaultPosition, wx.wxDefaultSize, 0 ) UI.m_staticText2:Wrap( -1 ) UI.bSizer5:Add( UI.m_staticText2, 0, wx.wxALIGN_CENTER_VERTICAL + wx.wxALL, 5 ) UI.fgSizer1:Add( UI.bSizer5, 1, wx.wxALIGN_CENTER_HORIZONTAL, 5 ) UI.bSizer6 = wx.wxBoxSizer( wx.wxVERTICAL ) UI.m_staticText41 = wx.wxStaticText( UI.MyFrame1, wx.wxID_ANY, "Adjust the sliders to increase or decrease the maximum feed rate and the maximum angle in which CV will be applied. The CV table will be linearized based on these two settings. Higher settings will result in smoother motion and shorter cycle times but less accurate tool paths. Lower settings will result in rougher motion and longer cycle times but more accurate tool paths.\n\nMost machines will rapid at many times the rate they will ever make a feed move. Often the achievable feed rate is much lower than even the programmed feed rate as well. The poorer the acceleration (in motor tuning) is and the shorter the Gcode moves are the more obvious this becomes. The maximum feed rate should be set to the maximum feed rate the machine can actually achieve while holding the required tolerances throughout the execution of the Gcode program you are tuning CV for.", wx.wxDefaultPosition, wx.wxDefaultSize, 0 ) UI.m_staticText41:Wrap( 280 ) UI.m_staticText41:SetMinSize( wx.wxSize( -1,290 ) ) UI.m_staticText41:SetMaxSize( wx.wxSize( -1,290 ) ) UI.bSizer6:Add( UI.m_staticText41, 0, wx.wxALL + wx.wxEXPAND, 5 ) UI.fgSizer1:Add( UI.bSizer6, 1, 0, 5 ) UI.bSizer7 = wx.wxBoxSizer( wx.wxHORIZONTAL ) UI.bSizer7:SetMinSize( wx.wxSize( -1,35 ) ) UI.m_buttonHelp = wx.wxButton( UI.MyFrame1, wx.wxID_ANY, "Help", wx.wxDefaultPosition, wx.wxDefaultSize, 0 ) UI.m_buttonHelp:SetFont( wx.wxFont( wx.wxNORMAL_FONT:GetPointSize(), 70, 90, 90, False, "" ) ) UI.bSizer7:Add( UI.m_buttonHelp, 0, wx.wxALL, 5 ) UI.m_buttonAccept = wx.wxButton( UI.MyFrame1, wx.wxID_ANY, "Accept", wx.wxDefaultPosition, wx.wxDefaultSize, 0 ) UI.bSizer7:Add( UI.m_buttonAccept, 0, wx.wxALL, 5 ) UI.m_buttonCancel = wx.wxButton( UI.MyFrame1, wx.wxID_ANY, "Cancel", wx.wxDefaultPosition, wx.wxDefaultSize, 0 ) UI.bSizer7:Add( UI.m_buttonCancel, 0, wx.wxALL, 5 ) UI.fgSizer1:Add( UI.bSizer7, 1, wx.wxEXPAND, 5 ) UI.bSizer2:Add( UI.fgSizer1, 1, wx.wxEXPAND, 0 ) UI.bSizer1:Add( UI.bSizer2, 1, wx.wxEXPAND, 0 ) UI.MyFrame1:SetSizer( UI.bSizer1 ) UI.MyFrame1:Layout() UI.MyFrame1:Centre( wx.wxBOTH ) -- Connect Events UI.m_buttonCVToggle:Connect( wx.wxEVT_COMMAND_BUTTON_CLICKED, function(event) m_buttonCVToggleOnButtonClick() event:Skip() end ) UI.m_sliderMaxFeedRate:Connect( wx.wxEVT_SCROLL_CHANGED, function(event) m_sliderMaxFeedRateOnScroll() event:Skip() end ) UI.m_sliderGreaterThan:Connect( wx.wxEVT_SCROLL_CHANGED, function(event) m_sliderGreaterThanOnScroll() event:Skip() end ) UI.m_buttonHelp:Connect( wx.wxEVT_COMMAND_BUTTON_CLICKED, function(event) m_buttonHelpOnButtonClick() event:Skip() end ) UI.m_buttonAccept:Connect( wx.wxEVT_COMMAND_BUTTON_CLICKED, function(event) m_buttonAcceptOnButtonClick() event:Skip() end ) UI.m_buttonCancel:Connect( wx.wxEVT_COMMAND_BUTTON_CLICKED, function(event) m_buttonCancelOnButtonClick() event:Skip() end ) UIDefaults()