Internet PLC Forum

General => Technical support => Topic started by: cdenk on June 27, 2010, 11:20:03 AM

Title: Debounce Interupt ??
Post by: cdenk on June 27, 2010, 11:20:03 AM
I have a water meter with a dry contact reed switch that cycles 1 time per gallon, and 20 GPM maximum, so maximum frequency that the PLC interrupt will see is less than 2 seconds per cycle. In testing the programming, I have used a jumper wire to generate activity on the interrupt pin, and get multiple interrupts even when trying to minimize.

How can I debounce the interrupt??
Title: Re:Debounce Interupt ??
Post by: garysdickinson on June 27, 2010, 03:53:52 PM
I have a couple suggestions on signal debounce:
Good Luck,

Gary D.
Title: Re:Debounce Interupt ??
Post by: cdenk on June 27, 2010, 05:28:03 PM
Thanks for the reply.

I question whether the scan time is short enough to reliably catch the switch pulse. The program is 4200 code words long with many custom functions, some which do have brief waits. I use a counter to select a MD-HMI screen from a half dozen, using a function key to increment the counter. Clicking the function key doesn't reliably increment the counter.

I was thinking there was a method using a timer, but that likely would involve the scan time.

I was thinking, I might have to use a 555 timer to debounce, but if that's  a way to go, probably would just build up a PIC board. Probably got to do that anyway to interface a remote display. This system has no other involvement with the PLC. The PLC has plenty of unused I/O, and could handle this with minimum effect on other duties.

Good thought on the resistor to protect the switch. The switch does have a maximum current limit.
Title: Re:Debounce Interupt ??
Post by: garysdickinson on June 27, 2010, 11:36:01 PM
cnenk,

If your real problem is that your scan time is so long that the PLC misses input events, then your problem isn't a debounce issue but a software architecture issue.

I assume that the 555 idea is to act as a "pulse stretcher" to ensure that the PLC will "see" the input.   This helps mask your long scan time problem.

If you go the 555 route, keep in mind the following:
An Aside:

If your scan time has been extended to the point that it misses inputs, its time to rethink your software architecture.  It'd be a good time to instrument your PLC and determine what is actually responsible for your long scan times.

You mentioned that some of your custom functions have "brief waits".  I'm assuming that you are either using the TBASIC DELAY statement or some other time wasting mechanism. I'd start by reworking any custom function that requires a time waster (scan time extender).

Gary D.
Title: Re:Debounce Interupt ??
Post by: cdenk on June 28, 2010, 06:28:02 AM
There are no "Delay" used, but there are quite a few loops that take time to execute, including some quick occuring event to occur. I have tried to program to minimize the time, but as a hobbyist, with this being the my first experience with a PLC, I am far from an expert. :( But am always happy to learn. :)

I tried once to determine the scan time by starting a timer at the beginning and reading it next time through the scan, but it didn't seem to provide usable results. Might have to get into that again.

The PLC manages a standby generator that runs 3 fuels (natural gas from our well, gasoline from a nearby 175 gallon tank used for vehicles, or propane) switching fuels automatically depending what is available. The PLC has done this reliably for 5 years.
Title: Re:Debounce Interupt ??
Post by: garysdickinson on June 28, 2010, 10:03:33 AM
cdenk,

I done some more thinking on how you might use the interrupt input with a mechanically noisy input.  

I'd suggest adding a bit of ladder logic to mask the bounces and a couple lines to your interrupt code so that it only counts the first bounce as being important.

In the following example Mask is a RELAY used to communicate between your ladder logic and interrupt routine.  Timer1 used to mask the entire time that the contact is ON including all of the bounces.  I'd suggest programming the SV to 10 (1 second) to mask any bounces of both the closing and the opening of the contact.  EnableInts is a NEW custom function to re-enable the interrupt logic once the contacts are known to be no longer bouncing.

OK, first the ladder logic:

  Mask                      Timer1
---||------------------(TIM)

  Timer1                     Mask
---||--------------+---[Clear]
                           |
                           |     EnableInts
                           +---{dCusF}

                       
Now the change to the interrupt code:

INTROFF 1      ' Disable interrupts
SetIO MASK   ' start the event mask timer
'
' the rest of the interrupt code goes here.

New custom functions EnableInts:

INTRDEF 1, fn_num, 1


Give this a try.

Gary D.
Title: Re:Debounce Interupt ??
Post by: cdenk on June 30, 2010, 06:28:40 PM
Sorry for not getting back sooner, we had some heavy weather pass through, took down a couple of good sized Norway spruce, have been cleaning up.

Added a Cust Fun near the beginning of the ladder to determine the lapsed time for 1000 cycles through the ladder. Found 1783 maximum HS timer ticks of 0.01 seconds = 0.0178 seconds per cycle. This should easily grab my 2 second period for switch closures. This is in line with Gary's first comment. Hope my findings are correct. Here is the Cust Fun code:

'DM[3945] Is a counter for how many times we have been through the ladder loop
'First time here, start the timer at 6000
if DM[3945] = 0
TimerPV[1] = 6000

ENDIF

IF DM[3945] = 1000
'Timer 1 is set as a high speed timer with 01 second per tick, and will measure the period for the number of iterations
DM[3946] = 6000 - TimerPV[1]
'DM[3946] Is the actual number of time ticks elapsed, and DM[3947} is the maximum number of ticks
IF DM[3946] > DM[3947]
DM[3947] = DM[3946]
 DM[3945] = 0
ENDIF
ELSE
DM[3945] = DM[3945] + 1
ENDIF

I will save the code that Gary generated, probably will be a learning experience.

Thanks again. :)
Title: Re:Debounce Interupt ??
Post by: garysdickinson on June 30, 2010, 09:31:59 PM
cdenk,

You've done well with your instrumentation.  The high resolution timer is an excellent trick.   Tracking the maximum time was even better.

I often wiggle a PLC output bit using a single bit of ladder logic. I'll monitor the output with an old school oscilloscope.  Output16 will change state on every scan:

  Output16                                     Output16
---|\|-------------------------------(OUT)

With your calculation of a 17.8 ms scan period, your program doesn't seem to have put a huge burden on the PLC.  This translates to a scan frequency of over 56 Hz.  This should be plenty fast enough to not miss your contact closure.

I would think that you shouldn't need to use the interrupt mechanism to deal with your water meter.   A normal input pin should work fine.

Well done,

Gary d.
Title: Re:Debounce Interupt ??
Post by: cdenk on July 01, 2010, 05:25:07 AM
Thanks again, I'll have to try that output toggle with a DMM that has frequency function. I don't have an o-scope :(

I just thought, based on an issue I have with using one of the HMI function keys to advance a counter to change the HMI display not being reliable was a result of the PLC being slow. But that's an issue for another topic. Probably will be a week or so before that come to the top of the list. Now I can install the meter over the weekend. :)
Title: Re:Debounce Interupt ??
Post by: cdenk on July 03, 2010, 03:16:10 PM
2 Items:
1: Toggled an output bit with a rung of logic. Put my DMM in frequency mode on it, and saw around 50hz. but since it takes to scans to make 1 cycle of the pin, that would put the scan at 100 hz. That's all order of magnitude close.
2: Moved the switch input to an ordinary input pin. Had to put a 0.5 second clock special bit in series to debounce. Used an unmounted reed switch with small hand held magnet as a trigger. Looks like that will work. The meter with the reed switch does have a mechanical dial that can be read to the gallon. Likely they have a magnet on one of the dials that turns around once per gallon. The meter is close to the PLC so I can keep an eye on the readings.

Thanks again. :)