Hi Rainer,
Thanks for your detailed response. inijoint.cc/taskintf.cc wasn't on my
radar. I'm still trying to wrap my head around how they work.
Based on your instructions, ,I made the following changes
1) in inijoint.cc
Line 75 static int loadJoint (int joint, EmcIniFile
*jointIniFile)
{
Line 100 bool home_ethercat;
Line 203 home_ethercat = 0;
jointIniFile->Find(&home_ethercat,
"HOME_ETHERCAT", jointString);
Added my new parameter HOME_ETHERCAT to the end of
Line 206 // issue NML message to set all params
Line 207 if (0 != emcJointSetHomingParams(
,
,
,home_ethercat);
2) in taskintf.cc
added int home_ethercat to list
Line 281 emcJointSetHomingParams(
Line 311 if (home_ethercat){
emcmotCommand.flags |= HOME_ETHERCAT
}
added home_ethercat to and %d to the rcs_print list for the added item
Line 349 if (emc_debug & EMC_DEBUG_CONFIG){
3) in motion.h
added int home_ethercat to list
Line 215 typedef struct emcmot_command_t
/* flags for homing */
#define HOME_ETHERCAT 256
I've added the extra code based on errors that came up in the terminal and
examined variables like use_index and volatile home that look similar to
what I am try to do.
to figure out the code However, Im getting an error that says
emc/task/emctaskmain.cc: In function 'int emcTaskIssueCommand(NMLmsg*):
emc/task/emctaskmain.cc: 1746:44: error 'class EMC_JOINT_SET_HOMING_PARAMS'
has no member named 'home_ethercat'; did you mean 'home_sequence'?
set_homing_params_msg->home_ethercat);
I added the above line since the previous error was that there were not
enough arguments in the list.
Since we are looking for something similar to home_sequence, I looked
through homing.c to try to determine how home_sequence is handled and then
tried to duplicate but, now I get even more errors.
Any ideas? Not sure if this matter's but I am using 2.9 since it now has
some nice lathe features.
>Would be nice to known if there is brand, that has been tested with
LinuxCNC's EtherCAT extension.
I am using Delta's ASDA-A2E and I believe that they one of the brands used
in the original development . Other than homing not working
correctly...yet, they are awesome.
Basically this is one of the last programming issues that I need to sort
out before putting my lathe through commissioning.
I'm hunkering down today to try and sort this out. Will let you know if I
get past step 1. Lol
Kind regards,
Dan
On Fri, Sep 17, 2021 at 7:52 PM Rainer <[email protected]> wrote:
> Hi Dan,
>
> > I respect your position regarding uploading a proprietary solution to
> GIT,
> I have no problem publishing the stuff related to LinuxCNC.
> I would be happy to provide it with EtherCAT.
>
> It simply made no sense with CANOpen when it lacks a configurable
> CANOpen Stack.
> It does make sense with Ethercat, comming with fixed/manual edited CoE
> configuration.
> Theoretical it would make sense with CAN/CANOpen, with a fixed
> configuration, too.
> But EtherCat has an advantage here.
> CAN Bus is limited to only 1Mbit/s while EtherCAT run's with 100Mbit/s.
> Example: In my case I operate 4 Servo drives, 2 spindle drives and one
> Wago/Beckhof Kbus I/O unit .
> Spindle drives do not operate with spindle orientation (what would lead
> to run the spindles in positioning (and speed) mode, too)
>
> To send 16bit speed set command and receive 32bit actual position
> to/from 4 servo drives brings the CAN bus very fast to it's max.
>
> If you want to push the bus usage to it's limits to reach minimal PID
> cycle time or have spindle orientation or additional servos for the atc,
> you need to optimize the bus usage, and/or add further busses.
> To optimize the bus usage to your special machine, you need bus
> configuration functionality. (And detailed knowledge )
>
> Fundamentally it is the same with CANOpen over EtherCAT, but with
> transfer rates being 100 times faster, there is no strong need for a
> changeable configuration.
> No problem to reach 1ms PID cycle time for eight servo/spindel drives
> and some I/O.
> This fixed setup will probably serve 95% of all applications.
>
>
> > " I added a parameter AUTOHOMING_SERVOSYSTEM = 1 in ini File "
> > How? I have tried adding a variable but cannot use it to take control in
> homing.c,
>
> The parameter is parsed in inijoint.cc and added as Boolean to
> emcJointSetHomingParams() parameter list
>
> This is copied to the flags in emcmotCommand in taskintf.cc .
>
> emcmotCommand.flags |= HOME_AUTOHOMING_SERVO;
>
> The definition is added in motion.h
>
> /* flags for homing */
> #define HOME_IGNORE_LIMITS 1
> #define HOME_USE_INDEX 2
> #define HOME_IS_SHARED 4
> #define HOME_UNLOCK_FIRST 8
> #define HOME_ABSOLUTE_ENCODER 16
> #define HOME_NO_REHOME 32
> #define HOME_NO_FINAL_MOVE 64
> #define HOME_INDEX_NO_ENCODER_RESET 128
> -> #define HOME_AUTOHOMING_SERVO 256 <-
>
>
> > - created a new section similar to HOME_SEARCH_WAIT that resets the
> timer and calls a void (routine) that syncs the servo position feed back to
> commanded position ?
>
> added the states HOME_AUTOHOME_READY_WAIT and HOME_AUTOHOME_READY_DONE
>
> to the homing statemachine in homing.c / home_state_t enumerator
>
> case HOME_AUTOHOME_READY_WAIT:
> {
> if ( GET_JOINT_AUTOHOME_FINISHED_FLAG(joint))
> {
> // joint->home_state = HOME_FINISHED;
> H[joint_num].home_state = HOME_AUTOHOME_READY_DONE;
> }
> }
> break;
>
> .
>
> .
>
> .
>
> case HOME_AUTOHOME_READY_DONE:
> {
> /* The converter delivers 0 in case he has executed a
> homing sequence.
> * if it already was homed, it delivers the recent
> position, what is actualy the correct value */
> H[joint_num].home_offset = 0;
>
> /* this moves the internal position but does not affect the
> motor position */
> joint->pos_cmd = joint->pos_fb;
> joint->pos_fb = joint->pos_fb;
> joint->free_tp.curr_pos = joint->pos_fb;
> joint->free_tp.pos_cmd = joint->pos_fb;
> joint->motor_offset = 0;
> /* next state */
> H[joint_num].home_state = HOME_FINAL_MOVE_START;
> immediate_state = 1;
> }
> break;
>
> > - this section also handles limit
> In my case no need for that. The drives use the limit switch with an
> index mark on the linear scales.
> If something goes wrong when homing, it is handle like e-stop ...
> > and e-stop
> e-stop cuts the AC power from the drives and the drive statemachine
> changes to error.
> This unrequested change of state is signaled by the error output of the
> CAN hal driver.
>
> > I believe the above section can be handled by custom m-codes and ladder
> logic but, if you could explain this part as well,
>
> CANOpen (and thereby CANopen over EtherCat ) defines device profiles for
> a bunch of device types.
> DS402 is the drive profile.
> Part of this definition is a statemachine that is mandatory to implement.
> (something I like very much about CANOpen, because only very few
> fieldbus protocols go to level 7 of iso/osi stack.
> Thats why every frequency converter on Modbus must have a specific piece
> of software.
> Not the case for CANOpen/CoE. Works for all brands the same way.)
>
> This is a link to picture showing the statemachine.
>
>
> https://infosys.beckhoff.com/index.php?content=../content/1031/el72x1-9014/1859316107.html&id=
>
>
> In my CAN/CANOpen driver the hal enable input controls the target state
> of the drive.
> If true, I try to reach the state "operation enabled"
> If false, I try to reach the state "ready to switch on"
>
> If the AMP can not reach the requested state (e.g. it lacks AC power),
> error flag is set.
>
> If in "operation enabled", you can send a request to home the drive.
>
> All this is explained in the drive manuals in detail.
>
> > that would be helpful since it is the more elegant solution.
> I like the old fashioned simple speed set, actual position, enable in
> and error out very much.
>
> But it simply does not reflect the features of modern servos.
> Besides autohoming, things like actual load, diagnostics messages,
> switching operation modes (torque/speed) could be added.
>
> > Not sure exactly what this means but providing only this part of the
> solution is probably all that is necessary
> Yep, no problem sharing the extension of the linuxcnc homing part and
> the DS402 state machine handling.
> Would like to test it with physical EtherCAT devices, before publishing.
>
> > " Hints regarding the EtherCAT Hardware are welcome"
> > I have Delta ASDA-A2-E 2 KW amps and a Delta C2000 VFD running on
> ethercat, are you looking for something specific?
> I have some spare Servostar 300 / 600 that could be extended with a
> EtherCat card.
> But this card is as expensive a Chinese EtherCat servo.
>
> So I think I will go with Chinese servos.
>
> Would be nice to known if there is brand, that has been tested with
> LinuxCNC's EtherCAT extension.
>
> cheers
>
> Rainer
>
>
> _______________________________________________
> Emc-developers mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/emc-developers
>
_______________________________________________
Emc-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/emc-developers