Ethercat HAL driver
I made some progress yesterday. When I start linuxcnc my device goes into OP and now if I write this in a terminal.
The motor gets current and I can't turn it by hand anymore:
ethercat -p0 -t uint16 download 0x6040 0 0x0006 # EnableVoltage+QuickStop
ethercat -p0 -t uint16 download 0x6040 0 0x0007 # +SwitchOn
ethercat -p0 -t uint16 download 0x6040 0 0x000f # +EnableOperation
But how and where should I have this in linuxcnc?
[update] I think there are plenty of examples in here: github.com/aschiffler/linuxcnc/tree/master/configs/roschi_cnc
I will try to adapt sth from this in the hal file...
setp lcec.0.3.drivecontrol-8 1
setp lcec.0.3.drivecontrol-13 1
setp lcec.0.3.drivecontrol-14 1
setp lcec.0.3.signalcontrol-0 0
setp lcec.0.4.drivecontrol-8 1
setp lcec.0.4.drivecontrol-13 1
setp lcec.0.4.drivecontrol-14 1
setp lcec.0.4.signalcontrol-0 0
setp lcec.0.5.drivecontrol-8 1
setp lcec.0.5.drivecontrol-13 1
setp lcec.0.5.drivecontrol-14 1
setp lcec.0.5.signalcontrol-0 0
Thank you again for your support
Please Log in or Create an account to join the conversation.
I do not use this type of generic file, it costs me a bit, and without having the device it is also a little more difficult
I attach a new .xml file with some changes
a your .hal file
setp lcec.0.X-cmd-SwitchOn 1
setp lcec.0.X-cmd-EnableVoltage 1
setp lcec.0.X-cmd-/QuickStop 1
setp lcec.0.X-cmd-EnableOperation 1
Now the driver is ready to work ...
the scale is surely wrong if not calculated, but to start leave at 1 and then check the measurement
Could this be the scale?
<pdoEntry idx="607A" subIdx="00" bitLen="32" halPin="poscmd" halType="float" scale="40.0"/>
<pdoEntry idx="6064" subIdx="00" bitLen="32" halPin="actpos" halType="float" scale="200.0"/>
Now we connect the signals ...
lcec.0.poscmd -> joint.0.motor-pos-cmd
lcec.0.actpos <- joint.0.motor-pos-fb
I hope it is a good start ...
Reguard
Chimeno
Please Log in or Create an account to join the conversation.
I am making good progress but the motor still does not move.
when I start linuxcnc the motor does get power and is locked into position.. it is very hard to move it by hand...
I read position from encoder it is 0.
the motor is in CSP mode 0x8
When I download a new position to 0x607A manually the motor does not move.
Same when I try to move the motor using the linuxcnc interface.
I can see the cursor moving on the 3d screen but the motor is always at 0
When I start linuxcnc and get in OP dmesg
reads this:
[14186.406727] EtherCAT 0: Slave states on main device: PREOP.
[14186.476831] EtherCAT WARNING: Datagram 0e6a62ff (master-fsm) was SKIPPED 1 time.
[14212.690402] EtherCAT: Requesting master 0...
[14212.690416] EtherCAT: Successfully requested master 0.
[14212.691529] EtherCAT 0: Domain0: Logical address 0x00000000, 18 byte, expected working counter 3.
[14212.691537] EtherCAT 0: Datagram domain0-0-main: Logical offset 0x00000000, 18 byte, type LRW.
[14212.691571] EtherCAT 0: Master thread exited.
[14212.691582] EtherCAT 0: Starting EtherCAT-OP thread.
[14212.691709] EtherCAT WARNING 0: 1 datagram UNMATCHED!
[14217.917614] EtherCAT WARNING 0-0: Slave did not sync after 5000 ms.
[14217.921603] EtherCAT 0: Domain 0: Working counter changed to 3/3
[14217.921612] .
[14217.937322] EtherCAT 0: Slave states on main device: OP.
So as you can see my sync is not working although I reached OP
I also read this sentence in the manual:
In this mode, the primary controller generates a position trace and sends the target
location (0x607A) to the drive during each PDO update cycle. The drive feeds back the
actual motor position and optional actual motor speed and torque.
Enable CSP
So what does happen if the PDO is not update at every cycle because the master is not synced correctly would CSP still work?
Also I was able to read the position from the actual location (0x6064) and the encoder has 4000 steps per revolution.
finally linuxcnc (2.9) wasn't happy with the hal command you gave me:
the hal wanted a command so I made a net..
from last message:
"Now we connect the signals ...
lcec.0.poscmd -> joint.0.motor-pos-cmd
lcec.0.actpos <- joint.0.motor-pos-fb"
so I modified to this:
net Ypos joint.1.motor-pos-cmd => joint.1.motor-pos-fb
net Zpos joint.2.motor-pos-cmd => joint.2.motor-pos-fb
net Xpos joint.0.motor-pos-cmd => lcec.0.0.poscmd
net Xact lcec.0.0.actpos => joint.0.motor-pos-fb
is it correct (what you meant?) or am I reversed with my arrows?
now it seems that when I start linuxcnc the motor turns on but when I try to move it
I get this
joint 0 following error
emc/task/taskintf.cc 947: Error on joint 0, command number 474
Also when I try to apply some force to the motor left or right from the stuck position, I see the encoder does work though..
So somehow it is not closing the loop on the position... do I need to set a speed for the CSP mode?
I thought updating position is enough.
The motor does work in windows with twincat so I know the cables are all correct.
Thank you again for your time and help
Cheers,
Attachments:
Please Log in or Create an account to join the conversation.
So as you can see my sync is not working although I reached OP
I also read this sentence in the manual:
In this mode, the primary controller generates a position trace and sends the target
location (0x607A) to the drive during each PDO update cycle. The drive feeds back the
actual motor position and optional actual motor speed and torque.
Enable CSP
So what does happen if the PDO is not update at every cycle because the master is not synced correctly would CSP still work?
In all the devices that have been tried so far, if the DC mode does not synchronize, the device appears an error and stays in the "PREOP E" state, if yours is in OP it must be synchronized in principle, you can try to lower the time.
<dcConf assignActivate="300" sync0Cycle="20000000" sync0Shift="0"/>
The arrows do not affect the programming, it is only as a comment to understand it betteris it correct (what you meant?) or am I reversed with my arrows?
This error is normal because the motor is not moving.now it seems that when I start linuxcnc the motor turns on but when I try to move it
I get this
joint 0 following error
emc/task/taskintf.cc 947: Error on joint 0, command number 474
In TWINCAT 3, does it work for you? you can compare these values with linuxcnc
0x0640 Control Word
0x6041 Status Word
You have activated in linuxcnc is Quick stop status ?? it's okay?
If you want you can also pass me the project in TWINCAT3 configured and that it operates and I look at it in case I see something different.
Regards
Chimeno
Please Log in or Create an account to join the conversation.
The values in 0x6040 and 0x6041 in TWINCAT are 0x1F and 0x1237 (see screenshot) when the NC controller is started
I do not understand why though it is not just 0x0F because in CSP the 0x10 bit is is not required according to manual
Anyway I did try to add it into linuxcnc using the hal command to get the same as:
setp lcec.0.0.X-cmd-OPmodeRel1 1
pi@raspberrypi:~ $ ethercat -p0 -t uint16 upload 0x6040 0
0x001f 31
pi@raspberrypi:~ $ ethercat -p0 -t uint16 upload 0x6041 0
0x1237 4663
pi@raspberrypi:~ $
Also it seems to me that all status including /Quickstop are good according to my current understanding of things:
I have tried setting 0x6040 from 0x06 to 0x0f and also from 0x06 to 0x1f multiple times. Because I think that in PP mode it is required to be switched for each new position.. but in CSP I believe it should stay at 1... (at least that is what I observe when it works in twincat)
I also tried turning on
setp joint.0.jog-enable 1
don't know if that is relevant... but it seems a good thing to enable the jog if I want to move the X axis..
What I am not sure is that in the doc both 0x607A(poscmd) and 0x6064(actpos) are specified as "pulse units" integer32 so I suppose this should be some kind of integer..
but in the xml, following may examples, I have them defined as float (because otherwise it complains about the scaling) .. I saw there was a thread on that subject here but it is somewhat old and used haltype=special32 ???
I also tried different scaling betwen 0.001 to 1 and 1000 for actpos and poscmd... ( it does indeed change the encoder resolution when I force the motor) generating more or less error.
Again thank you for your help.. I feel there is just one little thing to find ... it is a bit frustrating to be so close and not see the motor move...
Please Log in or Create an account to join the conversation.
If it is surely a small detail that does not leave you, meanwhile you can try another configuration mode, for example speed,
You can test the SYNC unit cycle at 1000us in TWINCAT and define the SYNC0 x 1 = 1000 us ?? if it works you can try this configuration.
<dcConf assignActivate="300" sync0Cycle="*1" sync0Shift="0"/>
In the screenshot that you show me these records are zero? why?
Reguard
Chimeno
Please Log in or Create an account to join the conversation.
I tried the new dcConf you suggested but it doesn't seem to work
also when I try to edit the sync unit cycle to 2000us, but the field in the window would not let me change the value.
I suppose I would need to change it in the SDO somehow and save the value in the firmware of the driver?
ALso I still have some warnings in the ethercat and still fail to sync.
but I do get to OP:
[ 444.038961] EtherCAT 0: Slave states on main device: PREOP.
[ 444.948987] EtherCAT WARNING: Datagram e745f9ef (master-fsm) was SKIPPED 1 time.
[ 479.273797] EtherCAT: Requesting master 0...
[ 479.273813] EtherCAT: Successfully requested master 0.
[ 479.274580] EtherCAT 0: Domain0: Logical address 0x00000000, 18 byte, expected working counter 3.
[ 479.274590] EtherCAT 0: Datagram domain0-0-main: Logical offset 0x00000000, 18 byte, type LRW.
[ 479.274791] EtherCAT 0: Master thread exited.
[ 479.274806] EtherCAT 0: Starting EtherCAT-OP thread.
[ 479.274977] EtherCAT WARNING 0: 1 datagram UNMATCHED!
[ 484.539948] EtherCAT WARNING 0-0: Slave did not sync after 5000 ms.
[ 484.543979] EtherCAT 0: Domain 0: Working counter changed to 3/3
[ 484.543988] .
[ 484.859325] EtherCAT 0: Slave states on main device: OP.
When I set 2.4mm to the target position in twincat the position of both actpos and poscm is 24000 so I suppose it is always an integer So do I need to have "FLOAT" haltype is correct for actpos and poscmd registers despite the integer32 type in the manual?
Do I maybe need to start an other thread or function in linuxcnc to enable actual displacement? or set windows or limits of operation or remove some safety somewhere?
Attachments:
Please Log in or Create an account to join the conversation.
I finally got everything wired up in the machine and running fully on Ethercat only. No more software encoder or parallel port slow down, and now working on the PID tuning. I couldn't properly tune it in the past as it couldn't ever get up past about 30ipm as it would loose counts and then error the axis. At some point the original 200ppr encoders were replaced with 1000ppr BEI encoders, so software encoding is practically impossible at moderate to high speed. Low speed not a problem, but once past 25ipm it was really iffy about loosing counts. But now, even with just some rough tuning, I can get 50ipm with it being smooth, it came from the factory with 250ipm, so after I finish PID tuning I am going to adjust my INI and crank up the jog speed some. Huge difference in the EL5151 hardware counting comparred to the previous parallel port software encoding. Absolutely love the Ethercat setup.
Robert
Please Log in or Create an account to join the conversation.
Here I explain how to change it through images that is much more intuitiveI tried the new dcConf you suggested but it doesn't seem to work
also when I try to edit the sync unit cycle to 2000us, but the field in the window would not let me change the value.
I suppose I would need to change it in the SDO somehow and save the value in the firmware of the driver?
First I show you the DC tab where you have 2000us
now you have to go to the MOTION tab where we have the first TASK to 2000us
now we change it to 1000us
Now we go back to the DC tab of your device and automatically we have the value 1000us, now you just have to change the value of the SYNC0 in this case we multiply it x1 and reconfigure
You can also change the value and the different SYNC modes directly on the device, in the COE tab I cannot tell you where because I do not have the device and it does not allow me to see all the records although it is surely in 1C32 and 1C33, you also have to think that whenever the device is configured in linux, you usually have to do it before the device goes into OP mode and only send and receive data through PDOs.
I feel that I cannot be of more help,
Reguard
Chimeno
Attachments:
Please Log in or Create an account to join the conversation.
Thank you so much...
I was able to change to 1ms and it works nice in twincat...
Also in twincat I have to enable controller+ feed FW + feed BW to make the motor move.
there is no such thing in linuxcnc?
I don't think there is more you can do indeed whithout a driver and hardware
And I don't really know how to thank you for all that... If you would ever come to Switzerland, I would be happy to offer you a good restaurant. Alternatively, if you need or would like something from here that I could ship, please let me know.
And of course, if I ever manage to make it work, I'll make sure to document the thing fully so newcomer (like me) with similar hardware can benefit of all this somehow.
Please Log in or Create an account to join the conversation.