In einem ranged based for loop werte aus einem struct vergleichen aber wie?

Hallo,
wir benötigen hier leider ein wenig Hilfe. Den Code den wir bisher entwickelt haben ist für einen Kabeltester. Basierend auf einem Arduino ATmega2560.

Ist es möglich aus einem ranged based for loop werte aus einem struct so auszulesen wie wir das wollen?

Um zu erklären was wir genau wollen:

  1. Es soll der erste Wert aus Verbindung_Anfang_1 auf Output gestellt werden
  2. teste danach alle anderen Kabel gegen das erste Kabel
    3, Schau wo ein Signal ankommt
  3. Prüfe ob das signal mit dem Wert aus dem Struct überinstimmt
  4. Wenn ja alles gut
  5. Wenn nein dann schreibe I1 -> O1 --FAIL-- Verdrahtungsfehler mit Leitung O2,...

Je nachdem welches Szenario im struct eingegeben wurde, wird entschieden wie die Verbindung getestet werden soll. Ob es ein "Y" ist oder "A" oder "H" ist. Der erste Testabschnitt funktioniert schon. An gibt an der Funktion sollte man nicht unbedingt was ändern müssen. Testabschnitt 2 ist der Abschnitt der Probleme macht.

Code (2).txt (25.9 KB)

// Anfang Pin/Kabel;

const int I1 = 23;
const int I2 = 25;
const int I3 = 27;
usw..

Das durchnummerieren von Variablen tut in meinen Augen weh.
Zudem sollten Variablen nicht mit einem Großbuchstaben beginnen

Ist das Durchnummerieren wirklich nötig?

Warum steht so viel in setup()? IMO gehören Tests in loop().

Wie soll in Testabschnitt 2 an den Pins was anderes als HIGH anliegen?

Insgesamt ist das so viel ziemlich überflüssiger Code, wer soll da noch durchblicken?

Ist es möglich aus einem ranged based for loop werte aus einem struct so auszulesen wie wir das wollen?

Vermutlich ja. Mit eurer struct werden bis zu 4 Punkte beschrieben. Das sollte auch für eine "H" - Verbindung reichen.
Durch das erste Byte (.LeitungsName) kriegt ihr sogar den jeweiligen Index zurückgeliefert. Wenn ihr das braucht, wäre eine "normale" for-Schleife einfacher. Sieht auf jeden Fall etwas redundant aus.

Und DrDiettrichs "viel ziemlich überflüssig" kommt mir irgendwie auch so vor...
(ohne dass ich Lust habe, es zu bereinigen, sorry)

was meinst du mit diesem Satz?

  1. Prüfe ob das signal mit dem Wert aus dem Struct überinstimmt

Welches Signal (???)
mit welchem Wert (welche Member-Variable in deinem Struct)
mit welchem Index / Zeile?

Was bedeutet dieser Satz:

Ob es ein "Y" ist oder "A" oder "H" ist.

Was ist
Y
A
H
?

Hallo
beschreibe mal mit einfachen Worten wie die Teststrategie für die/das Kabel aussieht und das ganz einfach.

Was ist Y A H ?

\ /   /\  |_| 
 |    ||  | |

klar?

So versteh ich es:

Nehmen wir an, oben sei die "Anfang"-Seite, unten das "Ende".

Alle Pins sollten (erstmal) INPUT_PULLUP sein.
Auf der Anfang-Seite wird nur ein Pin auf OUTPUT und LOW gelegt
Dann darf an einem anderen Anfang und an max 2 Enden LOW erkannt werden, alle anderen INPUT_PULLUP Pins müssen HIGH bleiben.

Im Normalfall (einfache Leitung) wird der zweite Anfang (H / Y) bzw. das zweite Ende (H / A) nicht verwendet. Sollte aber möglich und in der struct projektierbar sein.

Hallo
ich würde ne Tüte analoge Eingänge nehmen und und die Adern damit durchtesten

@michael_x: Könnte sein.
Aus meiner Sicht ist das dann aber trotzdem nur jeweils eine 1:n Verbindung

