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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: Wie bastel ich mir mit Double Integern einen String?

  1. #1
    Registriert seit
    19.06.2013
    Beiträge
    101
    Danke
    18
    Erhielt 3 Danke für 3 Beiträge

    Frage


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Moin,

    baue gerade eine kleine Restzeitberechnung für eine Schrittkette.

    Aktuell gehe ich so vor, dass bei Beginn die aktuelle Systemlaufzeit mit SFC64 (Time_Click) auslese und bei Ende nochmal. Subtrahieren und ich habe die Laufzeit.

    Zuerst teile ich mit DIV_DI durch 60000 um Gesamt-Minuten zu erhalten (alles hinter dem Komma fällt bei der Operation ja weg, richtig? Sekunden sind unwichtig)
    Dann teile ich wieder durch 60 um Gesamt-Stunden zu erhalten.
    Dann nehme ich den Rest mit MOD_DI von Gesamt-Minuten durch 60 für die tatsächlichen Minuten.
    Das Gleiche mit den Stunden und 24 für die tatsächlichen Stunden.
    Die Gesamt-Stunden teile ich nochmal mit DIV_DI durch 24 für die Tage.

    Oder geht es einfacher?

    Auf jeden Fall hab ich jetzt Minuten, Stunden und Tage als Werte vom Typ DI.

    Nun will ich einen String basteln, der in WinCC flexible innem EA-Feld angezeigt wird in Form von "00d 00h 00m" - mehr als 100 Tage werden es nicht!

    Wenn ich bis jetzt richtig verstanden habe brauche ich ein String mit 13 Byte, weil das 1.Byte ja die Länge angibt und im 2.Byte die tatsächliche Länge hinterlegt wird.
    Habe auch schon gesehen, dass es Funktionen geben soll aus DI einen String zu machen. Aber wie bastel ich das jetzt in mein gewünschtes Format?

    Oder steinigt mich, wenn ich viel zu kompliziert denke!
    Zitieren Zitieren Wie bastel ich mir mit Double Integern einen String?  

  2. #2
    Registriert seit
    12.04.2005
    Ort
    Black Forest
    Beiträge
    1.335
    Danke
    27
    Erhielt 129 Danke für 116 Beiträge

    Standard

    DI to String?

    Da du unter Step7 postest, FC5 aus der Standard Library (DI_STRNG)

    „Eine Frage raubt mir den Verstand bin ich verrückt oder sind es die Anderen ?“

    Albert Einstein

  3. Folgender Benutzer sagt Danke zu Boxy für den nützlichen Beitrag:

    Qnkel (22.05.2015)

  4. #3
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

    Die Vorgehensweise wäre wie folgt :
    Du errechnest dir aus deinem DINT die Tage, die Stunden und die Minuten als Einzel-Elemente. Der Wert, den du da hast, ist ja etwas auf Millisekunden-Basis.
    Nun wandelst du dir diese Einzel-Komponenten in Strings um und verkettest die Teilstring dann mit Concat zu einem Gesamt-String.
    Am Schönsten könntest du das in SCL erstellen ...

    Gruß
    Larry

  5. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Qnkel (22.05.2015)

  6. #4
    Qnkel ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.06.2013
    Beiträge
    101
    Danke
    18
    Erhielt 3 Danke für 3 Beiträge

    Standard

    SCL habe ich leider nicht.

    Wenn ich das richtig sehe könnte ich da ja fast den Code, den ich bereits in CoDeSys habe (dort heißt es ST) kopieren.

    --

    edit:

    So, CONCAT mag mich nicht. Gebe an "IN1" einen 2-Byte-String an (die gewandelten Tage) und an "IN2" kommt 'd', weil hinter den Zahlenwert der Buchstabe sein soll. RET_VAL hat ein 3-Byte-String (entsprechend meiner Logik).

    Step7 meckert das 'd' das Format STRING[1] hat, aber STRING[254] erwartet wird. Warum erwartet der an den INs eine Summe von 256Byte??

    edit2: Ja, ich bin dumm... dutzend Mal den Satz ignoriert, dass nur Symbole an den INs erlaubt sind.
    Geändert von Qnkel (21.05.2015 um 17:36 Uhr)

  7. #5
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

    Also erstens : Ja ... dein CodeSys-Code würde mit großer Wahrscheinlichkeit und/oder wenigen Änderungen auch von SCL "geschluckt" werden ...

    Zweitens : Du mußt bei den String-Funktionen mehrere Dinge beachten. Dazu gehört auch, dass die Strings immer initialisiert sein müssen (also die Header-Information über die definierte Länge MUSS mindestens da sein - das wäre bei TEMP-Strings nicht automatisch der Fall).
    Da ich String-Funktionen nur immer innerhalb von SCL einsetze weiß ich nicht, ob du nicht auch ein einzelnes Zeichen als Konstante übergeben kannst - in SCL ginge es.
    Der Baustein erwartet nicht eine Summe von 256 Bytes an den IN's - aber er gibt dir einen String[254] als Rückgabewert zurück - der Wandler weiß ja im Vorfeld nicht, was da alles so passieren soll - also wer das wie benutzen möchte.

    Gruß
    Larry

  8. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Qnkel (22.05.2015)

  9. #6
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.220
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Wenn ich richtig erinnere gehen einzelne Zeichen oder Zeichengruppen in AWL/KOP am IN nicht, man muß diese vorher in eine Stringvariable schreiben oder erstellt sich gleich einen globalen DB, der die wichtigsten Konstanten Strings als deklarierte Variable enthält. Diesen Variablen kann man dann auch selbsterklärende Namen geben und sie an den Input legen.
    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

  10. Folgender Benutzer sagt Danke zu Ralle für den nützlichen Beitrag:

    Qnkel (22.05.2015)

  11. #7
    Qnkel ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.06.2013
    Beiträge
    101
    Danke
    18
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Habe die Strings jetzt nicht initialisiert sondern im FB als STAT-Variablen mit entsprechender Länge angelegt.

    Gebe ich Typ "String" ein, belegt die Variable volle 256Byte. Gebe ich z.B. "String[2]" ein für 2 Zeichen, belegt sie entsprechend 4 Byte.
    Muss ich sie dann trotzdem nochmal initialisieren?

    Bei den Strings, die nur die Zeichen "d ", "h " und "m" enthalten, habe ich diese direkt in der Variablentabelle als Anfangswert eingestellt.
    Wenn initialisiert werden muss: Reicht es dafür, bei den anderen Strings auch einfach schonmal Dummy-Anfangswerte vorzugeben? Oder muss ich jedesmal ins 1.Byte die Gesamt-Länge reinschreiben?

    Leider fehlt mir auch die Simulation in Step7

  12. #8
    Registriert seit
    26.04.2010
    Beiträge
    292
    Danke
    31
    Erhielt 51 Danke für 50 Beiträge

    Standard

    Hi!

    Nein, du musst sie nicht initialisieren, weil sie genauso wie deine anderen Variablen schon einen Anfangswert haben. Hier aber halt den Wert '' . Also nichts zwischen den Hochkommas.

    Die Frage ist halt, was angezeit wird, bis deine Berechnung fertig ist. Da würden ja dann nur die Buchstaben stehen. Vielleicht solltest du während die Berechnung läuft folgendes anzeigen und dementsprechend bei den Anfangswerten und während der Berechnung wie folgt initialisieren:
    ??d ??h ??m

    Gruß,

    Ottmar
    Geändert von Ottmar (22.05.2015 um 08:13 Uhr)

  13. #9
    Registriert seit
    20.01.2009
    Beiträge
    190
    Danke
    32
    Erhielt 15 Danke für 14 Beiträge

    Standard

    Ich würde die Laufzeit (DInt) an WinCC weitergeben und dort umformatieren.

  14. #10
    Qnkel ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    19.06.2013
    Beiträge
    101
    Danke
    18
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Ottmar Beitrag anzeigen
    Die Frage ist halt, was angezeit wird, bis deine Berechnung fertig ist. Da würden ja dann nur die Buchstaben stehen. Vielleicht solltest du während die Berechnung läuft folgendes anzeigen und dementsprechend bei den Anfangswerten und während der Berechnung wie folgt initialisieren:
    ??d ??h ??m
    Ja, die Variable "Restzeit", die aufm Panel angezeigt wird, hat als Anfangswert bereits "00d 00h 00m".

    Zitat Zitat von hub Beitrag anzeigen
    Ich würde die Laufzeit (DInt) an WinCC weitergeben und dort umformatieren.
    Habe in WinCC flexible 2008 SP3 nichts gefunden, dass ich Millisekunden aus einem DInt direkt in Tage/Stunden/Minuten anzeigen lassen kann.

Ähnliche Themen

  1. Antworten: 8
    Letzter Beitrag: 11.01.2012, 09:36
  2. Wie bau ich mir einen Zufallsgenerator
    Von buddd im Forum CODESYS und IEC61131
    Antworten: 3
    Letzter Beitrag: 04.07.2010, 16:52
  3. Antworten: 2
    Letzter Beitrag: 12.12.2008, 19:00
  4. Antworten: 7
    Letzter Beitrag: 13.10.2008, 19:56
  5. Wie programiere ich einen Dimmer mit S7
    Von Rossi im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 02.01.2007, 19:25

Stichworte

Lesezeichen

Berechtigungen

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