# Profibus GSD - Codesys - Hex Code - Dateityp



## Override (27 Dezember 2012)

Hallo liebe Community, 

Ich bin neu hier und habe mit CodeSys (Beckhoff) angefangen zu programmieren.
Nun habe ich einen Janitza UMG508 Slave welcher mir über den Profibus die Messwerte in die PLC liefert.
Wenn ich die GSD Datei von Janitza http://www.janitza.de/downloads/profibus/ im Projekt importiere sind im Modul die Datentypen alle uint.
Das ist ein Problem denn die Werte können ja teilweise auch negativ sein.
Auch möchte ich 50.0 Hz anzeigen z.B. 
Habe schon versucht die Werte zu skalieren, jedoch muss am Logger im Profil der Datentyp mit dem im SPS Projekt definierte Datentyp übereinstimmen.

Hat jemand von euch Profis eine Idee wie man das hinbekommt mit Codesys, bei Siemens kann man den Dateityp wechseln soweit ich weiss...?

Besten Dank schon im Voraus und Grüsse

Override


----------



## Larry Laffer (28 Dezember 2012)

Override schrieb:


> Hat jemand von euch Profis eine Idee wie man das hinbekommt mit Codesys, bei Siemens kann man den Dateityp wechseln soweit ich weiss...?



Hallo,
das kann man bei Codesys ganz sicher auch. Schau dir mal die Wandlungsfunktionen in der Hilfe an.
Wie programmierst du ? KOP, FUP, AWL , ST ?

Gruß
Larry


----------



## Override (28 Dezember 2012)

Hallo Larry

Danke für deinen Post.

Ich habe schon alles mögliche versucht. Leider ohne Erfolg.
Das Feld wo der Datentyp darin steht, ist grau hinterlegt 

Programmiere in ST und teilweise FUP.
Die Programmiersprache hat in meinen Augen keinen Einfluss, da dies noch im System Manger definiert wird.

Grüsse
Override


----------



## Larry Laffer (28 Dezember 2012)

Da ich jetzt nicht so genau weis, ob wir nicht nebeneinander her reden / schreiben ...
Vielleicht postest du mal deinen Script-Ansatz (ich kann aber mit FUP so gar nichts anfangen).

Aber grundsätzlich ... du mußt die Variable vom Bus erstmal so nehmen, wie sie ist.
Danach kannst du sie in eine andere Variable wandeln (umcasten). Das könnte in ST ungefähr so heißen :
	
	



```
MyDINTVariable := DWORD_to_DINT(myDWORDvomProfiBus) ;
```
... die verwendeten Variablennamen sind natürlich beliebig ...

Gruß
Larry


----------



## Override (28 Dezember 2012)

Hmmm, wir reden aneinander vorbei 
Im Anhang ein Printscreen.
Das Problem liegt schon im System Manager, programmiert wird dann im PLC Control.
=> Zum casten weiss ich schon wie das geht. Das ist für mich kein Problem


----------



## Larry Laffer (28 Dezember 2012)

Override schrieb:


> Hmmm, wir reden aneinander vorbei ...



OK ... ich stehe gerade ein bißchen auf der Leitung ... wo hängt es denn jetzt ?
Der Profibus-Slave sendet also ein Array_of_Word ... das mußt du nun anders interpretieren ...


----------



## Override (28 Dezember 2012)

Grundsätzlich ja (Array of Word (UINT)), man könnte auch das ganze Array   ansprechen soviel ich weiss. Das wäre aber eher umständlich, denn man  müsste  das noch auswerten :smile:
Der Slave sendet Float Werte an die PLC, doch in der PLC sind in der  Hardware Config UINT als Typ fix definiert. Egal ob man jetzt das Array  oder die Variabeln einzeln auswertet.
Diese möchte ich auf REAL ändern, denn sonst wird das Ganze nie funtionieren.
Das kommt von der GSD denke ich mal oder ist Beckhoff Standard, irgendwie muss man das doch ändern können :-/

Nachtrag: Die Hardwareconfig gibt im Prinzip die Datentypen vor welche verknüpft werden können. => und genau dieser Typ möchte ich ändern...
In der PLC werden dann Variabeln definiert und auf die Hardwareconfig verknüpft. Bitte korrigiert mich wenn ich irgendwo falsch liege...


----------



## Larry Laffer (28 Dezember 2012)

Ich habe mir mal die Beschreibung (oberstes Element als PDF) von dem Ding gemäß deines Links angesehen. Die bezieht sich zwar auf Siemens - ist aber (denke ich) in der Sache egal.
Was ich darin gesehen habe ist :
- es tauscht ein Array_of_Byte über PB aus.
- was übertragen wird wählst du anscheinend selber aus und bestimmst dann somit was wo steht (so habe ich es jedenfalls interpretiert).
- ich habe nicht gesehen, dass REAL oder FLOAT übertragen wird - aber ganz sicher kannst du durch Wandlung Alles zu Allem machen.