Der Eingang (unten) von Y hat zwei Ausgängen
Der linke Eingang (unten) von A hat einen Ausgang
Der rechte Eingang (unten) von A hat einen Ausgang
Der linke Eingang (unten) von H hat zwei Ausgänge
Der rechte Eingang (unten) von H hat zwei Ausgänge.

Aber vieleicht scheitere ich einfach nur daran, dass ich mir das alles viel einfacher vorstelle.

Ähnliches kommt ja einmal im Jahr vorbei: Adruino Mega oder Due als Kabeltester - Deutsch - Arduino Forum

Hallo,

was ist mit Testabschnitt 2 gemeint?
Reduziere den gezeigten Code auf genau dieses Problem. Entferne alles was dafür nicht notwendig ist.
Dann sind die Chancen höher zu helfen.

combie:
Das durchnummerieren von Variablen tut in meinen Augen weh.
Zudem sollten Variablen nicht mit einem Großbuchstaben beginnen

Ist das Durchnummerieren wirklich nötig?

Jap. Es ist ein "Kabeltester" und I steht für Input und O für Output. Für die bessere Lesbarkeit der Leute die nicht jeden Tag programmieren. Wenn's so weh tut dann guck's dir nicht an

jiggijaggajuggujesse:
dann guck's dir nicht an

Das ist wohl der beste Vorschlag für Deinen Code.

Gruß Tommy

Für die bessere Lesbarkeit

Durchnummerieren für bessere Lesbarkeit.
Alles klar!
Keine Fragen mehr.

Wenn's so weh tut dann guck's dir nicht an

OK.
Ab jetzt ....

Okay ich versuche mich so klar wie nur möglich auszudrücken.
Also es sollen die Verbindungen(Testkabel) zwischen den digitalen Pins 22-53 getestet werden. Ich hätte bei d Pin 22 angefangen, dann 23-53 auf ausgelesen und nach jedem zählen soll die Verbindung mit dem aus dem struct kabel_konfiguration verglichen werden. Wenn die gegebene Verbindung existiert ist alles richtig, "PASS". Wenn sie es nicht tut oder wenn sie es tut aber noch andere(Kurzschluss, Fehlverdrahtung) Verbindungen hat ist das ein Fehler, "FAIL". Wenn ein Fehler vorliegt soll auch gleich auf dem Seriellen Monitor angezeigt werden wo der Fehler liegt(Kurzschluss, Fehlverdrahtung).
Y
A
H
sind die Verbindungsarten:
\ /
|

|
/ \

| _ |
| |

P,s. Der Code hat versehentlich ein paar Syntax Fehler. Der hier geht. Musste alle Leerzeichen entfernen um das hier posten zu können.

#include<LiquidCrystal.h>

//AnfangPin/Kabel;
const intI1=23;
const intI2=25;
const intI3=27;
const intI4=29;
const intI5=31;
const intI6=33;
const intI7=35;
const intI8=37;
const intI9=39;
const intI10=41;
const intI11=43;
const intI12=45;
const intI13=47;
const intI14=49;
const intI15=51;
const intIM=53;//M=MASSE,SCHIRM,GEHÄUSE


//EndePin/Kabel:
const intO1=22;
const intO2=24;
const intO3=26;
const intO4=28;
const intO5=30;
const intO6=32;
const intO7=34;
const intO8=36;
const intO9=38;
const intO10=40;
const intO11=42;
const intO12=44;
const intO13=46;
const intO14=48;
const intO15=50;
const intOM=52;//M=MASSE,SCHIRM,GEHÄUSE

