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 |