siemens und sps timer

Begonnen von hugo, 07. Mai 2007, 12:15:43

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 1 Gast betrachten dieses Thema.

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:


VAR_INPUT
    pt: POINTER;
    at_pt AT pt: STRUCT  // sicht auf die Variable pt
        DBNr: WORD;
        Adr: DWORD;
    END_STRUCT;   
    size : INT;
END_VAR


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.


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; 


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:


  // 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;


mfg
Daniel

hugo

klar so gehts natürlich, ich schlage folgendes vor:

unter codesys ist die funtion time() zum auslesen des timers.
wir schreiben eine funktion time() die nur bei step 7 verwendet wird.
damit muessen wir in der oscat lib nichts veraendern und alles läuft.
damit der überlauf funktioniert muessen wir nur das bit 32 generieren und alles läuft wie gehabt.
der große vortail ist das wir keinerlei funktionen anpassen müssen und alles kompatibel ist.
was denkst du?
ich kann diese funktion sehr schnell schreiben.

das nächste große problem ist das datum:
wenn ich das richtig verstanden habe ist bei siemens das datum nur 16 bit und in codesys ist es 32 bit. auflösung tage zu auflösung sekunden.
ich kann ganz einfach ein sdate_to_idate uznd ein idate_to_sdate schreiben.
allerdings muss ich dann in vielen funktionen die datum benutzen folgende abfrage einbauen:
if step_7 then x := sdate_to_idate
damit würden dann wieder alle funktionen funktionieren.

allerdings habe ich eventuell ein ueberlaufproblem denn siemens ist nur 16bit

was schlägst du vor?



hugo

noch eine frage zum datentyp time?

ist time bei siemens auch nur 31 bit oder nutzt es die vollen 32 bit? oder ist es gar ein signed datentyp?
wenn time unsigned 32 bit ist schlage ich folgendes vor:

funktion time()   (* nur unter step7 *)

if überlauf then toggle bit32
time := time_tck and bit32

natuerlich noch nicht ganz ausformuliert, aber sinngemäß.
damit erzeugen wir einen 32 breiten system timer der keine überlaufprobleme mehr hat.
zusätzlich fnktionieren alle time() aufrufe aus der lib ohne aenderungen

dalbi

Hallo,

also der Datentyp ist signed somit wäre dann Bit 32 Vorzeichen kommt glaub ich vom Typ DINT.
Das S7 Time Format geht von -T#24D_20H_31M_23S_647MS bis T#24D_20H_31M_23S_647MS.
(DINT -2 147 483 648 bis +2 147 483 647)

mfg
Daniel


hugo

naja warum einfach.

damit ist die oscat lib praktisch unter s7 unbrauchbar.
alle datunsfunktionen haben das problem 16 bit datum siemens und 32 bit datum codesys
alle time funktionen haben ein problem unsigned bei codesys und signed bei siemens

denke es wird eine langwierige und schwere arbeit für eine release 2.0 in 2-3 monaten

gravieren

Hi Hugo und Dalbi


Interesanter LINK zu Thema


http://www.sps-forum.de/showthread.php?t=656



Wir sollten uns mal "zusammensetzen", vieleicht macht uns Hugo hier einen geschützten "Entwicklerbereich"