andreef Posted January 17, 2018 Share Posted January 17, 2018 We have an application where we use 4 absolute encoders (32bits) on a rotating stage. The goal is to combine the 4 readings to achieve maximum precision (remove random translation of the rotation axis). We use type 2 ECTs to read the raw data with full 32 bit precision Acc84E[5].SerialEncCtrl=$63010B Acc84E[5].Chan[0].SerialEncCmd=$2114A0 // 32 bit 2bit status and 6bit polynom Biss C encoder EncTable[19].type=2; // 24+8 bit read entry; EncTable[19].pEnc = Acc84E[5].Chan[0].SerialEncDataA.a // address of lower 24 bit EncTable[19].pEnc1 = Acc84E[5].Chan[0].SerialEncDataB.a // address of upper 8 bits EncTable[19].index1=0; EncTable[19].index2 = 0; EncTable[19].ScaleFactor = 1.; EncTable[19].MaxDelta = 50000 * 256; This creates a conversion table which is signed 32 bits. Is there a way to make this 64 bit? When going forward and adding the four tables together using type 8 ETCs and scaling it by 1/4 we have the problem of the table rolling over and creating discontinuities (jump from 2^31-1 to -1*2^32) at an interval of 90 degrees (in units of the rotating stage). I know that for the ongoing operation only the delta Position value is relevant and I should be fine. However the 90 degree ambiguity creates issues with the absolute power on position. I was thinking of using the high 8 bits of one of the encoders and the lower 24 bits of the ECT where the 4 encoders are combined as my power up position info. Any thoughts on how to best implement the power on absolute position if the ETCs cannot be used as 64 bit? Link to comment Share on other sites More sharing options...
Jay Lee Posted January 18, 2018 Share Posted January 18, 2018 Hi, if only power on position is the concern, then you should be able to do it in a startup/poweron PLC. read all 4 encoders and assemble the position through SerialEncDataA and SerialEncDataB registers. average these 4 readings and put it in a register. point Motor[x].pAbspos to that register, and make sure you set up Motor[x].AbsPosFormat and Motor[x].AbsPosSf properly. issue HMZ online command or HOMEZ program command, and the absolute position will be read. Link to comment Share on other sites More sharing options...
Richard Naddaf Posted January 18, 2018 Share Posted January 18, 2018 You can manipulate the data manually and place it in two consecutive user buffers (e.g. Sys.Udata[10] and Sys.Udata[11]) then set up the following accordingly Motor[].pAbsPos = Sys.Udata[10].a Motor[].AbsPosFormat = $01003200 // example Motor[].AbsPosSf = Motor[].PosSf // example Or you can manually (when the motor is killed) write to the home position. Say you computed the data in Sys.Ddata[1]: Motor[].HomePos = Motor[].ActPos - Sys.Ddata[1] Link to comment Share on other sites More sharing options...
Recommended Posts