Hi, I have changed how to calculate the slave start time by taking only the sync0->cycle_time as cycle time. The results is good and I can see in the log that the 'remainder' is almost the same for all slaves.
@Florian: Why did you did this change on 2016-09-16 ? Best regards Philippe > On May 16, 2018, at 6:22 PM, Philippe Leuba <ple...@swissonline.ch> wrote: > > Hi All, > > I can not understand how to configure correctly my slaves with the > ecrt_slave_config_dc() function. > > I use nine EL7211-9014 servo controllers and the XML declarations is: > > <Dc> > <OpMode> > <Name>DC</Name> > <Desc>DC-Synchron</Desc> > <AssignActivate>#x700</AssignActivate> > <CycleTimeSync0 Factor="1">0</CycleTimeSync0> > <ShiftTimeSync0 Input="0">30000</ShiftTimeSync0> > <CycleTimeSync1 Factor="-1">0</CycleTimeSync1> > <ShiftTimeSync1>1000</ShiftTimeSync1> > </OpMode> > </Dc> > > SYNC0 and SYNC1 should be fired at each cycle. > > My realtime cycle is at 500us, so initially I used: > > ecrt_slave_config_dc(sc, 0x0700, 500000, 30000, 1000, 0); > > but I sometimes faced some hiccup on some motor movements (almost always on > the same motor, but sometimes not), most probably due to frames late > regarding SYNC events, so I increased the sync1_shift to half of the cycle > time: > > ecrt_slave_config_dc(sc, 0x0700, 500000, 250000, 1000, 0); > > This help, but I’m still not convinced that it is correct. > > How can I debug this, I did not see any error on slaves COEs 1c32 or 1c33 ? > > Startup debug messages are the followings: > > EtherCAT DEBUG 0-12: Checking for synchrony. > EtherCAT DEBUG 0-12: 19 ns difference after 1 ms. > EtherCAT DEBUG 0-12: app_start_time=64456682505935 > EtherCAT DEBUG 0-12: app_time=64460192975876 > EtherCAT DEBUG 0-12: start_time=64460292975876 > EtherCAT DEBUG 0-12: cycle=501000 > EtherCAT DEBUG 0-12: shift_time=250000 > EtherCAT DEBUG 0-12: remainder=263941 > EtherCAT DEBUG 0-12: start=64460293462935 > EtherCAT DEBUG 0-12: Setting DC cyclic operation start time to 64460293462935. > EtherCAT DEBUG 0-12: Setting DC AssignActivate to 0x0700. > - > - > - > EtherCAT DEBUG 0-13: Checking for synchrony. > EtherCAT DEBUG 0-13: 9 ns difference after 1 ms. > EtherCAT DEBUG 0-13: app_start_time=64456682505935 > EtherCAT DEBUG 0-13: app_time=64460854977928 > EtherCAT DEBUG 0-13: start_time=64460954977928 > EtherCAT DEBUG 0-13: cycle=501000 > EtherCAT DEBUG 0-13: shift_time=250000 > EtherCAT DEBUG 0-13: remainder=444993 > EtherCAT DEBUG 0-13: start=64460955283935 > EtherCAT DEBUG 0-13: Setting DC cyclic operation start time to 64460955283935. > EtherCAT DEBUG 0-13: Setting DC AssignActivate to 0x0700. > > I’m really surprised that the remainder can be so different, so I looked in > the source code and can not understand the logic: > > // set DC start time > start_time = master->app_time + EC_DC_START_OFFSET; // now + X ns (X > being 100000000 = 100 ms) > > if (sync0->cycle_time) { > // find correct phase > if (master->has_app_time) { > u64 diff, start; > u32 remainder, cycle; > > diff = start_time - master->app_start_time; > cycle = sync0->cycle_time + sync1->cycle_time; > remainder = do_div(diff, cycle); > > start = start_time + cycle - remainder + sync0->shift_time; > > Why the cycle is the sum of the two sync->cycle_time, in my case 501000, > should not it be: sync0->cycle_time (500000) ? > > This was changed on 2016-09-16, but It seems it was right before. > > I can see that sync0->cycle_time is written to register 9A0 (500000) > and sync1->cycle_time is written to register 9A4 (1000), this is correct. > > It seems to me that the sync1_cycle parameter of the ecrt_slave_config_dc() > is handled as as sync1_shift, this is really confusing. > > Is it normal, can someone explain this ? > > Philippe > _______________________________________________ > etherlab-users mailing list > etherlab-users@etherlab.org > http://lists.etherlab.org/mailman/listinfo/etherlab-users
_______________________________________________ etherlab-users mailing list etherlab-users@etherlab.org http://lists.etherlab.org/mailman/listinfo/etherlab-users