Programmiertechnik im Zusammenhang mit der Implementierung von Optimierern und Fuzzy-Reglern auf einem Mikrocontroller.
Registrierung
registrieren.zip - Download der nachfolgenden Programmbeispiele.
|
...in C++:
class A
{
public:
int holeKennung()
{
return 15678;
}
};
Code 0-1: Quellcode zu A.h
class B
{
private:
A* a_zeiger;
public:
void registriere(A* a_zeiger)
{
this->a_zeiger = a_zeiger;
}
void zeigeKennung()
{
cout<<a_zeiger->holeKennung()<<endl;
}
};
Code 0-2: Quellcode zu B.h
#include<iostream>
using namespace std;
#include "A.h"
#include "B.h"
int main()
{
A a;
B b;
b.registriere(&a);
b.zeigeKennung();
}
Code 0-3: Quellcode zu Hauptprogramm.cpp
...in Java:
public class A
{
public int holeKennung()
{
return 15678;
}
}
Code 0-4: Quellcode zu A.java
public class B
{
private A a_referenz;
public void registriere(A a_referenz)
{
this.a_referenz = a_referenz;
}
public void zeigeKennung()
{
System.out.println(a_referenz.holeKennung());
}
}
Code 0-5: Quellcode zu B.java
public class Hauptprogramm
{
public static void main(String[] args)
{
A a = new A();
B b = new B();
b.registriere(a);
b.zeigeKennung();
}
}
Code 0-6: Quellcode zu Hauptprogramm.java
Repräsentation von Fließkommavariablen als Integer-Werte auf einem Mikrocontroller
param.zip - Download des nachfolgend beschriebenen Programms.
|
Vorüberlegungen
|
Bild 0-1: Skalierung von x nach u: Zunächst auf den Bereich 0..1 skalieren, dann um den Faktor 65535 strecken.
|
|
#define PANZ 10
class Param
{
public:
double* p[PANZ]; //Array mit Zeigern auf die registrierten double-Parameter.
double pmin[PANZ]; //Minimaler Wert jedes Parameters.
double pmax[PANZ]; //Maximaler Wert jedes Parameters.
uint16_t u[PANZ]; //Integer-Repräsentation der einzelnen Parameter.
void aktualisiereInt(int nr) //double-Repräsentation des ausgewählten Parameters auf die Integer-Rep. übertragen.
{
u[nr] = (uint16_t)( ((*p[nr]-pmin[nr])*65535.0)/(pmax[nr]-pmin[nr]) );
}
void aktualisiereDouble(int nr) //int-Repräsentation des ausgewählten Parameters auf die double-Rep. übertragen.
{
*p[nr] = pmin[nr] + ((double)u[nr]*(pmax[nr]-pmin[nr]))/65535.0;
}
void registriere(int nr,double* x, double xmin, double xmax) //Neuen Parameter merken
{
p[nr] = x;
pmin[nr] = xmin;
pmax[nr] = xmax;
aktualisiereInt(nr);
}
bool aendereDefinitionsbereich(int nr, double xmin_neu, double xmax_neu)
{
if(*p[nr]<xmin_neu || *p[nr]>xmax_neu)
return false;
pmin[nr] = xmin_neu;
pmax[nr] = xmax_neu;
aktualisiereInt(nr);
return true;
}
};
Code 0-7: Quellcode der Klasse Param.h
#include<iostream>
#include<stdint.h>
using namespace std;
#include "Param.h"
Param param;
int main()
{
double y=0.7;
double t=310.45;
cout<<"y="<<y<<endl;
cout<<"t="<<t<<endl;
param.registriere(0,&y,-1.0,1.0);
param.registriere(1,&t,0.0,1000.0);
param.aktualisiereInt(0);
param.aktualisiereInt(1);
param.aktualisiereDouble(0);
param.aktualisiereDouble(1);
cout<<"y="<<y<<endl;
cout<<"t="<<t<<endl;
}
Code 0-8: Quellcode des Programms Test.cpp
y=0.7 t=310.45 y=0.699977 t=310.445
Code 0-9: Ausgabe des Programms Test.cpp