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

Ergebnis 1 bis 10 von 10

Thema: Daten an Warenwirtschaftssystemübergeben

  1. #1
    Registriert seit
    02.05.2014
    Ort
    Münsterland
    Beiträge
    11
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    Ich habe folgendes Problem:

    Ich muss Datum, Uhrzeit, Nr. einer Waage, lfdNr. der Waage, ArtNr. und Gewicht an ein Warenwirtschaftssystem übergeben.
    Der Datensatz darf eine Länge von 41 Zeichen haben und soll wie folgt aufgebaut sein.

    Datum 8 Zeichen ==> 20140314
    Uhrzeit 6 Zeichen ==> 061023
    WaagenNr 3 Zeichen ==> 123
    LfdNrWaage 9 Zeichen ==> 123456789
    ArtNr 6 Zeichen ==> 058123
    Gewicht 9 Zeichen ==> 00098.012

    daraus resultiert:

    Datenstrom < 2014031406102312312345678905812300098.012 >

    Wie kann ich bei der S7 Systemzeit den : loswerden?
    Zitieren Zitieren Daten an Warenwirtschaftssystemübergeben  

  2. #2
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.197
    Danke
    926
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    Meinst Du einen Doppelpunkt? (Wo kommt der bei Dir her??)

    Einfach aus den Date_and_Time-Einzelbestandteilen den String/die Zeichenfolge zeichenweise selber zusammenstellen.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  3. #3
    mallorza ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    02.05.2014
    Ort
    Münsterland
    Beiträge
    11
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo PN/DP

    Ja ich meine den Doppelpunkt.

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.727
    Danke
    398
    Erhielt 2.405 Danke für 2.002 Beiträge

    Standard

    ... wie sieht denn dein bisheriger Ansatz dazu aus ? Vielleicht läßt sich mit deinem Code "etwas" gezielter helfen ...

    Welcher Programmiersprache möchtest du dich hier bedienen ? Aus meiner Sicht wäre SCL hierfür ein guter Ansatz ...

    Gruß
    Larry

  5. #5
    mallorza ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    02.05.2014
    Ort
    Münsterland
    Beiträge
    11
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Programmiersprache ist mir eigentlich egal, obwohl AWL mir lieber wäre als SCL.
    Bis jetzt lade ich mir die Zeit aus dem SFC1

    U #IO_SetTime
    O #Flag
    SPB _NOR

    CALL "READ_CLK"
    RET_VAL:=#t_RetVal
    CDT :=#t_DateTime
    _NOR: NOP 0

  6. #6
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.355
    Danke
    455
    Erhielt 694 Danke für 519 Beiträge

    Standard

    Zitat Zitat von mallorza Beitrag anzeigen
    Bis jetzt lade ich mir die Zeit aus dem SFC1
    Der SFC1 liefert den Datentyp DATE_AND_TIME, der ist ganz eigen aufgebaut, den kannst du nicht soooo direkt nehmen. Das was du wahrscheinlich mit den Doppelpunkten meinst ist die WinCC-Anzeige aus dem Datums/Uhrzeitfeld, oder? Setz im S7-Programm mal den Cursor auf deine #t_DateTime Variable und drücke F1. Dann siehst du wie der Datentyp aufgebaut ist. Im Datentyp selbst gibt es keine Doppelpunkte.

    Zitat Zitat von PN/DP Beitrag anzeigen
    Einfach aus den Date_and_Time-Einzelbestandteilen den String/die Zeichenfolge zeichenweise selber zusammenstellen.
    Jep Harald hat recht. Ich hab mal was zusammenkopiert.

    Code:
    //SYSMTEZEIT AUSLESEN
          CALL  "READ_CLK"
           RET_VAL:=#ERR_Code
           CDT    :=#DT_Temp
    
    
    //DATE_AND_TIME AUFSPALTEN
          L     P##DT_Temp
          LAR1  
    
    
          L     LB [AR1,P#0.0]
          BTI   
          L     2000
          +I    
          T     #YY
    
    
          L     LB [AR1,P#1.0]
          BTI   
          T     #MM
    
    
          L     LB [AR1,P#2.0]
          BTI   
          T     #DD
    
    
          L     LB [AR1,P#3.0]
          BTI   
          T     #hh
    
    
          L     LB [AR1,P#4.0]
          BTI   
          T     #min
    
    
          L     LB [AR1,P#5.0]
          BTI   
          T     #ss
    
    
    //ZEITSTEMPEL DINT
          L     #YY
          L     L#10000
          *D    
          T     #ZeitSt_DINT
    
    
          L     #MM
          L     L#100
          *D    
          L     #ZeitSt_DINT
          +D    
          T     #ZeitSt_DINT
    
    
          L     #DD
          L     #ZeitSt_DINT
          +D    
          T     #ZeitSt_DINT                //Ergebnis: 20150421
    Jetzt hast du zb das Datum als DINT. Wenn du jetzt String-Zeichenketten machen willst lautet die weitere Vorgehensweise:
    1. Die DINT-Werte mit dem Baustein DI_STRING in einzelne Strings konvertieren.
    2. Die Einzelstrings dann mit dem Baustein CONCAT zu einem einzelnen zusammenfügen.


    Nebenfrage: Brauchst du die Zeichenkette auf der SPS? Man könnte das mit einem WinCC-VBS-Skrtipt auch recht simpel lösen....

    PS: So jetzt bin ich auch 4-Stellig...
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  7. Folgender Benutzer sagt Danke zu RONIN für den nützlichen Beitrag:

    mallorza (21.04.2015)

  8. #7
    mallorza ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    02.05.2014
    Ort
    Münsterland
    Beiträge
    11
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Danke RONIN,
    schön das ich dich 4-Stellig gemacht habe
    Nein muss nicht zwangsläufig aufn der SPS sein. Aber mit WinCC-VBS-Skript kenn ich mich nicht wirklich aus.

  9. #8
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.355
    Danke
    455
    Erhielt 694 Danke für 519 Beiträge

    Standard

    Ein WinCC Skript ist dann aber nur Ereignis-basiert (Button gedrückt, Varibalenänderung auf SPS, etc...).
    Da müsstest du schon genauer beschreiben wie du mit deinem Warensystem kommunizierst...
    1. Wann muss die Zeichenkette generiert werden. Wenn ein Benutzer am HMI ne Taste drückt oder abhängig vom Prozess?
    2. Wer kommuniziert mir dem System? SPS direkt oder Umweg bzw. welche Schnittstelle?
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  10. #9
    mallorza ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    02.05.2014
    Ort
    Münsterland
    Beiträge
    11
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Es soll ein einfach gehaltenes Protokoll verwendet werden. Über eine SocketServer-Verbindung senden wir die Daten als TCP-Client direkt an einen Port.

    zu 1: Die Zeichenkette muss Prozess gesteuert generiert werden (immer wenn eine Wiegung durchgeführt wurde).

    zu 2: Die SPS ist direkt an Kundennetzwerk angeschlossen (Ethernet)

  11. #10
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.197
    Danke
    926
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    In AWL würde ich nicht den Umweg über DINT + DI_STRNG + CONCAT machen.
    Ich würde gleich je 2 BCD-Ziffern der DATE_AND_TIME-Bestandteile in 2 Zeichen (CHAR) umwandeln, wo es geht sogar gleich 4 BCD-Ziffern auf einmal umwandeln. Es müssen ja nur 4 Bits zwischen die BCD-Ziffern eingefügt und jeweils mit 16#30 verodert werden.
    Code:
          L     B [AR1,P#0.0]               // BCD-Wert: 1 Byte = 8 Bit = 2 Nibbles = 2 Ziffern
          RRD   4                           // Einer-Ziffer in Akku-H schieben
          SLW   4                           // 4 0-Bits hinter Zehner-Ziffer einfügen
          RLD   4                           // Einer-Ziffer wieder anhängen
          OW    W#16#3030                   // BIN-->ASCII
          T     W [AR2,P#0.0]               // 2 Zeichen in CHAR-Array schreiben
    Oder nur mit Shift-Operationen, falls man Rotieren nicht mag:
    Code:
          L     B [AR1,P#0.0]               // BCD-Wert: 1 Byte = 8 Bit = 2 Nibbles = 2 Ziffern
          SLD   12                          // Zehner-Ziffer in Akku-H schieben
          SRW   4                           // 4 0-Bits vor Einer-Ziffer einfügen
          SRD   8                           // Zehner-Ziffer + Einer-Ziffer rechtsbündig in Akku-L
          OW    W#16#3030                   // BIN-->ASCII
          T     W [AR2,P#0.0]               // 2 Zeichen in CHAR-Array schreiben

    Den ganzen Sende-Datensatz würde ich etwa so erzeugen:
    Code:
    //AR2: Pointer auf Sende-Datensatz z.B. DB1.DBB0..DBB40 (z.B. ARRAY [0..40] OF CHAR)
    //(oder in TEMP erstellen und dann per BLKMOV in den DB kopieren)
          LAR2  P#DBX 0.0                   //DB1: +0.0 SendDS ARRAY [0..40] OF CHAR
          AUF   DB1
    
    //AR1: Pointer auf die DATE_AND_TIME-Variable
          LAR1  P##t_DateTime
    
    //*** Jahr '20YY': 2 Ziffern BCD-->ASCII + '2000' (Variante mit Shift)
          L     B [AR1,P#0.0]               // DT#: Jahr
          SLD   12
          SRW   4
          SRD   8
          OD    DW#16#32303030              // BIN-->ASCII + '2000'
          T     D [AR2,P#0.0]               // '2015'
    
    //*** Monat + Tag 'MMDD': 4 Ziffern BCD-->ASCII
          L     W [AR1,P#1.0]               // DT#: Monat + Tag
          SLD   4
          SRW   4
          SLD   12
          SRW   4
          SRD   4
          SRW   4
          OD    DW#16#30303030              // BIN-->ASCII
          T     D [AR2,P#4.0]               // '0421'
    
    //*** Stunde + Minute 'hhmm': 4 Ziffern BCD-->ASCII
          L     W [AR1,P#3.0]               // DT#: Stunde + Minute
          SLD   4
          SRW   4
          SLD   12
          SRW   4
          SRD   4
          SRW   4
          OD    DW#16#30303030              // BIN-->ASCII
          T     D [AR2,P#8.0]               // '1234'
    
    //*** Sekunde 'ss': 2 Ziffern BCD-->ASCII (Variante mit Rotate)
          L     B [AR1,P#5.0]               // DT#: Sekunde
          RRD   4
          SLW   4
          RLD   4
          OW    W#16#3030                   // BIN-->ASCII
          T     W [AR2,P#12.0]              // '56'
    
    //*** WaageNr '123'
          L     '123x'
          T     D [AR2,P#14.0]              // '123x'
    
    //*** LfdNrWaage '123456789'
          L     '1'
          T     B [AR2,P#17.0]              // '1' (ggf. mit WaageNr zusammenfassen)
          L     '2345'
          T     D [AR2,P#18.0]              // '2345'
          L     '6789'
          T     D [AR2,P#22.0]              // '6789'
    
    //*** ArtNr '058123'
          L     '0581'
          T     D [AR2,P#26.0]              // '0581'
          L     '23'
          T     W [AR2,P#30.0]              // '23'
    
    //*** Gewicht '00098.012' --> [AR2,P#32.0]...
    //...
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet
    Zitieren Zitieren Bcd-->ascii  

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

    mallorza (22.04.2015)

Ähnliche Themen

  1. USV, UPS, Persistente Daten, Daten beim Reboot fehlerhaft
    Von Sireth im Forum CODESYS und IEC61131
    Antworten: 28
    Letzter Beitrag: 17.03.2015, 15:26
  2. Daten lesen
    Von tomatensaft im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 11.10.2007, 16:33
  3. Daten verschieben
    Von puehri im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 17.07.2006, 19:22
  4. S5 daten zur S7 ?
    Von Anonymous im Forum Simatic
    Antworten: 36
    Letzter Beitrag: 17.12.2005, 13:38

Lesezeichen

Berechtigungen

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