Datum umwandeln

peraho

Level-1
Beiträge
68
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

habe ein kleines Problem:
Es soll ein String an einen Laser gesendet werden.
Der String soll wie folht aufgebaut sein:

Tag.monat.Jahr 1234 S1

Also Datum in deutescher Notation Stückzäfler und einen Schichtcode.
Wie bekomme ich am einfachsten das Datum in das richtige Format und dann in Stringformat gewandelt.
Habe mir das Date Format auseinandergenommen, damit ich je ein Byte für Tag, monat und Jahr habe.
Beim zusammen setzen und wandeln habe ich Probleme.
Die Funktion SFC20 liefert mir nur ein "=" zurück??.

Gruß Peraho
 
überprüf mal mit der Variablentabelle ob du die Zeichen richtig zurück bekommst (Byte liste).
Den SFC20 muß man byte als Datentyp geben!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es gibt wie immer viele Möglichkeiten.
Hier mal ein Stück Code für die Wandlung der Jahreszahl in Char "zu Fuß":

Charvars ist eine Struct in den Statischen Variablen des FB mit folgenden Elementen:

Charvars : STRUCT
Jahr : WORD ;
Wochennummer : WORD ;
Seriennummer_1 : BYTE ;
Seriennummer_2 : BYTE ;
Seriennummer_3 : BYTE ;
Seriennummer_4 : BYTE ;
Seriennummer_5 : BYTE ;
Anlagennummer : BYTE ;
Revisionsnummer : BYTE ;
END_STRUCT ;

Ist zwar als Byte angelegt, aber ich schreibe dort den Code als Char hinein.

Code:
      CALL  SFC    1
       RET_VAL:=#RetVal
       CDT    :=#Zeit                //Date_Time in Temp

      CALL  FC   306
       IN     :=#Zeit
       RET_VAL:=#Datum          //Date in Temp

