Step 7 Daten an Warenwirtschaftssystemübergeben

mallorza

Level-1
Beiträge
11
Reaktionspunkte
0
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?
 
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
 
... 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
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.

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... :cool:
 
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.
 
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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)
 
Bcd-->ascii

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
 
Zurück
Oben