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

Ergebnis 1 bis 6 von 6

Thema: S7-1500 die neuen Datentypen

  1. #1
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    775
    Erhielt 646 Danke für 492 Beiträge

    Standard


    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é
    Zitieren Zitieren S7-1500 die neuen Datentypen  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Zitat Zitat von vollmi Beitrag anzeigen
    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    vollmi (16.06.2016)

  4. #3
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    775
    Erhielt 646 Danke für 492 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    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.

  5. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard

    Ja wir Programmierer lernen jeden Tag etwas dazu
    Und durch das SPS-Forum brauchen wir die meisten Fehler gar nicht selber machen sondern können uns die von anderen abschauen.

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  6. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    vollmi (16.06.2016)

  7. #5
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    775
    Erhielt 646 Danke für 492 Beiträge

    Standard

    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é

  8. #6
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.166
    Danke
    921
    Erhielt 3.286 Danke für 2.655 Beiträge

    Standard


    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
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 07.07.2015, 09:10
  2. Exklusives Interview zur neuen Steuerungsfamilie S7-1500
    Von Martin Buchwitz im Forum Stammtisch
    Antworten: 0
    Letzter Beitrag: 03.12.2012, 08:51
  3. SIEMENS LOGO die Neuen mit Ethernet (0BA7)
    Von IBFS im Forum Sonstige Steuerungen
    Antworten: 24
    Letzter Beitrag: 05.05.2011, 08:02
  4. Die neuen Basic Panels mit DP ???? oder...
    Von Outrider im Forum HMI
    Antworten: 3
    Letzter Beitrag: 01.10.2009, 15:51
  5. Wie sind den die neuen Modicon von Schneider?
    Von maxi im Forum Sonstige Steuerungen
    Antworten: 5
    Letzter Beitrag: 24.02.2009, 19:48

Lesezeichen

Berechtigungen

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