TIA Datentypen

EMZ

Level-2
Beiträge
232
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute, habe eine kurze Frage.
Ich hab schonmal vor ca. einem Jahr mit SCL angefangen durch dieses Forum. Bin aber leider nicht dazu gekommen mich weiterhin mit der Materie zu beschäftigen.
Wollte jetzt nochmals neu ansetzen.
Ich wollte Fragen, bei welcher Funktion man welche Datentyen verwendet, z.B. DINT Dword Int....
Eine Erklärung oder ein LINK würde mir sehr helfen.

Danke im voraus.

LG
EMZ
 
bei fertigen Funktionen MUSS du die Typen benutzen die durch die Parameter vorgegeben werden
bei deinen eigenen Funktionen bestimmt DEINE Anforderung welche Typen du verwenden "solltest"

oder ist deine Frage nur unklar formuliert?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo EMZ

die Frage musst du anderes herum stellen.
In der Hilfe sind die Datentypen alle aufgelistet. Jeder Datentyp hat einen Wertebereich.
Du solltest den Typ nehmen, der zu deinem Problem passt.

Wenn du von einer Lichtschranke ein Signal bekommst, dann ist das BOOL. Das kann mit logischen Funktionen verarbeitet werden. Also mit AND OR XOR NOT. Plus Minus Mal Geteilt machen einfach keinen Sinn.

Wenn du von einem Analog-Digital-Wandler einen Wert bekommst, dann ist der vermutlich 16 bit breit und damit erst mal INT. Mit INT kann man rechnen, also plus minus mal geteilt.
Aber damit geht bei den Anfängern das Drama auch schon los. Sagen wir mal INT#0 entspricht 0V und INT#32767 entspricht 5V. Was ist dann INT#12500 in Volt.
Der Dreisatz sagt dem Hauptschüler 12500/32767*5V liefert Volt. Probier das aus und du bekommst 0 :-(
Und das ist kein Fehler, denn wenn du ein INT mit einem INT teilst, dann bekommst du INT.
12500/32767 = 0,3814813684499649 und das ist nun mal keine Ganzzahl. Also wird abgeschnitten und übrig bleibt 0.
Ok, sagt der Realschüler, dann multiplizieren wir eben zuerst und teilen dann.
12500*5 = 62500 das passt aber nicht in ein INT. Deswegen liefert eine SIMATIC und auch alle anderen µ-Controller nun -3036.
Und das teilen wir jetzt und haben wie oben schon wieder 0.
Damit aus dem INT eine brauchbare Zahl in Volt wird, musst du zuerst von INT nach REAL wandeln und dann rechnen.
12500.0 / 32767.0 * 5.0 = 1,9074068422 oder so ähnlich.
Womit wir beim schlimmsten aller Datentypen angelangt sind, dem REAL. Hieran verzweifelt sogar der Gymnasiast, denn damit treten ständig Rundungsfehler auf. Die uns in der Praxis aber gar nicht stören, denn wenn nur 12 oder 16 Bit rein kommen und unser Sensor nur eine Linearität von 3% und einen Fehler von 5% hat, dann reichen eigentlich 2 Stellen aus.
Deswegen ist REAL oft gut, solange man nicht versucht auf Gleichheit zu prüfen. Merke: 1.0 / 10.0 * 10.0 ist eigentlich nie 1.0!
Rechner arbeiten binär und da geht ein Zehntel nicht auf. Da hilft auch LREAL nix.

Was gibt es sonst noch. Datum und Zeitformate. Die sollte man verwenden wenn man mit Datum und Zeiten umgehen muss.
Und Zeichenketten -- zur Ausgabe von Fehlermeldungen.

'n schön' Tach auch
HB
 
Erstmals danke euch beiden :)
Hi Helle Barde..
Also soweit konnte ich dir folgen.
Und wozu nimmt man den Datentyp Dint ?
Und z.B. Array?

Und bei dem.Tia portal.gibt es ja in der symboltab. die Aufteilung : Input Output ,Static, Temp und noch eins oder zwei... (Bin momentan nicht am rechner)
Und wie weiß ich, wo ich welchen Datentyp bzw. Welche Variable einfügen muss ?
Was kommt.z.b. bei static rein oder temp?

Beispiel Bild folg heute noch :)

LG
EMZ
 
Also soweit konnte ich dir folgen.
Und wozu nimmt man den Datentyp Dint ?
Und z.B. Array?
D(ouble)INT nimmt man, wenn der Zahlenwert die Grenzen von INT übersteigt.
Ein Array (Feld) nimmt man, wenn man eine Liste eines bestimmten Format braucht. Z.B. eine Liste an String, wo man die Fragen von EMZ speichert:
Code:
[FONT=Courier New]Fragen_EMZ: Array[1..10] of STRING;
Fragen_EMZ(1):="Ich wollte Fragen, bei welcher Funktion man welche Datentyen verwendet";
Fragen_EMZ(2):="...";
...[/FONT]




