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.