dhidas Posted July 17 Share Posted July 17 The answer to this is probably quite simple, but is eluding me. Basic setup here, DAC output to servo driver, feedback is a standard quad encoder. after $$$ I want to set the motor position by hand so we issue a: Motor[1].Pos = 10000 The we #1j/, &1#1->I (we are using very simple forward and inverse kinematics eg KinPosAxisX = KinPosMotor1). Everything so far is good. The first time we run the motion program which is equivalent of X(15000) in linear abs mode "send motor #1 to 15000" (I expect the motor to go from the current 10000 to 15000) we see that the motor very quickly goes back to zero (not using the feedrate), then goes to 15000 according to the feedrate. All program moves after this are normal. What causes this initial move back to zero and how do I avoid it? Quote Link to comment Share on other sites More sharing options...
leandro.martins Posted July 18 Share Posted July 18 Are you defining a forward kinematic? In your case it would be something like: open forward (1) KinAxisUsed = KinEnaAxisX KinPosAxisX = KinPosMotor1 close The forward kinematic is used by the pmatch command to match the axes positions to motors position, in case of one of the motors has been moved. The pmatch is implicitly called at the beginning of a motion program. Quote Link to comment Share on other sites More sharing options...
leandro.martins Posted July 18 Share Posted July 18 Alternatively, as you inverse kinematic is very simple, instead of assigning the coordinate system as &1 #1->I You can point directly the motor directly to the axis &1 #1->X For this kind of axis definition the pmatch takes care of inverting the statement, obtaining the axis position. Quote Link to comment Share on other sites More sharing options...
dhidas Posted July 18 Author Share Posted July 18 We are defining both forward and inverse and they are exactly as you have typed it above (open forward.....). We'll later make the kinematics more complicated later on so I can't use these simple definitions (#1->X, etc). My goal is to solve this problem (misunderstanding) using this basic example with forward and inverse definitions before we move to the more complicated ones. I think it's that I'm not understanding how to correctly set the motor position by hand and have it globally applied. It seems like the kinematics don't see the change to Motor[x].Pos so it's calculating from 0 to 15000, when what I want is for it to see the 10000 and do the calculation from that position to 15000. I'm guessing it's something simple, but we've tried a lot of combinations and haven't hit it yet. Quote Link to comment Share on other sites More sharing options...
leandro.martins Posted July 18 Share Posted July 18 The Motor[x].Pos is not a writable element. Are you sendin this command via the terminal? That should return error. Why exactly do you need to set Motor[1].Pos=10000 ? Would your system have homing routine? If you want this as an offset, I can see to options here: Before starting the motion program Motor[1].HomePos= - 10000 At the beginning of the motion program pset X10000 Quote Link to comment Share on other sites More sharing options...
MoMo Posted July 18 Share Posted July 18 A necessary condition for using the kinematics function is that Coord[x].SegMoveTime is non 0. Quote Link to comment Share on other sites More sharing options...
dhidas Posted July 18 Author Share Posted July 18 Motor[x].Pos is a writeable element. From the SRM for Motor[x].Pos: """ However, with the motor disabled (“killed”), it is possible to write a value to Motor[x].Pos. This has the same effect as reading an absolute position sensor, and can be used to force a position value from a source not supported by the automatic position-read algorithms. """ Quote Link to comment Share on other sites More sharing options...
leandro.martins Posted July 18 Share Posted July 18 1 hour ago, dhidas said: Motor[x].Pos is a writeable element. From the SRM for Motor[x].Pos: You're right, I forgot about the fact that you start with the motor disabled, sorry about the confusion. What is the response when you command &1p ? Quote Link to comment Share on other sites More sharing options...
MoMo Posted July 19 Share Posted July 19 On 7/18/2024 at 5:51 AM, dhidas said: The answer to this is probably quite simple, but is eluding me. Basic setup here, DAC output to servo driver, feedback is a standard quad encoder. after $$$ I want to set the motor position by hand so we issue a: Motor[1].Pos = 10000 The we #1j/, &1#1->I (we are using very simple forward and inverse kinematics eg KinPosAxisX = KinPosMotor1). Everything so far is good. The first time we run the motion program which is equivalent of X(15000) in linear abs mode "send motor #1 to 15000" (I expect the motor to go from the current 10000 to 15000) we see that the motor very quickly goes back to zero (not using the feedrate), then goes to 15000 according to the feedrate. All program moves after this are normal. What causes this initial move back to zero and how do I avoid it? My tests don't have the problem you describe. TTT.mp4 Quote Link to comment Share on other sites More sharing options...
DaveBarnett Posted July 28 Share Posted July 28 (edited) Since you want to “set the motor position by hand” … instead of writing directly to the Motor[1].Pos register, you should write to the HomePos register like this: Motor[1].HomePos = Motor[1].ActPos - MyOffset Where MyOffset = 10000 in your case... Normally, this is done automatically when the HMZ command is issued. Edited July 28 by DaveBarnett Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.