This paper presents the design, implementation and analysis of a PLC-based self-tuning PI-fuzzy controller for linear and non-linear drives control. The controller consists of two fuzzy logic blocks, main and gain tuning, respectively. The main fuzzy block acts as a speed controller, while the gain tuning block scales the output of main fuzzy. The output gain tuning has the same inputs as main fuzzy (i.e. speed error and change of error). By introducing output gain tuning, overshoot and settling time can be restrained. The objective of the controller is to provide stability, to reduce overshoot in responds to disturbance and sudden change in reference speed. The performance is compared to PI-fuzzy controller through simulation and experiment. Results of the proposed system show satisfactory performance.