TIA Zahl 4 Bit Format

S.Schleich

Level-2
Beiträge
90
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen.

Wir haben die Vorgabe, ein "4-Ziffern-Passwwort" an einen Messumformer mit 2 Bytes zu schreiben.
Ist das mit Siemens überhaupt möglich?

Wir nutzen eine CPU 1512.

Gibt es einen Datentyp, der eine definierte Länge von 4 Bits also einem halben Byte hat?


Gruß
Silas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie kommst du von 4-Ziffern-Passwort auf 4 Bits? :unsure:
Vielleicht ist mit dem "4-Ziffern-Passwort in 2 Bytes" eine 4-Ziffern BCD-Zahl oder allgemein ein 16-Bit Word in Hex-Ansicht gemeint?
Zeige uns doch mal die originale Aufgabenstellung. Oder nenne uns den Typ des Messumformers und wie und wofür das Passwort dahin geschrieben werden soll, und idealaerweise auch einen Link zum relevanten Handbuch des Messumformers.
 
Die Vorgabe besagt:

es gibt ein "großes" Array of Bytes, welches der Messumformer empfängt. Da dies in der ENtwicklung ist, gibt es keine Doku darüber.

und die ersten beiden Bytes dieses Arrays sind für die 4 Zahlen vorgesehen...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also wir müssen über einen WRREC Baustein ein Array of 0..25 Byte an den Messumformer senden. In Byte 16 und 17 des Array müssen wir ein 4 stelligen code zwischen 0 und 9999 rein schrieben. Dieser code soll über ein Panel eingetippt werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
57374718_STEP7_V11_SliceAccess_in_KOP_FUP_1_de.png


Ihr müsst das Word dann halt eben über die zwei Bytes serialisieren, die Gegenstelle muss das dann wieder richtig auswerten.. wer auch immer sich zwei Byte für vier Ziffern ausgedacht hat..
 
Wir haben die Vorgabe, ein "4-Ziffern-Passwwort" an einen Messumformer mit 2 Bytes zu schreiben.
Ist das mit Siemens überhaupt möglich?
Nichts leichter als das. Packe das 4-Ziffern-Passwort in ein 16-Bit Word oder in 2 Bytes und sende die über den nicht genannten Kommunikationskanal an den Messumformer.

Gibt es einen Datentyp, der eine definierte Länge von 4 Bits also einem halben Byte hat?
Dazu passt "BCD", da belegt jede Ziffer 4 Bits = 1 Nibble
Achtung: Bei BCD sind nur Ziffern 0...9 erlaubt. Sollen auch die Pseudotetraden 16#A...16#F benutzt/erlaubt sein? Dann sind das gewöhnliche Hex-Werte, also alle möglichen Werte in Hex-Darstellung.
 
Nichts leichter als das. Packe das 4-Ziffern-Passwort in ein 16-Bit Word oder in 2 Bytes und sende die über den nicht genannten Kommunikationskanal an den Messumformer.


Dazu passt "BCD", da belegt jede Ziffer 4 Bits = 1 Nibble
Achtung: Bei BCD sind nur Ziffern 0...9 erlaubt. Sollen auch die Pseudotetraden 16#A...16#F benutzt/erlaubt sein? Dann sind das gewöhnliche Hex-Werte, also alle möglichen Werte in Hex-Darstellung.
ne.. Zahlen 0..9 wären schon korrekt..

wie muss das denn dann konvertiert werden?
wenn ich über ein HMI eine "1234" eingebe, muss die Variable an einen Convert-Baustein?
Oder muss ich jede Ziffer separat konvertieren?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nimmt das Gerät nicht an.
Du meinst, wenn du die richtige Passwort-Zahl 0...9999 in ein Word oder 2 Bytes schreibst, dann nimmt das Gerät die Zahl nicht als Passwort an? Dann musst du vermutlich den Integer-Wert 0...9999 vom HMI Panel erst in BCD gewandelt werden und dann in das Wort/die 2 Bytes zum Messumformer gesendet werden. Da wertet das Gerät die Zahl vermutlich als BCD bzw. Hex-Zahl aus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wie muss das denn dann konvertiert werden?
siehe TIA Hilfe "convert bcd" --> Explizite Konvertierung von DINT --> DINT_TO_BCD32
INT_TO_BCD16 reicht nicht, weil das nur 3 Ziffern von -999...+999 wandelt (steht auch in der TIA Hilfe)

also: INT-Eingabe --> Check 0...9999? --> DINT --> DINT_TO_BCD32 --> DWORD --> WORD --> in 2 Bytes
 
Zuletzt bearbeitet:
Servus,

ich hatte das mal so gelöst
Code:
FUNCTION "INT_to_BCD" : Word
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT
      in : Int;
   END_VAR


BEGIN
    #INT_to_BCD:=INT_TO_WORD(((#in/1000) MOD 10) * 4096 + ((#in/100) MOD 10)*256 + ((#in/10) MOD 10) * 16 + #in MOD 10);
END_FUNCTION

Ein Umweg über temporäre Variable und (für Abenteuerfreunde) Shiftoperatoren wäre auch noch möglich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das war der Grund, weshalb ich mir selbst etwas gebastelt habe.
Damit 8000 .. 9999 auch abgebildet werden.
1739523153960.png

Edit: Bzw. war es glaube ich eher 1000 .. 9999, da ja die Konvertierung zu BCD16 nur 3 Stellen zurück gibt....
 
Zuletzt bearbeitet:
Code:
    #INT_to_BCD:=INT_TO_WORD(((#in/1000) MOD 10) * 4096 + ((#in/100) MOD 10)*256 + ((#in/10) MOD 10) * 16 + #in MOD 10);
Funktioniert der Code auch mit Eingangswerten >= 8000 ?
Das war der Grund, weshalb ich mir selbst etwas gebastelt habe.
Damit 8000 .. 9999 auch abgebildet werden.
Anhang anzeigen 85367

Interessant. Erzeugt der TIA-SCL-Compiler Code, der intern mit DINT oder UINT rechnet (evtl. wegen MOD ?), oder ignoriert der einfach den INT-Überlauf ab 8*4096?
 
Zurück
Oben