In lathe it is handled in the default screens PLC script. I'm not sure but you may be able to adapt it to work for your purpose in doing some mill turning. The API says its for lathe but it may well work for mill too. Take note that it uses the X axis current position to determine diameter. Depending on how your doing things that may not work for you. But you could adapt it. Just pointing it out. It uses some screen elements so you would need to....
1) Save your screen as something new and unique.
2) Modify the new screen making sure it has all the elements needed (and named correctly).
3) Test
Here is the code that does the magic in lathe............
-------------------------------------------------------
-- Calculate CSS
-------------------------------------------------------
local NativeUnits, rc = mc.mcCntlGetUnitsDefault(inst)
local units, rc = mc.mcCntlGetUnitsCurrent(inst)
local xDia = mc.mcAxisGetPos(inst, 0)
local dia, rc = mc.mcCntlGetDiaMode(inst)
if (dia == 0) then
xDia = (xDia * 2)
end
if (NativeUnits == 200) and (units == 210) then
xDia = (xDia * 25.4)
elseif (NativeUnits == 210) and (units == 200) then
xDia = (xDia / 25.4)
end
if (units == 200) then --Gcode is in inch mode (G20)
mc.mcSpindleCalcCSSToRPM(inst, xDia, true)
elseif (units == 210) then --Gcode is in mm mode (G21)
mc.mcSpindleCalcCSSToRPM(inst, xDia, false)
end
-------------------------------------------------------
-- CSS DRO
-------------------------------------------------------
local FeedRate, SpinRPM, CurrentCSS
FeedRate = scr.GetProperty ("droFeedRate", "Value")
FeedRate = tonumber(FeedRate)
SpinRPM = scr.GetProperty("droSpinRPM", "Value")
SpinRPM = tonumber(SpinRPM)
CurrentCSS = (FeedRate / SpinRPM)
if CurrentCSS ~= LastCSS then --We need to update our user DRO
LastCSS = CurrentCSS --So we only update DRO when needed. Stops blinking DRO
if (FeedRate > 0) and (SpinRPM > 0) then
scr.SetProperty("droConstantSurfaceSpeed", "Value", tostring(CurrentCSS))
else
scr.SetProperty("droConstantSurfaceSpeed", "Value", "0.0000")
end
end