Hello Guest it is April 26, 2024, 11:40:18 PM

Author Topic: How to disable any movement before the machine is homed?  (Read 2195 times)

0 Members and 1 Guest are viewing this topic.

Offline kvid

*
  •  25 25
    • View Profile
Re: How to disable any movement before the machine is homed?
« Reply #10 on: February 21, 2020, 05:47:18 PM »
Simply put a sign on the computer.... Machine Must be Homed before any other movement!
This.  Simply brilliant!!!  :) 

Way back when, I was a systems analyst.  Believe it or not, systems analysts existed before computers got so accessible/popular.  System analysts were basically problem solvers when trying to improve any system, be it a manual or automated system of any type.  It could be logistics flow of material through a plant, or simply how to keep track of shipment items when they are loaded onto a truck.  And later on when computers became "the way" to solve problems, everyone wanted to do things that way.  But sometimes, the more direct approach was the cheaper and BETTER solution.  A sign is cheap.  Nothing more simple or direct than that.  And a lot of times, that simpler and more direct approach was job training. 

So I found myself becoming a big proponent signs and training! 

But I'm not ignoring the fact that sometimes a completely automated means to force a certain behavior is a bad idea.  I like shock collars.  LOL 

All that being said, here is my implementation of the no motion before home op.:

The following functions are put in the Screen Load script.
Code: [Select]
function InhibitMotion(inhibit)
    local inst = mc.mcGetInstance('InhibitMotion()')
    local rc, hSigInhitbitMotion

    hSigInhitbitMotion, rc = mc.mcSignalGetHandle(inst, mc.ISIG_MOTION_INHIBIT)
    if (rc ~= mc.MERROR_NOERROR) then -- check retun codes!
        mc.mcCntlMacroAlarm(inst, 600, 'Could not retrieve ISIG_MOTION_INHIBIT signal handle!')
return
end

if (inhibit) then
rc = mc.mcSignalSetState(hSigInhitbitMotion, 1) -- raise the mc.ISIG_MOTION_INHIBIT signal
if (rc ~= mc.MERROR_NOERROR) then -- check retun codes!
mc.mcCntlMacroAlarm(inst, 602, 'Could not set ISIG_MOTION_INHIBIT signal state to 1!')
return
end
else
rc = mc.mcSignalSetState(hSigInhitbitMotion, 0) -- lower the mc.ISIG_MOTION_INHIBIT signal
if (rc ~= mc.MERROR_NOERROR) then -- check retun codes!
mc.mcCntlMacroAlarm(inst, 604, 'Could not set ISIG_MOTION_INHIBIT signal state to 0!')
return
end
    end
end

function InhibitJog(inhibit)
    local inst = mc.mcGetInstance('InhibitMotion()')
    local rc, hSigInhitbitJog

    hSigInhitbitJog, rc = mc.mcSignalGetHandle(inst, mc.ISIG_JOG_INHIBIT)
    if (rc ~= mc.MERROR_NOERROR) then -- check retun codes!
        mc.mcCntlMacroAlarm(inst, 601, 'Could not retrieve ISIG_JOG_INHIBIT signal handle!')
return
end

if (inhibit) then
rc = mc.mcSignalSetState(hSigInhitbitJog, 1) -- raise the mc.ISIG_JOG_INHIBIT signal
if (rc ~= mc.MERROR_NOERROR) then -- check retun codes!
mc.mcCntlMacroAlarm(inst, 603, 'Could not set ISIG_JOG_INHIBIT signal state to 1!')
return
end
else
rc = mc.mcSignalSetState(hSigInhitbitJog, 0) -- lower the mc.ISIG_JOG_INHIBIT signal
if (rc ~= mc.MERROR_NOERROR) then -- check retun codes!
mc.mcCntlMacroAlarm(inst, 605, 'Could not set ISIG_JOG_INHIBIT signal state to 0!')
return
end
    end
end

