Modbus input for absolute encoder position?

More
6 years 10 months ago #152606 by 0x2102
Ran a test qModMaster to see the RAW data and they are not signed. I can not adjust the range.

RAW Capture:

Positive values
[TCP]>Tx > 16:35:10:639 - 00 A3 00 00 00 06 01 03 08 44 00 01
[TCP]>Rx > 16:35:10:644 - 00 A3 00 00 00 05 01 03 02 00 06
Value: 00 06 = 6

Negative values:
[TCP]>Tx > 16:30:28:065 - 00 88 00 00 00 06 01 03 08 44 00 01
[TCP]>Rx > 16:30:28:070 - 00 88 00 00 00 05 01 03 02 FF FC
Value: FF FC = 65532 (65535 -65532= -3)

Found this note below that might explain why some ModBus implementations like ModPoll interpret the number differently - in my case correct.

Quote from MinimalModBus Website:
Negative numbers (INT16 = short)
Some manufacturers allow negative values for some registers. Instead of an allowed integer range 0-65535, a range -32768 to 32767 is allowed. This is implemented as any received value in the upper range (32768-65535) is interpreted as negative value (in the range -32768 to -1).

I did set up something that somehow works but not great yet.

MB2MAL axis load data -> Mux2.in0
MB2MAL axis load data -> Offset (-65535) -> Mux2.in1
stepgen.00.velocity-fb -> Abs.in to determine if X is going positive or negative direction -> used as selection pin for Mux2

This is working but when changing directions I get spikes in the 65000 range - instead of 20 - 100 for normal load. Especially with short moves I get spike all the time. Probably a timing issue between ModBus data (too slow) and the direction change signal.

Please Log in to join the conversation.

More
6 years 10 months ago #152608 by andypugh
Use the "bitslice" component to detect when bit15 is set instead. (and make sure that the bitslice is earlier in the thread list than the mux2 is)

You could probably use "comp" instead. Though really this feels like it should be configurable inside mb2hal

Please Log in to join the conversation.

More
6 years 10 months ago #152611 by 0x2102
You made my day Andy. Working, with bitslice as the input select pin.

Agree, it would be great if MB2HAL would allow configuration for that.

Thanks!

Please Log in to join the conversation.

More
6 years 10 months ago #152612 by Todd Zuercher
Mb2hal, is a rather crude tool. I found myself running much of what it reads through Classicladder to deal with similar issues.

Please Log in to join the conversation.

More
6 years 10 months ago #152695 by andypugh

0x2102 wrote: Agree, it would be great if MB2HAL would allow configuration for that.


Should it be a config thing, in the INI, or would it be as good to add extra HAL pins that present the data as signed values?

I am also curious about the scale and offset pins that exist in the source-code for MB2HAL, but are commented out.

Please Log in to join the conversation.

More
6 years 10 months ago #152697 by 0x2102
I think for me personally it wouldn't matter and both options would be fine. As long as there is a way to configure it per transaction.

I am still looking into the absolute encoder position with MB2HAL but I will wait until I have my new milling machine next week. Initial tests were just on my bench. Funny thing for the absolute encoder trial, MB2HAL behaved in my favor this time - as it counts 0-65536. Tools like ModPoll would read 32768 to 0 (half turn) and then -32768 to 0 again for the other half turn.

Please Log in to join the conversation.

More
6 years 8 months ago #157762 by 0x2102

andypugh wrote: ...

full-turns -> convert to float
initial counts -> convert to float
turns and counts -> sum2, turns scaled by 65536

sum2.N.out -> sample-hold.0.in

(Magic here to latch the sample-hold)

sample-hold.0.out -> sum2.M.in0 (gain 1)
encoder.N.position -> sum2.M.in1 (gain 1)
sum2.M.out -> PID feedback, axis position feedback, etc.

Then specify HOME_ABSOLUTE_ENCODER in the INI.


Hello,

wanted to provide a quick update and ask a question. I did exactly as suggested by Andy. All working but there is one remaining issue.

The sum2.M.in1 (encoder.N.position) or in my case (stepgen.00.position-fb) is "0" when I start LinuxCNC for the first time. Machine on triggers the sample hold. Then I jog the machine in X +50mm and set machine to off. When I turn it back on the position is off by 50mm.

The encoder.N.position or stegen.00.position-fb counters remains at 50.00000mm or whatever value it has and does not reset to 0 between machine off and on. Sum2.M adds the actual absolute encoder position + the encoder.N.position stored for the new absolute position.

Example:
Turn on machine: x-pos = 200mm + 0 = 200mm, jog X+ 50mm, turn off machine -> new x-pos = 250 + 50 = 300 but the real position is 250.

I might be able to add a mux2 or use an offset to subtract the encoder value but maybe someone has another idea. I already have to use quite a # of rt modules: offset, abs, conv_float_s32, sample_hold, conv_s32_float, 2 x sum2 to make it work and I am starting to see "Insufficient memory for pin.." warnings. :)

Please Log in to join the conversation.

More
6 years 8 months ago #158413 by andypugh

0x2102 wrote: I might be able to add a mux2 or use an offset to subtract the encoder value but maybe someone has another idea. I already have to use quite a # of rt modules: offset, abs, conv_float_s32, sample_hold, conv_s32_float, 2 x sum2 to make it work and I am starting to see "Insufficient memory for pin.." warnings. :)


I am surprised that you are that close to the pin memory limit.

One answer might be a custom HAL component. If you can write C code at all then this fairly easy.
linuxcnc.org/docs/2.7/html/hal/comp.html

Or you could try just not turning off the machine :-)

Actually, it sounds like you need to trigger the sample-hold with something other than machine-on. Maybe a timedelay component?

Set up a timedelay for a few mS (as long as it takes to get the initial position read) and trigger that in the HAL file at load time.
(ie setp timedelay.0.in 1)

Please Log in to join the conversation.

More
6 years 8 months ago #158420 by 0x2102
I will take your advise and never turn the machine off :)

I am at a point where I can't turn it back on due to following error warning in LinuxCNC. This is actually better than having the actual position all wrong.

I think in closed-loop setup I would be able to reset the encoder feedback to 0 before I turn the machine back on. I found a reset bit in the hostmot2 manual. I might give that a try later, when I have glass scales on the machine.

I could use the servo encoder feedback but when I set them up in closed-loop (with the servo's auto-tuning on) I have some strange behavior in LinuxCNC PID tuning. Might need to turn auto-tuning off.

Anyway, thanks for all your help so far. I will provide an update, if things change.

Please Log in to join the conversation.

More
3 years 6 months ago #268482 by besriworld
Hello, any progress here? I have servo motors with 24bit absolute encoder. I want to read the current starting position and axle load when the machine is moving .Again, communication is modbus. Can you share your config files . I am new to LinuxCNC. Thanks!

Please Log in to join the conversation.

Time to create page: 0.065 seconds
Powered by Kunena Forum