Und bei dem.Tia portal.gibt es ja in der symboltab. die Aufteilung : Input Output ,Static, Temp und noch eins oder zwei... (Bin momentan nicht am rechner)
Und wie weiß ich, wo ich welchen Datentyp bzw. Welche Variable einfügen muss ?
Was kommt.z.b. bei static rein oder temp?
Das ist die Schnittstelle des Bausteins und was wo rein kommt, hängt davon ab, was mit den Variablen geschehen soll.

Code:
[FONT=Courier New]IN:     Werte vom Aufruf des Bausteins [B]in[/B] den Baustein übergeben.
INOUT:  Werte vom Aufruf des Bausteins [B]in[/B] den Baustein übergeben, bearbeiten (oder nicht) und wieder zurück an den Aufruf geben.
OUT:    Werte im Baustein erzeugen und an den Aufruf übergeben
STATIC: Werte im Baustein erzeugen oder gespeicherte Werte verwenden und bis zu einem späteren Zyklus speichern.
TEMP:   Werte zuerst im Baustein erzeugen und noch im gleichen Zyklus verwenden (werden nach dem Bausteinaufruf "gelöscht").[/FONT]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe gestern einen Testprogramm programmiert, natürlich ohne Funktion. Also meine erste Übung war es, dass ich zum Beispiel eine bestimmte Positionsabfrage programmiere.
Wie zum Beispiel bei einem Servoantrieb: Dass z.B. nach 10 Takten der Motor Position 1 erreicht und dann z.b. für eine bestimmte Taktzahl steht und dann zur Position 2 fährt und und und...
@hucki : Ich habe schon einmal von dir eine ähnliche Programmierstruktur bekommen, da ich es als herausforderung sehe möchte ich gleich damit beginnen.
Ich möchte auch keine Programmbeispiele, sondern eher Tipps und Fehleranalysen, nicht dass sich der ein oder andere denkt, dass ich ein fertiges Programm will.

FOR Index := 10 TO 1 BY 1 DO Zaehler [Index] := Zaehler [Index +1]; END_FOR;


so sah ungefähr mein SCL-Programm aus, habe aber leider nicht mehr das richtige, da nach einem PC Absturz die Übung verloren gegangen ist, aber ich denke da sind einige Fehler drinne.



http://www.bilder-upload.eu/show.php?file=db31ed-1418158252.png
 
Ersetz doch einfach mal Index durch einen bestimmten Wert.
Dann schau' Dir an, von wo nach wo der Wert im Array übergeben wird und ob Du das so wolltest?

Danach nimm' mal den größten und kleinsten Wert, die in der FOR-Schleife für Index vorgegeben werden und prüfe, ob die entstehenden Arrayfelder noch existieren!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
danke erstmals für die hilfreichen Beiträge.
@hucki: bin momentan nicht am PC wo ich TIA draufhabe. schicke ich morgen.
Wo kann ich den Wert im Array verfolgen ob der steigt ?
Die kleinste wäre 0 und der größte 10 ?

@HelleBarde
Soll ja nur eine Übung sein. Dass ich zum Beispiel einen Servomotor habe, der bis zur einer bestimmten Position z.b. 100mm fährt und dann dort für eine bestimmte umdrehungszahl stehen bleibt z.B. 2 Impulsen (drehgeber vom servoantrieb) und dann fährt der an Position 2 welches z.B. bei 200mm ist und dort bleibt er dann auch 2 Impulse stehen. Das will ich erstmal versuchen in scl zu programmieren.

LG
EMZ
 
Hallo

ok du hast ein Array, in dem stehen Positionen und Wartezeiten. Ich würde ein

positionen : Array[1..100] of struct
pos : DINT
wait : DINT

machen. Dann hast du einen FB. Der hat einen Index, der sich merkt in welchem Schritt also welches Array Element gerade dran ist. Und der FB hat eine Zähler für das Warten.

