component thcud "Torch Height Control Up/Down Input"; description """ Torch Height Control This THC takes either an up or a down input from a THC If enabled and torch is on and X + Y velocity is within tolerance of set speed allow the THC to offset the Z axis as needed to maintain voltage. If enabled and torch is off and the Z axis is moving up remove any correction at a rate not to exceed the rate of movement of the Z axis. If enabled and torch is off and there is no correction pass the Z position and feed back untouched. If not enabled pass the Z position and feed back untouched. Physical Connections typical paraport.0.pin-12-in <= THC controller Plasma Up paraport.0.pin-13-in <= THC controller Plasma Down parport.0.pin-15-in <= Plasma Torch Arc Ok Signal parport.0.pin-16-out => Plasma Torch Start Arc Contacts HAL Plasma Connections thc.torch-up <= paraport.0.pin-12-in thc.torch-down <= paraport.0.pin-13-in motion.spindle-on => parport.0.pin-16-out (start the arc) thc.arc-ok <= motion.digital-in-00 <= parport.0.pin-15-in (arc ok signal) HAL Motion Connections thc.requested-vel <= motion.requested-vel thc.current-vel <= motion.current-vel Pyvcp Connections In the xml file you need something like: "THC Enable" "thc-enable" "5" "vel-tol" .01 1 0.01 0.2 "1.2f" ("Arial",10) Connect the Pyvcp pins in the postgui.hal file like this: net thc-enable thcud.enable <= pyvcp.thc-enable """; author "John Thornton"; license "GPLv2 or greater"; option singleton yes; // Input Pins pin in bit torch_up "Connect to an input pin"; pin in bit torch_down "Connect to input pin"; pin in float current_vel "Connect to motion.current-vel"; pin in float requested_vel "Connect to motion.requested-vel"; pin in bit torch_on "Connect to motion.spindle-on"; pin in bit arc_ok "Arc Ok from Plasma Torch"; pin in bit enable "Enable the THC, if not enabled Z position is passed through"; pin in float z_pos_in "Z Motor Position Command in from axis.n.motor-pos-cmd"; // Output Pins pin out float z_pos_out "Z Motor Position Command Out"; pin out float z_fb_out "Z Position Feedback to Axis"; pin out float cur_offset "The Current Offset"; pin out bit vel_status "When the THC thinks we are at requested speed"; pin out bit removing_offset "Pin for testing"; // Parameters param rw float velocity_tol "The deviation percent from planned velocity"; param rw float correction_vel "The Velocity to move Z to correct"; // Global Variables variable float offset; variable float last_z_in; function _; ;; #include "rtapi_math.h" FUNCTION(_) { if(enable){ float min_velocity = requested_vel -(requested_vel*(1/velocity_tol)); if(current_vel > 0 && current_vel >= min_velocity){vel_status = 1;} else {vel_status =0;} if(torch_on && arc_ok && vel_status){ // allow correction if(torch_down){ offset -= correction_vel; } if(torch_up){ offset += correction_vel; } last_z_in = 0; } if(!torch_on){ // remove any offset float z_diff; z_diff = z_pos_in - last_z_in; if(z_diff > 0 && offset != 0){ // torch is moving up removing_offset = 1; if(offset > 0){ // positive offset if(offset > z_diff){ // remove some offset -= z_diff; } else {offset = 0;} } if(offset < 0){ // negative offset if(offset < z_diff){ // remove some offset += z_diff; } else {offset = 0;} } } else {removing_offset = 0;} last_z_in = z_pos_in; } z_pos_out = z_pos_in + offset; z_fb_out = z_pos_in; // keep axis motor position fb from being confused } if(!enable){ z_pos_out = z_pos_in; z_fb_out = z_pos_in; // keep axis motor position fb from being confused } }