|
Hi again Ralf,
Well, that formula works perfectly if v0 is 0...
If v0 > 0 then I need to loop to decrease the vmax to make it suitable to the movement... which is super-ugly in the best case.
So... I guess that the formula you sent me is good, but it lacks the control of v0.
LimitIterations = 1000
ta = Abs((vmax - v0) / a)
da = (v0 * ta) + (0.5 * a * ta * ta)
tf = Abs((vmax - vf) / a)
df = (vf * tf) + (0.5 * a * tf * tf)
If (da + df > dist + 0.000000001) Then
DistTotal = xf - x0 - da - df
RelAccDec = da / (da + df)
dist_corr_acc = DistTotal * RelAccDec
da = da + dist_corr_acc
dist_corr_dec = DistTotal * (1 - RelAccDec)
df = df + dist_corr_dec
taux = Sqr(da / (0.5 * a))
taux = (Sqr((2 * a * da) + (v0 * v0)) - v0) / a
vmax = v0 + (a * taux)
Do
ta = Abs((vmax - v0) / a)
da = (v0 * ta) + (0.5 * a * ta * ta)
tf = Abs((vmax - vf) / a)
df = (vf * tf) + (0.5 * a * tf * tf)
If (da + df > dist + 0.000000001) Then
vmax = vmax - 1
iterations = iterations + 1
If (iterations > LimitIterations) Then
ErrorID = 1
Exit Do
End If
Else
Exit Do
End If
Loop
End If
So this is what I've done till now... It should be much easier to find the maximum speed available for the movement.
so, thank you very much for your time.
Joan.
|
|
|
|
|
Hi Joan,
I think I will later take a look to this specific part of your Problem.
Until now I only saw the regular Movement-Characteristic (Start with v=0, Accelerate, perhaps drive with vMax, Decelerate to v=0).
What you now have is : your Movement is not finished a Point x1, from this Point you start a new Movement to Point x2 with perhaps new Parameters. So your Ending-Speed a x1 is not =0 - it should be the working-speed for the new Movement.
Am I right so far ?
What kind of machine do you want to control ?
I think your Motor is not a Synchron-(Servo-)Motor - I suppose you have an ASynchron-(Frequency-controlled-)Motor or a Stepper-Motor ...?
|
|
|
|
|
Hi again Ralf,
Thank you.
Yes and no, a normal movement will be from x0 (at v0) to xf (at vf) (usually both speeds will be 0).
But, Imagine that while on the path to x0 to xf the user press stop and the motor must stop as soon as possible.
Then I'll have to send the motor at it's nearest possible position and therefore the v0 will be the one it was used at the moment the user pressed the stop button. So a normal movement but with a v0 > 0.
The machine I want to control is a special prototype for cutting and pile paper sheets at a very fast rate, but the worst part here is that the customer has decided to use asynchronous motors and drives to move the axis on the part of the machine I'm in charge... with servomotors this would be super-easy... drives and asynchronous motors offer some problems due to accelerations, inertia... and of course the position, speed, torque loops must be created from scratch as the CNC can't handle them... (well, it could using a virtual axis and using that virtual axis as the master of the asynchronous drive, but the customer doesn't want it).
PS: the strange formula just before the ugly code comes from this page: Help w/ acceleration formula | Physics Forums - The Fusion of Science and Community[^] :
a = Vc/t
a = (Ve-Vo)/t
a = ( (Vo^2 + 2ad)^(1/2) - Vo )/t
at = ( (Vo^2 + 2ad)^(1/2) - Vo )
t = ( (Vo^2 + 2ad)^(1/2) - Vo )/a
You are right so far...
PS2: And a little bit more of information:
This:
taux = (Sqr((2 * a * da) + (v0 * v0)) - v0) / a
vmax = v0 + (a * taux) Gives exactly the same than this:
vmax = Sqr((v0 * v0) + 2 * a * (da))
which is wrong...
Joan.
modified 8-Feb-17 3:29am.
|
|
|
|
|
Hi Joan,
I think I understand your Problem because Automation of machines is also my Profession.
I'm not sure that an asynchronous Motor is the right approach - but that would be another Story.
If you want to stop the Motor during it's cycle (because of urgency or a fault) you don't need to calculate the distance - here it is necessary (my opinion) to realize a maximum of decelaration.
I thought that you wanted to change from one Speed to another during positioning (splining).
In this case the formula's should be corrected ... I think I have a Solution for this.
Cheers
Ralf
|
|
|
|
|
Hi Ralf,
Ralf Meier wrote: I'm not sure that an asynchronous Motor is the right approach
It is not... but customers are here to make our lives easy, aren't they?
Ralf Meier wrote: If you want to stop the Motor during it's cycle (because of urgency or a fault) you don't need to calculate the distance - here it is necessary (my opinion) to realize a maximum of decelaration.
Yes, in that case that would be the desired thing. I'm not thinking on an emergency situation, just a stop button press (aborting the movement of an axis gracefully).
And of course, having the possibility to change the destination while the axis is moving would be a plus.
Ralf Meier wrote: In this case the formula's should be corrected ... I think I have a Solution for this.
Thank you again.
|
|
|
|
|
OK ... this is my Approach :
I have a movement x0 to x1 completed and change now directly to the movement x1 to x2.
The movement x1 to x2 has a different speed and perhaps a different accelaration.
To calculate the time for the speed-change I use your formula t = v / a but now v is the difference between v_x0_x1 and v_x1_x2
So : t = abs(v_x0_x1 - v_x1_x2) / a_x1
Then you get the distance for the speed-change (slower or faster) = 0,5 * a_x1 * t^2
Be so kind and put this into your test and tell me your results ...
... to be continued
|
|
|
|
|
Hi again Ralf,
Ralf Meier wrote: So : t = abs(v_x0_x1 - v_x1_x2) / a_x1
So... In my case, given the axis was still moving when a new command has entered:
t = abs(v0 - vmax)/a
As the acceleration must be constant for all the axis movements.
v0 is the speed it was active at the new command reception, so it was the speed the axis was moving from x0 to x1, vmax is the speed I want from x1 to x2 and again, a is constant.
This gives me the time to change from v0 to vmax... so the ta time in my code.
Then I'm using the 0.5*a*t^2 and I get
da = 0.5*a*ta^2
Which again gives me the same results that I had before...
Thank you very much.
|
|
|
|
|
I'm sorry Joan ...
But I think you made a mistake.
Of course ... you could use allways the same accelaration - but if you for example change the speed from one movement to the other then time you need for this change must be different because you only have to work with the delta-Speed (the difference between the actual speed and this one you want to have next). So ... the way for this change must also be different. ...
I'm not sure if you took the right values for the calculation ...
...
|
|
|
|
|
Don't be sorry...
I'm sure I've made plenty of them.
Tomorrow I'll continue with the testing at the customer workshop.
I'll let you know if I get something working or not...
Thank you again!
modified 8-Feb-17 15:07pm.
|
|
|
|
|
I'm awaiting your feedback ...
|
|
|
|
|
I think I understand now my problem...
When the da + df are bigger than the total distance...
I'm doing a proportional reduction which approximates the vmax to it's desired/needed value.
The problem here I think is that part: I don't have to make a proportional reduction, I do need to find the position in which the acceleration movement and the deceleration movement are coincident once I will have this position then I should check the speed any of the movements has in that position. And that one should be vmax.
Now the issue is doing that, but tonight I'll try to get it.
I could use 0 as the starting position for the acceleration and xf as the starting position for the deceleration.
Both accelerations are the same (different signs).
...
Let's see...
|
|
|
|
|
I think you are right.
V-max is the speed you want to get - but this speed you couldn't get because of the acceleration-decelaration-triangles.
What I have done is : I calculated the possible speed (V-x) respectively the resulting changes.
But Joan ... for me this is a very interesting discussion.
Also : thanks a lot for the votings you gave to me ...
|
|
|
|
|
You are welcome!
Any idea on how to solve that problem?
This remembers me the school days when we had to find the intersection of two vectors...
Believe it or not I enjoyed that a lot, but I can't simply remember how it works
|
|
|
|
|
Hi Joan,
Joan M wrote: Any idea on how to solve that problem?
Joan M wrote: This remembers me the school days when we had to find the intersection of two vectors...
I think, both quotes belong together ...
And ... I believe you because I also searched for the same : how to get the point, where both vector-lines crosses.
My Approach is that this consists of 2 right-angled triangles. Both angles have the same opposite-side, so that would be the common part of the equation.
But if I thought a Moment that this is the Solution then I must say : mistaken - but I promise that I will think about it.
I come back if I know how to get further ...
|
|
|
|
|
An idea :
Assuming that you have the same Acceleration- and Decelaration-Value your Acceleration-Distance (if you could not reach v-max) must be half of the distance between x0 and x1.
What we can do is to calculate the distance for Acceleration. At the end of this we have v-max.
Now we can use the rule-of-3 (I hope this is the right name for that Operation) to calculate the Speed v-x because there is a direct relation between da : s/2 and v-max : v-x
Could you follow me (and check if you could work with that) ?
see you
Ralf
|
|
|
|
|
This already works, only if the v0 is equal vf.
If both speeds are different (we start from a moving situation and end stopped) then this approach fails.
|
|
|
|
|
I can't understand because in this case (i wrote it allready somewhere before) you have to calculate with the difference between both Speeds.
As long as the angle (accelaration/decelaration) is not different this calculation MUST match ...
|
|
|
|
|
Then I have not understood you before, and I don't know what you exactly meant with the speed difference...
|
|
|
|
|
Excuse me ...
The Speed-difference is the difference between the Speed with which you actually drive (between X0 and X1) and the Speed you wish to drive (between X1 and X2).
But for me it is the same as if you reduce to Zero - then the difference would be the complete Speed - otherwise it is the delta-Speed.
Could you follow me now ?
|
|
|
|
|
Another question for this "exercise" :
Have you realized that asynchronous Motors, driven by a frequency-controller, don't have the same turning-moment during the used frequency-range ?
That means : as lower your frequency is as lower is your turning Moment.
This would be a Problem to get the right final-Position when decelarating.
A synchronous Motor (servo-axis) is able to compensate itself (and the perhaps not correct reached final Position) - a asynchonous Motor not ...
|
|
|
|
|
Yes, at the exit of the theoretically calculated position I do have a PID that is used to get the motor to the place. And of course a minimum movement distance is also adjusted.
|
|
|
|
|
Another part which interest me :
How do you get the data out of your .Net-Application into the Motor-Controller ?
|
|
|
|
|
I'm not sending the values to the application now.
I'm just calculating in excel and then testing stress cases, all the calculations are done in the PLC and then everything works from there.
But if I would have to do it, if I would work with Beckhoff (which is the main brand I've worked with) then I would use ADS and it would be a breeze doing that...
I guess that each brand will have their methods... OPC and others, but when (like me) PC control is used then it is extremely easy to do that kind of operation.
|
|
|
|
|
I understand ...
But also the PLC should be able to do this work - either Beckhoff or Siemens (with which I work most of time) - and the calculation in ST (or with SLC when using Siemens) should be easy if once the formula and the algorithm is ready ...
|
|
|
|
|
Working now, updated the initial post if you want to see how I've done it.
Thank you for your hints...
|
|
|
|