Sonstiges S7-1500 die neuen Datentypen

vollmi

Level-3
Beiträge
5.425
Reaktionspunkte
1.403
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe grad ein Verständnisproblem. Ich versuche mich an die neuen Datentypen der 1500 anzupassen. Bzw den code möglichst elegant hinzubekommen.

Gegeben ist:
#AktSecofhour ist INT
#dateandtime.MINUTE/SECOND sind USINT

Dieser Code liefert mir in AktSecofhour einen Falschen wert.
Imho müsste die automatische konvertierung doch das alles richig machen da keine Vorzeichen vorkommen.
Code:
#AktSecofhour := #dateandtime.MINUTE * 60 + #dateandtime.SECOND;

So wirds richtig gemacht.
Allerdings wäre es doch sinnvoller wenn man die konstante 60 direkt als USINT eingeben könnte.
Code:
#AktSecofhour := USINT_TO_INT(#dateandtime.MINUTE) * 60 + USINT_TO_INT(#dateandtime.SECOND);

Wie macht man das denn korrekterweise?

mfG René
 
Allerdings wäre es doch sinnvoller wenn man die konstante 60 direkt als USINT eingeben könnte.
Ich glaube nicht daß das sinnvoll wäre, weil dann würde der Compiler vermutlich die Berechnung in USINT-Operationen erzeugen und erst am Schluß bei der Zuweisung zu INT konvertieren (vielleicht hat der das ja auch bei Deinem ersten Code gemacht weil er die 60 als USINT angesehen hat?) Aber bereits bei "#dateandtime.MINUTE * 60" wird meistens ein Ergebnis herauskommen, was nicht mehr in einen USINT passt . Man muß den Compiler überzeugen, daß die Multiplikation in INT oder UINT ausgeführt wird - also #dateandtime.MINUTE zuerst in INT oder UINT konvertiert wird und danach erst die Multiplikation als INT/UINT ausgeführt wird. Das kann man vielleicht erreichen, indem man dem Compiler erklärt, daß die 60 als INT/UINT zu interpretieren ist. Oder aber wie Dein zweiter Code, indem man explizit "USINT_TO_INT(#dateandtime.MINUTE)" angibt.

Funktioniert folgendes?
Code:
#AktSecofhour := #dateandtime.MINUTE * INT#60 + #dateandtime.SECOND;

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber bereits bei "#dateandtime.MINUTE * 60" wird meistens ein Ergebnis herauskommen, was nicht mehr in einen USINT passt .

Jetzt kapier ich erst das Problem Ich dachte USINT sei ein INT ohne Vorzeichen. Also 0-65535.
Dass das irgendein Vorzeichenloses kurzes INT ist also nur 8 Bit breit. Hab ich nicht erfasst.
 
Ja wir Programmierer lernen jeden Tag etwas dazu :D
Und durch das SPS-Forum brauchen wir die meisten Fehler gar nicht selber machen sondern können uns die von anderen abschauen. :cool:

Harald
 
Interessanterweise hat mir TIA aber online die 60 als INT angezeigt. Also wenn man mit der Maus drüberfährt.
Ich hätt jetzt auch erwartet das gerade in SCL automatisch in der Arithmetik dann im grösseren Typ gerechnet wird. Also USINT * INT hätte ich ein INT als Resultat erwartet.

Aber wenigestens bin ich irgendwo der Erste und wenns nur die ersten Fehler sind ;)

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Laut TIA-V13-Handbuch: untypisierte Konstanten erhalten ihren Datentyp mit der arithmetischen Verknüpfung in der sie verwendet werden.
Die 60 ist mit einem USINT verknüpft - also wählt der Compiler laut Dokumentation ebenfalls USINT für die 60 und berechnet den ganzen Ausdruck als USINT.

Welche Darstellung das TIA beim Beobachten wählt, steht wohl noch auf einem ganz anderen Blatt.

Harald
 
Zurück
Oben