Hello Guest it is March 29, 2024, 04:18:48 AM

Author Topic: Help with Mach 4 controlling a PLC for tool changes.  (Read 18979 times)

0 Members and 1 Guest are viewing this topic.

Re: Help with Mach 4 controlling a PLC for tool changes.
« Reply #20 on: January 23, 2018, 04:36:12 PM »
The nice thing about using a PLC if you like ladder logic is that all you have to do is have Mach send the Tool change signal along with which tool and then the PLC will do all the work. After it is done it will report back to Mach that the tool change is done and them Mach will go back to work.
If you are going to do a lot of LUA coding it doesn't make sense to use a PLC unless you just don't have the I/O.

P.S. I have never actually done this yet but that is what I have read and it makes sense to me.

Mike
We never have the time or money to do it right the first time, but we somehow manage to do it twice and then spend the money to get it right.
Re: Help with Mach 4 controlling a PLC for tool changes.
« Reply #21 on: January 23, 2018, 04:52:51 PM »
Mike,
We used to use breakout boards with the ESS, but we have found that the HiCON matched with a PLC is a very stable and reliable solution.  
Our equipment is all for production, so we needed/need a reliable source of I/O.  The ESS breakout board's signal was not very stable for what we want to accomplish.  So a PLC is well worth the money for us, and PLCs from Automation Direct are inexpensive and easy to use and easy to learn. 
The HiCON has plenty of input for Home and Limit switches as well as E Stop and Probing and the relay outputs we use for all the spindle control.    
A PLC connected to Mach4 VIA TCP Modbus is very fast and reliable for the rest of our I/O; and since its a PLC, might as well take advantage of it, use ladder logic to control lube pumps, tool changes, misc functions, etc... that way the PLC Script and Mach4 won't have to take any more memory away from motion control.  

Cartierusm,
Here is our entire M6 macro for the tool changer on our lathe.  You will have to edit it to send the correct output per the tool you desire, as you will see, we use registers to tell the Click which tool to change to.
Since the Bit inside the Click will latch the tool change sequence, we turn on Outpu22 for 1 second and turn it back off.

                     rc = mc.mcSignalWait(inst, mc.ISIG_INPUT0, mc.WAIT_MODE_HIGH, 20)

This SignalWait call is the heart of the M6.  It will force Mach4 to wait until it gets the desired input from the Click to finish the macro.  
Also, the "20" after the comma is the amount of time it will wait until it gets the signal before proceeding.  
So, we timed our Tool Changer, it takes about 6 seconds, occasionally up to 10 seconds depending on how stiff the gears are in the morning, but it never takes 20 seconds!! So if it takes more than that there is clearly an issue.  So we use the rc (forgive me, but I don't remember what RC stands for, return call, return code, whatever) to return a code if it was successful or not.  If not, we alarm out the machine and pop up a message box.

--Big Red Tool Change Macro
function m6()

local inst = mc.mcGetInstance()
local Requested = mc.mcToolGetSelected(inst)
local Current = mc.mcToolGetCurrent(inst)
local ToolChange = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT22) --This is the signal that will start the click tool change.


   if Requested == Current then
       mc.mcCntlSetLastError(inst, "Current tool == Requested tool so there is nothing to do")
   else
         --Tell the Click to change to requested tool.
         local DS1 = mc.mcRegGetHandle(inst,"Clcik PLC/Requested Tool")
         mc.mcRegSetValue(DS1,Requested)
        
         --Send signal to the Click to start the tool change.
         mc.mcSignalSetState(ToolChange,1) --Y001
         wx.wxMilliSleep(1000)
         mc.mcSignalSetState(ToolChange,0) --Y001
        
         --Wait for the signal from the CLick.        
         mc.mcCntlSetLastError(inst, "Wait for Click to complete tool change.")
         rc = mc.mcSignalWait(inst, mc.ISIG_INPUT0, mc.WAIT_MODE_HIGH, 20)--Time in seconds the Click has to complete the tool change.
         --Error check.  If the Click took too long.  Alarm out Mach4.
         if (rc~= 0) then
             wx.wxMessageBox("The Click did not complete the tool change in time.  Check for malfunction.")
             local Alarm = mc.mcSignalGetHandle(inst,mc.OSIG_ALARM)
             mc.mcSignalSetState(Alarm,1)
             CycleStop()
         else
             mc.mcCntlSetLastError(inst, "Current tool == " .. tostring(Requested))
             mc.mcToolSetCurrent(inst, Requested)
             mc.mcCntlSetLastError(inst, "Tool Change Complete.")
         end

    end--Request == Current