typedefstructkabel_konfiguration{
byteLeitungsName;
byteVerbindung_Anfang_1;
char*Verbindung_Anfang_1_Name;
byteVerbindung_Anfang_2;
char*Verbindung_Anfang_2_Name;
byteVerbindung_Ende_1;
char*Verbindung_Ende_1_Name;
byteVerbindung_Ende_2;
char*Verbindung_Ende_2_Name;
};
kabel_konfigurationKABEL[]={
//LeitungsName,VerbindungAnfang1,VerbindungAnfang1Name,VerbindungAnfang2,VerbindungAnfang2Name,VerbindungEnde1,VerbindungEnde1Name,VerbindungEnde2,VerbindungEnde2Name
{1,I1,"I1",0,"0",O1,"O1",0,"0"},
{2,I2,"I2",0,"0",O2,"O2",0,"0"},
{3,I3,"I3",0,"0",O3,"O3",0,"0"},
{4,I4,"I4",0,"0",O4,"O4",0,"0"},
{5,I5,"I5",0,"0",O5,"O5",0,"0"},
{6,I6,"I6",0,"0",O6,"O6",0,"0"},
{7,I7,"I7",0,"0",O7,"O7",0,"0"},
{8,I8,"I8",0,"0",O8,"O8",0,"0"},
{9,I9,"I9",0,"0",O9,"O9",0,"0"},
{10,I10,"I10",0,"0",O10,"O10",0,"0"},
{11,I11,"I11",0,"0",O11,"O11",0,"0"},
{12,I12,"I12",0,"0",O12,"O12",0,"0"},
{13,I13,"I13",0,"0",O13,"O13",0,"0"},
{14,I14,"I14",0,"0",O14,"O14",0,"0"},
{15,I15,"I15",0,"0",O15,"O15",0,"0"},
};

intx=0;//Variablezum"erinnern"derTasterstellungen;
intz=0;//VariablezumResetenvonTasterundAnzeigeleuchte

boolPASS=true;//VariablezumAusgebendesEndergebnissesPASS/FAIL>>true/false
boolover=false;//WirdtruewennTestlaufbeendetist

constintTaster=3;//HighwennTasterbetätigt(Schließer)

constinten=9,rs=8,d4=7,d5=6,d6=5,d7=4;

constintLEDbetriebsbereit=10;//grün
constintLEDfail=11;//rot
constintLEDpass=12;//grün
constintLEDtestlaeuft=13;//gelb

LiquidCrystallcd(rs,en,d4,d5,d6,d7);

