Broxe
Topic Author
Posts: 5
Joined: 11 Jun 2019, 10:59

ProfinetIRT-Gateway empfängt sporadisch Signale ohne Kabel

14 Jun 2019, 15:25

Moin Leute,
Ich habe einen RevolutionPi Core 3 mit einem RevPi DIO Modul. Aus diesem habe ich über ein Programm in C bisher die Eingänge über eine etwas verändere Version der Funktion readVariableValue() aus piTest.c abfragen können. In PiCtory habe ich den DIO mit 34 Ein- und 32 Ausgängen angelegt, ansonsten nichts verändert. Sie haben also immer noch die Standard-Bezeichnungen I_1 bis I_14 und O_1 bis O_14. Mit dieser Konfiguration hatte ich wochenlang keine Probleme.
Zur Verbindung mit einer SPS habe ich nun einen Profinet IRT- Gateway angehangen und ihn in PiCtory eingebunden. Ihn habe ich mit 512 Ein- und Ausgängen konfiguriert, über die Ersetzungsfunktion im Windows-Editor habe ich jedoch in der RSC-Datei aus /var/www/pictory/projects/ die Ein- und Ausgänge von "Input__1" in "Input_1" usw. geändert, da mir der doppelte Unterstrich nicht gefiel.
Den zyklischen Datenaustausch mit der Profinet-Schnittstelle habe ich über pthreads in einen zweiten Thread ausgelagert.
Als ich als absoluter Profinet-Anfänger die Software dazu programmieren wollte, fielen mir zunächst zwei Dinge ins Auge: Einerseits kann ich anscheinend nirgends die Hardware-Schnittstelle angeben, an welcher die Daten ausgegeben werden, was ich mir damit erklärte, dass der Datenaustausch wohl über beide Schnittstellen erfolgen kann und die richtige automatisch ausgewählt wird, andererseits habe ich keine Option gefunden, im Programm zu überprüfen, ob überhaupt ein Master angeschlossen ist. Über readVariableValue() und "piTest -r Input_1" konnte ich auch ohne Profinet-Konfiguration auf die 1024 Variablen des Gateways zugreifen, was mir allerdings sehr gelegen kam, da ich grade noch keine SPS zur Verfügung habe.
Als ich den Datenaustausch als "Trockenübung" einbaute, kam es jedoch zu einem unerwarteten Verhalten: Alle paar Sekunden ist der Speicherinhalt der Variable Input_1 nicht 0, sondern 1 und springt direkt danach wieder auf 0 zurück. Mit anderen Variablen (ich habe bis Input_3 getestet) verhält es sich ebenso: Ab und zu liegt dort eine 1 an. Woran kann das liegen? Ein Muster in diesem Wechsel scheint es nicht zu geben, da dieses Phänomen in schwankenden Abständen von etwa ein bis fünf Sekunden auftritt, allerdings habe ich keine genauen Messungen diesbezüglich durchgeführt und frage den Eingang nur etwa einmal pro Millisekunde ab. Der Code für die Abfrage hat in etwa folgenden Aufbau:
while(1){
	msleep(1); 
	if(mod_readVariableValue("Input_3") == 1){printf("An Input_3 liegt eine 1 an\n");}
}
msleep ist hierbei eine recht simple Funktion, welche das Pausieren eines Threads in Millisekunden erlaubt, indem sie ihr Argument, um den Faktor 10^6 vergrößert, an nanosleep() übergibt.
mod_readVariableValue() Ist oben genannte Version von readVariableValue(), welche sich vom Original hauptsächlich darin unterscheidet, dass sie den Variableninhalt nicht auf der Standardausgabe ausgibt, sondern als Rückgabewert vom Typ int an das aufrufende Programm und keine Zyklische oder formatierte Ausgabe mehr beherrscht.

Die Anordnung der Module ist, in Realität wie in PiCtory: Gateway- RevPI DIO - RevPi Core3
Die Ausgabe von piTest -d lautet:
Found 3 devices:

Address: 0 module type: 95 (0x5f) RevPi Core V1.2
Module is present
input offset: 1137 length: 6
output offset: 1143 length: 5

Address: 31 module type: 96 (0x60) RevPi DIO V1.4
Module is present
input offset: 1024 length: 70
output offset: 1094 length: 18

