# Libnodave / HB LB / Byte drehen / DB incl. DB in PC einlesen



## Softi79 (8 Oktober 2008)

Hallo zusmmane,

wir möchten aus einer CPU 319 einen DB incl. einiger UDTs über Libnodave einlesen bzw. bearbeiten der ganze Baustein soll in einer Oberfläche dargestellt werden.

Doch nun das leidige Problem mit Siemens und dem dreher (HighByte LowByte) 

Bei Beckhoff gibt es die Möglichkeit die Daten in der einen oder anderen Art bereitzustellen. wie löst man das am beisten bei der S7 mit Libnodave?

Weiteres Problem wenn ich den DB komplett eingelesen habe und stoße auf "einfache" Datentypen dann ist das kein Problem diese zu zerlegen, doch was mache ich wenn ich auf eine Struktur UDT stoße? 


Grüßle Softi


----------



## Question_mark (8 Oktober 2008)

*Little endian und big endian*

Hallo,



			
				Softi79 schrieb:
			
		

> doch was mache ich wenn ich auf eine Struktur UDT stoße?



Die Tags in der SPS werden doch sowieso von den Kommunikationstools wie LibNoDave oder AGLink über absolute Adressen angesprochen. Und auch einzelne Elemente in einer UDT haben eine absolute Adresse (und auch einen definierten Datentyp). Also ich kann da kein Problem erkennen...



			
				Softi79 schrieb:
			
		

> Doch nun das leidige Problem mit Siemens und dem dreher (HighByte LowByte)



AG-Link von Deltalogic hat entsprechende Funktionen für die Anpassung der unterschiedlichen Datenformate. Einfach das Handbuch lesen und die entsprechenden Beispiele ansehen und anwenden. Und alles wird gut 

Gruß

Question_mark


----------



## Rainer Hönle (9 Oktober 2008)

Das Problem bei der Darstellung ist allerdings, dass man kontextsensitiv interpretieren muss. Ist das Wort jetzt 2 x 8 Bits, zwei Bytes, ein Wort, das HighWord oder das LowWord eines Doppelwortes etc. Diese Info (einschließlich UDTs und deren Aufbau) ist im S7-Projekt enthalten und kann z.B. mit AGLink-Symbolik-Pro aus diesem gelesen werden.


----------



## bike (9 Oktober 2008)

In welcher Programmiersprache ist/wird die Oberfläche programmiert?
Für Delphi habe ich mir eine Unit geschrieben die die Zahlen dreht.

bike


----------



## Softi79 (9 Oktober 2008)

Die Oberfläche wird in C# programmiert.... kann man aus dem Code trozdem irgendwie was ableiten? wenn ja kannst du mir das mailen?

Gruß Softi


----------



## Rainer Hönle (9 Oktober 2008)

Die Zahlen zu drehen ist eigentlich einfach. Und hilft auch nur, wenn man sicher ist, dass es sichum ein Wort oder Int handelt. Woran wird aber erkannt, ob es sich um ein Doppelwort handelt? Dort sieht dann die Drehung anders aus.


----------



## Softi79 (9 Oktober 2008)

Das sollte man eben an der Struktur erkennen, es gäbe z.B. die Möglichkeit aus dem Kommunikations DB eine Quelle zu generierern und diese dann beim PC einzuspielen. Doch so wie ich das sehe spilet einem da die S7 einen Streich, denn wenn ich dem DB einen UDT übergeben und diese Struktur dann als ARRAY [1...5] ausführe und daraus eine Quelle generiere dann wird in der Quelle die Sturktur  nur einmal angegeben obwohl ich Sie als 1 bis 5 ausführe

Gruß Softi


----------



## HeizDuese (9 Oktober 2008)

