Profibus/Profinet-Teilnehmer Diagnose

Zuviel Werbung?
-> Hier kostenlos registrieren
Du verstehst mich nicht :(

Der Merker den ich da dran mache ist im Programm NIRGENDS verwendet, er ist IMMER FALSE! Der Trigger wird NIE von mir oder dem Programm gesetzt!
Mir ist schon klar das ich den Trigger nicht sehen würde, aber die o.g. Fakten sprechen für sich!

Grüße

Marcel
 
Sorry ... ich hatte dich wirklich nicht verstanden - ich denke aber, jetzt schon ...
Das genannte Ergebnis halte ich dann trotzdem für einen Zufall, da die Ablaufkette, die die Diag-Info aktualisiert ja nur auf das Ereignis des externen Triggers oder das des Timers angestossen wird.

Wegen deiner weiteren Diag-Info-Anfrage :
Ich hatte das jetzt mal nachgesehen. Diese (und auch noch viele andere) Info's erhält man nur, wenn man Station für Station einzeln abfragt. Das geht natürlich zu machen, würde aber meinem ursprünglichen Wunsch nach einem "schmalen" FB (der eben nicht so aufgebläht und unüberschaubar ist, wie der Siemens-FB mit seinem Visu-Anhang) komplett entgegen stehen. Da werde ich also im Augenblick keine Zeit drauf verwenden ... Sorry ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Larry, und natürlich alle anderen,

ich hätte nicht gedacht das aus einer solchen "Anfängerfrage" so etwas wird. Wie mir scheint ist es also doch keine Anfängerfrage!
Ohne dir nahe treten zu wollen finde ich das dein Baustein schon recht aufgebläht ist. Er liefert drei Wichtige Infos, ganz klar, aber der Weg dahin ist recht unübersichtlich wie ich finde.

Das soll keine böse Kritik sein, und ich denke du verstehst das auch. Ich bin dir sehr dankbar dafür das du den Baustein hier rein gestellt hast. Ich werde ihn für meine Bedürfnisse anpassen und dann ebenfalls hier hochladen.

Was ich mir vorstelle:

Nur PN-Diagnose (wir haben heute Entschieden in Zukunft 100% auf PN zu setzen)
Und dann nur noch 2 Signale pro Teilnehmer abzubilden
1. Teilnehmer hat eine Störung (Nicht näher Spezifiziert)
2. Teilnehmer ist nicht erreichbar (aber Projektiert)

Damit habe ich für mich erstmal alle relevanten Funktionen abgebildet.
Ich bin am Überlegen ob ich mir die Detaildiagnose mal anschaue, aber erstmal ist das kein Hauptziel.


Jetzt werfe ich noch einmal etwas in den Raum, was hier auch entfernt reinpasst.

Ich baue eine Profinet-Kommunikation zwischen zwei CPU auf und übertrage Daten zwischen zwei CPU mittels PUT und GET.
Zur Zeit überwache ich diese Verbindung über ein Lebensbit, welches ich über diese Verbindung jage und invertiere und auswerte.
Gibt es hier auch eine ähnliche Diagnose die mir sagt "Verbindung aufgebaut, abgebaut, irgendwas". Die Zustände der Bausteine PUT und GET werte ich schon aus. Leider funktionieren die auch wenn die entfernte CPU in STOP ist, daher noch das Lebensbit.

Grüße

Marcel
 
Ohne dir nahe treten zu wollen finde ich das dein Baustein schon recht aufgebläht ist. Er liefert drei Wichtige Infos, ganz klar, aber der Weg dahin ist recht unübersichtlich wie ich finde.

Hallo Marcel,
das tust du nicht.
Ich würde den Baustein auch gerne etwas übersichtlicher machen - allerdings läßt mir da die von Siemens vorgegebene Funktionalität betreffs des SFC51 nicht so schrecklich viel Spielraum. Den SFC51 muss man halt so oder so ähnlich benutzen - sorry.
Oder ... was findest du sonst unübersichtlich ?

Der Baustein scannt PB und PN weil wir bei uns beides und auch gemischt haben. Wenn du allerdings den PB nicht haben willst dann ist das ja kein Problem, die Zeilen zu entfernen - der I-DB wird dadurch allerdings nicht sehrviel kleiner.
Allerdings - stellt der FB fest, dass es keinen PB (oder PN) gibt dann wird der ja auch in der Folge nicht mehr untersucht.

Was die Diagnose angeht : mehr wie die von dir genannten Signale bilde ich ja aktuell auch nicht ab ... (weil der SFC ja auf einfachen Weg nicht mehr hergibt :()

Gruß
Larry
 
Ich stelle meinen Baustein nachher mal online, wenn er fertig ist.

den IDB habe ich recht klein bekommen, da ich die Arrays die am SFC51 hängen in den TEMP-Bereich geschmissen habe. Nach der Auswertung und Verschiebung in das Array sind die Werte da drin eh egal!
Außerdem habe ich darauf verzichtet das der Baustein scannt ob PB oder PN vorhanden ist, und lasse das den Programmierer per Eingang vorgeben. Nur die Funktion wird dann abgearbeitet.

Genaue Beschreibungen gibt es dann aber mit dem Baustein!

Grüße

Marcel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So Anbei "mein" Baustein...

Folgende Funktionen hat er:

Der Baustein wird nur abgearbeitet wenn der Eingang ENABLE aktiv ist.
Über die Eingänge PROFIBUS oder PROFINET wählt man das Bussystem, es kann nur eines Aktiv sein.
Im Stat-Bereich liegt das Array Teilnehmer_Busfehler of BOOL. Hier werden bis zu 256 Busteilnehmerstörungen angezeigt, jeweils für das ausgewählte Bussystem.
Das es mehr PN-Teilnehmer geben kann ist mir klar, für mich ist aber mehr nicht nötig. Wer mag kann den Baustein gerne aufbohren.

PB habe ich getestet, die Zykluszeit bei einem IPC477C mit WinLC RTX wird nicht beeinflusst.
PN kann ich erst im laufe der Tage testen, gebe dann Feedback!
Eine Fehlerauswertung des SFC51 findet nicht statt.

Code:
FUNCTION_BLOCK FB126   
TITLE   = 'BUS_DIAG'
AUTHOR  : 'Matze001'
VERSION : '1.0'    

VAR_INPUT
    ENABLE                  : BOOL;
    PROFIBUS                : BOOL;
    PROFINET                : BOOL;
END_VAR

VAR_OUTPUT 
 
END_VAR

VAR      
    Teilnehmer_Busfehler    : ARRAY[1..256] OF BOOL ; 
    SK1_NR                  : INT;
    REQ1                    : BOOL ;
    REQ2                    : BOOL ;
    REQ3                    : BOOL ;
    REQ4                    : BOOL ;
    BUSY1                   : BOOL ; 
    BUSY2                   : BOOL ; 
    BUSY3                   : BOOL ; 
    BUSY4                   : BOOL ; 

END_VAR

VAR_TEMP
    Fehler                  : INT ; 
    i                       : INT;
   
    SZL_Header              : STRUCT
        LenthDR             : WORD ;
        n_DR                : WORD ;
    END_STRUCT ;
  
  
    Abfrage_PB_Slaves       : STRUCT 
        projektiert         : ARRAY[0..255] OF BOOL ; 
        in_Funktion         : ARRAY[0..255] OF BOOL ; 
    END_STRUCT ;
    
    Abfrage_PN_Slaves : STRUCT 
        projektiert_Status  : WORD ;
        projektiert         : ARRAY[0..2047] OF BOOL ;
        in_Funktion_Status  : WORD ;
        in_Funktion         : ARRAY[0..2047] OF BOOL ; 
        mit_Stoerung_Status : WORD ;
        mit_Stoerung        : ARRAY[0..2047] OF BOOL ; 
    END_STRUCT ;
    at_Abfrage_PN_Slaves AT Abfrage_PN_Slaves : STRUCT 
        projektiert         : ARRAY[0..128] OF WORD ; 
        in_Funktion         : ARRAY[0..128] OF WORD ;  
        mit_Stoerung        : ARRAY[0..128] OF WORD ;  
    END_STRUCT ;
   

   
END_VAR


BEGIN

// Profibusauswertung


IF ENABLE AND PROFIBUS AND NOT PROFINET AND SK1_NR = 0 THEN
    REQ1:=TRUE;
    SK1_NR:=1;
END_IF;



Fehler := RDSYSST (REQ := REQ1
                  ,SZL_ID := w#16#0092               // Abfrage der projektierten ProfiBus-Stationen
                  ,INDEX := 1                        // Mastersystem-ID
                  ,BUSY := BUSY1
                  ,SZL_HEADER := SZL_Header
                  ,DR := Abfrage_PB_Slaves.projektiert       // Ziel-Datenbereich für die abgefragten Daten
                  ) ;

IF SK1_NR = 1 AND NOT BUSY1 AND FEHLER = 0 THEN
    REQ1:=FALSE;
    REQ2:=TRUE;
    SK1_NR:=2;
END_IF;


Fehler := RDSYSST (REQ := REQ2
                  ,SZL_ID := w#16#0292               // Abfrage der nicht ausgefallenen ProfiBus-Stationen
                  ,INDEX := 1                        // Mastersystem-ID
                  ,BUSY := BUSY2
                  ,SZL_HEADER := SZL_Header
                  ,DR := Abfrage_PB_Slaves.in_Funktion       // Ziel-Datenbereich für die abgefragten Daten
                  ) ;

IF SK1_NR = 2 AND NOT BUSY2 AND FEHLER = 0 THEN
    REQ2:=FALSE;
    SK1_NR:=3;
END_IF;

IF SK1_NR = 3 THEN
    
    FOR i:= 0 TO 255 DO
       
        Teilnehmer_Busfehler[i+1] := Abfrage_PB_Slaves.projektiert[i] AND NOT Abfrage_PB_Slaves.in_Funktion[i];
        
    END_FOR;
    
    SK1_NR:= 0;
END_IF;


// Profinetauswertung

IF ENABLE AND NOT PROFIBUS AND PROFINET AND SK1_NR = 0 THEN
    REQ3:=TRUE;
    SK1_NR:=11;
END_IF;


Fehler := RDSYSST (REQ := REQ3
                  ,SZL_ID := w#16#0094               // Abfrage der projektierten ProfiNet-Stationen
                  ,INDEX := 100                        // Mastersystem-ID
                  ,BUSY := BUSY3
                  ,SZL_HEADER := SZL_Header
                  ,DR := at_Abfrage_PN_Slaves.projektiert       // Ziel-Datenbereich für die abgefragten Daten
                  ) ;


IF SK1_NR = 11 AND NOT BUSY3 AND FEHLER = 0 THEN
    REQ3:=FALSE;
    REQ4:=TRUE;
    SK1_NR:=12;
END_IF;

Fehler := RDSYSST (REQ := REQ4
                  ,SZL_ID := w#16#0294               // Abfrage der nicht ausgefallenen ProfiNet-Stationen
                  ,INDEX := 100                        // Mastersystem-ID
                  ,BUSY := BUSY4
                  ,SZL_HEADER := SZL_Header
                  ,DR := at_Abfrage_PN_Slaves.in_Funktion       // Ziel-Datenbereich für die abgefragten Daten
                  ) ;
                  
IF SK1_NR = 12 AND NOT BUSY4 AND FEHLER = 0 THEN
    REQ4:=FALSE;
    SK1_NR:=13;
END_IF;



IF SK1_NR = 13 THEN
    
    FOR i:= 1 TO 255 DO
        
        Teilnehmer_Busfehler[i] := Abfrage_PN_Slaves.projektiert[i] AND NOT Abfrage_PN_Slaves.in_Funktion[i];
        
    END_FOR;
    
    SK1_NR:= 0;
END_IF;    
  



END_FUNCTION_BLOCK

Kritik sehr willkommen!

Grüße

Marcel

Edit: So hab mir doch noch die Zeit genommen PN zu testen! Hatte da nen haufen Fehler drin, da ich einfach den Profibusteil kopiert hab ;)
Nun funktioniert auch PN einwandfrei!

Edit2: Also ich habe den Baustein noch einmal nach dem Vorbild von LL angepasst.

Ich versuche mal eine grobe Beschreibung abzuliefern, um auch oxidierenden Nägeln etwas gutes zu tun ;)

