Code:
component GB_2speed;
pin in bit spindle-enable-in;
pin out bit spindle-enable-out;
pin in float spindle-speed-in;
pin out float motor-speed-out;
pin out bit motorhighspeed;
pin in bit gear-high;
pin in bit motor-high;
pin in bit gear-A;
pin in bit gear-B;
pin in bit gear-C;
pin in bit gear-D;
pin in bit gear-E;
pin out unsigned gear-required;
pin out bit message-##[14];
license "gpl";
function _;
;;
FUNCTION(_){
int actual, message, motor_max_speed;
int i;
// These need to be edited to suit the gearbox
int speeds[13] = {0, 125, 160, 215, 270, 360, 450, 595, 750, 1000, 1191, 1500, 2500};
int reqd_gear[13] = {0x0, 0x01, 0x21, 0x02, 0x22, 0x04, 0x24, 0x08, 0x28, 0x10, 0x48, 0x68, 0x50, 0x70};
if (spindle_speed_in == 0) return;
actual = (motor_high * 0x40 + gear_high * 0x20 + gear_A * 0x10 + gear_B * 0x08 + gear_C * 0x04 + gear_D * 0x02 + gear_E * 0x01);
for (i = 0; spindle_speed_in > speeds[i] && i < 12; i++);
gear_required = reqd_gear[i];
motorhighspeed = reqd_gear[i] & 0x40 ? 1 : 0;
if (gear_required == actual && gear_required != 0x0){ // We are in the right gear
spindle_enable_out = spindle_enable_in;
if (motor_high)
motor_max_speed = 2500;
else
motor_max_speed = 1850;
motor_speed_out = motor_max_speed * (spindle_speed_in / speeds[i+1]);
message = 0;
} else {
int j;
motor_speed_out = 0;
spindle_enable_out = 0;
for (j = 0; j < 13; j++) { message(j) = 0; }
message(i) = 1;
}
}