Ich weiß nun immer noch nicht so genau, wo du hängst ...


----------



## Override (28 Dezember 2012)

Danke für deine Abklärungen Larry
Das Problem ist, wenn ich auf dem Logger im Profibus Profil Float definiere und auf der Beckhoffseite die GSD importiere mit den UINT Typen kommt auf der Beckhoffseite nur Schrott raus.
Ist auch logisch denn die beiden definierten Typen (auf beiden Seiten) müssen zusammenpassen.

Da ich auf der Beckhoffseite eben nur UINT habe als Typ wird das schwierig FLOAT darzustellen und z.B. 230.5 anzuzeigen.
Hoffe ich habe es etwas besser beschreieben.


----------



## Larry Laffer (28 Dezember 2012)

Wie sieht denn der Inhalt der Übertragung (also der Wert der Inhalte) aus und was sollte davon werden ?
Mir würde das, weil ich dein Equipment nicht nachstellen kann, schon ein wenig helfen. Dann kommen wir beide vielleicht auch mal aus der Pauschal-Ecke heraus ...

Gruß
Larry


----------



## Override (28 Dezember 2012)

Also Online_UINT bei dem sind auf beiden Seiten der Typ auf UINT gestellt, dann kommt in dem Beispiel die Spannung von L1 raus. Was ich aber brauchen würde wäre 229.9 [V]
Bei Online_Float ist auf der Loggerseite auf Float gestellt. Dann kommt nur Mist raus (was eigentlich logisch ist) 






Danke für deine Hilfe!


----------



## RobiHerb (28 Dezember 2012)

*Besispiel Programm?*

Ich denke das im Download Bereich aufgeführte Beispiiel Programm hilft da weiter.

Meine Vermutung (ich habe keine S7 zum Laden des Beispiels):

Über die Schnittstelle kommen eine Reihe von Bytes (leider im GSD File als WORD aufgeführt), die eben in einem unbekannten Protokoll entsprechend formatiert sind. 

In diesem Fall würde ich versuchen:
den Wert vom Sender auf 0 zu stellen (ich gehe mal davon aus, es ist ein Sensor),
danach kleine Änderungen um den Nullpunkt,
Danach auf Max,
Danach auf Min,

Damit sieht man in der Regel, wenn man nicht totale Zufallsdaten hat, was da kommt in welchem Format.

Sehr oft wird zum Datenaustausch verwendet:

http://en.wikipedia.org/wiki/IEEE_floating_point

oder

http://en.wikipedia.org/wiki/C99#IEEE_754_floating_point_support


----------



## Override (28 Dezember 2012)

Hallo

Das wird bei einem Leistungslogger etwas schwierig, min. max. Werte einzustellen. Bei einem Sensor ja 

Man kann auf dem Logger ein Profil anlegen und jeder beliebige Wert vergeben.
Doch das Problem ist, wenn man nicht Float angibt wird auf dem Logger alles weggeschnitten nach dem Komma.
Und wenn nich Float angebe, kommt eben nur Schrott raus.

Hier das Profibusprofil, da kann man für jeden Wert einen eigenen Typ zuweisen wenn es sein muss:


----------



## Oberchefe (28 Dezember 2012)

Wenn das Ding in der Steuerungskonfiguration deklariert wird hat es ja wahrscheinlich irgendeine IX oder QX Adresse. Dann solltest Du einfach eine Struktur definieren, da packst Du Deine REAL oder was auch immer Werte (ggf. gemischt mit Integer oder was auch immer) rein. Dann eine Variable mit dem Datentyp der Struktur anlegen, als "AT" auf die Adresse der Steuerungskonfiguration.


----------



## Override (29 Dezember 2012)

Hier ein Auszug der Deklaration, diese ist aber in der PLC, denke der Fehler liegt nicht dort:


```
iwSpannungL1    AT%IW100: REAL;
    iwSpannungL2     AT%IW101:REAL;
    iwSpannungL3     AT%IW102: REAL;
    iwStromL1      AT%IW103:REAL;
    iwStromL2      AT%IW104:REAL;
    iwStromL3      AT%IW105:REAL;
```

Leider kann ich diese nicht mit der HW Konfig. verknüpfen. Da im System Manager von dem GSD Modul her jeder "Eingang" vom Typ UINT ist.

Das Problem ist wohl die GSD Datei, kann man die GSD Datei so editieren dass man den Variabelntyp ändern kann?
Ich kenne mich zuwenig aus mit GSD Dateien. Habe mich gestern informiert darüber aber leider nicht herausgefunden ob das möglich ist.
Im Beckhoff System Manager gibt es immer wieder den Typ UINT wenn ich das GSD Modul importiere.


