Jump to content

True Position


---
 Share

Recommended Posts

The tolerance is a formula in PCM, if you right click on it and choose formula, you can see it.

Values that are determined by formulas are shown as yellow in Calypso.
Link to comment
Share on other sites

I'm betting the print gives MMC or LMC in the true position callout of the slot. A formula is required to calculate MMC or LMC because Calypso does not allow that when it comes to a feature like that.
Link to comment
Share on other sites

  • 2 weeks later...
I created the following document as a guide for how / why the formula for MMC on slots or external features of size can be created in Calypso using PCM.

It goes through the reasoning behind the different formula's as well as giving the final result at the end.

Sometimes this can be accomplished using symmetry plane since it allows for using MMC however, maybe its just me, but it has always seemed to be hit or miss whether symmetry plane works or not.

(well apparantly attachments aren't working.. will paste it below.. )


Calculating MMC Bonus for Internal and External Features of Size


- Derek Stedman 01/11/2019 -



Within PCM, the bonus tolerance for a MMC callout can be calculated using the formulas provided in the following pages of this document.
Keep in mind, it requires two different formulas to handle internal versus external features of size.
I wrote this guide mainly because I kept finding myself re-creating this work over and over again on different projects and thought it would be nice to have a good template to work from.
Hopefully this provides some help/insight to someone out there. Feel free to pass this on if you wish.


IMPORTANT NOTE:
Datum Shift cannot be calculated using these (or pretty much any) formulas – Do not attempt to use them for that! If you do you they will NOT calculate the correct answer.
Unless the option for MMC is shown in your characteristic, Datum shift is not supported in Calypso due to the fact that any pattern must meet the simultaneous requirement which is implicit in any pattern. Features on the part must also meet the simultaneous requirement if they are called out to a common datum reference frame. Due to this requirement, other than in certain very limited circumstances calculating datum shift is made impossible due to the fact that allowing the Datum to float due to size will influence all holes / slots / features which are called out to it and depending on part geometry will affect results differently depending on the relationship of the individual features to the datum.
If you’re interested in understanding more just look up Datum Shift on Google and I am sure there will be more information there than you are likely to want to read.


The Completed Formulas

The following are the complete formulas. The rest of this paper explains the reasoning behind why the formulas were created this way.

Inside features of size:
tbase + max(min(dAct - (dNom + tlower) , (dNom + tupper) - (dNom + tlower)),0.0)

Outside features of size:
tbase + max(min((dNom + tupper) - dAct) , (dNom + tupper) - (dNom + tlower)),0.0)


The components within the formulas are listed below.
For the sake of our PCM examples, we will assume the characteristic being used to calculate MMC will be: "SEQ 21 0.270 Distance"

dNom Nominal diameter
PCM = getNominal("SEQ 21 0.270 Distance").nominal
 (*** In older versions of Calypso, getNominal may or may need to be converted by dividing by 25.4 when using imperial units)
dAct Actual diameter of the computed feature
PCM = getActual("SEQ 21 0.270 Distance").actual
tupper Upper tolerance (value with sign)
PCM = getNominal("SEQ 21 0.270 Distance").tolerance.upperTolerance
tlower Lower tolerance (value with sign)
PCM = getNominal("SEQ 21 0.270 Distance").tolerance.lowerTolerance
tbase The tolerance specified in the call out prior to calculating the MMC Bonus.

For the sake of the examples used we will assume we have the following values to work from.
dAct = 0.269970 dNom = 0.270 tupper = 0.002 tlower = -0.002 tbase = 0.002


The Basic Formulas

The formulas below are the basic starting point in creating a formula to calculate the MMC bonus.

Inside feature: dAct - (dNom + tlower)
Outside feature: (dNom + tupper) - dAct

On an internal feature, dAct - (dNom + tlower) determines how far above low limit the actual value is because as an internal feature low limit is the maximum material condition.
(dNom + tlower) calculates the lower limit.
Substituting with actual values we would have.
dAct - (dNom + tlower) = 0.269970- (0.270 + -0.002)
Which simplifies to 0.269970 - 0.268 = 0.00197

On an external feature, (dNom + tupper) – dAct determines how far from high limit the actual value is because as an external feature high limit is the maximum material condition.
(dNom + tupper) calculates the upper limit.
Substituting with actual values we would have.
(dNom + tupper) – dAct = (0.270 + 0.002) - 0.269970
Which simplifies to 0.272 - 0.269970 = 0.00203

Addition is used when calculating the upper / lower limits because tlower and tupper are signed values that come from the characteristic tolerances. This allows the formulas to work whether the characteristic has tolerances that are plus/plus, plus/minus or minus/minus.

