Problem with toogle2nist component

More
5 years 11 months ago #188678 by mwinterm
Hello,

I'm trying to implement a physical button to start/stop the spindle. To do so I try to use the toggle2nist component the following way:
Code:
# --- SPINDLE-BUTTON --- net spindle-button toggle2nist.0.in <= hm2_7i76e.0.7i76.0.0.input-25 net spindle-enable => toggle2nist.0.is-on net spindle-manual-start toggle2nist.0.on net spindle-manual-stop toggle2nist.0.off

This does not work as supposed. The spindle is stopping as long as I keep the button pressed and starting again as soon as I release it. The following workaround where I delay the spindle-enable signal is providing the desired result.
Code:
# --- SPINDLE-BUTTON --- net spindle-button toggle2nist.0.in <= hm2_7i76e.0.7i76.0.0.input-25 net spindle-enable => timedelay.0.in net spindle-enable-delayed toggle2nist.0.is-on <= timedelay.0.out net spindle-manual-start toggle2nist.0.on net spindle-manual-stop toggle2nist.0.off

However I don't understand why this hack is needed. Could it be connected to the sequence the HAL execution?

Further, what would be the right way to initialize a toggle or toggle2nist component to be in a specific state on start-up?

Regards,

Marc

PS: spindle-enable has the following connections:
Code:
net spindle-enable => pid.s.enable net spindle-enable => hm2_7i76e.0.7i76.0.0.spinena net spindle-enable <= spindle.0.on

Please Log in to join the conversation.

More
5 years 11 months ago #188679 by cmorley
What does spindle-manual-start/spindle-manual-stop connect to.

also what is the addf sequence for the components.
addf sets the sequence that components are evaluated and it can mean a component id evaluating old data.

Please Log in to join the conversation.

More
5 years 11 months ago #188683 by mwinterm
Code:
net spindle-manual-stop halui.spindle.0.stop net spindle-manual-start halui.spindle.0.start

and here the addf-statements:
Code:
addf hm2_7i76e.0.read servo-thread addf motion-command-handler servo-thread addf motion-controller servo-thread addf pid.x.do-pid-calcs servo-thread addf pid.y.do-pid-calcs servo-thread addf pid.z.do-pid-calcs servo-thread addf pid.s.do-pid-calcs servo-thread addf ratio_select servo-thread addf scale.gear servo-thread addf hm2_7i76e.0.write servo-thread setp hm2_7i76e.0.dpll.01.timer-us -50 setp hm2_7i76e.0.stepgen.timer-number 1 addf and2.0 servo-thread addf and2.1 servo-thread addf spindle-scale servo-thread addf conv-float-s32.0 servo-thread addf feed-scale servo-thread addf conv-float-s32.1 servo-thread addf rapid-scale servo-thread addf conv-float-s32.2 servo-thread addf toggle.0 servo-thread addf toggle2nist.0 servo-thread addf timedelay.0 servo-thread

Please Log in to join the conversation.

More
5 years 11 months ago #188706 by cmorley
My guess is the servo thread updates faster then the HALUI component does.
HALUI is userspace so it's update is a little unpredictable but should be about 100ms IIRC.

Please describe completely what you are trying to do and maybe we can find a different way or just live with the time delay - it works !

Chris

Please Log in to join the conversation.

More
5 years 11 months ago #189008 by mwinterm
Hello Chris,

this makes sense to me and knowing what the problem is I think I can live with my workaround for the moment.

However I'm facing another problem with toggle2nist: When I'm starting LinuxCNC toggle2nist immediately tries to do a switch-action (not sure if it is from on to off or other way around). As at start-up E-stop is still active this causes rightfully an error.

Here is the code from toggle2nist from that I found on GitHub:
Code:
component toggle2nist "toggle button to nist logic"; description """ toggle2nist can be used with a momentary push button connected to a toggle component to control a device that has separate on and off inputs and has an is-on output. If in changes states via the toggle output If is-on is true then on is false and off is true. If is-on is false the on true and off is false. """; pin in bit in; pin in bit is_on; pin out bit on; pin out bit off; variable int old_in; variable int to_state=0; function _ nofp; license "GPL"; ;; FUNCTION(_) { if (in!=old_in) /* a toggle has occurred */ { if (is_on) { /* turn OFF if it's on */ on=0; off=1; to_state=0; } else if (!is_on) { /* turn ON if it's off */ on=1; off=0; to_state=1; } } else { /* reset pins when we see the desired state */ if (to_state==is_on) { on=0; off=0; } } old_in=in; }
I'm pretty new to linuxcnc and have no experience in HAL component programming so far. However based on my general understanding of programming I think there could be a problem with
Code:
variable int old_in;
not being initialized on start-up and therefore having an arbitrary value most likely not being 0 or 1. With that when run the first time in the servo-thread it meets the first if-condition and therefore causes an immediate switch-action.
If my assumptions are correct a solution could be to add an additional initialization parameter that defines old_in when the HAL file is executed.

Does this make any sense?

Regards,

Marc

Please Log in to join the conversation.

More
5 years 11 months ago #189267 by mwinterm
...no one with any feedback on this?

Regards,

Marc

Please Log in to join the conversation.

More
5 years 11 months ago #189269 by tommylight
You can do some quick tests to check if it "misses", just load it in a sim config and check the sates with halshow or halscope or "show hal configuration" from the machine menu.

Please Log in to join the conversation.

More
5 years 11 months ago #190021 by Benb
Attached is a cartoon showing similar hal file to toggle2nist with couple of interlocks to prevent signal racing. I have not tested this configuration, but its start.

Attachment not found

Attachment not found

Please Log in to join the conversation.

More
5 years 11 months ago #190023 by cmorley
you could compile a new component and try your fix to see if it helps.
linuxcnc.org/docs/devel/html/hal/comp.ht...side_the_source_tree

Please Log in to join the conversation.

More
5 years 11 months ago #190367 by mwinterm
@cmorley: Thanks for the link, that is exactly what I'm currently looking into (once I find a little more time again...)

@Benb: that is also very nice work, even though I try to keep the logical programming in the HAL file to a minimum (I'm more a higher level language coder... ;-). However you have made a very nice schemata. Do you have a tool to create this directly from the *.hal file?

Best regards,

Marc

Please Log in to join the conversation.

Time to create page: 0.058 seconds
Powered by Kunena Forum