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

Ergebnis 1 bis 10 von 10

Thema: Byte_to_String mit führenden Nullen

  1. #1
    Registriert seit
    08.04.2014
    Ort
    Ruhrgebiet
    Beiträge
    75
    Danke
    9
    Erhielt 4 Danke für 4 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,
    ich möchte gerne Uhrzeiten darstellen der Form 03:00. Leider kappt mir Byte_to_String immer die führende Null. Als Anzeige habe ich dann 3:0. Erinnert mich eher an ein Bundesligaergebnis. Hat einer einen Tip wie ich die führenden Nullen hinbekomme. Der Weg dahin sollte möglichst kurz sein. Einen langen habe ich Netz gefunden. ist aber zuviel Schnack und Berechnung bei. Kostet bei 200 Zeiten zuviel Rechenzeit. Also quick and dirty ist gefordert.

    Wenn 3S mitliest: Das wäre ein weiterer Verbesserungsvorschlag für das Object, nachdem ihr auf meinen letzten schon nicht geantwortet habt, vielleicht gibt es hier eine Antwort .

    Danke schon mal

    Termi
    Zitieren Zitieren Byte_to_String mit führenden Nullen  

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

    Standard

    Wenn Stunde <= 9, dann string[0] := '0'

  3. #3
    Registriert seit
    11.12.2009
    Beiträge
    2.120
    Danke
    389
    Erhielt 390 Danke für 271 Beiträge

    Standard

    genau... oder ne schleife für jedes zeichen

    wenn ZEICHEN < 1 OR ZEICHEN > 9 dann
    zeichen = 0


    dann hättest du auch weitere führende nullen erschlagen. (Falls es dir jemals passiert).

    Grüße

    Marcel
    Stell Dir vor es geht, und keiner kriegts hin!

  4. #4
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.333
    Danke
    932
    Erhielt 3.333 Danke für 2.691 Beiträge

    Standard

    Wer oder was soll denn die Uhrzeit darstellen? Kann da vielleicht die Ausgabe einer Time- oder Time_of_Day-Variable passend formatiert werden statt die SPS die Formatierung in einen String machen zu lassen?
    Du könntest auch eine DATE_AND_TIME in String wandeln und mit MID die 5 Zeichen Uhrzeit-Teilstring entnehmen.
    Falls Du eine Funktion zur Ausgabe als Hex hast, könntest Du die Stunden und Minuten in BCD wandeln und als 2 Ziffern hex in den String schreiben.

    Ich weiß nicht, was für einen "langen Weg" Du im Netz gefunden hast, doch selbst ein zu-Fuß-zusammenbasteln des Strings aus einer DATE_AND_TIME-Variable braucht keine 200 Zeilen Code. (außerdem ist die Anzahl Codezeilen kein Maß für die benötigte Rechenzeit)

    Hier mal eine Anregung:
    Code:
        tmpT := '00:00' ; // String initialisieren
    
        tmpW.B0 := baDT.Hour ; // Stunde
        tmpW.B1 := DWORD_TO_BYTE( SHR(IN:=BYTE_TO_DWORD(baDT.Hour), N:=4) ) ;
        tmpWord := tmpWord AND W#16#0F0F OR W#16#3030 ;
        tbaT[1] := tmpW.B1 ;
        tbaT[2] := tmpW.B0 ;
    
        tmpW.B0 := baDT.Minute ; // Minute
        tmpW.B1 := DWORD_TO_BYTE( SHR(IN:=BYTE_TO_DWORD(baDT.Minute), N:=4) ) ;
        tmpWord := tmpWord AND W#16#0F0F OR W#16#3030 ;
        tbaT[4] := tmpW.B1 ;
        tbaT[5] := tmpW.B0 ;
    (die je 3 Zeilen tmpW... lassen sich auch in nur 1 Zeile Code packen)
    Hier ein ganzer Baustein mit den AT-Deklarationen zu diesem Beispielcode.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  5. #5
    Termi ist offline Benutzer
    Themenstarter
    Registriert seit
    08.04.2014
    Ort
    Ruhrgebiet
    Beiträge
    75
    Danke
    9
    Erhielt 4 Danke für 4 Beiträge

    Standard

    sorry, ich habe mich sehr missverständlich ausgedrückt und zu wenig Infos gegeben:
    ich lese die Daten aus meiner Viessmann KW200 Heizungssteuerung. Jede Tageszeit im 10 Minutentakt bytecodiert. Bei 24h in nur einem Byte muss man halt ein bisschen "dekodieren". Ich muss sagen die Idee ist Top.

    hier ist der Code:


    Byte_Zeit := 0#18; (*für 03:00Uhr oder 16#B0 für 22:00Uhr, fürs Forum*)
    IF Byte_Zeit = 16#FF THEN (* wenn ein FF, dann ist keine Zeit eingetragen *)
    TextRet := '--:--';
    ELSE
    TextRet := ''; (*löschen nur zur Beruhigung *)
    TextRet := concat(BYTE_TO_STRING(SHR(Byte_Zeit,3)) ,':');
    TextRet := concat(TextRet,BYTE_TO_STRING((Byte_Zeit AND 07)*10));
    END_IF

    in TextRet steht das was ich nicht immer will

    Danke schon mal für eure Ansätze


    Gruß
    Termi

  6. #6
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.333
    Danke
    932
    Erhielt 3.333 Danke für 2.691 Beiträge

    Standard

    Wenn es denn unbedingt mit den rechenzeitaufwendigen Stringfunktionen gemacht werden soll ("Hauptsache nur 2 Codezeilen" ), dann könnte es nach diesem Prinzip funktionieren:
    Code:
    TextRet := concat(mid(BYTE_TO_STRING(SHR(Byte_Zeit,3) + 100),2,1),':');
    TextRet := concat(TextRet,mid(BYTE_TO_STRING((Byte_Zeit AND 7) * 10 + 100),2,1));
    Harald
    Geändert von PN/DP (20.10.2015 um 20:04 Uhr)
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  7. #7
    Termi ist offline Benutzer
    Themenstarter
    Registriert seit
    08.04.2014
    Ort
    Ruhrgebiet
    Beiträge
    75
    Danke
    9
    Erhielt 4 Danke für 4 Beiträge

    Standard

    Rückmeldung:
    klappt leider noch nicht. Folgendes Ergebnis ergibt sich:


    2015-10-20_211620.jpg

    dabei ist das eingestellt bei gleichen Eingangswerten

    2015-10-20_211808.jpg

    Ich werde deinen Ansatz mal näher untersuchen. Kann sich anscheinend nur um falsche Klammern handeln. Die Werte sind übrigens 16#2B für 5:30 und 16#B2 für 22:30

    Gruß und Danke

    Termi

  8. #8
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.333
    Danke
    932
    Erhielt 3.333 Danke für 2.691 Beiträge

    Standard

    Zitat Zitat von Termi Beitrag anzeigen
    Folgendes Ergebnis ergibt sich:
    Es ist ziemlich deutlich zu sehen, daß die mid()-Funktion 1 Zeichen zu früh zurückgibt - weil das erste Zeichen im String hat die Positionsnummer 1. Es soll das zweite und dritte Zeichen geliefert werden. Versuche mal:
    Code:
    TextRet := concat(mid(BYTE_TO_STRING(SHR(Byte_Zeit,3) + 100),2,2),':');
    TextRet := concat(TextRet,mid(BYTE_TO_STRING((Byte_Zeit AND 7) * 10 + 100),2,2));

    Zitat Zitat von Termi Beitrag anzeigen
    16#B2 für 22:30
    Sollte das nicht 22:20 sein?

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

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

    Termi (21.10.2015)

  10. #9
    Termi ist offline Benutzer
    Themenstarter
    Registriert seit
    08.04.2014
    Ort
    Ruhrgebiet
    Beiträge
    75
    Danke
    9
    Erhielt 4 Danke für 4 Beiträge

    Standard

    super,
    passt wie die Faust aufs Auge. Im Übrigen ist es wirklich 22:20Uhr. Ich wollte dich nur testen

    Vielen Dank an euch allen.

    Christian

  11. #10
    Registriert seit
    18.10.2013
    Beiträge
    17
    Danke
    0
    Erhielt 6 Danke für 6 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    hallo, ist zwar schon erledigt ....... aber .....
    wenn es um recourcenschonung geht würde ich das anders lösen
    generiert je nach steuerung ca. 400 byte weniger code
    gruß

    Code:
    VAR
        TextRet : STRING[5];
        pTextRet : POINTER TO ARRAY[0..3] OF BYTE;
        Byte_zeit : BYTE;
    END_VAR
    
    pTextRet := ADR(TextRet);
    Byte_Zeit := %MB0;
    
    IF Byte_Zeit > 16#BD THEN
        TextRet := '--:--';
    ELSE
        TextRet := '00:00';
        pTextRet^[0] := 48 + (SHR(Byte_Zeit, 3) / 10);
        pTextRet^[1] := 48 + (SHR(Byte_Zeit, 3) MOD 10);
        pTextRet^[3] := 48 + (Byte_Zeit AND 2#0000_0111);
    END_IF
    Geändert von HeHo (31.10.2015 um 10:11 Uhr)

  12. Folgender Benutzer sagt Danke zu HeHo für den nützlichen Beitrag:

    Termi (02.11.2015)

Ähnliche Themen

  1. Antworten: 0
    Letzter Beitrag: 07.08.2013, 09:47
  2. DINT nach CHAR wandeln mit führenden Nullen
    Von smartie im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 25.02.2013, 14:53
  3. Global-DB mit Nullen vollschreiben
    Von Wagginator im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 16.05.2012, 09:05
  4. TargetVisu - Textfeld mit Nullen auffüllen ->GRRRRRRRRRRRR
    Von PLC-Gundel im Forum CODESYS und IEC61131
    Antworten: 2
    Letzter Beitrag: 15.12.2009, 14:05
  5. Vorbelegung einer Zahl mit Nullen
    Von INST im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 10.02.2005, 09:00

Stichworte

Lesezeichen

Berechtigungen

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