Der Baustein wird immer aufgerufen. Mit dem Enable Eingang wird die Abfrage angestossen. Wird er auf Dauer TRUE gesetzt, wird nach jeder fertigen Abfrage eine neue gestartet.
Ich habe es so zur Zeit im Einsatz, und sehe keine Einbußen bei Zykluszeit o.ä.! Hier können natürlich Trigger aus den entsprechenden Fehler OBs, Timer, Zufallsgeneratoren oder what ever als Trigger genutzt werden.

Durch die Eingänge Profibus und Profinet wird das Bussystem vorgewählt. Sind beide auf TRUE wird keine Abfrage gestartet. Wenn ich Lust habe lösche ich alle Daten noch ab, das ist bisher nicht der Fall!

Der Zustand eines Teilnehmers kann dann dem Array Teilnehmer_Busfehler entnommen werden. Es wird nur Diagnostiziert ob der Teilnehmer am Bus ist.
 
Zuletzt bearbeitet:
Hallo LL, hallo Matze,
könnt ihr mir mal erzählen wie sich das mit den Index verhält,
aus den Handbuch werde ich noch nicht ganz schlau.

Gruß RN
 
Baugruppenträger- / Stationszustandsinformation
0092 Sollzustand der Baugruppenträger im zentralen Aufbau / der Stationen eines DP-Mastersystems 0 / DP-Mastersystem-ID
4092 Sollzustand der Stationen eines DP-Mastersystems, das über eine externe DP-Anschaltung angeschlossen ist DP-Mastersystem-ID
0192 Aktivierungsstatus der Stationen eines DP-Mastersystems, das über eine integrierte DP-Anschaltung angeschlossen ist DP-Mastersystem-ID