Overall, the formulas are still simplistic, however they do calculate the bonus tolerance.
They would technically function as is, however they do not handle out of tolerance conditions on the feature of size. Using them like this would allow them to calculate an allowable MMC tolerance that was larger than the total allowable tolerance band, if the deviation was in the other direction, you might end up with a MMC tolerance that was in the negative.
It is doubtful either of these situation’s would cause a bad part to be accepted, however it would certainly look odd in the results, so we can make the effort to improve on them somewhat.

Limiting Result to Total Tolerance Band

Our first step is to limit the maximum calculated tolerance so it is unable to exceed the total allowable tolerance band of the feature. We will use the min() function as shown below.

Inside feature: min(dAct - (dNom + tlower) , (dNom + tupper) - (dNom + tlower))
Outside feature: min((dNom + tupper) - dAct) , (dNom + tupper) - (dNom + tlower))

The min() or minimum function is quite simple, it accepts two inputs and it returns the smaller of the two.
We have already gone over the first input above, it calculates the MMC Bonus.
The second input into the min() function is new. It calculates the total tolerance band of the characteristic.
The formula for the total tolerance band is shown below.

(dNom + tupper) - (dNom + tlower)

Unlike calculating the MMC Bonus, the total tolerance band is calculated the same for internal and external features.
The formula is pretty simple, the first part calculates the upper limit, the second part calculates the lower limit.
The lower limit is subtracted from the upper limit to calculate the total tolerance band.
The end result is the min() function is called with the MMC Bonus and the total tolerance band and it returns the smaller of the two values.

If the calculated MMC Bonus is less than the total tolerance band, then it is returned as the answer, however if it is greater than the total tolerance band then the total tolerance band is returned as the answer.
This brings us closer to a solution, however there is still a potential issue, where we could end up with the calculated result providing a negative result for the calculated tolerance.

Eliminating Negative Results

The previous step allowed us to make sure that the maximum value calculated for the MMC Bonus would be the value of the total tolerance band. However that only handles what happens when the feature of size deviates away from MMC towards LMC. In reality the feature of size may in fact deviate away from MMC and LMC and in those cases the results from the formulas shown on the last page would result in a negative result.

On an internal feature, we need to handle the case where the feature is undersize. We can do this by adding the max() function as follows.

max(min(dAct - (dNom + tlower) , (dNom + tupper) - (dNom + tlower)),0.0)

This will return the maximum of the two inputs, so if the original part of our formula yields a negative answer the value that is returned will be 0.0

On an external feature, We use the same max() function as with the internal feature to modify the function to guard against the possibility of the calculated MMC result being a negative value if the measured value is larger than high limit.
So we modify the formula as shown below.

max(min((dNom + tupper) - dAct) , (dNom + tupper) - (dNom + tlower)),0.0)

This guarantees that the value returned will always be non-zero.


Additional tolerance:

On an internal feature of size, if the callout is 0.000 MMC then the formula as shown so far will work fine as is, however if the call out allows more tolerance at MMC we need to add our result to our initial tolerance.
We can do this by modifying the original formula just a little more as follows.

tbase + max(min(dAct - (dNom + tlower) , (dNom + tupper) - (dNom + tlower)),0.0)

Putting this all together, our completed formula in PCM for an internal feature should look like this.

0.002 + max(min(getActual("SEQ 21 0.270 Distance").actual - (getNominal("SEQ 21 0.270 Distance").nominal + getNominal("SEQ 21 0.270 Distance").tolerance.lowerTolerance) , (getNominal("SEQ 21 0.270 Distance").nominal + getNominal("SEQ 21 0.270 Distance").tolerance.upperTolerance) - (getNominal("SEQ 21 0.270 Distance").nominal + getNominal("SEQ 21 0.270 Distance").tolerance.lowerTolerance)),0.0)


On an external feature, just like with an internal feature, if the callout is 0.000 MMC then the formula as shown so far will work fine as is, however if the call out allows more tolerance at MMC we need to add our result to our initial tolerance.
We can do this by modifying the original formula just a little more as follows.

tbase + max(min((dNom + tupper) - dAct) , (dNom + tupper) - (dNom + tlower)),0.0)

Putting this all together, our completed formula in PCM for an external feature should look like this.

0.002 + max(min((getNominal("SEQ 21 0.270 Distance").nominal + getNominal("SEQ 21 0.270 Distance").tolerance.upperTolerance) - getActual("SEQ 21 0.270 Distance").actual) , (getNominal("SEQ 21 0.270 Distance").nominal + getNominal("SEQ 21 0.270 Distance").tolerance.upperTolerance) - (getNominal("SEQ 21 0.270 Distance").nominal + getNominal("SEQ 21 0.270 Distance").tolerance.lowerTolerance)),0.0)
Link to comment
Share on other sites

 Share

×
×
  • Create New...