end --m6

if (mc.mcInEditor() == 1) then
 m6()
end
« Last Edit: January 23, 2018, 04:55:38 PM by Cbyrdtopper »
Chad Byrd
Re: Help with Mach 4 controlling a PLC for tool changes.
« Reply #22 on: January 23, 2018, 04:58:10 PM »
Hi Chad,
Nice Macro. If I build my tool changer for the lathe I will give it a try. I already have the click.Great little PLC for the money.
We never have the time or money to do it right the first time, but we somehow manage to do it twice and then spend the money to get it right.
Re: Help with Mach 4 controlling a PLC for tool changes.
« Reply #23 on: January 23, 2018, 05:05:45 PM »
Thanks a bunch. I'll give this a look and see if I can figure it out.

I'm no programmer, but I love the Click. I was able to program it pretty easy for all sorts of projects. And yes it's not expensive at all.
Re: Help with Mach 4 controlling a PLC for tool changes.
« Reply #24 on: January 23, 2018, 06:02:24 PM »
Ok now we're cooking with gas!

So is this the whole script or do I have to repeat this code 8 times for each of my tool positions, because I don't see where the different tool change positions are referenced?

I assume that the M6 program would have an instance for each of my tools and the corresponding inputs to verify the tool change was made. I'm using Y101 = T0101, Y102=T0202, Y103=T0303, Y104=T0404, Y105=T0505, Y106=T0606, Y107=T0707, Y108=T0808.
Re: Help with Mach 4 controlling a PLC for tool changes.
« Reply #25 on: January 23, 2018, 10:51:16 PM »
Mike,
Thanks!  I want to grow this forum and help others, so by all means use the code! Hope it works well for you!  I do love the Click, we've been playing with the BRX as well, a little more expensive but I want to try out the software.
Cartierusm,

You can set up an output variable to make your M6 shorter.  
For example:
if requested == 1 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT##) --Y001
end

if requested == 2 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT##) --Y002
end

ETC....

Then when you're ready to start the tool change toggle the "ToolOutput" on then off.  Just like I am doing with Output 22

I'm not sure how you are finishing the tool change in your Click, once it reaches your requested tool input?
If so, I think you can set up the same type of code for the input.
Otherwise you will have to pass each tool through an if statement.
If requested == 1 then
 rc = mc.mcSignalWait(inst, mc.ISIG_INPUT##, mc.WAIT_MODE_HIGH, 20) --X001
end
If requested == 2 then
 rc = mc.mcSignalWait(inst, mc.ISIG_INPUT##, mc.WAIT_MODE_HIGH, 20) --X002
end
ETC

This way it will only look for your Requested Tool Input that the Click will end the tool change sequence with.



« Last Edit: January 23, 2018, 10:59:13 PM by Cbyrdtopper »
Chad Byrd
Re: Help with Mach 4 controlling a PLC for tool changes.
« Reply #26 on: January 24, 2018, 12:16:14 AM »
Ok this doesn't seem totally correct to me. What do you think?

I'm using the limit switches on my Tool Changer to verify that the tool change has completed correctly, those inputs run X101-X106.

I basically took your tool change program and changed it to match what I think is correct.

--Mori Seiki SL-1 ATC
function m6()

local inst = mc.mcGetInstance()
local Requested = mc.mcToolGetSelected(inst)
local Current = mc.mcToolGetCurrent(inst)

if requested == 1 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT01) –Y101
end

if requested == 2 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT02) –Y102
end