Address: 30 module type: 79 (0x4f) Gateway Profinet IRT V1.2
Module is present
input offset: 0 length: 512
output offset: 512 length: 512

Vielen Dank im Voraus für eure Hilfe!
-Eike
 
Broxe
Topic Author
Posts: 5
Joined: 11 Jun 2019, 10:59

Re: ProfinetIRT-Gateway empfängt sporadisch Signale ohne Kabel

24 Jun 2019, 09:39

Gibt es eine Möglichkeit, den Verbindungszustand der Profinet-Schnittstelle am Modul abzufragen?
Es erscheint mir möglich, dass das Problem nur dann auftritt, wenn das Modul mit keinem Master verbunden ist.
In PiCtory habe ich je 512 Ein- und Ausgänge gefunden, jedoch kein Byte, in dem hinterlegt ist, in welchem Zustand sich die Schnittstelle befindet. Da am Profinet-Modul eine LED vorhanden ist, welche genau dies anzeigt, müsste es doch möglich sein, dort etwas auszulesen, oder?
 
Eduard
KUNBUS
Posts: 152
Joined: 18 Jun 2018, 16:16

Re: ProfinetIRT-Gateway empfängt sporadisch Signale ohne Kabel

24 Jun 2019, 14:29

Hallo Broxe,

ich habe mit dem gleichen Aufbau wie du das ganze getestet. Ich konnte das Verhalten deines Aufbaus nicht nachstellen.
Getestet habe ich mit dem aktuellen Image (2019-03-14-revpi-stretch) welches hier zu Download bereitsteht.

Welche Version des Images hast du auf dem RevPi?
Die Version des Images kannst du mit „cat /etc/revpi/image-release“ abfaragen.

Der RevPi hat ein Statusbyte „RevPiStatus“, hier findest du die Erklärung dazu.
Mit diesem Statusbyte kannst du auslesen ob ein „piGate Modul“ angeschlossen ist oder nicht.
Leider kannst du mit dem RevPi nicht den Feldbusstatus eines „piGate Modul“ abfragen.
Aber du könntest im Master ein „Lebensbit“ erzeugen, somit würdest du wiesen ob der Master mit dem „piGate Modul“ kommuniziert oder nicht.

Gruß,
Eduard
 
Broxe
Topic Author
Posts: 5
Joined: 11 Jun 2019, 10:59

Re: ProfinetIRT-Gateway empfängt sporadisch Signale ohne Kabel

25 Jun 2019, 12:00

Moin Eduard,
Mein RevPi läuft auf dem Image 2018-07-17-revpi-stretch.img, ist also relativ aktuell.
RevPiStatus hat den Wert 0x11, welcher dem entspricht, was ich bei meinem Aufbau erwartet hatte.

Inzwischen bin ich zu einem kleinen Durchbruch gelangt:
Du konntest dieses Problem gar nicht reproduzieren.
Es liegt an den LEDs. Bisher habe ich sie dazu genutzt, mir grundsätzliche Programminfos auch ohne Bildschirm vermitteln zu lassen.
Grundsätzlich hat mein Programm zwei Endlosschleifen: Eine im Hauptprogramm, welche dazu dient, eine Steuerung ähnlich eines SPS-Programmes immer und immer wieder zu wiederholen, die andere Dauerschleife zur Profinet-Kommunikation. In der ersten Schleife werden vor dem Beginn der eigentlichen Steuerung die LEDs des RevPi gesetzt. Die Steuerungssoftware auszukommentieren hat keinen Effekt gehabt, bei den LEDs sah es anders aus.
Wenn die LEDs des RevPi durch den unten stehenden Code gesetzt werden, empfange ich auf vielen der Eingänge der Profinet-Schnittstelle den Wert, mit dem die LEDs gesetzt werden:

Hauptprogramm:
while(1) {writeVariableValue("RevPiLED",8);}
writeVariableValue ist aus piTest.c übernommen, lediglich die printfs bei erfolgreichem Setzen der Variablen wurden entfernt

