Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 7 von 7

Thema: Mit Libnodave Diagnosepuffer auslesen

  1. #1
    Registriert seit
    31.10.2005
    Beiträge
    26
    Danke
    0
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich möchte mit der Funktion daveReadSZL Diagnosedaten einer CPU auslesen. Wie ist der empfangene Datensatz aufgebaut, bzw. wie liest man ihn richtig?
    Liefert einer der Teil-Datensätze einen String zurück?

    Step7-Hilfe:
    Ein Datensatz der Teilliste mit der SZL-ID W#16#xyA0 hat folgenden Aufbau:

    Name Länge in Worten Bedeutung
    ID 1 Wort Ereignis-ID
    info 5 Worte Informationen zum Ereignis bzw. zu dessen Wirkung
    time 4 Worte Zeitstempel des Ereignisses
    Thx vorab

    Bewareofthis
    Zitieren Zitieren Mit Libnodave Diagnosepuffer auslesen  

  2. #2
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von Bewareofthis
    Hallo zusammen,

    ich möchte mit der Funktion daveReadSZL Diagnosedaten einer CPU auslesen. Wie ist der empfangene Datensatz aufgebaut, bzw. wie liest man ihn richtig?
    Liefert einer der Teil-Datensätze einen String zurück?

    Step7-Hilfe:
    Ein Datensatz der Teilliste mit der SZL-ID W#16#xyA0 hat folgenden Aufbau:

    Name Länge in Worten Bedeutung
    ID 1 Wort Ereignis-ID
    info 5 Worte Informationen zum Ereignis bzw. zu dessen Wirkung
    time 4 Worte Zeitstempel des Ereignisses
    Thx vorab

    Bewareofthis
    daveReadSZL liefert die Rohdaten, so wie sie von der CPU kommen. Strings sind keine dabei. Vor den einzelnen Einträgen stehen noch einige Informationen zu der Liste: die SZL-ID und der Index werden wiederholt. Danach steht, wie lang ein einzelner Eintrag ist (in Byte) und wieviele Einträge es sind.
    Sieh dir bitte die Funktion readSZL in den Testprogrammen (testMPI.c) an, um zu sehen, wie die Kopfinformationen ausgewertet werden können.
    Der Diagnosepuffer besteht aus Einträgen von 20 byte (entsprechend 10 Worte wie in der Siemens-Doku).
    Den Zeitstempel wirst du leicht erkennen, wenn du dir die Zeichen hexadezimal ausgeben läßt (testMPI --szlID=0xA0 tut das). Zeit/Datum sind BCD-codiert. Die letzten beiden Stellen sind Sekundenbruchteile (Vielfache von 100us).
    Die restlichen Informationen (Bedeutung Ereignis-ID usw.) mußt du entweder in der Siemens-Doku finden (vielleicht kann jemand anders was dazu sagen. Man kann ja die Diagnose auch im SPS-Programm mit einer SFC auslesen. Da wird man das gleiche bekommen) oder du mußt die Ereignisse, die dich interessieren, absichtlich erzeugen lassen und schauen, wie sie codiert sind
    Zitieren Zitieren Re: Mit Libnodave Diagnosepuffer auslesen  

  3. #3
    Bewareofthis ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    31.10.2005
    Beiträge
    26
    Danke
    0
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Das mit dem Kopf-Datensatz im Puffer hab ich übersehen .
    Den Zeitstempel kann ich jetz auch auslesen, Thx Zottel .
    Allerdings hab ich noch keinen Schimmer was in den 5 Wörtern, die in der Siemens-Doku als Info dekl. sind, fürne Info steckt
    String(s) ist/sind es ja definitiv net, Codierung für kommendes bzw. gehendes Ereignis vielleicht, oder CPU Zustand (STOP->RUN)?

    Gruß
    Bewareofthis

  4. #4
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von Bewareofthis
    Allerdings hab ich noch keinen Schimmer was in den 5 Wörtern, die in der Siemens-Doku als Info dekl. sind, fürne Info steckt
    String(s) ist/sind es ja definitiv net, Codierung für kommendes bzw. gehendes Ereignis vielleicht, oder CPU Zustand (STOP->RUN)?
    Es wird etwas von dem sein, was Step7 dir in "Details zum Ereignis" unter der Liste anzeigt,
    z.B. bei Parametrierfehler:
    Baugruppenträger 0
    Steckplatz 6
    Fehlerart: projektierter Steckplatz nicht belegt.
    usw.
    Wenn es nicht dokumentiert ist, wirst du es durch brobieren rausfinden müssen

  5. #5
    Bewareofthis ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    31.10.2005
    Beiträge
    26
    Danke
    0
    Erhielt 3 Danke für 3 Beiträge

    Standard

    @Zottel:
    Was sind die Rückgabewerte der Funktion daveGetProgramBlock bzw. wie muss ich sie interpretieren?
    zur Erklärung:
    Ich habe die libnodave.net.dll um diese Methode erweitert:
    Code:
    [DllImport("libnodave.dll")]  
    		protected static extern int daveGetProgramBlock(IntPtr dc,int blockType,int number, byte[] buffer,int length);
    		public int GetProgramBlock(int blockType, int number ,byte[] buffer,int length)  
    		{
    			 return&#40;daveGetProgramBlock&#40;pointer,blockType,number,buffer,length&#41;&#41;; //<-- hier tritt Exception auf !
    		&#125;
    Ich bekomme allerdings eine NullReferenceException nach dem der Baustein von Livnodave geladen wurde und die Daten von der DLL zurückgegeben werden.

    Thx vorab

    Bewareofthis

  6. #6
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Zitat Zitat von Bewareofthis
    @Zottel:
    Was sind die Rückgabewerte der Funktion daveGetProgramBlock bzw. wie muss ich sie interpretieren?
    zur Erklärung:
    Ich habe die libnodave.net.dll um diese Methode erweitert:
    Code:
    &#91;DllImport&#40;"libnodave.dll"&#41;&#93;  
    		protected static extern int daveGetProgramBlock&#40;IntPtr dc,int blockType,int number, byte&#91;&#93; buffer,int length&#41;;
    		public int GetProgramBlock&#40;int blockType, int number ,byte&#91;&#93; buffer,int length&#41;  
    		&#123;
    			 return&#40;daveGetProgramBlock&#40;pointer,blockType,number,buffer,length&#41;&#41;; //<-- hier tritt Exception auf !
    		&#125;
    Ich bekomme allerdings eine NullReferenceException nach dem der Baustein von Livnodave geladen wurde und die Daten von der DLL zurückgegeben werden.

    Thx vorab

    Bewareofthis
    Der Funktionswert ist ein Fehlercode (oder 0 für ok).
    Der Puffer und die Länge werden von der Funktion beschrieben.
    Beim Puffer ist das kein Problem: Wenn man ein array übergibt, wird immer ein Zeiger darauf übergeben, so daß die aufgerufene Funktion an der Adresse schreiben kann.
    Statt "int length" könntest du "int * length" schreiben. Das ist dasselbe, wie die Funktion in C deklariert ist. Danach ist dein Programm (bzw. libnodave.dot.net) jedoch "unsafe" und müßte mit der entsprechenden Option kompiliert werden.
    Ich bin kein Dot.NET-Experte. Es mag andere Wege geben, einen Funktionsparameter "by reference" (als Zeiger, als veränderbaren Wert) zu übergeben.
    Eine Möglichkeit sollte sein, length auch als array zu deklarieren:

    getProgramBlock(int blockType, int number ,byte[] buffer,int[] length);

    int length=new int[1];
    und dann damit aufrufen.

  7. #7
    Bewareofthis ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    31.10.2005
    Beiträge
    26
    Danke
    0
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Thx Zottel jetz gehts !

    Das mit dem Call by Reference war mir klar, allerdings hab ich immer beide
    Parameter deklariert (ref byte[] buffer, ref int length), was widerum ein Schmarrn ist.
    So gehts jetz:
    Code:
     &#91;DllImport&#40;"libnodave.dll"&#41;&#93;  
    		protected static extern int daveGetProgramBlock&#40;IntPtr dc,int blockType,int number,byte&#91;&#93; buffer,ref int length&#41;;
    		public int GetProgramBlock&#40;int blockType, int number , byte&#91;&#93; buffer, ref int length&#41;
    		&#123;
    			 return&#40;daveGetProgramBlock&#40;pointer,blockType,number, buffer,ref length&#41;&#41;;
    		&#125;
    Gruß

    Bewareofthis

    BTW: Bekommt man nur den compilierten Code zurück ?

Ähnliche Themen

  1. libnodave java Diagnosepuffer
    Von bresner1 im Forum Hochsprachen - OPC
    Antworten: 0
    Letzter Beitrag: 13.10.2011, 13:38
  2. Diagnosepuffer auslesen mit SNMP
    Von danielo im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 13.10.2011, 11:00
  3. Diagnosepuffer der CPU via CP343 auslesen
    Von jck0815 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 01.02.2008, 17:09
  4. CPU-Meldung und Diagnosepuffer mit LibNoDave auslesen
    Von GvOdin im Forum Hochsprachen - OPC
    Antworten: 1
    Letzter Beitrag: 20.08.2007, 11:00
  5. Diagnosepuffer auslesen
    Von guenni im Forum HMI
    Antworten: 7
    Letzter Beitrag: 16.02.2007, 11:19

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •