TIA S7-300 Date und Time

TMaroni

Level-2
Beiträge
129
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie kann ich im TIA beim Format Date und Time auf die jeweiligen Byte (Jahr, Monat, Tag, Stunde, Minuten, Sekunden zugreifen?
Ich möchte eine Wochenzeitschaltuhr programmieren mit Vergleicher.
Wie oben benannt ist eine S7-300 315-2DP vorgesehen.

Hat jemand eine Anleitung wie man das macht?

Gruss
TMaroni
 
Indirekt absolut zugreifen: in AWL per speicherindirekter oder registerindirekter Adressierung auf die Speicheradressen innerhalb der DATE_AND_TIME-Struktur zugreifen. In SCL indirekt auf die absoluten Adressen in z.B. einem DB zugreifen.

DT auf einen temporären STRUCT umkopieren: in TEMP eine Struktur mit dem Byte-Aufbau von DATE_AND_TIME deklarieren und dann eine DATE_AND_TIME-Variable z.B. per BLOCKMOVE in diese Struktur kopieren. Danach kannst Du auf die einzelnen Bytes symbolisch zugreifen. Das geht in AWL und SCL. (In SCL kann auch per AT-Sicht direkt ohne Umkopieren auf die Einzel-Bytes des DATE_AND_TIME zugegriffen werden.)

Wie das ganze in TIA geht habe ich keine praktische Erfahrung. Für S7-300/400 muß es aber ähnlich wie bei Step7 classic gehen.

Harald
 
PS:
Im TIA-Hilfesystem bzw. Systemhandbuch sollte der Aufbau des Datentypes DATE_AND_TIME zu finden sein, ebenso die Erklärungen zur speicherindirekten (L B [#index]) und registerindirekten (L B [AR1, P#2.0]) Adressierung.

Harald
 
Ich habe gemäss deine Angabe die DT-Struktur umkopiert (Byte), jetzt möchte ich diese Bereiche in INT-Werte haben.
Wie kann ich das umwandeln? Kann ich das ganze auch umgekehrt anwenden?
Siehe unten Bilder
DT_Struktur_1.jpgDT_Struktur_2.png

Gruss
TMaroni
 
Vermutlich fast passend für Dich. Wurde halt nicht mit TIA programmiert sondern noch mit dem Simatic Manager.
Hoffe das hilft Dir weiter.

Code:
FUNCTION FC226 : BOOL
//  Beschreibung: FC_DT_TO_STRUCT
//                Baustein zerlegt den Datentyp DATE_AND_TIME in einzelne Variablen. Unter "Hilfe zu Step 7" ==> "Suchen" ==> "Format des Datentyps DATE_AND_TIME"
//                ist der Aufbau des Datentyps DATE_AND_TIME beschrieben. Mit Hilfe dieser Angaben wurde dieser Baustein hier erstellt.
//                Als Rückgabewert der Funktion wird das OK Flag übergeben.
//  Ersteller:  ***
//  Erstelldatum: ***    
//  Änderungen:   
TITLE=    'Konvertierung von DATE_AND_TIME in einzelne Variablen';
NAME:     DT_TO_STRUCT;
Family:   SCL;
Version:  '1.0';
AUTHOR:   **;
// KNOW_HOW_PROTECT
{SCL_SetOKFlag:='TRUE'}

VAR_INPUT
  DTVar                 :DT;            // DATE_AND_TIME Variable die zerlegt werden soll
END_VAR

VAR_OUTPUT
  nJahr                 :INT;           // Wertebereich 90-89, 90=1990/89=2089
  nMonat                :INT;           // Wertebereich 1-12, 1=Jan/12=Dez
  nTag                  :INT;           // Wertebereich 1-31 Tage
  nStunde               :INT;           // Wertebereich 0-23 Stunden
  nMinute               :INT;           // Wertebereich 0-59 Minuten
  nSekunde              :INT;           // Wertebereich 0-59 Sekunden
  nMillisekunde         :INT;           // Wertebereich 0-999 Millisekunden
  nWochentag            :INT;           // Wertebereich 1-7 1=Sonntag/7=Samstag
END_VAR

VAR
  sdtVar                :STRUCT   
    byJahr              :BYTE;          // Wertebereich 90-89, 90=1990/89=2089 BCD Codiert
    byMonat             :BYTE;          // Wertebereich 1-12, 1=Jan/12=Dez BCD Codiert
    byTag               :BYTE;          // Wertebereich 1-31 Tage BCD Codiert
    byStunde            :BYTE;          // Wertebereich 0-23 Stunden BCD Codiert
    byMinute            :BYTE;          // Wertebereich 0-59 Minuten BCD Codiert 
    bySekunde           :BYTE;          // Wertebereich 0-59 Sekunden
    byMillisekunde      :BYTE;          // Die beiden höchstwertigen Ziffern von MSEC
    by7                 :BYTE;          // xxxxyyyy x=Die niederwertige Ziffer von MSEC Y=Wochentag 1=Sonntag/7=Samstag
  END_STRUCT;      
  dtVartmp AT sdtVar    :DT;            // Temporärer Eingangszeiger der zerlegt werden soll 
  wWord                 :WORD;          // Hilfsvariable
  sWord AT wWord        :STRUCT         // Hilfsstruktur
    by0                 :BYTE;
    by1                 :BYTE;
  END_STRUCT;
  
END_VAR

BEGIN

// Die DATE_AND_TIME Variable mal temporär übergeben
dtVartmp:= DTVar;

// Bytes ins Word kopieren
sWord.by0     := sdtVar.byMillisekunde;
sWord.by1     := sdtVar.by7;

// Variablen übergeben
nJahr         := BCD_TO_INT(sdtVar.byJahr);
nMonat        := BCD_TO_INT(sdtVar.byMonat);
nTag          := BCD_TO_INT(sdtVar.byTag);
nStunde       := BCD_TO_INT(sdtVar.byStunde);
nMinute       := BCD_TO_INT(sdtVar.byMinute);
nSekunde      := BCD_TO_INT(sdtVar.bySekunde);
nMillisekunde := BCD_TO_INT(SHR(IN:= wWord, N:= 4));
nWochentag    := BCD_TO_INT(sdtVar.by7 AND BYTE#2#0000_1111);

FC226:= OK;

END_FUNCTION

Gruß Didaddy
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Im TIA Portal SCL ist die Umwandlung anders als beim Classic SCL. Die Umwandlung sieht so aus => BCD16_TO_INT.
Gibt es im TIA Portal die normale BCD_TO_INT-Umwandlung? Oder sind beide gleich?

Danke Didaddy für dein FC226!

Gruss
TMaroni
 
Habs mir gerade mal angeschaut, so wie ich das sehe müsste die Funktion in TIA BCD16_TO_INT der in S7 BCD_TO_INT entsprechen.
BCD32_... wäre dann für Double Integers zu verwenden.

Gruß Didaddy
 
Wie in SCL TimeByte (S7 Step S7-300) verwenden?
Ich möchte eine Prozedure jede 10 ms anfufen.
Vielen Dank im Voraus
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich möchte eine Prozedure jede 10 ms anfufen.
In Hardware Konfig der CPU das Aufrufintervall eines Weckalarms OB3x (z.B. OB35) auf 10ms einstellen, die Konfig in die CPU laden und dann in dem OB Deine Prozedur aufrufen.

Wie in SCL TimeByte (S7 Step S7-300) verwenden?
Falls die Frage nichts mit der anderen Antwort zu tun hat: Bitte die Frage nochmal anders/ausführlicher stellen.

Harald
 
In Hardware Konfig der CPU das Aufrufintervall eines Weckalarms OB3x (z.B. OB35) auf 10ms einstellen, die Konfig in die CPU laden und dann in dem OB Deine Prozedur aufrufen.

ich habe so gemacht,
aber das SC-Code
http://www.sps-forum.de/simatic/77336-scl-kompilierungsfehler-ich-kann-nich-die-fehler-erkennen.html

läuft falsch, zählt zu viel aber muss 333 prosec oder 33 pro 10 msec.(1 Hz pro Minuite)

ich habe mit TimeByte fogende gemacht (Im Anhang)aber möchte gerne MB0 in SCL-Code reaisieren.
 

Anhänge

  • sim.PNG
    sim.PNG
    18,8 KB · Aufrufe: 39
M0.5 ist das 1Hz-Bit aus dem CPU-Taktmerker-Byte?
In Deinem Bild würde dann der FB112 eine halbe Sekunde lang in jedem Zyklus aufgerufen und eine halbe Sekunde lang garnicht. Soll der FB112 nur jede Sekunde genau einmal aufgerufen werden, dann musst Du erst noch eine Flankenerkennung zwischenschalten.

muss 333 prosec oder 33 pro 10 msec.(1 Hz pro Minuite)
Ich verstehe leider nicht, was Du meinst. Du willst, daß der Baustein 333 mal pro Sekunde aufgerufen wird? Das wäre alle 3ms, daß passt aber irgendwie nicht zusammen mit Deinen anderen Aussagen.
3ms ist außerdem sehr schnell, kann das Deine CPU?
Warum muß es alle 3ms sein?

Erkläre doch nochmal, was Du eigentlich tun willst.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
muss 333 prosec oder 33 pro 10 msec.(1 Hz pro Minuite)
Ich glaub' jetzt habe ich verstanden was Du willst: Du willst eine Frequenz-Sollwert-Rampe oder eine Anstiegsbegrenzung programmieren, die um höchstens 1Hz pro Minute ansteigt? Und 13824 entspricht 50Hz? Dann darf der Sollwert pro Minute um höchstens 276.48 steigen = max 4.608 pro Sekunde = max 0.04608 je 10ms. Wenn Dein Baustein alle 10ms aufgerufen wird, dann darf er also höchstens 0.04608 addieren und nicht 33.0!

Harald
 
M0.5 ist das 1Hz-Bit aus dem CPU-Taktmerker-Byte?
In Deinem Bild würde dann der FB112 eine halbe Sekunde lang in jedem Zyklus
m0.5 ist wie Beispiel, ich habe nachgefragt wie im SCL-code Merker realisieren.
EON ist mir bekannt, aber das ist anderes
 
Zuletzt bearbeitet:
Ich glaub' jetzt habe ich verstanden was Du willst: Du willst eine Frequenz-Sollwert-Rampe oder eine Anstiegsbegrenzung programmieren, die um höchstens 1Hz pro Minute ansteigt? Und 13824 entspricht 50Hz? Dann darf der Sollwert pro Minute um höchstens 276.48 steigen = max 4.608 pro Sekunde = max 0.04608 je 10ms. Wenn Dein Baustein alle 10ms aufgerufen wird, dann darf er also höchstens 0.04608 addieren und nicht 33.0!

Harald

Ja, Sie haben Recht, das ist Rampe, aber fast.
Ich habe links gegeben
http://www.sps-forum.de/simatic/77336-scl-kompilierungsfehler-ich-kann-nich-die-fehler-erkennen.html

Das ist P-Regler, der die Aufgabe immer begrenz (1 Hz pro sec), bergauf läuft FU oder bergab
[Wenn Dein Baustein alle 10ms aufgerufen wird, dann darf er also höchstens 0.04608 addieren und nicht 33.0!
ich habe gemeint, das in 1 sec 100 msec )) sind

aber läuft nicht wenn in OB 10 msec anliegen, zählt zu schell. Mit dem Marker ist besser.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Vermutlich fast passend für Dich. Wurde halt nicht mit TIA programmiert sondern noch mit dem Simatic Manager.
Hoffe das hilft Dir weiter.

Code:
FUNCTION FC226 : BOOL
//  Beschreibung: FC_DT_TO_STRUCT
//                Baustein zerlegt den Datentyp DATE_AND_TIME in  einzelne Variablen. Unter "Hilfe zu Step 7" ==> "Suchen" ==>  "Format des Datentyps DATE_AND_TIME"
//                ist der Aufbau des Datentyps DATE_AND_TIME  beschrieben. Mit Hilfe dieser Angaben wurde dieser Baustein hier  erstellt.
//                Als Rückgabewert der Funktion wird das OK Flag übergeben.
//  Ersteller:  ***
//  Erstelldatum: ***    
//  Änderungen:   
TITLE=    'Konvertierung von DATE_AND_TIME in einzelne Variablen';
NAME:     DT_TO_STRUCT;
Family:   SCL;
Version:  '1.0';
AUTHOR:   **;
// KNOW_HOW_PROTECT
{SCL_SetOKFlag:='TRUE'}

VAR_INPUT
  DTVar                 :DT;            // DATE_AND_TIME Variable die zerlegt werden soll
END_VAR

VAR_OUTPUT
  nJahr                 :INT;           // Wertebereich 90-89, 90=1990/89=2089
  nMonat                :INT;           // Wertebereich 1-12, 1=Jan/12=Dez
  nTag                  :INT;           // Wertebereich 1-31 Tage
  nStunde               :INT;           // Wertebereich 0-23 Stunden
  nMinute               :INT;           // Wertebereich 0-59 Minuten
  nSekunde              :INT;           // Wertebereich 0-59 Sekunden
  nMillisekunde         :INT;           // Wertebereich 0-999 Millisekunden
  nWochentag            :INT;           // Wertebereich 1-7 1=Sonntag/7=Samstag
END_VAR

VAR
  sdtVar                :STRUCT   
    byJahr              :BYTE;          // Wertebereich 90-89, 90=1990/89=2089 BCD Codiert
    byMonat             :BYTE;          // Wertebereich 1-12, 1=Jan/12=Dez BCD Codiert
    byTag               :BYTE;          // Wertebereich 1-31 Tage BCD Codiert
    byStunde            :BYTE;          // Wertebereich 0-23 Stunden BCD Codiert
    byMinute            :BYTE;          // Wertebereich 0-59 Minuten BCD Codiert 
    bySekunde           :BYTE;          // Wertebereich 0-59 Sekunden
    byMillisekunde      :BYTE;          // Die beiden höchstwertigen Ziffern von MSEC
    by7                 :BYTE;          // xxxxyyyy x=Die niederwertige Ziffer von MSEC Y=Wochentag 1=Sonntag/7=Samstag
  END_STRUCT;      
  dtVartmp AT sdtVar    :DT;            // Temporärer Eingangszeiger der zerlegt werden soll 
  wWord                 :WORD;          // Hilfsvariable
  sWord AT wWord        :STRUCT         // Hilfsstruktur
    by0                 :BYTE;
    by1                 :BYTE;
  END_STRUCT;
  
END_VAR

BEGIN

// Die DATE_AND_TIME Variable mal temporär übergeben
dtVartmp:= DTVar;

// Bytes ins Word kopieren
sWord.by0     := sdtVar.byMillisekunde;
sWord.by1     := sdtVar.by7;

// Variablen übergeben
nJahr         := BCD_TO_INT(sdtVar.byJahr);
nMonat        := BCD_TO_INT(sdtVar.byMonat);
nTag          := BCD_TO_INT(sdtVar.byTag);
nStunde       := BCD_TO_INT(sdtVar.byStunde);
nMinute       := BCD_TO_INT(sdtVar.byMinute);
nSekunde      := BCD_TO_INT(sdtVar.bySekunde);
nMillisekunde := BCD_TO_INT(SHR(IN:= wWord, N:= 4));
nWochentag    := BCD_TO_INT(sdtVar.by7 AND BYTE#2#0000_1111);

FC226:= OK;

END_FUNCTION

Gruß Didaddy



Hallo Liebe Community, ich brauche eure Hilfe.
Die Funktion FC226 ist genau das was ich brauche, leider hapert es noch bei meiner Umsetzung. beim Übersetzen der SCL Quelle enstehen 16Fehler BCD_TO_INT Baustein konnte nicht gefunden werden.
Diesen Text habe ich dann ersteinmal entfernt. hatte versucht ein DB mit dem Namen BCD_TO_INT zu erstellen und dann übersetzen, aber auch das Funktioniert nicht.

Oder ist das eine Variablentabelle?

Hier weiß ich leider nicht was zu tun ist.
Den FC habe ich in einem Netzwerk aufgerufen und die INT Werte in einem DB geschrieben. Leider kommen auch hier krumme Werte. siehe Screenshoots
Meine Software ist S7 V5.5
Scl ist V5.1 Sp5
Könnt ihr mir helfen?

Vielen Dank im vorraus

Liebe Grüße Steve
 

Anhänge

  • sclquelle.JPG
    sclquelle.JPG
    160,4 KB · Aufrufe: 15
  • sclquelleFehler.JPG
    sclquelleFehler.JPG
    208,3 KB · Aufrufe: 12
  • fc5.JPG
    fc5.JPG
    108,7 KB · Aufrufe: 13
  • db7.JPG
    db7.JPG
    91 KB · Aufrufe: 12
Das BCD_TO_INT ist eine OnBoard Konvertierungsfunktion (Klasse B). Nichts mit DB anlegen oder so.

Das wird bei mir fehlerfrei übersetzt.

Hast du alles unverändert von hier übernommen?
 
Guten Morgen
Danke für die schnelle Antwort,
Habe das ganze 1zu1 übernommen mit Copy/Paste.
Vielleicht liegt es an der SCL Version. Müsste ich Mal an anderer Stelle Probieren ??
Welche SCL Version nutzt du?

Edit: Als Steuerung nutze ich et200S 151-8 Cpu-F


Edit2: Habe nun Abhilfe geschaffen mit einer anderen AWL Quelle die ähnlich ist, falls jemand ähnliche Probleme hat, war dieser Link sehr hilfreich für mich

https://support.industry.siemens.co...d-dort-anzeigen-lassen-können-?dti=0&lc=de-DE
 
Zuletzt bearbeitet:
Zurück
Oben