inline response in red, best regards, Paolo
-----Original Message----- From: Peter van Knippenbergh [mailto:[email protected]] Sent: giovedì, 26. novembre 2009 13:32 To: Inselmini Paolo Cc: [email protected] Subject: RE: [etherlab-users] Timing measurements Hi Thank you for your quick reply, but not is everything is clear yet, see inline (below) From: Inselmini Paolo [mailto:[email protected]] Sent: Thursday, November 26, 2009 10:22 AM To: Peter van Knippenbergh Subject: RE: [etherlab-users] Timing measurements Hi EL5101 support distributed clock so if you want to measure the cycle time you can do it by evaluating the response of the slave synchronization datagram. I do that to synchronize the master with the slave reference clock. I implemented the ecrt_get_slave_sync_time function in the etherCAT master.c file to read the cycle time. This function should be called every cycle, you can then read the cycle time within the exported EtherCAT_timeSync structure. It's what you need? struct { u64 ecat_time_ns; //absolute sync thelegram time u32 delta_ecat_time_ns; //sync thelegram cycle time u32 ecat_time_1; bool isSync; struct semaphore lock; } EtherCAT_timeSync; void ecrt_get_slave_sync_time(ec_master_t *master) { u32 ecat_time; //s32 delta_ecat_time; if((master->has_start_time == 1) && (EtherCAT_timeSync.isSync ==0)) { down(&EtherCAT_timeSync.lock); EtherCAT_timeSync.isSync =1; EtherCAT_timeSync.ecat_time_ns = master->app_start_time; EtherCAT_timeSync.ecat_time_1 = (u32)(EtherCAT_timeSync.ecat_time_ns & 0xFFFFFFFF); up(&EtherCAT_timeSync.lock); } if(master->sync_datagram.state == EC_DATAGRAM_RECEIVED) { down(&EtherCAT_timeSync.lock); ecat_time = (u32) le32_to_cpup((void *)master->sync_datagram.data); EtherCAT_timeSync.delta_ecat_time_ns = (s32)ecat_time - (s32)EtherCAT_timeSync.ecat_time_1; if(EtherCAT_timeSync.delta_ecat_time_ns < 0) EtherCAT_timeSync.delta_ecat_time_ns = (u32)(0x100000000LL + (s64)decat_time); The decat_time time is not defined, so in my opinion the line must be : EtherCAT_timeSync.delta_ecat_time_ns = (u32)((0x100000000LL) + (s64)(EtherCAT_timeSync.delta_ecat_time_ns)); Is that correct ?? R: Yes, it is!! the delta_ecat_time was added for you, I only use the absolute time... I made a mistake. EtherCAT_timeSync.ecat_time_ns &= ~0xFFFFFFFFLL; // remove low 32 bits of the time EtherCAT_timeSync.ecat_time_ns |= (u64)ecat_time; // add low 32 bits of readed ethercat absolute time if(ecat_time < EtherCAT_timeSync.ecat_time_1) { //overflow, increment the owerflowed value EtherCAT_timeSync.ecat_time_ns += 0x100000000LL; } EtherCAT_timeSync.ecat_time_1 = ecat_time; up(&EtherCAT_timeSync.lock); } } EXPORT_SYMBOL(ecrt_get_slave_sync_time); I assume I must export this function to user space, the same way as for example ecrt_master_send R: Yes, you should. I use this function only in kernel space so I did not exported to user space. EXPORT_SYMBOL(EtherCAT_timeSync); I assume I must create a function to export this struct to userspace, where the parameter is a pointer to a EtherCAT_timeSync stuct. R: In kernel space I access directly to the structure to read the delta_ecat_time_ns value, you can create a simple function without parameters that return the value you need (ecat_time_ns or delta_ecat_time_ns) and export this function to the user space like you will do with the ecrt_get_slave_sync_time function. Kind regards Peter van Knippenbergh Paolo Inselmini Development Engineer _____ AGIE SA via dei Pioppi 2, 6616 Losone, Svizzera phone +41 (0) 91 806 95 73, Fax +41 (0) 91 806 92 42 [email protected]<mailto:[email protected]>, www.gfac.com<http://www.gfac.com/> _____ GFAgieCharmilles - Achieve more -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of Peter van Knippenbergh Sent: mercoledì, 25. novembre 2009 15:05 To: [email protected] Subject: [etherlab-users] Timing measurements Hi I want to measure the latency of sending and receiving cyclic data, one of the slaves is a Beckhoff EL5101. I want to read a timing register every cycle. I want to map a register (not an object) to the process data, and therefore I tried to use the 3rd fmmu, but when going to OP, the ethercat master zero's the 3rd fmmu. Is there a easy way to get a timestamp in a user-space program for every cycle. It is ok for me if the communicated timestamp is an older tempstamp, because I want to use it for latency measurements. Kind regards Peter van Knippenbergh
_______________________________________________ etherlab-users mailing list [email protected] http://lists.etherlab.org/mailman/listinfo/etherlab-users