Solange die Position nicht erreicht ist, macht der FB nix!
Ist die Position erreicht, dann lade ich den Zähler aus positionen[ #index ].pos und mach sonst nix
Ist im Zähler was drin wird der Zähler dekrementiert.
Ist der Zähler 0, dann wird der Index erhöhrt und dem Moter der Befehl gegeben auf die neue Position zu fahren.

Womit wir bei der spannenden Frage sind, wie fährst du eine Position an?

'n schön' Tach auch
HB
 
Was ist die Aufgabe?
Selbstfindung! :ROFLMAO:

Eigene, möglichst komplizierte Aufgabenstellungen, um die SPS-Programmierung ja nicht auf die einfache, sich steigernde Arbeitsweise "sich selbst" beizubringen.
:lol:


Ich hab' immer das Gefühl, er will 10 Schritte auf einmal machen, aber verhaspelt sich schon beim ersten. Doch er ist wissbegierig und bleibt am Ball.

(Vlt. will er auch nur testen, wie geduldig wir sind. :confused:)



Womit wir bei der spannenden Frage sind, wie fährst du eine Position an?
Gar nicht! Ist 'ne reine, selbst auferlegte, theoretische Übungsaufgabe.

Im Prinzip die Fortsetzung u.a. dieser Threads:
http://www.sps-forum.de/simatic/65412-siemens-logo-programmierhilfe.html
http://www.sps-forum.de/simatic/66252-programmierhilfe-fup.html
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wo kann ich den Wert im Array verfolgen ob der steigt ?
Die kleinste wäre 0 und der größte 10 ?
Dann setz' das doch mal hier ein:
Code:
[FONT=Courier New]FOR Index := 10 TO 1 BY 1 DO
      [B][COLOR=#FF8C00]Zaehler [Index] := Zaehler [Index +1];[/COLOR][/B]
END_FOR;[/FONT]
Ergebnis 1:
Code:
[FONT=Courier New][B][COLOR=#FF8C00]Zaehler [0] := Zaehler [1];[/COLOR][/B][/FONT]
Das Feld Zaehler[0] erhält also den Wert vom Feld Zaehler[1]. Die Werte wandern demzufolge von oben (10) nach unten (0) im Feld.
Du fängst aber den Index bei 10 an (größter Wert) ->

Ergebnis 2:
Code:
[FONT=Courier New][B][COLOR=#FF8C00]Zaehler [10] := Zaehler [11];[/COLOR][/B][/FONT]
Woher soll denn jetzt bitte schön das Feld Zaehler [11] kommen? Du hast in Deiner Deklaration Array [0..10] ja nur Zaehler [0] bis Zaehler [10] angelegt!

OK, kann man ja erweitern, aber was passiert weiter:
Im ersten Schleifendurchlauf (Index=10) wird von 11 (= Index +1) nach 10 (= Index) kopiert.
Zweiter Schleifendurchlauf (Index=9) -> von 10 (Inhalt von 11) nach 9.
Dritter Schleifendurchlauf (Index=8 ) -> von 9 (Inhalt von 10 und somit von 11) nach 8.
...
Zehnter Durchlauf (Index=1) -> von 2 (Inhalt von 3 und somit von 4 ... und somit von 11) nach 1.

Du hast also in Nullkommanichts von 11 bis 1 überall das Gleich drin. In einem einzigen Zyklus.
Und war das so gewollt? Kann ich mir irgendwie nicht vorstellen!


Und wie Du siehst, da braucht man auch keinen PC mit TIA für. Sondern einfach etwas logisches Denken und das Bemühen, mal nachzuvollziehen, was man der SPS da vorgibt, zu tun. Da sind ja noch keine komplizierten Sachen dabei, sondern nur einfache Mathematik.
 
Zuletzt bearbeitet:
Ich weiß dass somit meine Funktion die ich haben will nicht erfüllt wird, aber diese soll dann noch fortlaufend im Programm kommen.
Ich habe jetzt:

FOR Index := 10 TO 1 BY 1 DO Zaehler [Index] := Zaehler [Index +1]; END_FOR;

programmiert und die 1 nach BY wird mir rot angezeigt.
Ich will zuerst mal einen Schieberegister aufbauen und dann kreuz und quer experimentieren.
Deshalb wäre ich auch mit jeglichen Übungsbeispielen zufrieden :)
Die Positionsabfrage ist glaube ich über einen Zähler einfacher zu programmieren.
Diese ist aber nicht das Problem mit einer Literatur komme ich da gut klar.
Die Schleifen will ich jetzt angreifen. Diese sind leider nicht gut genug beschrieben.
@hucki Hast du denn auch ein beispiel von richtig komplexen Programmierbeispielen?

Gruß
EMZ
 
@hucki

Ich habe halt nur in der Ausbildung die Grundfunktionen mit step7 programmiert und mehr haben wir nicht gemacht. Durch meine Firma und der Schule war ich leider leider zu sehr an Logo gebunden deshalb möchte ich mir das selber beibringen. Und wenn ich schon damit anfange gleich richtig mit SCL, da diese ja mehr Freiheiten zulässt.
Also bitte ich um Verständnis für schwache Anfängerfragen.

Gruß
EMZ
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe jetzt:

FOR Index := 10 TO 1 BY 1 DO Zaehler [Index] := Zaehler [Index +1]; END_FOR;

programmiert und die 1 nach BY wird mir rot angezeigt.
[...]
@hucki Hast du denn auch ein beispiel von richtig komplexen Programmierbeispielen?
3 Fehler in nur 1 Zeile Code:
1) Sollte der TIA-SCL-Compiler tatsächlich so "schlau" sein, daß er merkt, daß man durch fortlaufende Addition von 1 nie vom Anfangswert 10 zum Endwert 1 kommt? (theoretisch)
Versuche mal "BY -1".

2) hast Du schon wieder das Problem, daß Du auf Zaehler[11] zugreifen willst, es aber gar kein Element Zaehler[11] gibt (erinnere Dich: Du hast Zaehler als "Array [0..10] of Bool" deklariert).

3) würde Dir Dein Code Dein Array nicht verschieben, sondern alle Elemente (außer dem ersten) mit dem Wert des letzten Elementes füllen.

