C# 2008 : Dreipunkt

ftComputing : Programme für die fischertechnik-Interfaces und -konstruktionskästen
  
ftComputing.de
Home
Back
Sitemap
Index
Links
Impressum
Mail
 

Dreipunktregelung

Eine Lampe an Out.O7 sitzt auf auf einem Schneckenantrieb mit Motor an Mot.M1. Sie soll den Photowiderstand an Unv.I4 mit einem vorgegeben SollWert so beleuchten, daß der Meßwert an Unv.I4 stets innerhalb vorgegebener Grenzen (LimitHigh / LimitLow) bleibt.

Lösung mit Klasse FishFace

using FishFaceTX;
namespace
Dreipunkt {

 
public partial class DreiMain : Form {
   
FishFace tx = new FishFace();
   
Mot ReglerMotor = Mot.M1;

   
Unv LichtSensor = Unv.I4;
   
Out Lichtquelle = Out.O7;

   
int SollWert; int LimitHigh; int LimitLow; int ActualValue;  

    public DreiMain() {InitializeComponent();}

    private void numSollwert_ValueChanged(object sender,
                 EventArgs e) {

     
SollWert    = (int)numSollwert.Value;
     
LimitHigh   = SollWert + 100;
     
LimitLow    = SollWert - 100; }

    private void cmdAction_Click(object sender, EventArgs e) {
     
numSollwert.Value = 700;
     
tx.OpenController("COM4");

     
tx.SetLamp(Lichtquelle, Dir.On);
     
tx.Pause(1234);
     
lblStatus.Text = "Ende : ESC-Taste";
     
while (!tx.Finish()) {
       
ActualValue = tx.GetAnalog(LichtSensor);
       
lblIstWert.Text = ActualValue.ToString();
       
if (ActualValue < LimitLow)
            tx.SetMotor(ReglerMotor, Dir.Right, 400);

       
else if (ActualValue > LimitHigh)
                 tx.SetMotor(ReglerMotor, Dir.Left,  400);

       
else tx.SetMotor(ReglerMotor, Dir.Off);

       
tx.Pause(111);
     
}
     
tx.CloseController();
     
lblStatus.Text = "Das war's";
}}}

Der Sollwert wird durch das Control numSollwert (NumericUpDown) in der Ereignisroutine numSollwert_ValueChanged samt Grenzwerten eingestellt.

In der Click-Routine des Buttons cmdAction läuft in einer Endlosschleife das eigentliche Programm :
- tx.OpenController / tx.CloseController : Verbindung zum TX Controller (Name COM4 anpassen).
- die while-Schleife über die Messungen kann durch die ESC-Taste beendet werden.
- in der Schleife wird zuerst der aktuelle Wert am Photowiderstand gemessen und im Label-Control lblIstWert angezeigt.
- Danach erfolgt die eigentliche Regelung : akt. Wert kleiner LimitLow : Motor nach Rechts
  akt. Wert größer LimitHigh : Motor nach links, sonst Motor Stopp
- gemessen wird alle 111 mSek.

Lösung auf Basis von Device-Klassen

using FishFaceTX;
namespace
Dreipunkt {

 
public partial class DreiMain : Form {
   
FishControl   fc = new FishControl();
   
EncoderMotor  ReglerMotor;

   
PhotoResistor LichtSensor;
   
Lamp          Lichtquelle;


    public DreiMain() {

     
InitializeComponent();
     
Label.CheckForIllegalCrossThreadCalls = false;
     
ReglerMotor = new EncoderMotor(fc, Ctr.Main, Mot.M1);
     
LichtSensor = new PhotoResistor(fc, true, Ctr.Main, Unv.I4);
     
LichtSensor.ChangedToHigh +=
                 new AnalogInput.Limit(LichtSensor_ChangedToHigh);

      
LichtSensor.ChangedToLow +=
                 new AnalogInput.Limit(LichtSensor_ChangedToLow);

     
LichtSensor.ChangedToNormal +=
                new AnalogInput.Limit(LichtSensor_ChangedToNormal);

      
LichtSensor.CurrentValue +=
                   new AnalogInput.Limit(LichtSensor_CurrentValue);

     
Lichtquelle = new Lamp(fc, Ctr.Main, Out.O7);
   
}

Erzeugung der Device-Objekte. true steht hier für "mit Ereignissen" und die Zuordnung der Ereignisroutinen.

     void LichtSensor_ChangedToHigh(AnalogInput sender, int Wert) {
     
ReglerMotor.RunLeft(444);}
   
void LichtSensor_ChangedToLow(AnalogInput sender, int Wert) {
     
ReglerMotor.RunRight(444);}
   
void LichtSensor_ChangedToNormal(AnalogInput sender, int Wert) {
     
ReglerMotor.StopRun();}
   
void LichtSensor_CurrentValue(AnalogInput sender, int Wert) {
     
lblIstWert.Text = Wert.ToString();}

   
private void numSollwert_ValueChanged(object sender,
                                                   
EventArgs e) {

     
int SollWert          = (int)numSollwert.Value;
      
LichtSensor.LimitHigh = SollWert + 75;
     
LichtSensor.LimitLow  = SollWert - 75;

   
}

Die Ereignisroutinen sind überraschend kurz : nur ReglerMotor links, rechts und aus sowie Anzeige des aktuellen Meßwertes am Photowiderstand. bei der Routine zur Einstellung des Sollwertes werden zusätzlich noch die Grenzwerte für das Objekt Lichtsensor gesetzt. Auf eine threadsichere Anzeige der Werte wurde verzichtet. Siehe oben Label.CheckForIllegalCrossThreadCalls

   private void cmdAction_Click(object sender, EventArgs e) {
     
numSollwert.Value = 700;
     
fc.Connect("COM4");
     
fc.StartEvents();
     
Lichtquelle.On();
     
fc.Pause(1234);
     
lblStatus.Text = "Ende : ESC-Taste";
     
while (!fc.Finish()) fc.Pause(555);
     
fc.DisConnect();
      
lblStatus.Text = "Das war's";

   
}}}

Der Sollwert wird durch das Control numSollwert (NumericUpDown) in der Ereignisroutine numSollwert_ValueChanged samt Grenzwerten eingestellt.

In der Click-Routine des Buttons cmdAction läuft in einer Endlosschleife das eigentliche Programm :
- tx.OpenController / tx.CloseController : Verbindung zum TX Controller (Name COM4 anpassen). Zusätzlich : Start der Eventroutinen.
- die while-Schleife über die Messungen kann durch die ESC-Taste beendet werden. Das ist auch ihre einzige Aufgabe : Das Warte auf das Ende. Der Rest läuft über die Ereignisroutinen.

Stand : 01.12.2009