oscat.lib > oscat.lib fuer Step 7
siemens und sps timer
hugo:
hi kann mir jemand sagen wie bei siem,ens der sps timer (1ms auflösung) ausgelesen wird?
bei codesys ist dies time(); ist dies bei siemens auch so?
hat der hardwaretimer auch 1ms auflösung?
wie wird bei siemens die adresse einer variable ermittelt? bei codesys ist dies adr();
wie wird bei siemens die größe einber variable ermittelt? bei codesys ist dies sizeof();
danke, hugo
dalbi:
Hallo Hugo,
Systemzeit kann mittels TIME_TCK() gelesen werden.
Auszug S7-Hilfe:
Mit der SFC 64 "TIME_TCK" (time tick) lesen Sie die Systemzeit der CPU. Die Systemzeit ist ein "Zeitzähler", der von 0 bis max. 2147483647 ms zählt. Bei einem Überlauf der Systemzeit wird wieder ab 0 gezählt. Das Zeitraster und die Genauigkeit der Systemzeit betragen bei S7-400 und bei der CPU 318 1 ms, bei allen anderen CPUs der S7-300 10 ms. Die Systemzeit wird nur von den Betriebszuständen der CPU beeinflußt.
Die Adresse einer Variable läst sich z.B. so ermitteln:
--- Code: ---VAR_INPUT
pt: POINTER;
at_pt AT pt: STRUCT // sicht auf die Variable pt
DBNr: WORD;
Adr: DWORD;
END_STRUCT;
size : INT;
END_VAR
--- Ende Code ---
im Programm kann dann mittels at_pt.DBNr und at_pt.Adr darauf zugegriffen werden.
mfg
Daniel
dalbi:
Hallo Hugo,
beim Datentyp ANY ist die Struktur dann folgende.
--- Code: ---pt: ANY;
at_pt AT pt: STRUCT // sicht auf die Variable pt
Id : BYTE; // ist immer 16#10
DataType:BYTE;
Lenght:WORD;
DB_Nummer:WORD;
Byte_Pointer:DWORD;
END_STRUCT;
--- Ende Code ---
DataType:
Hexadezimal code | Datentyp | Beschreibung
b#16#00 NIL Null pointer
b#16#01 BOOL Bits
b#16#02 BYTE Bytes (8 Bits)
b#16#03 CHAR Zeichen (8 Bits)
b#16#04 WORD Wörter (16 Bits)
b#16#05 INT Ganz zahlen (16 Bits)
b#16#06 DWORD Wörter (32 Bits)
b#16#07 DINT Ganz zahlen (32 Bits)
b#16#08 REAL Gleitpunkt zahlen (32 Bits)
b#16#09 DATE Datum
b#16#0A TIME_OF_DAY (TOD) Uhrzeit
b#16#0B TIME Zeit
b#16#0C S5TIME Daten typ S5TIME
b#16#0E DATE_AND_TIME (DT) Datum und Zeit (64 Bits)
b#16#13 STRING Zeichen kette
mfg
Daniel
hugo:
was passiert beim system tck mit dem höchstwertigen bit?
falls der counter nur bis 2 milliarden zählt hat er nur 31 bit und das 32. bit bleibt immer null.
das hat zur folge das eine differenz zweier timer ticks beim überlauf schiefgeht.
katastrophe.....
oder zählt der timer vielleicht doch bis volle 32 bit ?
dalbi:
Hallo Hugo,
anbei ein Beispiel wie ich das Problem gelöst habe:
--- Code: --- // Regler Abtastzeit ermitteln
tx1 := tx; // Altwert speichern
tx := Time_TCK();
ST := tx - tx1;
IF ST < t#0ms THEN
ST := ST + T#24D_20H_31M_23S_647MS;
END_IF;
TA := DINT_TO_REAL(TIME_TO_DINT(ST))/1000;
--- Ende Code ---
mfg
Daniel
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln