function handle() local desired_rpm = GetCurSpindleRPM() if (not IsRealDeviceConnected()) then desired_rpm = 0 end local value, is_online = ReadModbusRegisterUpdated("SpindleStatus") Sleep(30) local mode_updated = is_online and check_mode(value, desired_rpm) if (prev_rpm == nil or prev_rpm ~= desired_rpm or not mode_updated) then if (send_spindle_control_command(desired_rpm)) then prev_rpm = desired_rpm end end end function send_spindle_control_command(rpm) local mode = get_mode(rpm) local Hz = math.floor(math.abs(rpm) / 60 * 100 + 0.5) local success_1 = WriteModbusRegister("SpindleMode", mode) Sleep(30) local success_2 = WriteModbusRegister("SpindleRPM", Hz) return success_1 and success_2 end function get_mode(rpm) local mode = 49152 -- Stop if (rpm > 0) then mode = 50176 -- Forward elseif (rpm < 0) then mode = 50688 -- Reverse end return mode end function check_mode(status, rpm) if (rpm > 0) then return is_bit_assigned(status, 10) and not is_bit_assigned(status, 9) -- Forward elseif (rpm < 0) then return is_bit_assigned(status, 10) and is_bit_assigned(status, 9) -- Reverse else return not is_bit_assigned(status, 10) -- Stop end end function is_bit_assigned(value, index) return value & (1 << index) ~= 0 end