Jump to content
OMRON Forums

sutty

Members
  • Posts

    80
  • Joined

  • Last visited

  • Days Won

    2

Posts posted by sutty

  1. Yes, it is!

    When I set Motor[4].Servo.MinGainFactor = Motor[4].Servo.MaxGainFactor (which forces Motor[4].Servo.GainFactor to that value) = "GainFactor" I calculated according several NominalGain-estimations, and it works from 0 to 100 kg.

    For example I tune the 100kg system. Estimate Nominal Gain for 100 kg (around 50) and for 22kg (around 500). So I set Motor[4].Servo.MinGainFactor = Motor[4].Servo.MaxGainFactor = 50/500 = 0.1 which forces Motor[4].Servo.GainFactor = 0.1.

    Might the cascading of motor #4 and #24 be a issue?

  2. Hi Steve!

    I rised EstTime up to 3000 - no improvments at all.

    I have to mention again that that ABS(Motor[4].Servo.EstGain) wont rise above 2e-2 in no case.

    Motor[4].Servo.NominalGain=4800
    Motor[4].Servo.EstMinDac=100
    Motor[4].Servo.EstTime=300
    Motor[4].Servo.MinGainFactor=1
    Motor[4].Servo.MaxGainFactor=5

    image.thumb.png.45c8e584aca336bff0f94ff4a32e5a5e.png

     

    Motor[4].Servo.NominalGain=4800
    Motor[4].Servo.EstMinDac=100
    Motor[4].Servo.EstTime=3000
    Motor[4].Servo.MinGainFactor=1
    Motor[4].Servo.MaxGainFactor=5

    image.thumb.png.ec0b5bf2bf0da4a48c45bc6bea370e1d.png

  3. Hi!

    It's one axis. Did tuning unloaded. IDE-Tune-tool says: NominalGain=4800 (unloaded) resp. 550 (loaded with 21,94 kg)

    Servo: 16kHz

    RTI: 2 kHz

    Topology: Motor #4 and Motor #24 (put-through only) cascaded

    Set Adaptive-Control-Parameters:

    Motor[4].Servo.NominalGain=4800
    Motor[4].Servo.EstMinDac=100
    Motor[4].Servo.EstTime=160
    Motor[4].Servo.MinGainFactor=1
    Motor[4].Servo.MaxGainFactor=9
    Motor[4].Servo.MinW=0
    Motor[4].Servo.MaxW=0
    Motor[4].Servo.MinDR=0
    Motor[4].Servo.MaxDR=0

    Put load with 21,94 kg (total of 100 kg possible) on.

    Motor[4].Servo.GainFactor remains all time at 1!!

    Motor[4].Servo.EstGain wont go above 0.02

    Lowering MinGainFactor would lower GainFactor during accel/deceleration equally to MinGainFactor

    By the way setting MinGainFactor = MaxGainFactor = 9 would give a nice and stable setup with 21,94 kg load.

    I am really rookie-like - but can anybody show me a good practice example?!!

    Would I absolutely have to also set MaxW, MinW, MaxDR and MinDR?

    Thanks and regards,

    Anton

     

     

  4. Hi Curt!

    Besides this mystery, what do you think, will I completely overcome this phenomenon by simply using whole-words resp P-Vars ?

     

    The attachment is a simple ppmac-project which leads on a umac-arm cpu to such issue.

    P3=0 (whole-word access - no errors)

    P3!=0 (bit access - erroneous)

    I used a gate3 for the clocks.

    No physical hw (motors ..)

     

    Have a nice weekend!

    VarSync_09_ppmac_from_scratch.zip

  5. Hi Curt!

    I took a plot of what happens here:

    m2->u.user:$1884.26.1

    plc4: increments p1+=1 and resets m2=0 if m2==1

    uws: increments p2+=1 and sets m2=1 if m2==0

    with Sys.BgSleepTime=1000 the difference between counter p1 and p2 remains 0

    with Sys.BgSleepTime=250 p2 advances about 1 each 10s

     

    Discussion:

    In the plot below it shows on the left that plc 4 increments p1 (purple) and resets m2=0, then uws increments p2 (orange) and sets m2=1.

    To the right it shows, that plc4 increments p1 and resets m2=0, but must be interrupted by uws, which (for whatever reason?) already sees m2=0 and so increments p2, but does NOT succeed setting m2=1. plc4 resumes at the point where it was interrupted by uws before and finishes up (in any case without incrementing p1). uws at next interrupt still sees m2=0 and does its job (increments p2 and sets m2=1) once more time. now p2 leads p1.

     

    Is this what you expect it to do?!

    I dont get it, that uws can see m2 already equal 0 even though plc4 has not finished its task?!!

    plot03.thumb.jpg.e82f20a04e734a2fe77be7a9c8fbd7f8.jpg

  6. Eric,

    uws sets M1=1 only if it reads M1==0 & Capture has happened

    bgplc resets M1=0 only if it reads M1==1.

     

    What I was asking for, can it be possible uws fails writing M1=1 at all (in that circumstance that uws interrupted bgplc while bgplc was just reading M1 & a Capturing has happened so uws would want to set M1=1)

     

    Using M1->*u or M1->u.user:$001880.0.32 (whole-word access) instead of M1->u.user:$001880.26.1 (bit access - multi-step process) are both possible solutions for this issue?

     

    Regards,

    Anton

  7. Curt, will your suggestion to use whole-words (avoiding multi-step process) solve such issue in all cases (100%)?

     

    I am asking because in our case:

    uws checks a caputre flag. If the capture has happened it sets variable M1=1

    bgplc polls M1. After it sees M1==1 it does stuff and at the end resets M1=0

    But in very raw cases M1 never gets set even tough the capture has happened.

     

    Is that possible while bgplc only reads M1, the interrupting uws can not change M1 at all?!

    What do you mean by implicit/explicit operations?

    Would it also help to use a self-definded M1->*u instead?

  8. Hi!

     

    In usrcode.c (user-written-servo) I am reading from and writing to M-Vars, which for itself are assigned to locations on user-shared-memory. But I am NOT using GetPtrVar() nor SetPtrVar(). Instead it works like this:

    address = 0x001880;

    ushptr = (volatile unsigned int*)(pushm + address);

    read:

    u32v = (unsigned int)((*ushptr & (1 << start_bit)) >> start_bit);

    write:

    *ushptr |= mask;

     

    In a script plc I do the same on such M-Vars. The m-variable definition looks like this:

    M1->u.user:$001880.26.1

    In that plc M1 is reset once in a while.

     

    Now and then it happens, that setting M1 within uws does not succeed, and remains 0.

     

    Besides, using P-Vars instead of M-Vars dismisses such issue and setting/resetting works all the time.

     

    Regards, Anton

     

    Ps. pp_proj.ini:

    [CPU_AFFINITY]

    rtpmac_main=0

    servotask=1

    rtitask=1

    backgroundthread=0

  9. Hi!

    My forward kinmatic subroutine is 1 single line calling CfromScript():

    open forward (1)
    ForwardKin1ErrCode = CfromScript(cfsNr,KinematicType,NrPoints,0,0,0,0);
    close

     

    Anyhow, I do not get axis velocities nor axis following errors when issuing &1v resp &1f, eventhough I tried to rebuild the double pass option (where CfromScript() simply calls ForwardKin())

    double ForwardKin(int kinType, struct LocalData *Ldata)
    {
    double ErrCode = 0;
    //double *R;
    double *L;
    double *C;
    double *D;
    int i;
    int tmpKinVelEna;
    
    //R = GetRVarPtr(Ldata);//Ldata->L + Ldata->Lindex + Ldata->Lsize;
    L = GetLVarPtr(Ldata);//Ldata->L + Ldata->Lindex;
    C = GetCVarPtr(Ldata);//Ldata->L + Ldata->Lindex + MAX_MOTORS;
    D = GetDVarPtr(Ldata);// Ldata->D;
    
    //if (KinVelEna) callsub 100;
    if (KinVelEna > 0.0) tmpKinVelEna=1; else tmpKinVelEna=0;
    
    for (i=0; i<=tmpKinVelEna; i++)
    {
           //double pass option?
    	if (tmpKinVelEna == 1)
    	{
    		if (i == 0)
    		{
    			Ldata->Lindex = Ldata->Lindex + Ldata->Lsize;
    		}
    		else
    		{
    			Ldata->Lindex = Ldata->Lindex - Ldata->Lsize;
    			KinAxisUsed = 0x1C0;				//X,Y,Z in use
    		}
    	}
    	else
    	{
    			KinAxisUsed = 0x1C0;				//X,Y,Z in use
    	}
    
    	//N100:
    	if (1>0) //pshm->Coord[1].HomeComplete)
    	{
    		if (kinType == 0)			//standard
    		{
    ...
    and so on
    

     

    Can anybody tell me how to realize such double pass option the right way in a CfromScript() program?!!

     

    Best regards,

    Anton

  10. The present algorithm was designed to ensure that memory conflicts could not be created as tables were entered in development. We are looking to see if there is a way around these protections.

    Meanwhile have you found "a way around these protections"?!

     

    Also important how to free table-buffer, since save-cmd takes quite some time (minute) if 500MB are in use.

  11. Typically, compensation for CMM is done on a computer. Compensation in PMAC is used to compensate for motion, but CMM does not require a high absolute motion accuracy. CMM requires only a high measurement accuracy. Therefore, the position of the motor encoder is taken back to be calculated to calculate the exact trigger position of the probe

    Thanks for your feedback.

    And yes, I agree for trigger-probing, where the compensation can be done on the measured points (on the host-pc). But the new 3D-Compensation on PPMAC allows compensating the whole trajectory, which is good for scanning-probes.

  12. Hi!

    To increase the volumetric performance of a CMM, geometric error compensation, also known as computer-aided accuracy, is indispensable.

    I split these errors I need to compensate into 2 leagues: position-dependent and position-independent errors.

    Position-dependent errors can once more be split into 3 translation and 3 angle errors per axis. In sum 18 error-parameters for all 3 axis.

    Position-independent errors are the 3 squareness-errors between the 3 axis.

    (Besides, thermal errors are to be counted to the positioning-errors (as part of the translation errors))

     

    Once those 21 error-parameters are known (eg through measuring with laser interferometers) there are several ways for getting PPMAC doing the job:

    + axis transformation matrices

    + kinematic subroutines

    + axis definition statements

    + 3D compensation table

     

    However, for the matter of computational load I did simplified testings with 3D-compensation table (3rd order interpolation). On a CK3E-CPU with Phase/Servo/RTI of 32/16/4 kHz, one table put another 2 to 3% load onto the foreground CPU (I tested up to 8 tables leading to +20%)

     

    This result made me wonder, if it would make sense to use other features of PPMAC than a 3D-compensation-table, with the goal getting the 21-error-parameters into PPMAC with the least necessary amount of CPU-load.

     

    Questions:

    Does anybody have experiences concerning this issue, how did you solve it?!

    Which of the above features consumes how much of the CPU-power (rule of thumb)?

    Are there any other features not listed here which could be used?

    Does somebody have a list of hints to save cpu-power (besides 32/16/4 kHz loop freq, I know)?

    3-D compensation tables are calculated with servo-update-rate (0.0625ms), Segmentation (10ms) time would be enough - but how to get there?

     

    General question:

    Which strategy to follow: Should I rather do the compensation in the forward path (between trajectory calculation until servo-loop), than in the backward path (compensating actual positions)?!

     

    Don't hesitate for any idea!

    Thanks!

  13. Hi Jeff!

    Now I found the reason for the mailfunction of ecattypedsto() --> ECAT[].ServoExtension

    If set to match the ECAT Cycle time (eg 1ms Cycle time, Servo-Freq 16 kHz --> ServoExtension=15) then the function ecattypedsdo() delivers "nan" all the time.

    If ServoExtension=3 or less, then the function ecattypedsdo() works correctly and delivers reasonable values all the time.

    The lower ServoExtension, the higher its reliability.

    Thanks anyway for your efforts!

×
×
  • Create New...