voidsetup(){
Serial.begin(9600);//StartetKommunikationüberSerielleSchnittstellezumMonitor
pinMode(LEDbetriebsbereit,OUTPUT);
pinMode(LEDtestlaeuft,OUTPUT);
pinMode(LEDfail,OUTPUT);
pinMode(LEDpass,OUTPUT);
pinMode(Taster,INPUT);

lcd.begin(16,2);
}
void DoOneTest(){//AlleLeitungenwerdennacheinandergetestet
boolfirsttime=true;
boolVerdrahtungOK=true;
bytevar;


//Testabschnitt2-KurzschlüsseundVerdrahtungsfehlererkennen
Serial.println("StartetTestabschnitt2:Verdrahtungsfehler");

for(kabel_konfiguration&ref:KABEL){
pinMode(ref.Verbindung_Anfang_1,INPUT_PULLUP);
pinMode(ref.Verbindung_Anfang_2,INPUT_PULLUP);
pinMode(ref.Verbindung_Ende_1,INPUT_PULLUP);
pinMode(ref.Verbindung_Ende_2,INPUT_PULLUP);
if(ref.Verbindung_Anfang_2==0&&ref.Verbindung_Ende_2==0){
var=1;
}
if(ref.Verbindung_Anfang_2==0&&ref.Verbindung_Ende_2>0){
var=2;
}
if(ref.Verbindung_Anfang_2>0&&ref.Verbindung_Ende_2==0){
var=3;
}
if(ref.Verbindung_Anfang_2>0&&ref.Verbindung_Ende_2>0){
var=4;
}
}

switch(var){
case1:

for(inti=0;i<sizeof(KABEL)/sizeof(KABEL[0]);i++){

Serial.println("");
Serial.print(KABEL[i].Verbindung_Anfang_1_Name);Serial.print("->");Serial.print(KABEL[i].Verbindung_Ende_1_Name);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("TestVerdrahtung");
lcd.setCursor(0,1);
lcd.print(KABEL[i].Verbindung_Anfang_1_Name);

pinMode(KABEL[i].Verbindung_Anfang_1,OUTPUT);
digitalWrite(KABEL[i].Verbindung_Anfang_1,LOW);
firsttime=true;

for(intj=0;j<sizeof(KABEL)/sizeof(KABEL[0]);j++){
if(j!=i&&digitalRead(KABEL[j].Verbindung_Anfang_1)==LOW){
errorOtherPin=KABEL[j].Verbindung_Anfang_1_Name;

lcd.setCursor(8,1);
lcd.print("--FAIL--");

if(firsttime==true){
Serial.println("");Serial.print("--FAIL--VerdrahtungsfehlermitLeitung:");
lcd.setCursor(8,1);
lcd.print("--FAIL--");
firsttime=false;
}else{
Serial.print(",");
}
Serial.print(errorOtherPin);
PASS=false;
VerdrahtungOK=false;
}
}

for(intj=0;j<sizeof(KABEL)/sizeof(KABEL[0]);j++){
if(j!=i&&digitalRead(KABEL[j].Verbindung_Anfang_2)==LOW){
errorOtherPin=KABEL[j].Verbindung_Anfang_2_Name;

lcd.setCursor(8,1);
lcd.print("--FAIL--");

if(firsttime==true){
Serial.println("");Serial.print("--FAIL--VerdrahtungsfehlermitLeitung:");
lcd.setCursor(8,1);
lcd.print("--FAIL--");
firsttime=false;
}else{
Serial.print(",");
}
Serial.print(errorOtherPin);
PASS=false;
VerdrahtungOK=false;
}
}

for(intj=0;j<sizeof(KABEL)/sizeof(KABEL[0]);j++){
if(j!=i&&digitalRead(KABEL[j].Verbindung_Ende_1)==LOW){
errorOtherPin=KABEL[j].Verbindung_Ende_1_Name;

lcd.setCursor(8,1);
lcd.print("--FAIL--");

if(firsttime==true){
Serial.print("--FAIL--VerdrahtungsfehlermitLeitung:");
lcd.setCursor(7,1);
lcd.print("--FAIL--");
firsttime=false;
}else{
Serial.print(",");
}
Serial.print(errorOtherPin);
PASS=false;
VerdrahtungOK=false;
}
}

for(intj=0;j<sizeof(KABEL)/sizeof(KABEL[0]);j++){
if(j!=i&&digitalRead(KABEL[j].Verbindung_Ende_2)==LOW){
errorOtherPin=KABEL[j].Verbindung_Ende_2_Name;

lcd.setCursor(8,1);
lcd.print("--FAIL--");

if(firsttime==true){
Serial.println("");Serial.print("--FAIL--VerdrahtungsfehlermitLeitung:");
lcd.setCursor(8,1);
lcd.print("--FAIL--");
firsttime=false;
}else{
Serial.print(",");
}
Serial.print(errorOtherPin);
PASS=false;
VerdrahtungOK=false;
}
}
}
//PasswennkeinKurzschluss&Verdrahtungsfehler
if(VerdrahtungOK==true){
Serial.print("--PASS--");
lcd.setCursor(8,1);
lcd.print("--PASS--");
break;

case2:

break;
case3:

break;
case4:

break;
}


delay(1000);
}
Serial.println("");
Serial.println("");
Serial.println("Testabschnitt2beendet");
Serial.println("");
}