function InhibitMotionAndJog(inhibit)
InhibitMotion(inhibit)
InhibitJog(inhibit)
end

function CheckHomed()
    local inst = mc.mcGetInstance('CheckHomed()')
    local homedX, homedY, homedZ, homed, rc, hSigInhitbitMotion, inhibitMotion
    homedX, rc = mc.mcAxisIsHomed(inst, mc.X_AXIS)
    if (rc ~= mc.MERROR_NOERROR) then -- check retun codes!
        mc.mcCntlMacroAlarm(inst, 5000, 'Could not retrieve X axis homed condition!')
return
end
    homedY, rc = mc.mcAxisIsHomed(inst, mc.Y_AXIS)
    if (rc ~= mc.MERROR_NOERROR) then -- check retun codes!
        mc.mcCntlMacroAlarm(inst, 5001, 'Could not retrieve Y axis homed condition!')
return
end
    homedZ, rc = mc.mcAxisIsHomed(inst, mc.Z_AXIS)
    if (rc ~= mc.MERROR_NOERROR) then -- check retun codes!
        mc.mcCntlMacroAlarm(inst, 5002, 'Could not retrieve Z axis homed condition!')
return
end

    hSigInhitbitMotion, rc = mc.mcSignalGetHandle(inst, mc.ISIG_MOTION_INHIBIT)
    if (rc ~= mc.MERROR_NOERROR) then -- check retun codes!
        mc.mcCntlMacroAlarm(inst, 5003, 'Could not retrieve ISIG_MOTION_INHIBIT signal handle!')
return
end

    inhibitMotion, rc = mc.mcSignalGetState(hSigInhitbitMotion)
    if (rc ~= mc.MERROR_NOERROR) then -- check retun codes!
        mc.mcCntlMacroAlarm(inst, 5005, 'Could not retrieve ISIG_MOTION_INHIBIT signal state!')
return
end

homed = homedX and homedY and homedZ
   
if ((homed == 0) and (inhibitMotion == 0)) then
InhibitMotionAndJog(true)
elseif ((homed == 1) and (inhibitMotion == 1)) then
InhibitMotionAndJog(false)
    end
end

And put this one liner in your PLC script:
Code: [Select]
CheckHomed()

Steve

Thank you Steve!

The code works very well. It is exactly what I was looking for.

Offline kvid

*
  •  25 25
    • View Profile
Re: How to disable any movement before the machine is homed?
« Reply #11 on: March 03, 2020, 05:09:42 AM »
Yeah...  the PMC rules for this kind of stuff.  It is a one rung'er.  :) 

Unfortunately, I broke the PMC editor in builds 4394 to 4410.  A new dev build will be there soon.  But you can try it out just dropping the .pmc and .lua files in your Pmc directory and then telling the screen set to use them.  Like I said, only the PMC Editor was broken.  I tried to get fancy and had an epic failure.  LOL

Both the scripts above and this pmc file raise ISIG_MOTION_INHIBIT (Gode/MDI) and ISIG_JOG_INHIBIT (jogging). 

Steve

Awesome! It worked with both methods but the one with PMC is much simpler.

I did not know before what PMC was but just after watching the following video from the support I was able to install your script
successfully.

https://www.youtube.com/watch?v=jVhH9qyjjf0

The script is basically fine and does it's job - prevents a crash.

There is one thing that I would like to fix though. When Cycle Start is pressed Mach4 will still run a first few lines of code. I assume that is because of cycle time being minimum 1 ms.

Is there a way to just grey out the Cycle start button until the machine is homed?
« Last Edit: March 03, 2020, 05:13:11 AM by kvid »

Offline smurph

*
  • *
  •  1,546 1,546
  • "That there... that's an RV."
    • View Profile
Re: How to disable any movement before the machine is homed?
« Reply #12 on: March 03, 2020, 03:50:52 PM »
It will run G code up to the point where there is movement and then stop.  It is motion inhibit, not cycle start inhibit.  So there are will be that distinction. 

Steve