if requested == 3 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT03) –Y103
end

if requested == 4 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT04) –Y104
end

if requested == 5 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT05) –Y105
end

if requested == 6 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT06) –Y106
end

if requested == 7 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT07) –Y107
end

if requested == 8 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT08) –Y108
end

   if Requested == Current then
       mc.mcCntlSetLastError(inst, "Current tool == Requested tool so there is nothing to do")
   else

         --Tell the Click to change to requested tool.
         local Y101 = mc.mcRegGetHandle(inst,"Clcik PLC/Requested Tool")
         mc.mcRegSetValue(Y101,Requested)
end

         --Tell the Click to change to requested tool.
         local Y102 = mc.mcRegGetHandle(inst,"Clcik PLC/Requested Tool")
         mc.mcRegSetValue(Y102,Requested)
end

         --Tell the Click to change to requested tool.
         local Y103 = mc.mcRegGetHandle(inst,"Clcik PLC/Requested Tool")
         mc.mcRegSetValue(Y103,Requested)
end

         --Tell the Click to change to requested tool.
         local Y104 = mc.mcRegGetHandle(inst,"Clcik PLC/Requested Tool")
         mc.mcRegSetValue(Y104,Requested)
end

         --Tell the Click to change to requested tool.
         local Y105 = mc.mcRegGetHandle(inst,"Clcik PLC/Requested Tool")
         mc.mcRegSetValue(Y105,Requested)
end

         --Tell the Click to change to requested tool.
         local Y106 = mc.mcRegGetHandle(inst,"Clcik PLC/Requested Tool")
         mc.mcRegSetValue(Y106,Requested)
end

         --Tell the Click to change to requested tool.
         local Y107 = mc.mcRegGetHandle(inst,"Clcik PLC/Requested Tool")
         mc.mcRegSetValue(Y107,Requested)
end

         --Tell the Click to change to requested tool.
         local Y108 = mc.mcRegGetHandle(inst,"Clcik PLC/Requested Tool")
         mc.mcRegSetValue(Y108,Requested)
end

         --Send signal to the Click to start the tool change.
         mc.mcSignalSetState(ToolChange,1) –Y101
         wx.wxMilliSleep(1000)
         mc.mcSignalSetState(ToolChange,0) –Y101
end

         --Send signal to the Click to start the tool change.
         mc.mcSignalSetState(ToolChange,1) –Y102
         wx.wxMilliSleep(1000)
         mc.mcSignalSetState(ToolChange,0) –Y102
end

         --Send signal to the Click to start the tool change.
         mc.mcSignalSetState(ToolChange,1) –Y103
         wx.wxMilliSleep(1000)
         mc.mcSignalSetState(ToolChange,0) –Y103
end

         --Send signal to the Click to start the tool change.
         mc.mcSignalSetState(ToolChange,1) –Y104
         wx.wxMilliSleep(1000)
         mc.mcSignalSetState(ToolChange,0) –Y104
end

         --Send signal to the Click to start the tool change.
         mc.mcSignalSetState(ToolChange,1) –Y105
         wx.wxMilliSleep(1000)
         mc.mcSignalSetState(ToolChange,0) –Y105
end

         --Send signal to the Click to start the tool change.
         mc.mcSignalSetState(ToolChange,1) –Y106
         wx.wxMilliSleep(1000)
         mc.mcSignalSetState(ToolChange,0) –Y106
end

         --Send signal to the Click to start the tool change.
         mc.mcSignalSetState(ToolChange,1) –Y107
         wx.wxMilliSleep(1000)
         mc.mcSignalSetState(ToolChange,0) –Y107
end

         --Send signal to the Click to start the tool change.
         mc.mcSignalSetState(ToolChange,1) –Y108
         wx.wxMilliSleep(1000)
         mc.mcSignalSetState(ToolChange,0) –Y108
end

         
         --Wait for the signal from the CLick.         
         mc.mcCntlSetLastError(inst, "Wait for Click to complete tool change.")

