Profibus GSD - Codesys - Hex Code - Dateityp

Override

Member
Beiträge
11
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
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
 
OP
O

Override

Member
Beiträge
11
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
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 :confused:

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

Supermoderator
Teammitglied
Beiträge
13.148
Punkte Reaktionen
2.745
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 :
Code:
MyDINTVariable := DWORD_to_DINT(myDWORDvomProfiBus) ;
... die verwendeten Variablennamen sind natürlich beliebig ...

Gruß
Larry
 
OP
O

Override

Member
Beiträge
11
Punkte Reaktionen
0
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 :)

UINT.jpg
 
Zuletzt bearbeitet:
OP
O

Override

Member
Beiträge
11
Punkte Reaktionen
0
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...
 
Zuletzt bearbeitet:

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.148
Punkte Reaktionen
2.745
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 ...
 
OP
O

Override

Member
Beiträge
11
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
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

Supermoderator
Teammitglied
Beiträge
13.148
Punkte Reaktionen
2.745
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
 
OP
O

Override

Member
Beiträge
11
Punkte Reaktionen
0
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) :)
Online2-UINT.jpg
Online1_FLOAT.jpg


Danke für deine Hilfe!
 

RobiHerb

Well-known member
Beiträge
678
Punkte Reaktionen
112
Zuviel Werbung?
->Hier kostenlos registrieren
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
 
OP
O

Override

Member
Beiträge
11
Punkte Reaktionen
0
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:
Janitza-Profibus-Profil.jpg
 

Oberchefe

Well-known member
Beiträge
2.665
Punkte Reaktionen
479
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.
 
OP
O

Override

Member
Beiträge
11
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hier ein Auszug der Deklaration, diese ist aber in der PLC, denke der Fehler liegt nicht dort:

Code:
    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.
 
Zuletzt bearbeitet:

Oberchefe

Well-known member
Beiträge
2.665
Punkte Reaktionen
479
hatte das so gedacht:

Datentyp anlegen:

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

Dann Variable deklarieren:

Code:
    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

Well-known member
Beiträge
2.665
Punkte Reaktionen
479
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...
 
OP
O

Override

Member
Beiträge
11
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
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!
 
Zuletzt bearbeitet:

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.148
Punkte Reaktionen
2.745
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
 
OP
O

Override

Member
Beiträge
11
Punkte Reaktionen
0
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
 
Oben