Das ist die Profibus Mastersystem-Nummer, wie sie in der Hardwareconfig eingetragen ist. (1)
 
Mach mal ein Projekt mit Profibus und Profinet auf (z.B. den IPC)

Da steht am profibus die (1) und beim PN die (100).
Hättest du jetzt ein zweites PB Netz wäre es (2) und ein zweites PN halt (101).

Grüße

Marcel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Stimmt darüber habe ich noch nicht nachgedacht, aber ich sage es mal so...

Der SFC51 hat das Array ja an einem OUT-Parameter, beschreibt die Werte also jedes mal.
Auswerten tue ich erst nach dem Aufruf. Der Baustein wird immer aufgerufen, nur das REQ ist Opeartionsabhängig.

Bisher funktioniert es wie gesagt!

Grüße

Marcel
 
...wegen dem Asynchron, sollte der Marcel über sein Beispiel mal nachdenken,
da sollte für jeden Aufruf das 'busy' Signal separat sein, ansonsten kann die
Auswertung zu fehlinterpretation führen.
 
Wie du siehst verwende ich das Busy-Signal nicht.
Ich habe eine Dummy-Variable benutzt da ein FC alle Ein/Ausgänge beschaltet haben will.

Grüße

Marcel
 
Hehehe... alles klar ;)