Bevor man überhaupt anfängt Code zu tippen, sollte einem klar sein was man will, wie man da hinkommt, und ob und wie das überhaupt funktionieren kann. Also erstmal Papier und Stift nehmen und aufmalen, was da passieren soll. Danach sollte etwa dies rauskommen:
Code:
FOR Index := 9 TO 0 BY -1 DO Zaehler [Index + 1] := Zaehler [Index]; END_FOR;
Oder wie hucki Dir vor mehr als einem Jahr schonmal zeigte:
Code:
FOR Index := 10 TO 1 BY -1 DO Zaehler [Index] := Zaehler [Index - 1]; END_FOR;


Wozu willst Du komplexe Programmierbeispiele? Auch die lassen sich in einfache Teilaufgaben "Basics" zerlegen, doch offensichtlich beschäftigst Du Dich schon mit den kleinen Aufgaben nicht ausreichend.

Harald
 
Das habe ich auch versucht. Danke für deine Hilfe.
FOR Index := 9 TO 0 BY -1 DO Zaehler [Index + 1] := Zaehler [Index]; END_FOR;

Kannst du mir vielleicht erklären was ab dem DO bei deinem Code passiert und welchen grund es hat dass du dies so geschrieben hast?

Jetzt habe ich eine Frage. Wie kriege ich dir Schleife zum starten?
Ich habe einpaar sachen probiert aber hat nicht so ganz funktioniert.
Screenshot kommt noch in laufe ses tages
 
sorry, hat bisschen gedauert :)
Hier mein Programm funktioniert leider nicht :(

IF #schieben THEN


FOR #index := 10 TO 1 BY -1 DO
#Zaehler [#index]:= #Zaehler [#index - 1];
END_FOR;

IF #Zaehler[#Position_1] THEN
#ausgangszaehler:= #Pausenzeit;

#Start := #ausgangszaehler > 0;

IF #Start THEN #ausgangszaehler := #ausgangszaehler -1 ;
END_IF;

END_IF;



END_IF;


Start_Anlage Bool 0.0 false True
Stopp_Anlage Bool 0.1 false True
Takt Bool 0.2 false True
Pausenzeit Int 2.0 4 True
Position_1 Int 4.0 10 True
Output
Freigabe_Pos2 Bool 6.0 false True
Start Bool 6.1 false True
InOut

Static
takt_2 Bool 8.0 false True
ausgangszaehler Int 10.0 0 True
Zaehler Array [0..10] of Bool 12.0 True

Temp
schieben Bool 0.0 False
index Int 2.0 False
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hast Du Dir mal überlegt, wie die temporäre Variable #schieben TRUE werden soll?



PS: Benutz' bitte mal den Code-Button (#) in der 2. Icon-Reihe ganz rechts für Deine Programmzeilen. Dann sind sie besser lesbar.
 
Zuletzt bearbeitet:
@RAik
Ich bin es mittlerweile gewohnt dass es bei jedem Thread einen gibt der seinen noch so sinnlosen d..... Senf dazu geben muss, aber bitte les doch erstmal alle beiträge bevor du überhaupt was schreibst.
Ich machs dir leichter dann brauchst deine gehirngrütze nicht so anzustrengen: Ja ich bin Anfänger und kann paar sachen nicht ganz nachvollziehen...aber ich bin dabei zu Lernen mit der wenigen Zeit die ich habe mir SCL beizubringen.
Aber mittlerweile weiß ich auch besser was ich programmiere... und es wird besser und besser und besser ;) zumindest reicht es auch wenn ich nicht viel zeit habe zu lernen, da ich es auch nur aus eigeninteresse und hobby mache ;)

@hucki
Um #schieben TRUE zu setzen reicht doch ne einfache IF funktion mit boolschen variablen oder ?

LG
EMZ
 
Zurück
Oben