Ich bin wieder da....
Kann mir jemand das mit den Threads nochmal erklären?
Mein Grundproblem ist, das verschiedene Funktionen parallel/gleichzeitig ausgeführt werden sollen.
Aus den einzelnen Funktionen (im alten Programm) hab ich die Endlosschleifen gelöscht und hatte geplant, das ich das in "main" steuern kann.
Bei unten stehendem Programm wird erst "EinlesenTemp" abgearbeitet, danach "EinlesenDI".
Das sollte eigentlich schon gleichzeitig passieren....
Danach (weil die beiden Variablen in der if-Schleife am Ende der Funktionen gesetzt werden) werden "VentilSoll" und "Ausgabe" abgearbeitet.
Da das aber alles in der "while(1)"-Schleife steht, sollte das wiederholt werden. Wird aber nicht.
Ich muß doch mit "join" die threads beenden. Was mache ich falsch?
Warum werden die in der Endlosschleife nicht mehr neu gestartet?
goggle war nicht sehr hilfreich... und in meinen c++-Büchern steht rein gar nix von threads....
Hier mein "main":
int main() {
thread t1();//muessen vorher deklariert werden
thread t2();
thread t3();
thread t4();
setup();
while(1){
thread t1(EinlesenTemp);
thread t2(EinlesenDI);
t1.join();
t2.join();
if(EinlesenTempIR && EinlesenDIIR){
cout << "261" << endl;
thread t3(VentilSoll);
thread t4(Ausgabe);
t3.join();
t4.join();
}
//t1.join();
//t2.join();
}
return 0;
}
Display More
Hier das komplette Programm:
/*
In boot/config.txt eintragen:
#dtoverlay=w1-gpio,<param>=<val>
#1-wire aktivieren
dtoverlay=w1-gpio,gpiopin=4,pullup=0 # header pin 7
dtoverlay=w1-gpio,gpiopin=14,pullup=0 # header pin 15
dtoverlay=w1-gpio,gpiopin=15,pullup=0 # header pin 16
Für Autostart in /etc/rc.local eintragen:
/home/pi/Documents/c++/heiz/bin/Debug/./heiz
*/
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <wiringPi.h>
#include <unistd.h>
#include <thread>
#include <time.h>
#define DOV1 0//Digital OUT Ventil 1 WiringPi-Ausgang 0
#define DOV2 1
#define DOV3 2
#define DOPumpHW 3
#define DOPumpWT 4
#define DOPumpHK 5
#define DOPumpZirk 12
#define DIV1S1 21// Digital Input Ventil 1, Schalter 1, WiringPi-Eingang 21
#define DIV1S2 22
#define DIV2S1 24
#define DIV2S2 27
#define DIV3S1 25
#define DIV3S2 28
using namespace std;
string Pfad[11] = { "/sys/bus/w1/devices/28-3cece381f7e5/temperature",//0
"/sys/bus/w1/devices/28-3cb0e3810f73/temperature",//1
"/sys/bus/w1/devices/28-3ca2e381aae7/temperature",//2
"/sys/bus/w1/devices/28-3cb3e38126f8/temperature",//3
"/sys/bus/w1/devices/28-3c97e3813e8e/temperature",//4
"/sys/bus/w1/devices/28-3cdee381bb11/temperature",//5
"/sys/bus/w1/devices/28-3c66e3815cb6/temperature",//6
"/sys/bus/w1/devices/28-3c70e3818de4/temperature",//7
"/sys/bus/w1/devices/28-3ce7e381cb88/temperature",//8 WWoben
"/sys/bus/w1/devices/28-3cd1e381ccae/temperature",//9 WWunten
"/sys/bus/w1/devices/28-3c60e381ad24/temperature"//10 WWrücklauf
};
float Temp[11];
bool WWLaden100;
bool WWLaden50;
bool PufferLaden50;
int Ventil1soll;
int Ventil2soll;
int Ventil3soll;
int Ventil1ist;
int Ventil2ist;
int Ventil3ist;
bool VentilOK;
bool V1S1;
bool V1S2;
bool V2S1;
bool V2S2;
bool V3S1;
bool V3S2;
bool V1S1alt;
bool V1S2alt;
bool EinlesenTempIR = 0;
bool EinlesenDIIR = 0;
int Stoerung;
void Ventil();
int V1(bool v1) {
digitalWrite(DOV1, !v1);//Negiert, weil Relaiskarte negiert
return 0;
}
int V2(bool v2) {
digitalWrite(DOV2, !v2);
return 0;
}
int V3(bool v3) {
digitalWrite(DOV3, !v3);
return 0;
}
void setup() {
wiringPiSetup();
pinMode(DOV1, OUTPUT);
V1(0);
pinMode(DOV2, OUTPUT);
V2(0);
pinMode(DOV3, OUTPUT);
V3(0);
pinMode(DOPumpHW, OUTPUT);
digitalWrite(DOPumpHW, 1);
pinMode(DOPumpWT, OUTPUT);
digitalWrite(DOPumpWT, 1);
pinMode(DOPumpHK, OUTPUT);
digitalWrite(DOPumpHK, 1);
pinMode(DOPumpZirk, OUTPUT);
digitalWrite(DOPumpZirk, 1);
pinMode(DIV1S1, INPUT);
pullUpDnControl(DIV1S1, PUD_DOWN);
pinMode(DIV1S2, INPUT);
pullUpDnControl(DIV1S2, PUD_DOWN);
pinMode(DIV2S1, INPUT);
pullUpDnControl(DIV2S1, PUD_DOWN);
pinMode(DIV2S2, INPUT);
pullUpDnControl(DIV2S2, PUD_DOWN);
pinMode(DIV3S1, INPUT);
pullUpDnControl(DIV3S1, PUD_DOWN);
pinMode(DIV3S2, INPUT);
pullUpDnControl(DIV3S2, PUD_DOWN);
}
void EinlesenTemp() {
//while (1) {
for (int i=0; i<= 10; i++) {
ifstream Tempsensor (Pfad[i]);
Tempsensor >> Temp[i];
cout << "Temp " << i <<": "<<(Temp[i] / 1000) << endl;
}
EinlesenTempIR =1;
//}
}
void EinlesenDI(){
//while(1){
V1S1 = digitalRead(!DIV1S1);
V1S2 = digitalRead(!DIV1S2);
V2S1 = digitalRead(!DIV2S1);
V2S2 = digitalRead(!DIV2S2);
V3S1 = digitalRead(!DIV3S1);
V3S2 = digitalRead(!DIV3S2);
EinlesenDIIR = 1;
usleep(100000);
//}
}
void VentilSoll(){
//while(1){
if ((Temp[0]-3) > Temp[8]) {
WWLaden100 = 1;
} else {
WWLaden100 = 0;
}
if (((Temp[0]-3) > Temp[9]) && (WWLaden100 == 0)) {
WWLaden50 = 1;
} else {
WWLaden50 = 0;
}
if ((Temp[0]-3) < Temp[9]) {
WWLaden100 = 0;
WWLaden50 =0;
}
cout << "WWLaden100 = " << WWLaden100 << endl;
cout << "WWLaden50 = " << WWLaden50 << endl;
cout << "PufferLaden50 = " << PufferLaden50 << endl;
if (WWLaden100 ==1) {
Ventil1soll = 1;
Ventil2soll = 1;
Ventil3soll = 1;
}
if (WWLaden50 == 1) {
Ventil1soll = 2;
Ventil2soll = 1;
Ventil3soll = 1;
}
if ((WWLaden100 == 0) && (WWLaden50 == 0)){
Ventil1soll = 3;
Ventil2soll = 1;
Ventil3soll = 1;
}
if(Ventil1ist != Ventil1soll)Ventil();
sleep(1);
//}
}
void Ventil() {
while(Ventil1ist != Ventil1soll){
V1(1);//Ventilmotor einschalten
while (V1S1 == 1 || V1S2 == 1) usleep(100000);//sicher sein, das nocken aus
while (V1S1 == 0 && V1S2 == 0) usleep(100000);//fahre, solange nocken aus
while (V1S1 == 1 || V1S2 == 1){//sobald eine Nocke an geht....
if(V1S1 == 1){V1S1alt = 1;} //speicher die Werte ab
if(V1S2 == 1){V1S2alt = 1;}
usleep(100000);
}
if(V1S1alt == 1 && V1S2alt == 0){
cout <<"Fall 1" << endl;
Ventil1ist = 1;
}
if(V1S1alt == 0 && V1S2alt == 1){
cout <<"Fall 2" << endl;
Ventil1ist = 2;
}
if(V1S1alt == 1 && V1S2alt == 1){
cout <<"Fall 3" << endl;
Ventil1ist = 3;
}
}
V1(0);
}
void Ausgabe(){
//while(1){
cout << "V1S1 = " << V1S1 << endl;
cout << "V1S2 = " << V1S2 << endl;
cout << "V2S1 = " << V2S1 << endl;
cout << "V2S2 = " << V2S2 << endl;
cout << "V3S1 = " << V3S1 << endl;
cout << "V3S2 = " << V3S2 << endl;
// cout << "v1 = " << v1 << endl;
// cout << "v2 = " << v2 << endl;
// cout << "v3 = " << v3 << endl;
cout << "Ventil1soll = " << Ventil1soll << endl;
cout << "Ventil1ist = " << Ventil1ist << endl;
cout << "VentilOK = " << VentilOK << endl;
sleep(1);
//}
}
int main() {
thread t1();
thread t2();
thread t3();
thread t4();
setup();
while(1){
thread t1(EinlesenTemp);
thread t2(EinlesenDI);
t1.join();
t2.join();
if(EinlesenTempIR && EinlesenDIIR){
cout << "261" << endl;
thread t3(VentilSoll);
thread t4(Ausgabe);
t3.join();
t4.join();
}
//t1.join();
//t2.join();
}
//ausgange();
return 0;
}
Display More