Profinet-Thread:
while(1){
	if(mod_readVariableValue("Input_1")>0){ printf("%d an Input_1\n", mod_readVariableValue("Input_1"));}
	if(mod_readVariableValue("Input_2")>0){ printf("%d an Input_2\n", mod_readVariableValue("Input_2"));}
	if(mod_readVariableValue("Input_3")>0){ printf("%d an Input_3\n", mod_readVariableValue("Input_3"));}
	
	if(mod_readVariableValue("Input_10")>0){ printf("%d an Input_10\n", mod_readVariableValue("Input_10"));}
	if(mod_readVariableValue("Input_20")>0){ printf("%d an Input_20\n", mod_readVariableValue("Input_20"));}
	if(mod_readVariableValue("Input_30")>0){ printf("%d an Input_30\n", mod_readVariableValue("Input_30"));}
	
	if(mod_readVariableValue("Input_101")>0){ printf("%d an Input_101\n", mod_readVariableValue("Input_101"));}
	if(mod_readVariableValue("Input_102")>0){ printf("%d an Input_102\n", mod_readVariableValue("Input_102"));}
	if(mod_readVariableValue("Input_103")>0){ printf("%d an Input_103\n", mod_readVariableValue("Input_103"));}
}
Diese Ausgänge habe ich vollkommen willkürlich gewählt.
Ausgabe:
8 an Input_103
0 an Input_20
8 an Input_103
8 an Input_10
8 an Input_103
8 an Input_2
8 an Input_3
0 an Input_102
0 an Input_30
0 an Input_10
0 an Input_20
0 an Input_30
usw...
Diese Zeilen kamen mit nur wenigen Millisekunden Verzögerung nacheinander.
Gut zu sehen ist hierbei, dass die Werte so schnell wieder verschwinden, dass die Ausgabe häufig eine 0 ausgibt.

Wenn ich nun die Endlosschleife im Hauptprogramm verzögere, kommt die gleiche Ausgabe, nur bedeutend langsamer:
while(1){
	msleep(50);
	writeVariableValue("RevPiLED",8);
}
Dieser Code sorgt dafür, dass nur etwa einmal pro Sekunde eine Zeile Ausgabe erscheint.
Das führt mich zu der Überlegung, dass das Setzen der LEDs dieses Verhalten hervorruft, nicht die Tatsache, dass die LEDs gesetzt wurden.
writeVariableValue("RevPiLED",8);
while(1){msleep(50);} 

Dieser Code führt zu überhaupt keiner Ausgabe.

Ob dieses Problem nur bei den LEDs auftritt, welche programmbedingt besonders häufig gesetzt werden, oder ob es auch bei den Ein- und Ausgängen des DIO-Moduls auftritt, weiß ich nicht. Ich werde demnächst versuchen, es zu überprüfen.

Mit freundlichen Grüßen,
Eike
 
Broxe
Topic Author
Posts: 5
Joined: 11 Jun 2019, 10:59

Re: ProfinetIRT-Gateway empfängt sporadisch Signale ohne Kabel

25 Jun 2019, 13:12

Inzwischen habe ich mal etwas rumexperimentiert und bin zu neuen Erkenntnissen gekommen:
Wenn ich den Ausgang O_1 über folgenden Code kontinuierlich auf 1 setze, kann ich einen ähnlichen Fehler hervorrufen:
while(1){writeVariableValue("O_1", 1);}
Lese ich jetzt über den Code aus meinem letzten Beitrag Input_1, Input_2, Input_3, Input_10, Input_20, usw. aus, kommt kein Fehler. Ersetze ich das Wort Input durch Output, kommt eine Ausgabe, aber diesmal mit einem klar erkennbaren, einfachen Muster:
...
1 an Output_2
1 an Output_3
8 an Output_30
1 an Output_2
1 an Output_3
8 an Output_30
1 an Output_2
1 an Output_3
8 an Output_30
...
Es kommen immer wieder die gleichen drei Zeilen. Interessanterweise ist es dabei irrelevant, welchen Ausgang ich setze. Die gleiche Ausgabe kommt auch, wenn die Ausgänge O_2, O_4 oder O_10 gesetzt werden.
Für mich klingt dieses Verhalten nach einem Adressierungsfehler. Wie sicher wird zwischen den Speichern des Profinet-Gateways und dem Arbeitsspeicher des RevPi unterschieden? Kann es vorkommen, dass der Befehl, einen Speicherbereich im Profinet-Gateway zu beschreiben gleichzeitig einen Wert in den Arbeitsspeicher des Revolution Pi schreibt?

Who is online

Users browsing this forum: No registered users and 0 guests