Codeausschnitt als Beispiel Real (in c# float):

```
...
            
            byte[] buffer = new byte[4];
            byte[] swapBuffer = new byte[4];

            res = dc.readBytes(libnodave.daveDB, DBNo, DBBStart, 4, buffer);
            if (res == 0)
            {
                byte[] swapBuffer = new byte[4];
                swapBuffer = (byte[]) buffer.Clone();

                    buffer[0] = swapBuffer[3];
                    buffer[1] = swapBuffer[2];
                    buffer[2] = swapBuffer[1];
                    buffer[3] = swapBuffer[0];
                    return BitConverter.ToSingle(buffer, 0);
            }
```
und noch Int  (c# Int16)


```
....
            
            byte[] buffer = new byte[2];
            byte[] swapBuffer = new byte[2];

            res = dc.readBytes(libnodave.daveDB, DBNo, DBBStart, 2, buffer);
            if (res == 0)
            {
                swapBuffer = (byte[])buffer.Clone();
                buffer[0] = swapBuffer[1];
                buffer[1] = swapBuffer[0];
                return BitConverter.ToInt16(buffer, 0);
            }
```

lässt sich aber ggf. noch optimieren.


----------



## Softi79 (10 Oktober 2008)

Ok, so in der Art haben wir das Programm auch geschriíeben, funktioniert auch. Doch das Problem ist der Aufbau des DB´s denn ich kann sehr Wohl den DB auslesen 

Das Problem ist nicht, wenn ich das für eine Bestimmte Struktur mache. Die Schwirigkeit ist das zu verallgemeinern
Wenn ich die Struktur vorher nicht weiß. Dann weiß ich auch nicht wie viele bytes ich drehen muss.
Weil ich bekomme von der S7 nur byte array ohne Info was für Typen daa sind.Wir haben uns schon überlegt den DB imt einem Header auszustatten.

z.B.
HEADER of DB12 Kommunikation
0.0 Länge DB INT
2.0 OFFSET bis Bit
--> Länge Bereich Bit
4.0 OFFSET bis BYTE
-- Länge Bereich Byte
6.0 OFFSET bis WORD
8.0 OFFSET bis DWORD


Die Quelle dss DBs könnte man generieren und an den PC übertragen und der muss sich dann aus der Quelle die Formate zusammen bauen. doch was macht man bei UDTs?


Oder welche Möglichkeit gibt es sonst noch bei einer Hardware wie

SPS S7 319 WinCC flex MP 277 Touch
mit einem PC symbolisch auf Xbelibige Daten zuzugreifen.

mit libnodave kann ich ja nur auf absolute Adressen zugreifen, es sollte aber eine Möglichkeit geben z.B. einen kompletten DB auszulesen und die INfos über den Aufbau braucht man natürlich auch um entsprechend die Daten richtig zu wandeln

Wäre eine OPC Server einfacher? was ksotet so ein teil oder ist das auf einer 319er schon vorhanden?

Grüßle Softi


aber naja schön wäre das nicht und vorallem wäre man eine Feste Struktur gebunden


----------



## Rainer Hönle (10 Oktober 2008)

Ein OPC-Server ist ein Programm, das auf dem POC (und nicht auf der SPS) läuft. *OPC* kommt von *O*le for *P*rocess *C*ontrol. Und mit *OLE* ist wieder einmal die Technologie meines Freundes Bill *O*bject *L*inking and *E*mbedding gemeint. So, jetzt genug der Verwirrung.
Es gibt OPC-Server, die direkt auf das S7-Projekt zugreifen und dann die symbolischen Operanden zur Auswahl bringen (wir haben auch so einen ;-)). Für die Kommunikation werden dann aber die symbolischen Operanden wieder in absolute Operanden übersetzt. Und dann passiert das gleiche wie bei libnodave und zusätzlich die korrekte Wandlung gemäß Datentyp (in real, DWord, ..).
Bei OPC-Servern ist zu beachten, dass das Gegenstück (ein OPC-Client) auch erst in das eigene Programm eingebunden werden muss.


----------



## Mike101 (15 Oktober 2008)

*unpack*

Moin,
bin neu hier, und progge nur in perl, hab aber ne ganz nette Lösung für ne Array interpretation :
Meldepunkt    ARRAY[1..64]
 STRUCT

    Lesungen_Gesamt DINT    L#0
    Good_Read    DINT    L#0
    No_Read    DINT    L#0
    Good_Read_IF    DINT    L#0
    No_Read_IF    DINT    L#0
    Fehllesequote    REAL    0.000000e+000

  END_STRUCT

Also nen threading Daemon schaufelt die DB´s aus verschiedenen SPSen zeitgesteuert (Time::HiRes) in eine MySQL-DB
Ein weitere Daemon interpretiert diese Daten.
Das Umwandeln mach ich so:

my @_dataArray = unpack("NNNNNf" x length($_data)/24),$_data);

dabei ist $_data der in der DB gespeicherte Blob

vielleicht hilfts weiter

MfG mike


----------