void Anzeigeleuchten(){//SteuerungderAnzeigeleuchten

digitalWrite(LEDbetriebsbereit,HIGH);

if(digitalRead(Taster)==LOW&&x==0){
digitalWrite(LEDtestlaeuft,LOW);
x=1;
}else{
delay(10);
}
if(digitalRead(Taster)==HIGH&&x==1){//Tasterwirdgedrückt
PASS=true;
over=false;
digitalWrite(LEDpass,LOW);
digitalWrite(LEDfail,LOW);
digitalWrite(LEDtestlaeuft,HIGH);
Serial.println();
Serial.println("##########################################################");
Serial.println("#KABELTEST#");
Serial.println("##########################################################");
Serial.println("");
x=2;//Erinnert,dassTastergedrücktwird
}else{
delay(10);
}
if(digitalRead(Taster)==LOW&&x==2){//Tasterwurdegedrückt
digitalWrite(LEDtestlaeuft,HIGH);
x=3;
}else{
delay(10);
}
if(x==3&&z==1){
digitalWrite(LEDtestlaeuft,LOW);
Serial.println("Kabelvollständigüberprüft");
Serial.println("");
z=0;
x=0;
if(PASS){
Serial.println("╔════════════════════════╗");
Serial.println("╠--PASS--KABELTESTBESTANDEN╣");
Serial.println("╚════════════════════════╝");
}else{
Serial.println("╔════════════════════════╗");
Serial.println("╠--FAIL--KABELTESTNICHTBESTANDEN╣");
Serial.println("╚════════════════════════╝");
}
}else{
delay(10);
}
}
void loop(){

Anzeigeleuchten();


if(x==2||x==3){
DoOneTest();//EinenKabeltestmachen
delay(2000);
z=1;
over=true;
}
if(PASS&&over){
digitalWrite(LEDpass,HIGH);//AnzeigeleuchtePASSgehtan
digitalWrite(LEDfail,LOW);//AnzeigeleuchteFAILbleibtaus
lcd.setCursor(0,0);
lcd.print("****************");
lcd.setCursor(0,1);
lcd.print("*****PASS*****");
}elseif(!PASS&&over){
digitalWrite(LEDpass,LOW);//AnzeigeleuchtePASSbleibtaus
digitalWrite(LEDfail,HIGH);//AnzeigeleuchteFAILgehtan
lcd.setCursor(0,0);
lcd.print("****************");
lcd.setCursor(0,1);
lcd.print("*****FAIL*****");
}else{
digitalWrite(LEDpass,LOW);
digitalWrite(LEDfail,LOW);
}
}

combie:
Durchnummerieren für bessere Lesbarkeit.
Alles klar!
Keine Fragen mehr.
OK.
Ab jetzt ....

Natürlich! Wenn nun mal bei einem Kabel Leitung 1 mit 1 beschrieben wird werde ich doch nicht Äpfel oder Birnen da hin schreiben.

Tipp:
Manche Annahmen, sind so dermaßen falsch, dass noch nicht einmal das Gegenteil richtig ist.

jiggijaggajuggujesse:
Okay ich versuche mich so klar wie nur möglich auszudrücken.
Also es sollen die Verbindungen(Testkabel) zwischen den digitalen Pins 22-53 getestet werden. Ich hätte bei d Pin 22 angefangen, dann 23-53 auf ausgelesen und nach jedem zählen soll die Verbindung mit dem aus dem struct kabel_konfiguration verglichen werden. Wenn die gegebene Verbindung existiert ist alles richtig, "PASS". Wenn sie es nicht tut oder wenn sie es tut aber noch andere(Kurzschluss, Fehlverdrahtung) Verbindungen hat ist das ein Fehler, "FAIL". Wenn ein Fehler vorliegt soll auch gleich auf dem Seriellen Monitor angezeigt werden wo der Fehler liegt(Kurzschluss, Fehlverdrahtung).

Dann bleibt unverständlich, wozu im Progrramm Ein- und Ausgänge definiert werden. Wenn z.B. zwei Eingänge einen Kurzschluß haben, dann muß das ja auch als Fehler angezeigt werden. Wenn mit I und O nur die beiden Enden des Kabels gemeint sind, dann liest sich das vielleicht schön, ist programmtechnisch aber unsinnig.

Andere Leute haben ja schon versucht zu erklären, daß jeder Pin (Ader im Kabel) mit bis zu 3 weiteren Pins verbunden sein soll. Dann reicht es doch, diese anderen Pins in die Tabelle einzutragen (1:n), und entsprechend abzuarbeiten. Also eine Schleife über die Tabelle (= Anschlüsse), der jeweilige Anschluß wird zum Ausgang und auf LOW geschaltet. Dann alle (anderen) Pins prüfen, ob sie in der Tabelle für diesen Anschluß verbunden sein sollten. Das sind zwei verschachtelte Schleifen, eine dritte für alle (0-4) zum Anschluß gehörenden Verbindungen.

Das wäre dann in ca. 20 Zeilen zu erledigen. Wenn ihr mehr braucht, insbesondere 2 Tests nacheinander, dann ist das euer Problem das ihr ganz genau erklären müßt - sonst ist euch nicht zu helfen.

BTW die Analogeingänge kann man auch als digitale verwenden, ansonsten haben analoge Signale im Kabeltester nichts zu suchen.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.