Here's a py script to continuously read the diag registers (requires ethercat_master.py). While running this, one may wiggle EtherCAT cables to help identify intermittents.
Best regards - Dave > > Message: 3 > Date: Wed, 06 Jul 2016 13:43:37 -0700 > From: Henry Bausley <hbaus...@deltatau.com> > To: Ralf Roesch <ether...@cantastic.org> > Cc: "etherlab-users@etherlab.org" <etherlab-users@etherlab.org> > Subject: Re: [etherlab-users] Intermittent Large number of datagrams > UNMATCHED > Message-ID: <1467837817.9419.71.camel@henry-ThinkCentre-M93p> > Content-Type: text/plain; charset="UTF-8" > > > Thanks for all the great suggestions everyone. Now that I'm back from > holiday I will monitor registers 0x300 and 0x310 per the suggestions. > > Ralf, > > The drives we are using are Lenze i700 drives. > > I will also try changing the network interface. Currently the network > interface giving a problem is reported as a > Intel 82579LM which is just a PHY, so I assume the controller is in the > chipset. > > I will try using the additional port on my PC which has an Intel 82574L > and see if I have better luck. > > I will keep you posted. > > >
# -*- coding: utf-8 -*- """ bus_diag =========== Scan EtherCAT bus slaves and read out bus diagnostic registers. Created on 2015-07-28 Author Dave Page """ import time from ethercat_master.ethercat_master import get_slaves, MasterDevice from collections import namedtuple if __name__ == "__main__": class PortState(object): def __init__(self, pos, ecat): self.position = pos self.ecat = ecat self.invalid_frame = [0]*4 self.rx_error = [0]*4 self.forwarded_error = [0]*4 self.ecat_processing = 0 self.lost_link = [0]*4 self.read_fail = 0 def __str__(self): return """%3d: %-50s fail: %3d frame: %3d %3d %3d %3d rx: %3d %3d %3d %3d forward: %3d %3d %3d %3d proc: %3d link: %3d %3d %3d %3d""" % tuple( [self.position, self.ecat.name, self.read_fail] + self.invalid_frame + self.rx_error + self.forwarded_error + [self.ecat_processing] + self.lost_link) with MasterDevice(0) as m: master = m.get_master() slaves = [] for i in xrange(master.slave_count): slaves.append( PortState(i, m.get_slave(i)) ) while True: print print for slav in slaves: r300 = 0 r308 = 0 r310 = 0 try: # Read 0x0300 - 0x0307 r300 = m.read_reg(slav.position, 'uint64_t', 0x0300) # Read 0x0308 - 0x030f r308 = m.read_reg(slav.position, 'uint64_t', 0x0308) # Read 0x0310 - 0x0313 r310 = m.read_reg(slav.position, 'uint32_t', 0x0310) #print '%016x %016x %08x' % (r300, r308, r310) except: slav.read_fail += 1 try: # Reset all m.write_reg(slav.position, 'uint64_t', 0x0300, 0) m.write_reg(slav.position, 'uint64_t', 0x0308, 0) m.write_reg(slav.position, 'uint32_t', 0x0310, 0) except: print 'Reset failed' # Accumulate errors for p in xrange(4): slav.invalid_frame[p] += (r300 >> (p*16)) & 0xff slav.rx_error[p] += (r300 >> (8+p*16)) & 0xff slav.forwarded_error[p] += (r308 >> (p*8)) & 0xff slav.lost_link[p] += (r310 >> (p*8)) & 0xff slav.ecat_processing += (r308 >> 32) & 0xff print slav time.sleep(2)
_______________________________________________ etherlab-users mailing list etherlab-users@etherlab.org http://lists.etherlab.org/mailman/listinfo/etherlab-users