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");}
}
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
-Eike