Wird nachgereicht. Ich hab ja geschrieben das die Version die ich da nutze nur meine Spielwiese ist, mit der ich es ein wenig probiert habe schlank zu bekommen. Schlank = fast keine Funktion mehr.

Grüße

Marcel
 
Der OUT-Parameter ist ein ANY! Ich glaube nicht dass jedes mal der gesamte Bereich des ARRAY geschrieben wird.

Gruß, Onkel

Das müsste ich testen! Wie gesagt ich bin mit dem Baustein auch noch nicht vertraut und hab nur ein wenig gespielt.
Bisher habe ich noch keine negativen Ereignisse registriert, was nicht heißt das es sie nicht gibt. Meiner Meinung nach müsste aber der SFC51, wenn er immer die gleiche Abfrage macht, auch immer einen gleich langen Datenbereich ausgeben!

Grüße

Marcel
 
Ich habe noch einmal nachgeschaut, im Handbuch steht das der SFC51 immer den kompletten Datensatz
überträgt. Aber in Marcel seinen Beispiel wäre es besser das er das 'Busy' Signal auswertet und dann erst
die Daten auswertet.

Im übrigen sollte ein erneuter Anstoß des Auftrages erst erfolgen wenn der bestehende abgearbeitet ist.
Wie handhabt ihr den Aufruf, OB86 würde ja nur beim Wechsel eines Ereignises ausgeführt und damit kann
dann ein vernünftiges Triggerereinis erstellen. Der OB122 würde ja beim Peripherie-Zugriffsfehler, quasi
Zyklisch aufgerufen und bei nicht entsprechender zyklisch einen Trigger liefern, nutzt ihr den OB122 zum
triggern?
 
Zurück
Oben