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

Softi79

Level-2
Beiträge
220
Reaktionspunkte
12
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
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
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
In welcher Programmiersprache ist/wird die Oberfläche programmiert?
Für Delphi habe ich mir eine Unit geschrieben die die Zahlen dreht.

bike
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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
 
Codeausschnitt als Beispiel Real (in c# float):
Code:
 ...
            
            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)

Code:
 ....
            
            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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Ein OPC-Server ist ein Programm, das auf dem POC (und nicht auf der SPS) läuft. OPC kommt von Ole for Process Control. Und mit OLE ist wieder einmal die Technologie meines Freundes Bill Object Linking and Embedding 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.
 
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
 
Zurück
Oben