----------



## Oberchefe (29 Dezember 2012)

hatte das so gedacht:

Datentyp anlegen:


```
TYPE GSD_Lesen :
STRUCT
    iwSpannungL1: REAL;
    iwSpannungL2:REAL;
    iwSpannungL3: REAL;
    iwStromL1:REAL;
    iwStromL2:REAL;
    iwStromL3:REAL;
END_STRUCT
END_TYPE
```

Dann Variable deklarieren:


```
MeineDaten AT %IW100: GSD_Lesen;
```

Muss allerdings zu geben dass ich mit Beckhoff noch nichts gemacht habe, kann mir aber nicht vorstellen dass das anderswo funktioniert (z.B. Wago) bei Beckhoff aber nicht


----------



## Oberchefe (29 Dezember 2012)

Nachtrag:

wenn das Ding UINT will um funktionieren zu können deklarierst Du eben noch ein paar UINT zusätzlich auf die Adressen IW100, IW101, IW102...


----------



## Override (29 Dezember 2012)

Denke aber dann liegt das Problem wieder beim Logger. Dort kann ich nur ein Wert pro Adresse übergeben. Der Datentyp wird dort fix festgelegt.
Und wenn der halt UINT bleibt dann wird das auch nichts nützen denke ich. 
Habe das jetzt mal so probiert, leider kommt wieder nur Mist raus. :-(

Hat jemand Erfahrungen mit GSD Dateien?

=> Kann man in der GSD Datei den Datentyp ändern?
=> Oder ist das CodeSys welcher automatisch UINT daraus macht?

Oder mal ein ganz anderer Ansatz. Kann man von dem UMG508 die Daten auch über ADS übertragen (Ethernet). Gibt es ADS Treiber für das Teil?

Danke für eure Unterstützung!


----------



## Larry Laffer (29 Dezember 2012)

Hallo,
du denkst bezüglich der GSD-Dateien komplett falsch ...
Eine GSD-Datei legt nicht den Datentyp fest - sie legt lediglich fest, wieviele Daten (hier meißt Bytes) zu übertragen sind und wie deren Konsistenz ist.
Im Grunde legst du in deinem Janitza fest, was in welcher Reihenfolge in die Ausgangs-Tabelle geschrieben werden soll (und bestimmst so deren Größe, die dann in der PB-Kommuniaktion irgendwie nachgehalten werden muß) und hast dann in der SPS die Aufgabe, das entsprechend auseinanderzupflücken. Hier ist es natürlich schön einfach, wenn du mit den Grunddatentypen arbeiten kannst - es geht aber auch anders.

Mein Vorschlag wäre :
Du ließt deine Daten erstmal in ein Array_of_Byte oder Array_of_Word ein und legst dann, wie von Oberchefe schon vorgeschlagen, eine AT-Sicht auf diese Tabelle, die deren Inhalte in einen Struct interpretiert, deren Aufbau mit deiner Janitza-Konfiguration übereinstimmt.

Gruß
Larry


----------



## Override (29 Dezember 2012)

Danke für eure Hilfe, ich werde das mal so versuchen.
@ Larry, danke für die Aufklärung betreffend GSD, wusste ich nicht.

Gruss Override


----------



## sailor (30 Dezember 2012)

Hallo,
betreffend GSD: Die kannst du mit jeden Text-Editor bearbeiten.
Wenn du im Slave die Ausgänge als Float deklarierst, werden die auch als UINT übertragen, das heisst, der Floatwert wird Bit für Bit in die PLC geschrieben. Besteht aus zwei UINT-Werten. Du hast wahrscheinlich nur einen Dreher drin! Tausche doch mal HI- mit LO-Word oder vielleicht nimmst du auch die falschen Wörter.
Gruß
Sailor


----------



## bike (30 Dezember 2012)

Also eine GSD Datei nacharbeiten musste ich bis heute noch? nicht.
Der TE sollte sich nicht an den Formaten in der Hardware festhalten.
Von dem Slave kommt ein Datenfeld, das in der PLC richtig interpretiert werden muss.


bike


----------



## Override (30 Dezember 2012)

Ich denke schon dass ich einfach die Daten nicht korrekt interpretiere.
Soll ich dann am besten ein Array von UINT nehmen oder jeder Parameter einzeln?

Sobald ich im Profibusprofil auf dem Logger einzelne Parameter auf Float umschalte machen die einzelnen Werte was sie wollen


----------



## bike (31 Dezember 2012)

Ich würde mir das gesamte Datenfeld einlesen.
Dann die Beschreibung nehmen und die Werte entsprechend aus dem Datenfeld auslesen und interpretieren.
Dann hast du das was du brauchst.


bike


----------

