Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 2 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 11 bis 20 von 33

Thema: TIA Portal V12 Update 3 verfügbar

  1. #11
    ducati ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    09.08.2006
    Beiträge
    3.642
    Danke
    915
    Erhielt 661 Danke für 543 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    oha... man glaubt es nicht...

  2. #12
    Registriert seit
    29.03.2004
    Beiträge
    5.800
    Danke
    144
    Erhielt 1.710 Danke für 1.240 Beiträge

    Standard

    Zitat Zitat von VISTAnwender Beitrag anzeigen
    Ich muss dem Compiler wohl erst beibringen, dass dies ein REAL ist oder
    eine echte Konstante verwenden.
    Bei Konstanten muss man höllisch aufpassen dass einem die implizite Typkonvertierung die Berechnung nicht kaputtmacht. Das kann man aber nicht dem TIA anlasten.

    Beispiel:
    Code:
    INTvar := 10;
    REALvar := INTvar * 3600;
    Hier wird die Multiplikation auf dem Datentyp Integer durchgeführt, und erst bei der Zuweisung in eine Real-Zahl konvertiert. Da das Ergebnis von 10*3600 nicht mehr vom Wertebereich Integer abgedeckt wird gibt es einen Überlauf. In REALvar steht dann -29536.0 (was wahrscheinlich nicht so geplant war).

    Wenn man also Konstante hingegen 3600.0 schreibt, erkennt der Compiler die unterschiedlichen Typen und konvertiert INTvar vor der Multiplikation in eine Real-Zahl.
    Das trifft auch für alle anderen numerischen Datentypen zu. Bei der 1200 gibt es beispielsweise den Typ USINT (8-Bit Ganzzahl).
    Bei
    USINTvar = 100;
    INTvar = USINTvar * 100;
    wird die Multiplikation ebenfalls auf USINT mit dem bei diesen Werten daraus resultierendem Bereichs-Überlauf durchgeführt.

  3. Folgende 2 Benutzer sagen Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    190B (29.05.2013),UniMog (29.05.2013)

  4. #13
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.758
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard

    Unittests sind für Siemens wohl auch ein Fremdwort, wenn sich solch ein fehler in den compiler einschleichen kann...
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  5. #14
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.264
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Bei Konstanten muss man höllisch aufpassen dass einem die implizite Typkonvertierung die Berechnung nicht kaputtmacht. Das kann man aber nicht dem TIA anlasten.

    Beispiel:
    Code:
    INTvar := 10;
    REALvar := INTvar * 3600;
    Hier wird die Multiplikation auf dem Datentyp Integer durchgeführt, und erst bei der Zuweisung in eine Real-Zahl konvertiert. Da das Ergebnis von 10*3600 nicht mehr vom Wertebereich Integer abgedeckt wird gibt es einen Überlauf. In REALvar steht dann -29536.0 (was wahrscheinlich nicht so geplant war).

    Wenn man also Konstante hingegen 3600.0 schreibt, erkennt der Compiler die unterschiedlichen Typen und konvertiert INTvar vor der Multiplikation in eine Real-Zahl.
    Das trifft auch für alle anderen numerischen Datentypen zu. Bei der 1200 gibt es beispielsweise den Typ USINT (8-Bit Ganzzahl).
    Bei
    USINTvar = 100;
    INTvar = USINTvar * 100;
    wird die Multiplikation ebenfalls auf USINT mit dem bei diesen Werten daraus resultierendem Bereichs-Überlauf durchgeführt.
    Aber wohl nicht in V12 SP2, siehe meinen Thread zu diesem Thema.
    Geändert von Ralle (30.05.2013 um 08:47 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  6. #15
    Registriert seit
    22.11.2007
    Beiträge
    731
    Danke
    6
    Erhielt 89 Danke für 62 Beiträge

    Standard

    und in Hochsprachen C/C++,Delphi,Java,.Net Variante... ist das ja auch nicht so

    Code:
    INTvar := 10;
    REALvar := INTvar * 3600;
    als C/C++ unter 32Bit VS,GCC,etc.

    INT == short
    REAL == float

    Code:
    short intvar = 10;
    
    float realvar = intvar * 3600; ==> 36000.0
    
    short tmp = intvar * 3600;
    float realvar = tmp; ==> -29536.0
    wird immer mit dem linksseitigen Typ (oder eher der groesste und das konvertiert) gerechnet - d.h. 1000Trillzillionen Zeilen Code und Entwickler verstehen das als normal
    nur in der (Siemens)SPS ist das anders?

    und C auf einem ARM ist nur ein Hauch weg von dem Code wie er native auf der S7 1200 läuft - es hat nichts mit der Hardwareplatform oder Optimierung und sonstiges
    zu tun der SCL Kompiler macht meiner Meinung nach einfach falschen Code (oder verhält sich unkonform zum kompletten Rest der Welt)

    Kann hier jemand mal klar ein Beispiel bringen was mit dem SP3 wirklich gefixt wurde (also SP2 SPS3 vergleich)
    und mir erklären warum die SPS sich anders verhält als alle anderen Programmiersysteme?
    Geändert von LowLevelMahn (30.05.2013 um 09:51 Uhr)

  7. #16
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.264
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    @LowLevelMan

    Siehe hier.
    Allerdings kann ich das nicht noch einmal machen, da ich nun auf UPD3 bin.
    Zur Not kann ich evtl. noch einmal eine ältere VM-Sicherung reaktivieren, aber frühestens heute Abend, um das nochmals nachzuvollziehen.

    PS: Nein, geht leider nicht mehr, UPD2-->UPD3 habe ich als Zwischensicherung nicht mehr parat.
    Geändert von Ralle (30.05.2013 um 10:04 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  8. #17
    Registriert seit
    29.03.2004
    Beiträge
    5.800
    Danke
    144
    Erhielt 1.710 Danke für 1.240 Beiträge

    Standard

    Zitat Zitat von LowLevelMahn Beitrag anzeigen
    wird immer mit dem linksseitigen Typ (oder eher der groesste und das konvertiert) gerechnet - d.h. 1000Trillzillionen Zeilen Code und Entwickler verstehen das als normal
    nur in der (Siemens)SPS ist das anders?
    Also diese Norm wäre mir neu, Siemens macht es genauso wie es bei C gemacht wird (den Bug mal ausgenommen).
    Laut K&R ist es so dass die Typumwandlungen anhand der Operanden bestimmt werden.

    Dass deine Tests funktionieren liegt einfach daran dass du auf einer 32- oder 64-Bit Maschine bist. Lass das alles mal auf einer 8- oder 16-Bit Maschine laufen, und wundere dich was passiert.
    Geändert von Thomas_v2.1 (30.05.2013 um 11:03 Uhr)

  9. #18
    Registriert seit
    22.11.2007
    Beiträge
    731
    Danke
    6
    Erhielt 89 Danke für 62 Beiträge

    Standard

    Laut K&R ist es so dass die Typumwandlungen anhand der Operanden bestimmt werden.
    ja und bei shorts und kleiner als int wird auf int oder unsigned int promoted - was C/C++ und alle anderen auch so machen
    also sollte der SCL-Kompiler doch auf DInt(DWORD) promoten - das macht er aber nicht

    bei nur float operanden wird auf float bei double und float wird auf double promoted (also REAL und LREAL)

    Dass deine Tests funktionieren liegt einfach daran dass du auf einer 32- oder 64-Bit Maschine bist. Lass das alles mal auf einer 8- oder 16-Bit Maschine laufen, und wundere dich was passiert.
    die SPS ist aber eine 32Bit Maschine - also erwarte ich schon irgendwie gleiches verhalten (ein C auf 32Bit ARM macht es ja auch genau so)
    Geändert von LowLevelMahn (30.05.2013 um 11:12 Uhr)

  10. #19
    Registriert seit
    29.03.2004
    Beiträge
    5.800
    Danke
    144
    Erhielt 1.710 Danke für 1.240 Beiträge

    Standard

    Integer promotion ist ja nochmal eine andere Baustelle.

    Dann lass auf deiner 32-Bit Maschine mal folgendes laufen:
    Code:
    double double_testfunc1(int32_t op1)
    {
    	double f;
    	f = op1 * 2000000000;
    	return f;
    }
    
    double double_testfunc2(int32_t op1)
    {
    	double f;
    	f = op1 * 2000000000.0L;
    	return f;
    }
    Da hast du bei testfunc1 mit dem Parameter 1000 den gleichen Effekt den du hier Siemens anlastest.
    Geändert von Thomas_v2.1 (30.05.2013 um 11:27 Uhr)

  11. #20
    Registriert seit
    22.11.2007
    Beiträge
    731
    Danke
    6
    Erhielt 89 Danke für 62 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Integral promotion ist ja nochmal eine andere Baustelle.
    und es ist in Ordnung das der SCL-Kompiler hier nicht richtig handelt?

    Da hast du bei testfunc1 mit dem Parameter 1000 den gleichen Effekt den du hier Siemens anlastest.
    Aber die S7 1200 ist doch eine 32 Bit Maschine (also ist doch ein 8/16Bit integral promotion "falsch") und der SCL-Kompiler sollte meiner Meinung nach die
    Integral promotion so durchführen wie C auf 32 Bit ARM es macht oder verstehe ich deine Erklärungen einfach nicht

    und dein Tip 3600 als 3600.0 zu schreiben kompensiert nur die fehlerhafte Integral promotion

    Ich erwarte einfach das

    Code:
    INTvar := 10;
    REALvar := INTvar * 3600;
    als

    Code:
    INTvar := 10;
    REALvar := DInt(INTvar * 3600);
    kompiliert wird

    Wie verhalten sich andere da - also z.B. Codesys?
    Geändert von LowLevelMahn (30.05.2013 um 11:34 Uhr)

Ähnliche Themen

  1. Modbus Slave im TIA Portal V12 - S7-1500
    Von shutdown_TIA12 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 07.11.2013, 16:08
  2. Antworten: 19
    Letzter Beitrag: 10.08.2013, 17:02
  3. TIA TIA PORTAL V12: Erste Eindrücke
    Von vita-2002 im Forum Simatic
    Antworten: 188
    Letzter Beitrag: 23.05.2013, 04:29
  4. TIA Portal v12 mit S7 1200
    Von dentech im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 27.03.2013, 08:39
  5. [Parallelthread] TIA-Portal V12: erste Eindrücke
    Von Perfektionist im Forum Stammtisch
    Antworten: 11
    Letzter Beitrag: 08.03.2013, 16:45

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •