Step 7 Datentyp REAL Alternative

Techm3ch

Level-2
Beiträge
74
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Freunde der Automatisierung,

ich programmiere auf einer S7-1511-1 PN in FUP. Die Anlage die ich programmiere hat unter anderem den Wert Speed, dieser ist 2 Byte groß und steht für %
diese prozente sehen so aus: Ich lese und schreibe "1357" = 13.57% (zur besseren lesbarkeit wandle ich über eine division den Integer in ein REAL

die folgende Seite sagt REAL ist 4 Byte groß und bei meiner aktuellen Programmierung wäre das problematisch da ich nur 2 Byte habe für Speed und es treten auch Fehler auf aber ich kann das nicht 100% zuordnen. kann mir jemand etwas wissen vermitteln bitte?



(https://www.spshaus.ch/files/inc/Do...llgemein/TIA_Portal_Uebersicht_Datentypen.pdf)
 
Moin Techm3ch,

ein REAL IST 4 Byte groß!

Woher kommt der Wert "Speed" und wohin geht er?
Wo ist die Lesbarkeit besser?
Wie wird mittels einer Division gewandelt?
Warum hast Du zwei Nachkommastellen (sind 0,01 % (nicht einmal ein 0/00) relevant?)?

VG
MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Begrenzung von 2 BYTEs für 'Speed' ist für die Übergabe an eine FU ?
Über eine Analogausgang, oder Profinet ?

Mache deine Berechnungen generell mit REALs.
Nur bei den Übergabe an den FU wandelst du es als den letzten Schritt in ein INT um.
Etwas wie
FU_Speed_sollwert_int := REAL_TO_INT(FU_Speed_sollwert_real) * 100.0 ;

Du musst auch die Skalierung was die FU erwartet und die Wertegrenzen von ein INT überwachen.
 
ich habe eine Steuerung die eine Anlage steuert, an die Steuerung kann ich SOLL werte schicken (die steuerung übersetzt und schickt sie dann an die anlage) und die Anlage schickt IST Werte an die Steuerung die ich auslesen kann.

der adressbereich einer anlage ist 32 Byte lang, jeweils für IN & OUT. Speed ist Byte 48 + 49

Ich lese den Wert ein, muss die endianess anpassen, dann konvertiere ich den UINT zu REAL und führe DIV durch 100 aus. Wenn ich einen SOLL wert sende, mache ich das gleiche aber umgekehrt, der bediener gibt also 15.57 ein und das wird dann mit 100 MUL von REAL zu UINT und dann SWAP. Ich sehe da kein Problem, die Anlage erhält aber falsche Werte.

vielen dank schonmal
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich habe eine Steuerung die eine Anlage steuert, an die Steuerung kann ich SOLL werte schicken (die steuerung übersetzt und schickt sie dann an die anlage) und die Anlage schickt IST Werte an die Steuerung die ich auslesen kann.

der adressbereich einer anlage ist 32 Byte lang, jeweils für IN & OUT. Speed ist Byte 48 + 49

Ich lese den Wert ein, muss die endianess anpassen, dann konvertiere ich den UINT zu REAL und führe DIV durch 100 aus. Wenn ich einen SOLL wert sende, mache ich das gleiche aber umgekehrt, der bediener gibt also 15.57 ein und das wird dann mit 100 MUL von REAL zu UINT und dann SWAP. Ich sehe da kein Problem, die Anlage erhält aber falsche Werte.

vielen dank schonmal
Welche Werte erhälst Du denn?
Und welchen Konvertierungsbefehl nimmst Du? Bei Siemens gibt es welche die einfach das Bitmuster nehmen und es in eine Variable eines anderen Typs packen, das ist zum Beispiel sinnvoll, wenn Du ein REAL in einem DWORD übertragen bekommst, zum Beispiel per Netzwerk, und diese Bitkombi dann in eine Real-Variable packen möchtest ohne das irgendwelche wilden Umrechnungen stattfinden, damit da dann was sinnvolles rauskommt.
Im Codesys Universum fehlt so eine Funktion nämlich leider.
 
es sind momentan 2 anlagenteile, also 2(anlage)x32x2(ein und ausgänge), wenn ich an die anlage 1 den wert 80% sende geht sie auf 20% und die anlage 2 geht auf 80%, was genau umgekehrt ist. oder es passiert nichts. da die steuerug selber auch "intelligent" ist fällt mir die fehlersuche schwer, sie reagiert nicht nur auf werte sondern passt auch die werte der anderen anlagen automatisch an um im gleichgewicht zu sein
 
Welche Werte erhälst Du denn?
Und welchen Konvertierungsbefehl nimmst Du? Bei Siemens gibt es welche die einfach das Bitmuster nehmen und es in eine Variable eines anderen Typs packen, das ist zum Beispiel sinnvoll, wenn Du ein REAL in einem DWORD übertragen bekommst, zum Beispiel per Netzwerk, und diese Bitkombi dann in eine Real-Variable packen möchtest ohne das irgendwelche wilden Umrechnungen stattfinden, damit da dann was sinnvolles rauskommt.
Im Codesys Universum fehlt so eine Funktion nämlich leider.
ich nehme den Befehl CONV UInt to Real und CONV Real to UInt. Ich habe nicht direkt werte, die anlage reagiert einfach unvorhersehrbar
 
Hast du Möglichkeit zu sehen was passiert mit die Daten auf die Anlagen Seite ?
Ich meine die Daten die direkt von deine Steuerung kommen. Nicht nach die Behandlung in die Anlagensteuerung.
Bist du sicher das hast die Formatierung und Addressierung korrekt ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
was meinst du mit code? fehlercode? habe tatsächlich keinen beim TIA portal, die anlage reagiert einfach nicht wie sie soll
Näh ich meine welche Programmcode hast du ? Ob AWL, SCL, LAD oder KOP.
Nur dass du keine 'Verdreher' oder Byte-Versatz falsch gemacht habe.
 
Nah OK, dass hast du ja erwähnt.

Dann fehlt es nur Beispiele von die Daten auf beide Seiten.

Edit: Näh warte mal.

Was hast du gemacht ?
Einfach deine Code hier posten.
kleiner ausschnitt, auf der rechten seite sind meine "merker"iD1 sind die eingänge der Anlage 1 iD2 für anlage 2... und oD1 wären die ausgänge die momentan noch nicht beschrieben sind da ich grad den code überarbeite
 

Anhänge

  • 1715870859636.png
    1715870859636.png
    1 MB · Aufrufe: 43
Zurück
Oben