//Jahr in Stringword wandeln
      L     0
      T     #Charvars.Jahr 

      L     P##Zeit
      LAR1  

      L     B [AR1,P#0.0]               //Jahr
      T     #HM_Char2                  //Word in Temp

      L     #HM_Char2
      SRW   4
      L     W#16#30
      +I    
      SLW   8
      T     #HM_Char1                 //Word in Temp

      L     #HM_Char2
      SLW   12
      SRW   12
      L     W#16#30
      +I    
      T     #HM_Char2

      L     #Charvars.Jahr
      L     #HM_Char1
      OW    
      L     #HM_Char2
      OW    
      T     #Charvars.Jahr       //hier steht nun der Charcode für das Jahr drin

Seriennummer wandeln:

Code:
//Seriennummer umwandeln
      L     #Seriennummer;            //DINT in IN
      DTB   ; 
      T     #Seriennummer_BCD;     //DWORD in TEMP

      L     P##Seriennummer_BCD; 
      LAR1  ; 

//1. Zeichen
      L     LB [AR1,P#3.0]; 
      SLW   12; 
      SRW   12; 
      L     W#16#30; 
      +I    ; 
      T     #Charvars.Seriennummer_1; 

//2. Zeichen
      L     LB [AR1,P#3.0]; 
      SRW   4; 
      L     W#16#30; 
      +I    ; 
      T     #Charvars.Seriennummer_2; 

//3. Zeichen
      L     LB [AR1,P#2.0]; 
      SLW   12; 
      SRW   12; 
      L     W#16#30; 
      +I    ; 
      T     #Charvars.Seriennummer_3; 

//2. Zeichen
      L     LB [AR1,P#2.0]; 
      SRW   4; 
      L     W#16#30; 
      +I    ; 
      T     #Charvars.Seriennummer_4; 

//5. Zeichen
      L     LB [AR1,P#1.0]; 
      SLW   12; 
      SRW   12; 
      L     W#16#30; 
      +I    ; 
      T     #Charvars.Seriennummer_5;
Das kannst du für die restlichen Daten wiederholen, für den Stückzähler kannst du aus den IEC-Funktionen die Stringwandlung nutzen und dir dann aus dem String die benötigten Zeichen herausnehmen. Immer darauf achten, daß hier jeweils BCD in Char gewandelt wird!

Und hier noch das "Zusammenbasteln" des Strings:

TITLE =Daten in den Schreibstring legen

Code:
      L     P##Schreibstring;         //String [254] in  INOUT
      LAR1  ; 
      L     W [AR1,P#0.0]; // DB_Nr Schreibstring
      T     #DB_NR;                    //Int in Temp
      AUF   DB [#DB_NR]; 
      L     D [AR1,P#2.0]; // Pointer auf Datenbereich Schreibstring
      LAR1  ; // ins Adressregister

      L     11; //Das ist die Länge des Strings, diese ist fest!!!
      AUF   DB [#DB_NR]; 
      T     B [AR1,P#1.0]; 
      L     #Charvars.Jahr; 
      AUF   DB [#DB_NR]; 
      T     W [AR1,P#2.0]; //0.0 und 1.0 sind Stringlänge

      L     #Charvars.Wochennummer; 
      AUF   DB [#DB_NR]; 
      T     W [AR1,P#4.0]; 

      L     #Charvars.Seriennummer_5; 
      AUF   DB [#DB_NR]; 
      T     B [AR1,P#6.0]; 
      L     #Charvars.Seriennummer_4; 
      AUF   DB [#DB_NR]; 
      T     B [AR1,P#7.0]; 
      L     #Charvars.Seriennummer_3; 
      AUF   DB [#DB_NR]; 
      T     B [AR1,P#8.0]; 
      L     #Charvars.Seriennummer_2; 
      AUF   DB [#DB_NR]; 
      T     B [AR1,P#9.0]; 
      L     #Charvars.Seriennummer_1; 
      AUF   DB [#DB_NR]; 
      T     B [AR1,P#10.0]; 

      L     #Charvars.Anlagennummer; 
      AUF   DB [#DB_NR]; 
      T     B [AR1,P#11.0]; 

      L     #Charvars.Revisionsnummer; 
      AUF   DB [#DB_NR]; 
      T     B [AR1,P#12.0];

Du müßtest natürlich Charvars und auch die Stringlänge (hier 11) anpassen.

Das ganze ist in einem FB programmiert. Die Daten werden außen angelegt, Datum wird mit SFC1 ausgelesen. Das Ergebnis steht in dem an "Schreibstring" angelegten DB-String zur Verfügung und wird bei mir dann später auch an einen LASER gesendet.
 
Zuletzt bearbeitet:
Hi Ralle,

das ja mal ne Menge Quelltesxt. Aber da kommt man wohl bei Siemens nicht drum herum.
Vielen Dank mal für die Hilfe. Habe heute ne Zeit lan probiert bis es lief.
Hatte noch Probelem, dass bei der Umwandlung in String die führende null ignoriert wird. So ähnlich war es dann auch beim Stückzähler.

Aber passt jetzt alles. Hoffe ich doch ;-)

Vielen dank für eure Hilfe nochmal!!!!

Gruß Peraho
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Schwindelig!?

Es gibt wie immer viele Möglichkeiten.
Hier mal ein Stück Code für die Wandlung der Jahreszahl in Char "zu Fuß":

Charvars ist eine Struct in den Statischen Variablen des FB mit folgenden Elementen:

Charvars : STRUCT
Jahr : WORD ;
Wochennummer : WORD ;
Seriennummer_1 : BYTE ;
Seriennummer_2 : BYTE ;
Seriennummer_3 : BYTE ;
Seriennummer_4 : BYTE ;
Seriennummer_5 : BYTE ;
Anlagennummer : BYTE ;
Revisionsnummer : BYTE ;
END_STRUCT ;

Ist zwar als Byte angelegt, aber ich schreibe dort den Code als Char hinein.

Code:
      CALL  SFC    1
       RET_VAL:=#RetVal
       CDT    :=#Zeit                //Date_Time in Temp

      CALL  FC   306
       IN     :=#Zeit
       RET_VAL:=#Datum          //Date in Temp

//Jahr in Stringword wandeln
      L     0
      T     #Charvars.Jahr 

      L     P##Zeit
      LAR1  

      L     B [AR1,P#0.0]               //Jahr
      T     #HM_Char2                  //Word in Temp

      L     #HM_Char2
      SRW   4
      L     W#16#30
      +I    
      SLW   8
      T     #HM_Char1                 //Word in Temp

      L     #HM_Char2
      SLW   12
      SRW   12
      L     W#16#30
      +I    
      T     #HM_Char2

      L     #Charvars.Jahr
      L     #HM_Char1
      OW    
      L     #HM_Char2
      OW    
      T     #Charvars.Jahr       //hier steht nun der Charcode für das Jahr drin
Seriennummer wandeln:

Code:
//Seriennummer umwandeln
      L     #Seriennummer;            //DINT in IN
      DTB   ; 
      T     #Seriennummer_BCD;     //DWORD in TEMP

      L     P##Seriennummer_BCD; 
      LAR1  ; 

//1. Zeichen
      L     LB [AR1,P#3.0]; 
      SLW   12; 
      SRW   12; 
      L     W#16#30; 
      +I    ; 
      T     #Charvars.Seriennummer_1; 

//2. Zeichen
      L     LB [AR1,P#3.0]; 
      SRW   4; 
      L     W#16#30; 
      +I    ; 
      T     #Charvars.Seriennummer_2; 

//3. Zeichen
      L     LB [AR1,P#2.0]; 
      SLW   12; 
      SRW   12; 
      L     W#16#30; 
      +I    ; 
      T     #Charvars.Seriennummer_3; 

//2. Zeichen
      L     LB [AR1,P#2.0]; 
      SRW   4; 
      L     W#16#30; 
      +I    ; 
      T     #Charvars.Seriennummer_4; 

//5. Zeichen
      L     LB [AR1,P#1.0]; 
      SLW   12; 
      SRW   12; 
      L     W#16#30; 
      +I    ; 
      T     #Charvars.Seriennummer_5;
Das kannst du für die restlichen Daten wiederholen, für den Stückzähler kannst du aus den IEC-Funktionen die Stringwandlung nutzen und dir dann aus dem String die benötigten Zeichen herausnehmen. Immer darauf achten, daß hier jeweils BCD in Char gewandelt wird!

Und hier noch das "Zusammenbasteln" des Strings:

TITLE =Daten in den Schreibstring legen

Code:
      L     P##Schreibstring;         //String [254] in  INOUT
      LAR1  ; 
      L     W [AR1,P#0.0]; // DB_Nr Schreibstring
      T     #DB_NR;                    //Int in Temp
      AUF   DB [#DB_NR]; 
      L     D [AR1,P#2.0]; // Pointer auf Datenbereich Schreibstring
      LAR1  ; // ins Adressregister

      L     11; //Das ist die Länge des Strings, diese ist fest!!!
      AUF   DB [#DB_NR]; 
      T     B [AR1,P#1.0]; 
      L     #Charvars.Jahr; 
      AUF   DB [#DB_NR]; 
      T     W [AR1,P#2.0]; //0.0 und 1.0 sind Stringlänge

      L     #Charvars.Wochennummer; 
      AUF   DB [#DB_NR]; 
      T     W [AR1,P#4.0]; 

      L     #Charvars.Seriennummer_5; 
      AUF   DB [#DB_NR]; 
      T     B [AR1,P#6.0]; 
      L     #Charvars.Seriennummer_4; 
      AUF   DB [#DB_NR]; 
      T     B [AR1,P#7.0]; 
      L     #Charvars.Seriennummer_3; 
      AUF   DB [#DB_NR]; 
      T     B [AR1,P#8.0]; 
      L     #Charvars.Seriennummer_2; 
      AUF   DB [#DB_NR]; 
      T     B [AR1,P#9.0]; 
      L     #Charvars.Seriennummer_1; 
      AUF   DB [#DB_NR]; 
      T     B [AR1,P#10.0]; 

      L     #Charvars.Anlagennummer; 
      AUF   DB [#DB_NR]; 
      T     B [AR1,P#11.0]; 

      L     #Charvars.Revisionsnummer; 
      AUF   DB [#DB_NR]; 
      T     B [AR1,P#12.0];
Du müßtest natürlich Charvars und auch die Stringlänge (hier 11) anpassen.

Das ganze ist in einem FB programmiert. Die Daten werden außen angelegt, Datum wird mit SFC1 ausgelesen. Das Ergebnis steht in dem an "Schreibstring" angelegten DB-String zur Verfügung und wird bei mir dann später auch an einen LASER gesendet.

Wenn ich denn Quellcode lese, dann wird mir schwindelig!!!
Aus welchem Buch stammt den das?
 
Zurück
Oben