package org.vishia.exampleJava2C.java4c; import org.vishia.exampleJava2C.emulationEnv.MainEmulation.WayActuator; import org.vishia.exampleJava2C.emulationEnv.MainEmulation.WaySensor; /**This class is the example main class to control a movement. * * @author JcHartmut * */ public class MainController { final WaySensor way1Sensor, way2Sensor; final WayActuator way1Actuator, way2Actuator; /** The set value for the way in 0.1mm-units from above -3 m to 3 m. */ short wWay = 1000; /**controller offset. */ int dWay; /**Simple set value: add 0.5 mm per step */ short addWay = 5; final PID_controller pidCtrl1 = new PID_controller(); /**The constructor of this Controller assumes, that the depended instances all built always. * @param broker Interface contains all require methods to depended instances. */ public MainController(iRequireMainController broker) { way1Sensor = broker.requireWay1Sensor(); way2Sensor = broker.requireWay2Sensor(); way1Actuator = broker.requireWay1Actuator(); way2Actuator = broker.requireWay2Actuator(); } /**Gets the set value in units mm*/ public short getWaySetvalue(){ return wWay; } /**Gets the offset of the controller on input*/ public int getWayOffset(){ return dWay; } /**This is the cyclical called method to execute the controlling. */ public void step() { //reads the inputs from Hardware, it is in units 1 micrometer. int xWay = way1Sensor.getWay(); //first example: way moves up and down between 1000 and 2000. if(wWay >= 2000){ addWay = -5; } else if(wWay <= 1000){ addWay = 5; } wWay += addWay; /**difference of way in units 1 Micrometer, range should be -32..32 mm. */ dWay = xWay - 100 * wWay; /**The actuating variable for the movement. It is a voltage for a motor in range -10000 to 10000, unit milliVolt. */ short yOut; if(dWay > 30000) { //The way is out of range, move down. yOut = -10000; } else if(dWay < -30000) { //The way is out of range, move up. yOut = 10000; } else { //because the dway should be in range -3..3 cm (normally in mm-range), the calculation may be done with 16-bit-accuracy. yOut = pidCtrl1.process((short)(-dWay)); } way1Actuator.setMotorVoltage(yOut); } /**Get the internal value of the integrator of the first way controller. */ public float getWay11Intg(){ return pidCtrl1.getIntg(); } /**This interface contains all requirenesses of the MainController * from the external environment. It should be implemented in the constructing class. * @author JcHartmut * */ public interface iRequireMainController { WaySensor requireWay1Sensor(); WaySensor requireWay2Sensor(); WayActuator requireWay1Actuator(); WayActuator requireWay2Actuator(); } }