If requested == 1 then
 rc = mc.mcSignalWait(inst, mc.ISIG_INPUT03, mc.ISIG_INPUT04, mc.ISIG_INPUT05, mc.ISIG_INPUT06, mc.WAIT_MODE_HIGH, 20) --X103, X104, X105, X106
end

If requested == 2 then
 rc = mc.mcSignalWait(inst, mc.ISIG_INPUT01, mc.ISIG_INPUT04, mc.ISIG_INPUT05, mc.ISIG_INPUT06, mc.WAIT_MODE_HIGH, 20) --X101, X104, X105, X106
end

If requested == 3 then
 rc = mc.mcSignalWait(inst, mc.ISIG_INPUT01, mc.ISIG_INPUT02, mc.ISIG_INPUT05, mc.ISIG_INPUT06, mc.WAIT_MODE_HIGH, 20) --X101, X102, X105, X106
end

If requested == 4 then
 rc = mc.mcSignalWait(inst, mc.ISIG_INPUT01, mc.ISIG_INPUT03, mc.ISIG_INPUT05, mc.ISIG_INPUT06, mc.WAIT_MODE_HIGH, 20) --X101, X103, X105, X106
end

If requested == 5 then
 rc = mc.mcSignalWait(inst, mc.ISIG_INPUT02, mc.ISIG_INPUT04, mc.ISIG_INPUT05, mc.ISIG_INPUT06, mc.WAIT_MODE_HIGH, 20) --X102, X104, X105, X106
end

If requested == 6 then
 rc = mc.mcSignalWait(inst, mc.ISIG_INPUT01, mc.ISIG_INPUT03, mc.ISIG_INPUT04, mc.ISIG_INPUT06, mc.WAIT_MODE_HIGH, 20) --X101, X103, X104, X106
end

If requested == 7 then
 rc = mc.mcSignalWait(inst, mc.ISIG_INPUT01, mc.ISIG_INPUT02, mc.ISIG_INPUT04, mc.ISIG_INPUT06, mc.WAIT_MODE_HIGH, 20) --X101, X102, X104, X106
end

If requested == 8 then
 rc = mc.mcSignalWait(inst, mc.ISIG_INPUT02, mc.ISIG_INPUT03, mc.ISIG_INPUT05, mc.ISIG_INPUT06, mc.WAIT_MODE_HIGH, 20) --X102, X103, X105, X106
end

         --Error check.  If the Click took too long.  Alarm out Mach4.
         if (rc~= 0) then
             wx.wxMessageBox("The Click did not complete the tool change in time.  Check for malfunction.")
             local Alarm = mc.mcSignalGetHandle(inst,mc.OSIG_ALARM)
             mc.mcSignalSetState(Alarm,1)
             CycleStop()
         else
             mc.mcCntlSetLastError(inst, "Current tool == " .. tostring(Requested))
             mc.mcToolSetCurrent(inst, Requested)
             mc.mcCntlSetLastError(inst, "Tool Change Complete.")
         end

    end--Request == Current

end --m6

if (mc.mcInEditor() == 1) then
 m6()
end

Offline Chaoticone

*
  • *
  •  5,624 5,624
  • Precision Chaos
    • View Profile
Re: Help with Mach 4 controlling a PLC for tool changes.
« Reply #27 on: January 24, 2018, 12:45:27 AM »
I would write the PLC ladder to look at a register to determine position to go to. Then in your M6 write the selected tool to that register.

Then write a 1 to another register to tell the PLC to start a tool change (it already knows what tool to go to because you just told it). This is the "go to work" signal in the PLC. The PLC will watch for the status of this register every scan.

Have your PLC do everything needed to change the tool. Get this working first. I have used a program named Qmodbus to read/write to the PLC for testing. Until you can do this, no reason to have Mach and the PLC talking to one another. You write the tool number to the register, then set the go to work bit to 1. The plc does all of the tool change then sets that go to work bit back to 0.

Once the tool change is complete, the PLC changes the go to work register back to 0 that started the PLC doing the tool change.

