ProfinetIRT-Gateway empfängt sporadisch Signale ohne Kabel

Post Reply
Broxe
Posts: 10
Joined: 11 Jun 2019, 10:59

ProfinetIRT-Gateway empfängt sporadisch Signale ohne Kabel

Post by Broxe »

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:

Code: Select all

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:

Code: Select all

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
Posts: 10
Joined: 11 Jun 2019, 10:59

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

Post by Broxe »

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: 209
Joined: 18 Jun 2018, 16:16

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

Post by Eduard »

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
Posts: 10
Joined: 11 Jun 2019, 10:59

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

Post by Broxe »

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:

Code: Select all

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

Profinet-Thread:

Code: Select all

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:

Code: Select all

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.

Code: Select all

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
Posts: 10
Joined: 11 Jun 2019, 10:59

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

Post by Broxe »

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:

Code: Select all

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?
Broxe
Posts: 10
Joined: 11 Jun 2019, 10:59

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

Post by Broxe »

Falls es jemandem hilft, ist hier mal ein einfaches C-Projekt, an welchem der Fehler einfach reproduzierbar ist mit einem Bild des Aufbaus.
Attachments
RevPi-Aufbau.jpg
RevPi-Aufbau.jpg (799.59 KiB) Viewed 12135 times
Errortest.zip
(60.15 KiB) Downloaded 750 times
Broxe
Posts: 10
Joined: 11 Jun 2019, 10:59

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

Post by Broxe »

Mir ist ein kleiner Fehler beim Upload unterlaufen: in main.c müsste es

Code: Select all

mod_writeVariableValue("O_10", 1);
statt

Code: Select all

writeVariableValue("O_10", 3);
heißen. Eine aktualisierte Version ist im Anhang zu finden.
Attachments
Errortest_1.zip
(59.95 KiB) Downloaded 890 times
Broxe
Posts: 10
Joined: 11 Jun 2019, 10:59

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

Post by Broxe »

Nach vielem Herumprobieren bin ich endlich weiter gekommen - Hoffe ich zumindest.
Auch, wenn wir die LEDs eigentlich als Ursache ausgeschlossen hatten, hat sich doch gezeigt, dass sie eine besondere Rolle spielen: Erst, wenn in einem beliebigen Programm eine LED gesetzt wird (egal welche, egal auf welche Farbe, egal durch welches Programm), tritt das oben beschriebene Problem auf. Es bleibt dann solange bestehen, bis der Revolution Pi entweder komplett neu gestartet wird oder der Treiber über PiCtory zurückgesetzt wird. Auch das Setzen der LEDs über piTest können zum Auftreten des Fehlers führen. Man kann also das Problem "lösen", indem man die LEDs konsequent ignoriert. Dass das des Rätsels Lösung ist, glaube ich natürlich nicht, aber es ist eine Möglichkeit, die Folgen zu verhindern.

Interessanter Weise ist der Fehler nichtmal so einfach reproduzierbar: Setzt man in main.c folgenden Code ein, ist es schon passiert, dass das Problem erst nach ein paar Anläufen auftrat:

Code: Select all

int i;
for(i=0;i<=5000;i++){
   msleep(1);
   mod_writeVariableValue("O_10", 1);
}

mod_writeVariableValue("RevPiLED", 11);
	
while(1){
   msleep(1);
   mod_writeVariableValue("O_10", 1);
}
Die Schleife am Anfang hat dabei den Zweck, erst fünf Sekunden lang einen Ausgang zu setzen und erst dann eine LED zu beschalten, um so zu zeigen, dass erst nach dem Setzen einer LED der Fehler auftritt.

Sofern das Setzen der LEDs in einer for-Schleife geschieht und sie mit mehreren Werten hintereinander beschreiben wird, scheint der Fehler häufiger aufzutreten. Weitere Tests stehen noch aus.

Code: Select all

for(i=0;i<20;i++){mod_writeVariableValue("RevPiLED",i);}
Das mehrfache Setzen der LEDs auf einen Wert verändert das Problem offenbar nicht.


Bisher kann ich noch nicht genau sagen, welche Faktoren einen Einfluss auf den Fehler haben, aber ich konnte nachweisen, dass einerseits der Wert, auf welchen die LEDs gesetzt werden den Fehler verändert, aber es auch einen Unterschied macht, welcher Ausgang in der Dauerschleife gesetzt wird. Der Wert des LED-Byte ist maßgeblich entscheidend für die Zahlen, die an der Profinet-Schnittstelle empfangen werden, der beschaltete Ausgang bestimmt, an welchen Eingängen Werte abgegriffen werden.
Broxe
Posts: 10
Joined: 11 Jun 2019, 10:59

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

Post by Broxe »

Hier ist die RSC-Datei mit der wir arbeiten
Attachments
SUHE_PiCtory.zip
(11.54 KiB) Downloaded 786 times
User avatar
dirk
KUNBUS
Posts: 2174
Joined: 15 Dec 2016, 13:19

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

Post by dirk »

Lieber Broxe, wir sind am Ende unserer Analysen angekommen denn mit unserer kostenlosen Supportleistung konnten wir Dir helfen, Dein Gerät in Betrieb zu nehmen.
Post Reply