Mach will be watching this register and once it comes back as 0 (it can only == 0 after the PLC sets it to 0 because you just set it to 1) the M6 ends and Mach takes back off running your Gcode.

Think I remember reading and writing to C registers in the click for the stuff the PLC and Mach needed to be able to read and write.

« Last Edit: January 24, 2018, 12:47:00 AM by Chaoticone »
;D If you could see the things I have in my head, you would be laughing too. ;D

My guard dog is not what you need to worry about!
Re: Help with Mach 4 controlling a PLC for tool changes.
« Reply #28 on: January 24, 2018, 01:23:03 AM »
Chaoticone, I don't completely get what you mean, but it did make me realize that on my Click Input X106 is only triggered after a successful tool change.

So I can loose some code. I also added for tool change position.

--Mori Seiki SL-1 ATC
function m6()

local inst = mc.mcGetInstance()
local Requested = mc.mcToolGetSelected(inst)
local Current = mc.mcToolGetCurrent(inst)

if requested == 1 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT01) –Y101
mc.mcCntlGcodeExecuteWait (inst, “G90 G53 G00 X0.25 Z0.25”)
end

if requested == 2 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT02) –Y102
mc.mcCntlGcodeExecuteWait (inst, “G90 G53 G00 X0.25 Z0.25”)
end

if requested == 3 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT03) –Y103
mc.mcCntlGcodeExecuteWait (inst, “G90 G53 G00 X0.25 Z0.25”)
end

if requested == 4 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT04) –Y104
mc.mcCntlGcodeExecuteWait (inst, “G90 G53 G00 X0.25 Z0.25”)
end

if requested == 5 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT05) –Y105
mc.mcCntlGcodeExecuteWait (inst, “G90 G53 G00 X0.25 Z0.25”)
end

if requested == 6 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT06) –Y106
mc.mcCntlGcodeExecuteWait (inst, “G90 G53 G00 X0.25 Z0.25”)
end

if requested == 7 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT07) –Y107
mc.mcCntlGcodeExecuteWait (inst, “G90 G53 G00 X0.25 Z0.25”)
end

if requested == 8 then
     local ToolOutput = mc.mcSignalGetHandle(inst,mc.OSIG_OUTPUT08) –Y108
mc.mcCntlGcodeExecuteWait (inst, “G90 G53 G00 X0.25 Z0.25”)
end

   if Requested == Current then
       mc.mcCntlSetLastError(inst, "Current tool == Requested tool so there is nothing to do")
   else

         --Tell the Click to change to requested tool.
         local Y101 = mc.mcRegGetHandle(inst,"Clcik PLC/Requested Tool")
         mc.mcRegSetValue(Y101,Requested)
end

         --Tell the Click to change to requested tool.
         local Y102 = mc.mcRegGetHandle(inst,"Clcik PLC/Requested Tool")
         mc.mcRegSetValue(Y102,Requested)
end

         --Tell the Click to change to requested tool.
         local Y103 = mc.mcRegGetHandle(inst,"Clcik PLC/Requested Tool")
         mc.mcRegSetValue(Y103,Requested)
end

         --Tell the Click to change to requested tool.
         local Y104 = mc.mcRegGetHandle(inst,"Clcik PLC/Requested Tool")
         mc.mcRegSetValue(Y104,Requested)
end

         --Tell the Click to change to requested tool.
         local Y105 = mc.mcRegGetHandle(inst,"Clcik PLC/Requested Tool")
         mc.mcRegSetValue(Y105,Requested)
end

         --Tell the Click to change to requested tool.
         local Y106 = mc.mcRegGetHandle(inst,"Clcik PLC/Requested Tool")
         mc.mcRegSetValue(Y106,Requested)
end

         --Tell the Click to change to requested tool.
         local Y107 = mc.mcRegGetHandle(inst,"Clcik PLC/Requested Tool")
         mc.mcRegSetValue(Y107,Requested)
end

         --Tell the Click to change to requested tool.
         local Y108 = mc.mcRegGetHandle(inst,"Clcik PLC/Requested Tool")
         mc.mcRegSetValue(Y108,Requested)
end

         --Send signal to the Click to start the tool change.
         mc.mcSignalSetState(ToolChange,1) –Y101
         wx.wxMilliSleep(1000)
         mc.mcSignalSetState(ToolChange,0) –Y101
end

         --Send signal to the Click to start the tool change.
         mc.mcSignalSetState(ToolChange,1) –Y102
         wx.wxMilliSleep(1000)
         mc.mcSignalSetState(ToolChange,0) –Y102
end

         --Send signal to the Click to start the tool change.
         mc.mcSignalSetState(ToolChange,1) –Y103
         wx.wxMilliSleep(1000)
         mc.mcSignalSetState(ToolChange,0) –Y103
end

         --Send signal to the Click to start the tool change.
         mc.mcSignalSetState(ToolChange,1) –Y104
         wx.wxMilliSleep(1000)
         mc.mcSignalSetState(ToolChange,0) –Y104
end

         --Send signal to the Click to start the tool change.
         mc.mcSignalSetState(ToolChange,1) –Y105
         wx.wxMilliSleep(1000)
         mc.mcSignalSetState(ToolChange,0) –Y105
end

         --Send signal to the Click to start the tool change.
         mc.mcSignalSetState(ToolChange,1) –Y106
         wx.wxMilliSleep(1000)
         mc.mcSignalSetState(ToolChange,0) –Y106
end

         --Send signal to the Click to start the tool change.
         mc.mcSignalSetState(ToolChange,1) –Y107
         wx.wxMilliSleep(1000)
         mc.mcSignalSetState(ToolChange,0) –Y107
end

         --Send signal to the Click to start the tool change.
         mc.mcSignalSetState(ToolChange,1) –Y108
         wx.wxMilliSleep(1000)
         mc.mcSignalSetState(ToolChange,0) –Y108
end

         
         --Wait for the signal from the CLick.         
         mc.mcCntlSetLastError(inst, "Wait for Click to complete tool change.")

 rc = mc.mcSignalWait(inst, mc.ISIG_INPUT06, mc.WAIT_MODE_HIGH, 20) --X106
end

         --Error check.  If the Click took too long.  Alarm out Mach4.
         if (rc~= 0) then
             wx.wxMessageBox("The Click did not complete the tool change in time.  Check for malfunction.")
             local Alarm = mc.mcSignalGetHandle(inst,mc.OSIG_ALARM)
             mc.mcSignalSetState(Alarm,1)
             CycleStop()
         else
             mc.mcCntlSetLastError(inst, "Current tool == " .. tostring(Requested))
             mc.mcToolSetCurrent(inst, Requested)
             mc.mcCntlSetLastError(inst, "Tool Change Complete.")
         end

    end--Request == Current

end --m6

if (mc.mcInEditor() == 1) then
 m6()
end

Offline Chaoticone

*
  • *
  •  5,624 5,624
  • Precision Chaos
    • View Profile
Re: Help with Mach 4 controlling a PLC for tool changes.
« Reply #29 on: January 24, 2018, 01:48:27 AM »
If you do it like I'm suggesting, you can get rid of just about all of that script. It does require the PLC ladder to handle all of the tool change internally though but how it should be IMO.

function m6()
    local current = mc.mcGetCurret(inst)
    local selected = mc.mcGetSelected(inst)

    if (current ~= selected) then --do a tool change
        Set tool number reg in PLC to selected
        Set go to work bit to 1 --Maybe fire a PLC output to a Mach input instead or map that register to an input so can do a wait for signal
        rc = mc.mcSignalWait(signal, state, time)
        if (rc ~= 0) then --we had some kind of error
            mc.mcCntlSetLastError(inst, "Tool Change Failed" )
            mc.mcCntlCycleStop(inst)
        end
    end
end

That's not exactly right but about all the script you would need.
« Last Edit: January 24, 2018, 02:20:47 AM by Chaoticone »
;D If you could see the things I have in my head, you would be laughing too. ;D

My guard dog is not what you need to worry about!