# Funktionsbausteine



## redscorpion (11 Dezember 2011)

Hallo 

Ich hab da mal ne Frage zu FB´s , da ich noch anfänger bin fällt mir dies noch ein wenig schwer ! 

Kann mir jemand erklären wie man einen FB aufbaut was sind Temp Variablen ? ist das ein Zwischenspeicher ? und wann nimmt man diese her ? IN-Out ! IN und Out wie gehe ich so einen Baustein an ?

wann ist es nützlich einen FB zu erstellen ?

Wenn ich einen FB habe kann ich den auch in einem FC aufrufen und muss ich diesen dann auch im OB nochmals aufrufen.

Hoffe mir kann jemand eine erklärung geben. Damit ich das auch mal verstehe .

Danke euch schon mal im Voraus.

PS: Wer Rechtschreibfehler findet darf diese behalten


----------



## rostiger Nagel (11 Dezember 2011)

ein paar Punkte kann ich ja mal beisteuern. 

*Temp-Variablen*
Ist ein Speicher Bereich der zur Laufzeit des Baustein verwendet wird und
kann Sinnvoller Weise, als Zwischenspeieher verwendet werden. 
Dieser Speicher ist Temponär und liefert nach verlassen des Baustein keine
gesicherte Werte mehr. Da der selbe Speicherbereich auch von anderen Bausteinen
verwendet werden kann. 

*IN/OUT/IN_OUT*
Diese Variablen bezeichnet Mann als Schnittstelle und dient zur Komunikation nach
außerhalb des Bausteins. 
'IN' nutzt man um Variablen oder Werte einzulesen die nicht im Baustein verändert
werden sollen oder müssen als Beispiel einen Eingang oder einen Wert z.b. eine Zeit.
'OUT' nutzt mann um Ergebnise oder Zustände nach außen des Baustein führen zu
können, als bestes Beispiel Wäre da ein Ausgang.
'IN-OUT' sind Variablen die eingelesen werden sollen und auch im Baustein verändert
werden und wieder ausgegeben werden sollen. Dh könnte z.b. wieder ein Ausgang oder
Merker sein. Mann kann auch sagen dieser Bereich dient zum Weiterreichen.

*Stat Bereich*
Dieses ist das Gedächtnis des Baustein, hier wird der Zustand von Variablen gespeichert.
Du bist übrigens nicht gezwungen Temponäre Variablen zu verwennden, wenn du Zwischen-
ergebnisse zu Diagnosezwecke beobachten möchtest kannst du die auch in den STAT Bereich 
legen.

*Baustein angehen*
dazu solltest du dir erstmal im klaren sein was du bezwecken möchtest, dann halte
ich es für sinnvoll, die Schnittstelle zu defnieren, Variablen zu Deklarieren. Welche 
Variablen darfst du nach dem Aufruf wieder vergessen, welche brauchst du für den
erneuten aufruf.  Vermeide es außerhalb des Baustein, Variablen aus der instanz zu 
bearbeiten, damit der Baustein in sich gekapselt ist.

*Aufrauf*
Zu einen Funktionsbaustein gehört eine Instanz, der Instanz DB, hier werden alle Variablen
abgelegt bis auf die Temponären. Somit kannst du den gleichen Baustein öfter im Programm
verwenden ohne beim aufruf dem Speicherbereich im ganzen neu zu Deklarieren.


----------



## redscorpion (11 Dezember 2011)

Hy rostiger Nagel das hat mir weitergeholfen Danke

Gibt es im Internet online Kurse kostenlos wo man so was leicht erlernen kann 

Danke


----------



## diabolo150973 (11 Dezember 2011)

Hallo,

guck Dich hier mal um:

http://www.sps-lehrgang.de/codebausteine-in-step7/

Das sollte für den Einstieg etwas weiterhelfen.

Schönen Sonntag noch,

dia


----------



## MCerv (11 Dezember 2011)

In Step 7 gibt es 2 Bausteinarten mit denen man grundsätzlich programmiert, der eine ist der FC und der andere der FB.

Die Unterschiede einfach: FC ein Baustein ohne Gedächtnis, der FB mit Gedächtnis (=Instanz-Datenbaustein [IDB])
Beim FC müssen IN- OUT- IN_OUT-Variablen von außen beschaltet werden, beim FB nicht, da die Variablen, bis auf die TEMP-V. im IDB einen Speicherplatz haben und bei der Parametrierung einen Startwert erhalten.

Beide Beusteinarten können IN-, OUT-, IN_OUT- und Temp-Variablen enthalten. Der FB hat zusätzlich noch die STAT-Variablen mit denen man programmieren kann.

IN-, OUT- und IN_OUT-Variablen nimmt man, um einen Baustein von Außen mit Werten zu beschalten. Imtern kann der Baustein dann mit der symbolischen Beschschritung der Variable arbeiten (z. B. IN = "Start", dann trägt man von Außen an den Eingang "Start" seinen Operanten (M10.0) an und intern verknüpft man nur noch den "Start" mit der gewünschten Funktion). IN- Variablen können nur Werte in den Baustein geben. Ein setzen/rücksetzen intern ist nicht möglich und hat keinen Einfluss auf die IN-Variable. Bei der OUT-Variablen verhällt sich das genauso, nur das hier der Wert zählt der intern gesetzt wird. Die IN_OUT_Variable kann beides, d. h. sie übernimmt das Eingangssignal, es kann intern verarbeitet werden und anschließend wird der Zustand wieder nach außen übergeben.

Temp-Variablen sind lediglich lokale und für den momentanen Aufruf gültige Hilfvariablen. Achtung: Die CPU hat eine gewisse Anzahl von Temp-Variablen-Speicherstellen zur Verfügung und nutzt diesen immer wieder. Es muss daher sichergestellt sein, das die Temp-Variable intern immer mit einem definierten Signal / Wert beschrieben wird. Der Speicher ist nicht zwangläufig NULL.

Beim FB kann man anstatt mit den Temp-Variablen zu arbeiten auch die STAT-Variablen nutzen, diese gehören nur zu dem aktuellen Bausteinaufruf und sind im nächsten Zyklus wieder vorhanden!

Kleines Beispiel für eine Anwendung:
Für eine Flanke (FP / FN) wird ein Flankenhilfsmerker benötigt, beim FB kann dieser eine STAT-Variable sein, beim FC muss es eine IN_OUT-Variable sein!


----------



## redscorpion (13 Dezember 2011)

Hy MCerv,

Würde mich freuen wenn du mir ein Beispiel z.B. machen könntest von einem Frequenzumrichter Movidrive oder so , welche , wenn man in auf und ab fahren möchte ? welche IN , OUT , Temp und oder Stat Variablen man braucht. Und eine erklärung warum das so zu machen ist. 
Würde mich freuen 
Sorry aber das kappier ich noch nicht so.

Danke 

Gruß
Robert


----------



## MCerv (13 Dezember 2011)

Programmbeispiele (S7) für einen Movidrive von SEW bekommst Du direkt vom der SEW-Homepage.

Schau mal hier:

http://www.sew-eurodrive.de/produkt/simatic-step-7.htm

http://www.sew-eurodrive.de/support/documentation_result.php?gruppen_id=A43


----------



## GS-Harri (14 Dezember 2011)

Hallo Robert,

 ich weiss ja nicht, wie tief du in der Materie drinsteckst, deshalb beschreibe ich dir mal meine Vorgehensweise bei einem Step 7 Programm, in dem ich mehrere Movidrives verfahre. (Obwohl ich als Instandhalter nicht so der Profi bin)

Antrieb im Hardwaremanager definieren, (GSD Datei kannst du dir bei SEW runterladen), dabei werden E/A Adressen definiert (3 words, z.Bsp. 272-277) 
Ich bleibe bei diesem Beispiel und rufe in einem FC, in dem ich diesen Antrieb ansteuern möchte, die SFC 14 und 15 auf. (Hilfe erkärt die Parameter) Dabei wir bei Laddr aus 272 (Hardwaremanager dezimal) ein 110 (Hex) und bei record den Bereich eines Datenbaussteines angeben, ab welchem die Daten des FU in diesen DB geschrieben werden bzw. die Daten von dem FU ausgelesen werden (UDT für DB auch von SEW). Somit kommuniziert der FU mit Hilfe der SFC 14/15 über den DB mit der S7. Jetzt kannst du die entsprechenden DB Adressen in deinem Anwenderprogramm auslesen bzw Befehle an den FU schicken.

Ich hoffe, ich hab dich nicht gelangweilt und konnte dir etwas helfen. Wenn du willst, schicke ich dir auch gerne mein Projekt.

Grüße
Harri


----------



## redscorpion (14 Dezember 2011)

Hallo GS -Harri

Ich Danke Dir für die erklärung , würde mich freuen wenn du mir dein Projekt schicken könntest.

Danke


----------



## rostiger Nagel (14 Dezember 2011)

@redscorpion,
wenn du nicht gerade eine aktuelle Anwendung mit einer SEW Antriebstechnik hast, ist das
ein ungünstiger Strohhalm, an den du dich da klammerst. Ich finde den Übungsansatz von
Michael in Beitrag #5 viel geeigneter um etwas zu lernen. 
Versuche doch einn einfachen Binäruntersetzer (Stromstoßschalter)  zu erstellen, das ist völlig
ausreichend um den Sinn und die Möglichkeiten eines FB's zu ergründen. 
Vielleicht schreibst du ihn erstmal als FC und später als FB, um die unterschiede zu begreifen. 
Du lädst deine Ansätze bzw Lössungn hier hoch und wir helfen dir auf die sprünge.


----------



## redscorpion (16 Dezember 2011)

Hallo 

nochmals zu den FB´s zurück, ich dachte ich stelle nun ein paar Bilder ein, habe z.B. den Beispiel Baustein von SEW Seite gezogen, und meinen eigenen Baustein mit dem ich nachher die Achse auf die Bestimte position fahren möchte.
Brauch ich überhaupt noch einen Baustein oder kann ich dies im SEW Baustein aufruf anparametrieren.

Netzwerk 1 Bild ist Baustein Beispiel

zweites Bild ist dann mein Baustein den ich denke noch zum verfahren zu brauchen.

Danke

Danke


----------



## Verpolt (16 Dezember 2011)

am Rande:

```
U "irgendwas"
L "SollPosition
```

die SollPositiuon wird IMMER geladen, unabhängig von der U Abfrage. ( eventuell drüberspringen... SPB...)

In deinem Baustein schwirrt immer wieder ein Lade-Befehl zwischen den Abfragen. So wird das nicht funktionieren.

Der SEW Baustein rangiert dir die FU-Daten in einen stat/temp Bereich desgleichen. Die Ansteuerung musst selber erledigen


----------



## siegener19 (28 April 2013)

Hallo,

ich hätte zu diesem Thema mit der Schnittstelle, wo man "in", "out" usw. angibt, auch eine Frage. Ich nehme mal jetzt ein Beispiel. Ich habe zwei Zylinder, die Werkstücke auf ein Förderband werfen. Diese Werkstücke werden über das Förderband hindurch über mehrere Sensoren, die die Werkstücke überprüfen, bis an die Endstelle des Förderbandes gebracht. Beide sollen abwechselnd Werkstücke auf das Förderband werfen, also wenn die Endstelle erreicht ist.
Jetzt kann ich doch eine Funktion für beide Schreiben? Was mache ich mit den in, out, ...? 
Habe das irgendwie nicht ganz verstanden.

Gruß


----------



## Tigerente1974 (28 April 2013)

Ich versuch das mal mit möglichst wenigen Sätzen zu beantworten.

Um einen Baustein mehrfach für die gleiche Funktion nutzen zu können, dürfen innerhalb des Bausteins keine Ausgänge, Merker oder Timer direkt adressiert werden.

Man arbeitet also innerhalb des Bausteins mit "lokalen" Variablen.
Um den Baustein mit der "globalen" Außenwelt zu verbinden, nutzt man die Schnittstelle des Bausteins. Ganz grob formuliert:
IN: Für Eingangsvariablen, die abgefragt aber nicht geändert werden sollen. Z.B. Eingänge von Sensoren
IN_OUT: Für Variablen die lesend und schreibend bearbeitet werden sollen. Z.B. Merker
OUT: Für Ausgangvariablen, ganz klassisch z.B. für den Ventilausgang.

Man deklariert an der Schnittstelle also Lokalvariablen, mit denen man im Bausteincode "lokal" arbeitet. Beim Bausteinaufruf schreibt man die entsprechenden "globalen" Variablen dran.


----------



## rostiger Nagel (28 April 2013)

@siegener19,
bitte mal Beitrag #2 noch einmal lesen.


----------



## siegener19 (29 April 2013)

@rosiger Nagel , das habe ich doch. Leider habe ich es nicht verstanden. Am besten und einfachsten ist es, wenn ich zu sowas Beispiele habe.


----------



## Tigerente1974 (29 April 2013)

Hier mal ein ganz einfaches Beispiel mit beiden Varianten.


----------



## Fanta-Er (29 April 2013)

schöns beispiel: 





> Hier mal ein ganz einfaches Beispiel mit beiden Varianten.



der größte vorteil hierbei ist, du kannst den FC2 tausend mal aufrufen und jedes mal neue variablen dranschreiben.
auf sew bezogen: einmal den baustein geschrieben und du kannst 10servos (10x aufgerufen) damit steuern. die relevanten variablen werden ja von außen angelegt.


----------



## siegener19 (30 April 2013)

Wirklich super Forum. Ich will auch mal ein Danke bekommen, leider bin ich Anfänger und kann so leider auch niemanden helfen :sad:

Hier werden ja FC1 und FC2 gleichzeitig aufgerufen. Kann ich das so programmieren, dass erst FC1 und dann FC2 aufgerufen wird?


----------



## bike (30 April 2013)

siegener19 schrieb:


> Wirklich super Forum. Ich will auch mal ein Danke bekommen, leider bin ich Anfänger und kann so leider auch niemanden helfen :sad:
> 
> Hier werden ja FC1 und FC2 gleichzeitig aufgerufen. Kann ich das so programmieren, dass erst FC1 und dann FC2 aufgerufen wird?



Das wird doch im Aufruf im OB1 schon erledigt.
Zuerst call FC1 , dann call FC2

Oder habe ich es falsch gelesen?


bike


----------



## siegener19 (30 April 2013)

Also bei der Programmierung mit FUP werden alle gleichzeitig aufgerufen, deshalb meine Frage.


----------



## vollmi (30 April 2013)

siegener19 schrieb:


> Also bei der Programmierung mit FUP werden alle gleichzeitig aufgerufen, deshalb meine Frage.



Nein werden sie nicht. Die werden nacheinander aufgerufen, stell die Sprache mal auf AWL um, dann siehst du es. FUP ist nur ne Darstellungsform, am Code ändert sich dabei nichts.

mfG René


----------



## rostiger Nagel (30 April 2013)

bike schrieb:


> Das wird doch im Aufruf im OB1 schon erledigt.
> Zuerst call FC1 , dann call FC2
> 
> Oder habe ich es falsch gelesen?
> ...



ja hast du falsch gelesen, im Beispiel von Tigerente und der frage vom Siegener,
werden die Bausteine FC1 und FC2 im *FC3 *aufgerufen, von OB1 steht da nichts.


----------



## bike (30 April 2013)

rostiger Nagel schrieb:


> ja hast du falsch gelesen, im Beispiel von Tigerente und der frage vom Siegener,
> werden die Bausteine FC1 und FC2 im *FC3 *aufgerufen, von OB1 steht da nichts.



Und die im FC3 aufgerufene Bausteine werden nicht sequenziell abgearbeitet?

Das verstehe ich nicht.
Es ist doch völlig egal, ob in OB1 oder innerhalb eines FC Bausteine aufgerufen werden, dachte ich bis gerade.
Aber gut, wieder etwas gelernt 


bike


----------



## rostiger Nagel (30 April 2013)

Weil du die jungen Leute durcheinander bringst, der sucht doch jetzt den OB1 im Beispiel.


----------



## Tigerente1974 (30 April 2013)

Back to topic...

Ja, die Aufrufe habe ich auf die Schnelle in einen eigenen FC gepackt. Es macht aber keinen Unterschied.
Es macht natürlich auch nicht viel Sinn.
Ich habe BEIDE Aufrufe reingeschrieben, damit man den Unterschied beim Beschalten der Schnittstelle sieht.

Der Aufruf für den FC2 ist das Ziel  
Und wie schon gesagt wurde, kann der Baustein dann mehrfach benutzt werden. Also mehrere Aufrufe, die dann untereinander stehen und nacheinander abgearbeitet werden...


----------



## 00alex (1 Mai 2013)

Ich habe eine einfache Funkion programmiert um die "Sache" zu kapieren : a+b=c  einmal als Funktion und einmal als Funktionsbaustein  , da sieht man das ein grosser unterschied ist zwischen OUT und IN-OUT .
Wie was funktioniert sieht man am besten mit gaaanz einfache Beispiele , meine Erfahrung nach !


Funktionen und Funktionsbausteine sind nur  ... PLATZHALTER ( mit Gedächtnis beim FB ) deswegen soll ihnen alles symbolisch sein .

"a+b=c" ist was anderes als a+2=c , 2+b=c , a+b=2 Mehrfachbenutzung  der Formel "a+b=c" impliziert a,b,c als Platzhalter 

... falls ich richtig kapiert habe ... praktisch  aber funzt  so zu sagen


----------



## Toki0604 (1 Mai 2013)

> , da sieht man das ein grosser unterschied ist zwischen OUT und IN-OUT .


OUT und IN-OUT gibt es sowohl bei einer Funktion (FC) als auch bei einem Funktionsbaustein (FB).
Der Unterschied liegt viel mehr im STAT, das "Gedächtnis" in Form eines Instanz-DB (IDB). Also einem eigenen diesem Baustein zugewiesenen Speicherbereich.



> Funktionen und Funktionsbausteine sind nur  ... PLATZHALTER


Das sind keine "Platzhalter"... 
Man kann alles was man Programmieren will theoretisch auch in 256 Netzwerke im OB1 unterbringen, oder sogar auf die Unterteilung in Netzwerke verzichten.
Das ist theoretisch und absoluter Blödsinn ;-)
FC´s und FB´s dienen in erster Hinsicht dem strukturierten Programmaufbau. 
Um verschiedene FUNKTIONEN (z.B.) in einem seperaten Baustein voneinander zu trennen, einzelne Funktionen nur zu einem bestimmten Zeitpunkt aufzurufen etc.



> Mehrfachbenutzung...


Genau das ist einer der großen Vorteile von FC´s und FB´s.
Wenn sie richtig programmiert sind kann man sie beliebig oft aufrufen und mit anderen Formalparametern beschalten, 
was wiederum den Vorteil hat das das gesamte Programm übersichtlicher bleibt und der Aufwand der Programmierung geringer bleibt.

Gruß, Toki

Ps.: Feiert man in Östereich nicht auch den 1.Mai?? ;-)


----------



## 00alex (1 Mai 2013)

Feiert ...aberr ...essen bei euch (wirklich) alle zu gleich ?


PLATZHALTER in sehr allgemeinen Sinn ... also man schreibt zum Beispiel ein FB (!) um eine Summe  zu rechnen  (gewählt weil einfach) ... => nie mehr muss man das (nochmal) schreiben weil die Variablen im Programm PLATZHALTER für die Werte die dann  gebraucht werden sind . Und die FB Platzhalter für ein Programm mit direkter programmierung ist ...etc. Hofe jetz ist klar was ich sagen wollte ...

Hast recht mit der Wortklauberei ... praktisch S7 ist sehr einfach und (sehr) REDUNDANT auch (!).IN-OUT ist mit Vorsicht zu geniessen 
 

Als Feiertag ist mir Weihnachen lieber als ...1 Mai ( diese amerikanische Feiertag ... ist aber auch lustig solange man (nur)es bezhalt bekommt  )


----------



## rostiger Nagel (1 Mai 2013)

00alex schrieb:


> Hofe jetz ist klar was ich sagen wollte ...



neh; absolut nicht, was möchtest du uns den mitteilen?



00alex schrieb:


> praktisch S7 ist sehr einfach und (sehr) REDUNDANT auch (!).IN-OUT ist mit Vorsicht zu geniessen



Was ist den mit Redundant im Zusammenhang von S7 gemeint?

Warum sind IN-OUT Vaiablen mit Vorsicht zu genießen?


----------



## Toki0604 (1 Mai 2013)

> neh; absolut nicht, was möchtest du uns den mitteilen?


Sehr gut, dann bin ich damit nicht alleine...


----------



## Toki0604 (1 Mai 2013)

> Was ist den mit Redundant im Zusammenhang von S7 gemeint?


Redundant - das mehrfache Vorhandensein funktional gleicher oder vergleichbarer technischer Ressourcen...
Denke das er das nur im übertragenen Sinne angewandt hat.
IN-OUT scheint er allerdings nicht zu mögen (oder zu verstehen).


----------



## 00alex (1 Mai 2013)

[h=1]Übergabe an IN_OUT-Parameter eines FB[/h]Bei der Übergabe von zusammengesetzten Datentypen an IN_OUT-Parameter eines Funktionsbausteins (FB) wird die Operandenadresse der Variable übergeben (call by reference). 
Bei der Übergabe von elementaren Datentypen an IN_OUT-Parameter eines FB werden die Werte in den Instanz-Datenbaustein kopiert, bevor der FB gestartet wird und aus dem Instanz-Datenbaustein herauskopiert, nachdem der FB beendet ist. 
Dadurch können IN_OUT-Variablen elementaren Datentyps mit einem Wert initialisiert werden. 
_Es ist jedoch nicht möglich, in einem Aufruf eine Konstante als Aktualparameter an der Position einer IN_OUT-Variablen anzugeben, da auf eine Konstante nicht geschrieben werden kann._
*Variable vom Datentyp STRUCT oder ARRAY können nicht initialisiert werden, da in diesem Fall im Instanz-Datenbaustein nur eine Adresse liegt.

KLAR ?*


----------



## rostiger Nagel (1 Mai 2013)

00alex schrieb:


> *Übergabe an IN_OUT-Parameter eines FB*
> 
> Bei der Übergabe von zusammengesetzten Datentypen an IN_OUT-Parameter eines Funktionsbausteins (FB) wird die Operandenadresse der Variable übergeben (call by reference).
> Bei der Übergabe von elementaren Datentypenan IN_OUT-Parameter eines FB werden die Werte in den Instanz-Datenbaustein kopiert, bevor der FB gestartet wird und aus dem Instanz-Datenbaustein herauskopiert, nachdem der FB beendet ist.
> ...



Ich verstehe immer noch nicht was Problematisch bei der Verwendung von IN-OUT Variablen 
sein soll. Was bereitet dir bei deinen Zitat zu der Eigenschaft der Variablen, aus irgendeiner Kurs
Unterlage den Probleme?
Genauso könntest du schreiben Merker sind nicht Umproblematisch oder Lokalvariablen haben teuflische
Eigenschaften. 

Wo ist jetzt das Problem?


----------



## 00alex (3 Mai 2013)

Versuche mal einen erzeinfachen FB zu programmieren : a=b+c mit IN-OUT Parameter !
Wenns klapt lass es mich wissen ...


... und nicht nur dass IN-OUT darf kein Eingang und kein Ausgang sein ....oder ?


----------



## Fanta-Er (3 Mai 2013)

ich versuche es einmal anders. es ist falsch da nur adressen hinter den variablen stehen aber zum verständnis ist es glaube ich so einfacher.

nach einen call fc werden die in und in_out geladen.
dein program wird durchlaufen und die out und in_out werden wieder beschrieben.

nach ein call fb werden erst alle in, in_out (und stat ist ja vorhanden da es das "gedächnis" des bausteins ist) in den idb geladen.
programm abarbeiten wobei hier immer auf den idb zugegriffen wird.
stat bleiben im gedächnis. out, in_out wieder in den idb schreiben UND auf die variablen die an in/in_out drangeschrieben sind.

die temp werden beim aufruf NIE beschrieben.

daraus folgt:
-temp können irgend einen wert haben. jeh nach vorrangegangenen baustein. um sie nutzen zu können musst du sie erstmal beschreiben und beim nächsten aufruf ist die information weg. sind also schmiermerker/zwischenspeicher
 alle bausteine benutzen den selben tempbereich. ist aber nur immer einer aufgerufen.
-an den out/in_out müssen BESCHREIBBARE variablen stehen (oder nichts beim fb da er ja erstmal in idb schreibt). auf einem eingang oder einer zahl kann nicht geschrieben werden.
-in einem fc können keine zustände gespeichert werden. nutzt du nun einen merker, Ausgang oder speicher von db, wird jeder aufruf diesen, in abhängigkeit seines programs, verändern.
-in_out lädt erst die variable bearbeitet sie und schreibt sie wieder weg.
-udt´s oder verschieden selbstgebaute datentypen können nicht als in_out genutzt werden. hier spielt die wahrheit (adressen) eine rolle. als in und out könne sie genutzt werden.
-da die variablen von einem fb erstmal im idb liegen können variablen vorbelgt (intialwerte) werden und es muss nicht unbedingt was an in,out und in_out drangeschrieben werden.
-im fb kannst du zustände werte in seinem gedächnis(stat) speichern. da jeder fb seinen eigenen speicherbereich hat, gehörem sie nur ihm und bleiben erhalten. (idb zugriffe sind aber aus anderen bausteinen möglich)

wie bereits erwähnt, wird nicht im fc umgeladen sondern die variable wird über die adresse angesprochen. auch die zugriffe in/auf idb sind nur adressen. es geht mir nur darum die abläufe zu kapieren.
wie das genau mit den zugriffen ist, ist bereits weiter vorne beschrieben. wenn du da tiefer rein willst, schau die hilfe und funktionen vom ar1 und ar2 an.


----------



## rostiger Nagel (3 Mai 2013)

00alex schrieb:


> Versuche mal einen erzeinfachen FB zu programmieren : a=b+c mit IN-OUT Parameter !
> Wenns klapt lass es mich wissen ...
> 
> 
> ... und nicht nur dass IN-OUT darf kein Eingang und kein Ausgang sein ....oder ?



was ist das den für ein Quatsch, begründe bitte einer deiner Ausagen!


----------



## 00alex (3 Mai 2013)

...eimal 
a= a+b ... eimal a=b+c
als FC oder  FB schreiben mit der BEDINGUNG mindestens ein IN-OUT Parameter zu benutzen ( für a,b oder c)



....könnte sein dass ich Blödsinn krakele ? ...dann vergessen wir die Sache ( es ist nur eine SIEMENS Sache ...die andere SPS Steuerungen haben es nicht )


----------



## rostiger Nagel (3 Mai 2013)

00alex schrieb:


> ...eimal
> a= a+b ... eimal a=b+c
> als FC oder  FB schreiben mit der BEDINGUNG mindestens ein IN-OUT Parameter zu benutzen ( für a,b oder c)
> 
> ...



Grundsätzlich kannst du bei den Berechnungen INOUT Variablen nutzen. 

Schreibe mal was dein Problem bei der Sache ist oder wo du Bedenken hast. 
Aber bitte ein wenig ausführlicher und nicht in zwei nicht vollendeten Halbsätzen.


----------



## PN/DP (3 Mai 2013)

Möglicherweise meint er, daß man an IN_OUT keine PEW oder PAW "anschließen" darf. Doch alles andere - auch E und A - kann man problemlos anschließen. Ob das was möglich ist auch Sinn macht steht auf einem ganz anderen Blatt. Sinnvolle Lösungen zu finden lernt man nicht unbedingt in einem Programmier-Lehrgang.

Harald


----------



## 00alex (3 Mai 2013)

PN/DP schrieb:


> Möglicherweise meint er, daß man an IN_OUT keine PEW oder PAW "anschließen" darf. Doch alles andere - auch E und A - kann man problemlos anschließen. Ob das was möglich ist auch Sinn macht steht auf einem ganz anderen Blatt. Sinnvolle Lösungen zu finden lernt man nicht unbedingt in einem Programmier-Lehrgang.
> 
> Harald


GENAU ...und Konstanten und Arrays auch nicht ... mit dem "Programmier-Lehrgang" hast 100% recht ...insbesonderes wenn eher autodidaktish ist ... Arbeitsamt Kurs eh


----------



## m_w (3 Mai 2013)

Das man keine Konstanten an IN_OUT parametrieren kann ist klar, aber ARRAY und STRUCT kann ich doch als IN_OUT verwenden. Sie werden halt nicht initialisiert weil im IDB nur der Zeiger auf die Adresse steht, oder lieg ich da falsch?


----------



## 00alex (3 Mai 2013)

Wie kann man einen Beitrag löschen ?


----------



## 00alex (3 Mai 2013)

m_w schrieb:


> Das man keine Konstanten an IN_OUT parametrieren kann ist klar, aber ARRAY und STRUCT kann ich doch als IN_OUT verwenden. Sie werden halt nicht initialisiert weil im IDB nur der Zeiger auf die Adresse steht, oder lieg ich da falsch?


Beim Strommausfall wirst Probleme bekommen ohne Initialisierung !


----------



## m_w (3 Mai 2013)

Ich kann ja im FB initialisieren, genauso wie ich das mit jeder OUT oder STAT variable mache.


----------



## 00alex (3 Mai 2013)

Nicht die ARRAYS ! Denk an Stromausfall ...


----------



## m_w (3 Mai 2013)

FOR i = 1 TO (nArrayLaenge)
    array_ := "false" oder "0" oder "1"
END_FOR_


----------



## 00alex (3 Mai 2013)

Mit ST kannst alles triksen aber es dauert SICHER  länger als FUP oder LADDER ! ...meiner Meinung nach .Stell dir vor du hast andere INITIALWERTE als nur  0 oder nur  1 im array ... ist nicht besser gleich 2 arrays zu haben ?
Wann wird das gelesen :
FOR i = 1 TO (nArrayLaenge)
array_ := "false" oder "0" oder "1"__
END_FOR

In jeder Bearbeitungszyklus ?

Rede schon wieder Unsinn ? _


----------



## m_w (3 Mai 2013)

Ich will ja nichts tricksen, ich will nur mit den mir gegebenen Werkzeugen schnellstmöglich ans Ziel kommen. Und wenn ich eine Struktur oder ein Array als IN_OUT Parameter am Baustein brauche und es da Sinn macht, dann werde ich dass da auch einsetzen. Wie ich dann mein Zeug im FB initialisiere oder ob ich das da überhaupt brauche steht auf einem anderen Blatt.

edit: und bei mir gibts keine anderen Initialwerte als 0 in einem ARRAY... entweder ich initialisiere was oder nicht!


----------



## 00alex (3 Mai 2013)

Guter ANSATZ !


----------



## m_w (3 Mai 2013)

Ach und mit Deiner a+b=c funktion



```
VAR_IN_OUT
     a := DINT;
     b := DINT;
     c := DINT;
END_VAR;

c := a + b;
a := c + 1;
```


Jetzt aber bitte nicht fragen ob das Sinn macht oder nicht... Die cpu geht aber nicht in Stop wenn ich das laufen lasse.


----------



## 00alex (4 Mai 2013)

m_w schrieb:


> ...
> edit: und bei mir gibts keine anderen Initialwerte als 0 in einem ARRAY... entweder ich initialisiere was oder nicht!



Heisst initialisieren (nur) nullen oder auch (irgendwelche erwünschte) STARTWERTE geben ???

http://de.wikipedia.org/wiki/Variable_(Programmierung)

" Variablen sollten vor ihrer Benutzung *initialisiert* werden, das heißt, *einen definierten Wert zugewiesen bekommen*. "

Hat es in der SPS andere Bedeutung ? ... habe manchmal auch andere STARTWERTE als Null benutzt ( wäre das nicht mehr "initialisieren" ?


----------



## Tigerente1974 (5 Mai 2013)

Die Wortklauberei macht doch keinen Sinn.

Das Zitat stammt vermutlich aus der Hilfe zum Thema TEMP-Variablen.

Bei TEMP-Variablen ist es nun mal so, dass diese mit "irgendwas" zugewiesen sein müssen, um einen definierten Wert für die weitere Verwendung im Baustein zu haben. Das kann man jetzt meinetwegen nennen wie mal lustig ist, das ändert aber nichts an der Sache.


----------



## HelleBarde (5 Mai 2013)

Wie schon einer gesagt hat, haben FB ein Gedächtnis. Ihre Instanz. Bei Siemens ist das ein DB.
Dieser bekommt schon in der Entwicklungsumgebung (TIA oder Step7V5 oder noch älteres Zeug -- und auch bei CodeSys) Werte, welche auf die AS geladen werden. Damit sind die immer initialisiert.
Wenn der Strom wieder kommt, dann ist es bei S. möglich die Werte wieder aus dem Ladespeicher zu holen. Also sind sie auch da wieder initialisiert.
FB Parameter müssen nicht verschaltet werden, da diese Werte ja in der Instanz liegen. Außer bei komplizierten Datentypen im IN-OUT. Dort werden im DB nur Pointer hinterlegt, der eigentliche Wert liegt wo anders.

Und jetzt kommt mal wieder Siemens-Spezialverwirrung:

Wenn also kein einziger FB Aufruf den komplizierten IN-OUT versorgt, dann steht da ein Null-Pointer drim. Beim Zugriff auf diesem IN-OUT innerhalb des FB geht die CPU in STOP (oder OB121).
Vollprofis (oder sollte ich hier Vollpfosten sagen) haben noch die Möglichkeit im DB-Editor in den Pointer was rein zu schreiben. Also mit dieser grottigen Syntax P#DBa.DBXb.c den Zeiger auf einen hoffentlich vorhandenen DB zu lenken. Schlechter Stil, gaaaanz schlechter Stil sowas. Wenn das nicht klappt, dann suchst du stundenlang nach etwas was nicht da ist (da sucht man ja bekanntlich am längsten nach)

Eine Struktur im IN-OUT (per Referenz übergeben) wird mit Peripherie versorgt. Bloß unterscheidet der Pointer nicht zwischen PE und PA. Der kennt nur P. Der Befehl im FB entscheidet dann ob von PE gelesen oder nach PA geschrieben wird. Du denkst, dass du da ein PEW angelegt hat, aber drinnen schreibt er dir auf das PAW mit der Nummer.    HEUL
Das mit den Peripheriezugriffen sollte man bei Siemens bleiben lassen.

Noch schlimmer ist das bei FC. In Step7V5 ist es erlaubt an einen Input eines FC vom Typ sagen wir mal DWORD z.B. ein PAD20 dran zu schreiben. Im FC darfst du sowohl auf den Input schreiben als auch von ihm Lesen. D.h. wenn du liest bekommst du PED20, wenn du schreibst PAD20. Bei Siemens werden bei den CPU 300 und 400 auch FC Parameter immer per Referenz übergeben.   noch mehr heul.

Bei einfachen Datentypen verhält sich der Siemens FB eher so, wie es die Begriffe IN OUT und INOUT suggerieren.


----------



## 00alex (5 Mai 2013)

Deswegen  habe ich gemeint IN-OUT Variablen sind  mit Vorsicht zu genissen !
Vielen , vielen DANK *HelleBarde* ...sehr gut erklärt (für mich mindestens ) .

 Einen Hinweis :
- beim Stromausfall ist die Anlage in irgendeinem SCHRITT ... die Daten in der DB sind remanent (wenn so eingestellt)  gehen also nicht verloren , sind aber mit der Daten des unterbrochenen Schrittes belegt .
Beim Neustart muss diese Schritt neu gestartet werden also  es wäre möglich dass die DB mit Daten von der vorherigen Schritt belegt werden muss... (Stichwort INITIALISIEREN )

DAS GEHT ABER aber bei STRUCT ,  ARRAY typen NICHT! 
Initialisiert müssen die Daten in DB auch beim Neustart nach Stromausfall ... oder Manuell Sprung zu irgend einem manuell gewählten Kettenschritt !

Hoffe jetzt ist es klar was ich weiter zurück meinte !?!


----------



## vollmi (6 Mai 2013)

Ich glaube ihr redet von zwei verschiedenen Dingen. 

Und In_Out sind nicht vorsichtiger zu geniessen wie alles andere. Wenn man "einigermassen" vernünftig programmiert geht davon nicht der Hauch einer Gefahr aus. In diesem Tread wäre die Pointerproblematik nichteinmal erwähnenswert gewesen sondern verkompliziert die Sache für den Leser völlig unnötig.

mfG René


----------



## 00alex (6 Mai 2013)

Ich würde INOUT Variablen sowieso nur für  rekurrente Funktionen ( Funktionen auf sich selbst ) benutzen .
Einfacher Beispiel wäre ein 1-Addierzähler 
"a" INOUT Variable
a : a+1

Bei jedem FC Durchlauf wird "a" Flankenabhängig um 1 erhöht ....


----------



## Tigerente1974 (6 Mai 2013)

00alex schrieb:


> Deswegen  habe ich gemeint IN-OUT Variablen sind  mit Vorsicht zu genissen !



Nein. Deswegen lässt man eben keine dressierten Affen an das PG.

Ich kann doch als Benutzer einer Software nicht erwarten, dass der Compiler jeden erdenklichen Fehler des Anwenders erkennt.


----------



## Tigerente1974 (6 Mai 2013)

00alex schrieb:


> Einen Hinweis :
> - beim Stromausfall ist die Anlage in irgendeinem SCHRITT ... die Daten in der DB sind remanent (wenn so eingestellt)  gehen also nicht verloren , sind aber mit der Daten des unterbrochenen Schrittes belegt .
> Beim Neustart muss diese Schritt neu gestartet werden also  es wäre möglich dass die DB mit Daten von der vorherigen Schritt belegt werden muss... (Stichwort INITIALISIEREN )
> 
> ...



Ein linearer oder auch ein verzweigter Ablauf ist schnell programmiert, ohne sich viele Gedanken zu machen.

Ein sauberer Wiedereinstieg nach einem Abbruch o.ä. erfordert halt etwas Hirnschmalz. Ich muss doch nur wissen, ob meine Schrittkette immer im letzten Schritt steht und was ich bei Wiederanlauf machen möchte. Das kann man dann sauber ausprogrammieren. Und für mich spielt es da erstmal keine Rolle, welche Art der Schrittkettenprogrammierung man gewählt hat.


----------



## vollmi (6 Mai 2013)

00alex schrieb:


> Ich würde INOUT Variablen sowieso nur für  rekurrente Funktionen ( Funktionen auf sich selbst ) benutzen .
> Einfacher Beispiel wäre ein 1-Addierzähler
> "a" INOUT Variable
> a : a+1
> ...



Ich bin stolz auf dich. Dafür ist die InOut Definition da. Für Zugriffe von denen gelesen und gleichzeitig geschrieben werden soll.
Ob man da jetzt nur liest, ne eins dazu addiert und dann schreibt...
oder ob man liest, zweihundert Funktionen/Berechnungen etc. ausführt und dann irgendwann draufschreibt ist eigentlich absolut dasselbe.

Darauf wurde ja am Anfang ja schon ausgiebig hingewiesen.


----------



## 00alex (6 Mai 2013)

@vollmi ...habe 2001 sechs Monate als 5-Achs CNC Fräser für RIETER in Winterthur gearbeitet ...(befristeter Vertrag)

SUPER LOHN ....super LAND ....super Kollegen :*

Ist günstig in der Schweiz zu leben , bist Schweizer ?

.


----------



## Schmidtchen (20 Januar 2014)

Hallo Leute, 

ich habe mal eine Frage zu der Thematik FB/FC.
Ich habe mir einen FB erstellt "Betriebszustand", dieser wird im OB1 durchlaufen. Den FB "Betriebszustand" habe ich im FB "Langzeitmessung" aufgerufen und mit IN bzw Out Variablen beschaltet. Den FB Langzeitmessung hab ich wiederum im OB1 aufgerufen und die IN bzw OUT mit den PLC variablen von der Steuerung beschaltet. Also Taster S1 ist %ID... usw. 

Nun war es so gedacht, den FB "Betriebszustand" in zwei weiteren FB's aufzurufen "Füllvorgang". Hab das dann dort so wie beim FB "Langzeitmessung" gemacht und quasi die IN /Out Variablen vom FB "Betriebszustand" bis in den OB1 zu meinen PLC Variablen durch geschaltet. 

Im FB "Langzeitmessung" arbeitet der FB "Betriebszustand" noch ganz normal und im FB "Füllvorgang" nicht mehr. Er schaltet trotz "True" an P1 nicht den Ausgang an der SPS. 

Jetzt kommt die Frage, hätte ich den FB "Betriebszustand" lieber als FC ausführen sollen?? 
Oder liegt das an etwas anderem?? 

Hat jemand ne Idee und kann mir jemand einen Tipp geben um den Fehler einzugrenzen!?

Schon mal danke....


----------



## Paul (21 Januar 2014)

Hast du dem FB für jeden Aufruf einen eigenen Instanz DB gegeben?
Verwendest du absolute Adressen (Merker, Zeiten etc...) in dem FB?
Warum muss er überhaupt 4 mal aufgerufen werden?
Ich nehme mal an es geht um den "Betriebszustandistwertanzeigebaustein" aus deinem anderen Thread.
Als FC wird das schon 2 mal nichts, weil da noch ein paar Sachen mehr zu beachten sind als beim FB

Deine Fragen setzen fast immer hellseherische Fähigkeiten voraus.

Und noch was:
Wenn ich mir vorstelle eure Werksfeuerwehr muss sich darauf verlassen, dass die Atemluft-Flaschen voll sind,
weil dein wirres Programm es so gemessen hat.....
Die Jungs setzen im Ernstfall ihr Leben aufs Spiel!


----------



## Schmidtchen (21 Januar 2014)

Hallo Paul, 

ja es geht um diesen FB "Betriebszustands-Baustein". Ich will erst mal noch was zum Thema Feuerwehr sagen, ob das Gerät bei denen zum Einsatz kommt weis ich nicht und soweit ich weis wollten sie CO2 Feuerlöscher befüllen, momentan machen sie das irgendwie von Hand. Was die da genau vorhaben weis ich nicht, Sie wollen bloß einen Sollwert eingeben können. Wenn der Istwert den Sollwert erreicht soll das Ventil ein Um-Befüllvorgang unterbinden. 

Da dir mein Programmierstil nicht gefällt könntest du mir auch mal einen Verbesserungsvorschlag machen was man verbessern könnte als jedes mal darauf herum zu hacken  
Ich hab immer ein offenes Ohr für einen Verbesserungsvorschlag :sm5:

Ich wird mal ein paar Bilder erstellen wo man eig alles sehen sollte, kommen gleich.........


----------



## Schmidtchen (21 Januar 2014)

So nun die Bilder....(Ich hoffe man kann es erkennen?)

Bild FBs, ich hab mir den FB2 im OB1 erstellt, diesen hab ich mir in den FB6 gezogen. Im FB6 hab ich noch ein paar weitere Netzwerke dazu konstruiert und anschließend den FB6 in meinen OB1 gezogen und dann dort meine Variablen angelegt. 

Das gleiche hab ich dann bei dem FB "Aktuelle Messung" und "Langzeitmessung" gemacht. Ich dachte das man das so machen kann!?

Da ich die Funktion des Betriebszustands in den Drei FB benötige und nicht für jeden Prozess (Messung) neu erstellen wollte. 

Wie wäre es richtig gewesen?


LG


----------



## Paul (21 Januar 2014)

Schmidtchen schrieb:


> Da dir mein Programmierstil nicht gefällt könntest du mir auch mal einen Verbesserungsvorschlag machen was man verbessern könnte als jedes mal darauf herum zu hacken


Du beißt dir die Zähne daran aus wenn du erforschen sollst, warum eine einfache Flanke nicht funktioniert,
sprichst aber im gleichen Atemzug davon, dass du Messwerte in dynamische Arrays schreiben willst.
In Sachen S7 Programmierung fehlen dir die Grundlagen, du glaubst aber offenbar dass man diese überspringen und gleich zu Arrays gehen kann.

Du schreibst, dass du dir irgendwas programmiert hast, das auch funktioniert, bloß leider nicht so wie es soll. 

Wenn du Fragen stellst, setzt du offenbar voraus dass die Anderen dein Programm schon kennen oder vorliegen haben.
Du sagst selbst "Was die da genau vorhaben weis ich nicht". Wie willst du was programmieren wenn du nicht mal weist was das werden soll?

Zu deinem Programmierstil kann ich nichts sagen, weil noch nichts davon gesehen habe, außer das bisschen Code mit den Flanken, die nicht gehen.

Mir stehen nur die Haare zu Berge wenn ich deine Herangehensweise an die Probleme betrachte.
Du weißt offenbar selber nicht was das werden soll. Langzeitmessung Vorgabe nur in Stunden (1-24), im selben Satz aber auch: ".... auch schon mal 30 Minuten"
Mal sprichst du von Atemluft Flaschen mal von CO2 Löschern, fast das gleiche.
Mal so nebenbei CO2 ist ein farb- und geruchloses Gas, schwerer als Luft und in der richtigen Konzentration absolut tödlich.

Deine Frage FB oder besser FC ist ungefähr so wie "Mein Auto springt nicht an, meint Ihr es hilft wenn ich wieder Sommerreifen aufziehe? Im Sommer ging´s noch"

Mein Verbesserungsvorschlag:
Mach dir erst mal ein vernünftiges Konzept was das eigentlich werden soll.
Mach eine Risikobewertung.
Orientiere dich beim Bedienkonzept an normalen Anlagen und nicht an einem Schneepflug.
Schau erst mal dass du die einfachen hinkriegst, und zwar so dass du auch weißt WARUM es funktioniert.


----------



## Paul (21 Januar 2014)

@Schmidtchen
Die Grafiken die du im Beitrag #64 angehängt hast sind genau das was ich meine.
3 Netzwerke hingeklatscht ersichtlicher Code --> Null.  Hellsehen ist gefragt.

Und noch was:
Du hast einen DB "Füllvorgang_DB" als Instanz DB für deinen FB Füllvorgang.
Den FB-Eingang <HMI BLD Freigabe> beschaltest du mit einem Bit aus seinem eigenen Instanz DB.
So was ist Zufall, wenn es funktioniert


----------



## Schmidtchen (21 Januar 2014)

Wo fange ich jetzt an zu antworten.....aber ich muss dir schon recht geben, dass die Projekt Erarbeitung in Sachen Programmierung chaotisch ist. Das liegt wahrscheinlich daran das es mit der Zeit langsam eng wird und es noch nicht so funktioniert wie es sollte und ich mach so ein Projekt zum ersten Mal. Hatte während der Ausbildung schon mal S7 aber nicht in diesem Umfang und das ist mittlerweile 3 Jahre her. Im letzten Semester hatte ich industrielle Steuerungstechnik, aber die Praktika in S7 kommen erst nächstes Semester.

Und nochmal zu dem Füllvorgang, Sie wollen einen Sollwert (Druck) eingeben können und wenn Sie den Prozess starten öffnet sich ein Ventil um irgendein Medium umzufüllen...Wenn der Sensor (Druck) ermittelt und der Istwert == Sollwert soll sich das Ventil wieder verschließen (abfallen). Das ist die Funktion die Sie haben möchten, mehr nicht....wie weit ich das dann ausdehne ist mir überlassen. Und Sie können auch Wasser in Flaschen abfüllen, wenn das Adapterstück einen entsprechenden Anschluss für das Magnetventil bzw. für den Sensor hat. Ich will damit sagen es ist nicht konkret gesagt wurde.

Bei der Langzeitmessung hab ich mich wahrscheinlich falsch ausgedrückt. Ich zähle momentan die Felder des Array und hab es auf eine maximale Anzahl von 1440 begrenzt, was 60 Messwerte/Min und einer Messzeit von 24 h bedeutet. Wenn 1440 Felder gezählt wurden beginnt er wieder beim 1. Feld. Da ich gerne eine Messzeit von 2h eingeben wollte oder auch 0,5h (bzw im Format: 00:30) müsste ich die Eingabe mit festen Werten Vergleichen. Also bei 2 h die Feldanzahl des Array auf 120 setzten. Bei dem Prinzip muss ich aber vorher alle Messzeiten definieren (Feldanzahl). Da bei 2 h (120 Felder) noch 1320 Felder frei wären. Da ich gerne die Messdaten auf der CPU (Speicherkarte) speichern würde um sie später aufrufen zu können, wollte ich  die Felder die nicht benötigt werden auch nicht speichern. 

Vlt hast du ja einen Hinweis wie man dieses Problem elegant lösen kann. (Ansatz)

Na ich meine eine CO2 Feuerlöscher, CO2 muss ja auch schwerer sein als Luft, damit es dem Feuer die Luft zufuhr abdreht, quasi ersticken. (ich hab es nicht gegoogelt, aber so sollte die Funktionsweise sein)

Wie macht sollte eine Risikobewertung erfolgen bzw gibt es da ne Richtlinie?
Zu Thread #67: 

Angenommen ich habe einen FB "Betriebszustand" und möchte diesen in einem anderem FB aufrufen. Ich habe mehrere Prozesse die eine gleiche Betriebszustands Visualisierung (Funktion von Zwei Meldeleuchten) haben  sollen, aber jeder Prozess etwas anderes macht. Wie würde man das aufbauen/verschachteln? Ist dafür ein FB oder eher ein FC geeignet? 

Ich muss noch anmerken, dass ich am 31.1 meinen letzten Tag habe. Da soll das Gerät funktionstüchtig sein und ich eine Bedienungsanleitung für den Anwender erstellt haben. :sm4:


LG


----------



## hucki (21 Januar 2014)

Paul schrieb:


> @Schmidtchen
> Die Grafiken die du im Beitrag #64 angehängt hast sind genau das was ich meine.
> 3 Netzwerke hingeklatscht ersichtlicher Code --> Null.  Hellsehen ist gefragt.
> 
> ...


@Paul,
ich bin ja erstaunt, dass Du auf den Bildern überhaupt was erkennst!

@Schmidtchen,
wenn Du schon "nur" Screenshot machst und nicht das Programm selbst bzw. einen Codeauszug postest, dann verkleinere nicht noch die Bildgröße. Auf den jetzigen Bildern kann man (zumindest bei mir) nur mit der Gefahr von Augenkrebs was erkennen. 


Da hilft mir auch der Zoom meines Browsers nicht weiter.


----------



## Schmidtchen (21 Januar 2014)

Ich lad nochmal ein neues Bild....


----------



## Paul (21 Januar 2014)

Also erst mal das A&O funktioniert dein Druckaufnehmer so, dass du 10bar angezeigt bekommst wenn 10bar anstehen.

Zweitens: Für was soll diese Langzeitmessung eigentlich gut sein?
Dauert es 24 Std um so eine Flasche zu füllen, oder soll da geprüft werden ob sie dem Druck hält.
Alle 100ms einen Messwert aufzeichnen. Für was?
Um das zu Archivieren (meinetwegen die letzten 10 Messungen) ist die Speicherkarte der CPU, denke ich zu klein.

Drittens: Was soll das mit Wasser abfüllen? Dazu brauchst du einen Durchflußsensor oder Füllstandsensor.

Wenn du einen FB mehrfach verwenden willst, dann dürfen in dem FB keine Merker, klassischen Zeiten etc. verbaut sein.
Das muss alles in der Deklarationstabelle stehen.
Wenn der FB dann mehrfach verwendet wird, braucht er für jeden Aufruf einen eigenen Instanz DB.
Evtl. Stichwort Multi Instanzfähig


----------



## Schmidtchen (21 Januar 2014)

Ich hab nochmal die Bilder erneuert, ich hoffe man kann es besser lesen?

Wie kann man denn noch Bilder hochladen? 

Ich benutzte einen Rechner der am Netzhängt und einen autarken Rechner zur Programmierung.


----------



## Schmidtchen (21 Januar 2014)

Schmidtchen schrieb:


> Ich hab nochmal die Bilder erneuert, ich hoffe man kann es besser lesen?
> 
> Wie kann man denn noch Bilder hochladen?
> 
> Ich benutzte einen Rechner der am Netzhängt und einen autarken Rechner zur Programmierung.



Das ist doch zum Mäuse melken, die Bilder sind genauso besc..... wie vorher.....:sb7:


----------



## Schmidtchen (21 Januar 2014)

Ja der Drucksensor zeigt mir das an. 
Also die Langzeitmessung ist dafür gedacht, eine Anlage länger als 24 Stunden überwachen zu können. Bei dieser Funktion sollen je nach Messbereichswahl (Zwei Drucksensoren einmal für 400 und einmal für 3000 bar) das ein Signal (4 bis 20 oder 0 bis 20 mA) auf eine Messbuchse geschaltet werden. Dieses Signal kann ich dann mit einem externen Schreiber erfassen. Eig hat die Langzeitmessung und der Füllvorgang Garnichts mit einander zu tun. Die Langzeitmessung dient eig nur zur Überwachung einer Anlage. 

Bei dem Prozess "Aktuelle Messung" soll alle 100 MS ein Wert ermittelt werden, nach einer Minute (600 Messwerte) soll der Mittelwert gebildet werden. Mit den Mittelwerten soll eigentlich ein Diagramm gefüttert werden, welches den Druck in Abhängigkeit der Zeit darstellt. Außerdem möchte ich den Mittelwert in dem Array ablegen und speichern. (Aber Array in Array speichern geht wahrscheinlich schlecht in C konnte man das über Strukturen machen (glaub ich)?)--> Da weis ich noch nicht wie das hier geht?

Wie könnte man die Messdaten den Speichern? 

Das Wasser war doch nur ein Beispiel (Bei einem geschlossenem Gefäß steigt ja auch der Wasserdruck wenn es voll wird oder?).
Sie können auch irgendein anderes Medium messen.

Ok....woher weis ich denn ob sich jetzt ein FC sich besser als ein FB eignet (oder anders herum)?


----------



## hucki (21 Januar 2014)

Schmidtchen schrieb:


> Ok....woher weis ich denn ob sich jetzt ein FC sich besser als ein FB eignet (oder anders herum)?


Grob gesagt:

Wenn Du im Baustein Daten erstellst, die *nur dieser Baustein im nächsten Zyklus* wieder benötigt, speichert man das üblicherweise im Instanzdatenbaustein. Den hat nur ein FB, also benutzt Du selbigen.
Solche Daten wären z.B. Flankenmerker, Ausgänge mit Setzen und Rücksetzen bearbeiten, Timerdaten, Zwischenergebnisse zum Weiterberechnen im nächsten Zyklus u.ä..

Wenn solche Daten nicht anfallen, kannst Du das auch mit einem FC erschlagen.
(Wenn solche Daten nur *in geringen* Ausmass, z.B nur ein Flankenmerker o.ä., anfallen, kann man diese beim FC *über INOUT* auch global speichern und sich so einen IDB ersparen)


----------



## hucki (21 Januar 2014)

Leider sind die neuen Bilder nicht wirklich größer. 

Egal. Aber etwas wirklich Wichtiges hast Du vergessen - den Deklarationsteil der Schnittstelle.

Deshalb kann ich nur anhand der Bezeichnungen vermuten, dass Du die Flankenmerker als temporäre Variablen erstellt hast.
 Solche gelten immer nur für den aktuellen Aufruf des Bausteins im aktuellen Zyklus.
Die Flankenmerker brauchst Du aber für den nächsten Zyklus! Deswegen müssen sie statisch sein!


----------



## Schmidtchen (21 Januar 2014)

Ok, danke für den Hinweis....

Wie kann man denn noch Bilder hochladen....? (außer Screenshot)


----------



## hucki (21 Januar 2014)

Screenshot selbst ist schon ok.
Eventuell vorher die Ansicht im TIA über den Schieberegler rechts unten vergrößern.
Dann darauf achten, dass das bild beim Hochladen nicht (automatisch?) verkleinert wird.
Ich lade meine Bilder über einen externen Hoster hoch und verlinke das hier nur. Im meinen Profil findest Du ein Album, wo Du Dir das ansehen kannst.

PS: Du kannst aber auch das Programm selbst, gepackt als Archiv, hier hochladen. Dann kann sich das jeder, der möchte, selbst in Ruhe ansehen.


----------



## Schmidtchen (21 Januar 2014)

Hab nochmal eine Frage, bei der Langzeitmessung möchte ich ja die Messwerte auf eine Messbuchse legen (da muss ich meine Temperatur auf das gewünschte Ausgangssignal skalieren). Da ich das Signal von Sensor (Integer) in einen Realwert umgewandelt habe muss ich das ja auch wieder in einen Integer umwandeln bevor ich es ausgebe oder?


----------



## Schmidtchen (21 Januar 2014)

hucki schrieb:


> Screenshot selbst ist schon ok.
> Eventuell vorher die Ansicht im TIA über den Schieberegler rechts unten vergrößern.
> Dann darauf achten, dass das bild beim Hochladen nicht (automatisch?) verkleinert wird.
> Ich lade meine Bilder über einen externen Hoster hoch und verlinke das hier nur. Im meinen Profil findest Du ein Album, wo Du Dir das ansehen kannst.



Ich schaue mal....

Bei dir sieht das super aus....:s12:

Zum Packen des Programms müsste ich z.B. ein zusätzliches Programm benutzen oder kann man das im TIA Portal machen?


----------



## hucki (21 Januar 2014)

Schmidtchen schrieb:


> Zum Packen des Programms müsste ich z.B. ein zusätzliches Programm benutzen oder kann man das im TIA Portal machen?


Das Archivieren des Programms (unter Datei) erstellt auch ein zip-Archiv.


----------



## Schmidtchen (21 Januar 2014)

hucki schrieb:


> Das Archivieren des Programms (unter Datei) erstellt auch ein zip-Archiv.



Ich glaub ich stell mich grad zu blöd an,  du meinst im TIA Portal unter "Projektansicht" Menüpunkt Projekt --> Archivieren anklicken und dann ??


----------



## hucki (21 Januar 2014)

Ach Du Sch...! In TIA hab' ich noch gar nicht archiviert.

Also, ja, genau dort. Namen angeben (sollte es nicht als Ordner geben, sonst öffnet er diesen) und speichern.
Das Ergebnis ist ein zip-Archiv mit veränderter Endung. Das kannst Du hier hochladen.
Falls die Forumssoftware da nicht mitmacht, entweder nochmal zippen (z.B. mit 7zip) oder Endung zu Zip ändern und hier mit posten, wie sie original war.


----------



## Paul (21 Januar 2014)

Schmidtchen schrieb:


> Ja der Drucksensor zeigt mir das an.


Na ja ist ja schon mal was, aber ehrlich gesagt glaube ich dir das nicht.
Sonst würdest du nicht das Thema 0 bis 20mA und 4 bis 20 mA auf den Tisch bringen.



Schmidtchen schrieb:


> Also die Langzeitmessung ist dafür gedacht, eine Anlage länger als 24 Stunden überwachen zu können. Bei dieser Funktion sollen je nach Messbereichswahl (Zwei Drucksensoren einmal für 400 und einmal für 3000 bar) das ein Signal (4 bis 20 oder 0 bis 20 mA) auf eine Messbuchse geschaltet werden. Dieses Signal kann ich dann mit einem externen Schreiber erfassen. Eig hat die Langzeitmessung und der Füllvorgang Garnichts mit einander zu tun. Die Langzeitmessung dient eig nur zur Überwachung einer Anlage.


Sehe ich das richtig? Du willst 2 Sensoren 0 bis 20mA und 4 bis 20mA umschaltbar über ein und den selben Analogeingang einlesen?
Dann musst du den Eingang als 0 bis 20mA festlegen und beim skalieren 0 bis 27648 bzw. 5530 bis 27648 vorgeben.
Kann man machen, ist aber Gemurckse.



Schmidtchen schrieb:


> Das Wasser war doch nur ein Beispiel (Bei einem geschlossenem Gefäß steigt ja auch der Wasserdruck wenn es voll wird oder?).


Bei einem OFFENEM Gefäß kannst du über ein "Blubberröhrchen" am Boden Luft einblasen und über den Staudruck
die Höhe des Füllstandes ermitteln. Mehr fällt mir dazu nicht ein.



Schmidtchen schrieb:


> Ok....woher weis ich denn ob sich jetzt ein FC sich besser als ein FB eignet (oder anders herum)?


Nimm einfach im Zweifelsfall immer FB. Ist einfacher in der Handhabung. Und noch mal SIEHE MULTIINSTANZ.

OK Alles in allem habe ich immer noch nicht kapiert was das eigentlich werden soll.

Ich hoffe nur, dass es sich um einen Schreibfehler handelt und du nicht wirklich an einer
Anlage rumhantierst wo Drücke bis zu 3000bar entstehen können.


----------



## Paul (21 Januar 2014)

Schmidtchen schrieb:


> Hab nochmal eine Frage, bei der Langzeitmessung möchte ich ja die Messwerte auf eine Messbuchse legen (da muss ich meine *Temperatur* auf das gewünschte Ausgangssignal skalieren). Da ich das Signal von Sensor (Integer) in einen Realwert umgewandelt habe muss ich das ja auch wieder in einen Integer umwandeln bevor ich es ausgebe oder?


Von Temperaturen war bisher noch nie die Rede. 
Wohin willst du es denn ausgeben? Zu dem Schreiber?


----------



## Schmidtchen (22 Januar 2014)

Guten morgen,



Paul schrieb:


> Na ja ist ja schon mal was, aber ehrlich gesagt glaube ich dir das nicht.
> Sonst würdest du nicht das Thema 0 bis 20mA und 4 bis 20 mA auf den Tisch bringen.
> 
> 
> ...



Nee war kein Schreibfehler, ich habe einen 19 Zolleinschub aus einer älteren Anlage und die liefert mir einen Wert 0 - 20 mA den ich dann in die SPS einlese (19 Zolleinschub besteht aus Netzteil, Verstärker und Drucksensor für 3000 bar).


----------



## Schmidtchen (22 Januar 2014)

Paul schrieb:


> Von Temperaturen war bisher noch nie die Rede.
> Wohin willst du es denn ausgeben? Zu dem Schreiber?



Also die Temperatur wir eigentlich auf meinem KTP angezeigt und soll aber bei einer Langzeitmessung an einer Messbuchse, so kann diese vom Schreiber mitgezeichnet werden (Wie der Druck)


----------



## Schmidtchen (22 Januar 2014)

hucki schrieb:


> Ach Du Sch...! In TIA hab' ich noch gar nicht archiviert.
> 
> Also, ja, genau dort. Namen angeben (sollte es nicht als Ordner geben, sonst öffnet er diesen) und speichern.
> Das Ergebnis ist ein zip-Archiv mit veränderter Endung. Das kannst Du hier hochladen.
> Falls die Forumssoftware da nicht mitmacht, entweder nochmal zippen (z.B. mit 7zip) oder Endung zu Zip ändern und hier mit posten, wie sie original war.



Ich teste es mal  aus.....


----------



## SoftMachine (22 Januar 2014)

-


hucki schrieb:


> Das Archivieren des Programms (unter Datei) erstellt auch ein zip-Archiv.





hucki schrieb:


> Ach Du Sch...! In TIA hab' ich noch gar nicht archiviert.
> Also, ja, genau dort. Namen angeben (sollte es nicht als Ordner geben, sonst öffnet er diesen) und speichern.
> Das Ergebnis ist ein zip-Archiv mit veränderter Endung.
> ...



@ hucki

Kannst du mir das als ebenfalls unbedarften TIA-Neuling doch nochmal genauer erklären ?  

Gruss


----------



## Schmidtchen (22 Januar 2014)

Hallo Leute, ich hänge gerade bei der Ausgabe eines analogen Messwertes. 

Ich hab mal ein paar Bilder gemacht, ich hoffe man kann es diesmal lesen und ich setzte nicht voraus das ihr hellsehen könnt  

Also ich habe mir mit einem Kalibrator eine Temperatur vorgegeben (0 bis 1372°C --> Typ K). 

Beim einlesen meines Messwertes (Integer) habe ich diesen dann in einen REAlwert gewandelt und anschließend durch 10 dividiert. siehe Bild "Umwandlung Eingangsmesswert_Temperatur"

Nun möchte ich den Wert auf einen analog Ausgang legen um diesen mit einem externen Schreiber erfassen zu können, dafür hatte ich den Baustein SCALE X vorgesehen. Vorher hab ich aber meine Temperatur (Istwert) durch 1000 geteilt und an scale übergeben. Da ich 4 bis 20 mA als Signal haben möchte, habe ich auch so Min und Max ausgewählt. 

Ich muss dazu sagen, dass mein AI ein SB 1231 TC mit 1x16 Bit ist und mein AQ (SM1234) nur 13 Bit Auflösung hat, kommt daher die Abweichung? 

Nächste Sache, in der HW_Konfig hab ich über Eigenschaften meinem Kanal 2 (AQ Temperatur) als Ersatzwert (beim Wechsel von RUN auf STOP) 4 mA gegeben. Leider kann ich immer nur 4 mA messen egal welche Temperatur ich einstelle. also auch wenn ich 1372 a einstelle und mein Ausgang ca. 24 anzeigt....

Könntet ihr mal drüber schauen ob das so grob richtig ist oder irgendwo noch ein Fehler ist....

Ich hoffe ich habe nix vergessen.....

LG


----------



## hucki (22 Januar 2014)

SoftMachine schrieb:


> @ hucki
> 
> Kannst du mir das als ebenfalls unbedarften TIA-Neuling doch nochmal genauer erklären ?


Ernsthaft? 
*Umschau* 
*versteckte Kamera such'*




Na gut:

1. TIA (-Projekt) in der Projektansicht öffnen.

2. In der Menüleiste ganz links das Menü Projekt öffnen. 
("Hürde" Nr.1: das heißt bei gefühlten 99,99% der übrigen dt. Windowssoftware immer "Datei", deshalb hatte ich das Schmidtchen auch erst so gesagt und er hat mich berichtigt)

3. Menüpunkt Archivieren auswählen

4. Im sich öffnenden Fenster den Speicher-Ordner und Archivnamen angeben. 
(Hier Hürde Nummer 2: Wenn es im angegebenen Speicher-Ordner einen Unterordner mit dem gleichen Namen, den man für das Archiv möchte, gibt, wird nicht das Archiv angelegt, wie eigentlich gewünscht, sondern der Unterordner geöffnet. Das ist insofern "problematisch", das standardmäßig der Ordner geöffnet wird, in dem sich der Projekt-Ordner befindet und genau dessen Name auch als Name für das Archiv vorgegeben wird.)

5. Archivieren klicken. 



Danach kommt Hürde Nr. 3 für's Hochladen im Forum: Das Archiv ist zwar ein zip, aber TIA benennt es in z*a*p um und hängt zusätzlich noch die Nummer der TIA-Version an. Bei TIA 12 bekommt man also ein "_Archiv_.zap12".
Ich hab's nicht probiert, aber ich vermute mal, dass dies so keine erlaubte Dateiendung für's Hochladen im Forum mehr ist. Die einfachste Abhilfe - wieder in *.zip umbenennen und man kann es hochladen.
Diese *.zip-Datei kann man nach dem Download zwar wie jedes andere zip-Archiv entpacken und sich selbst um den ganzen Rest zum Öffnen kümmern, nur mit TIA dearchivieren kann man es so nicht. Wer also mit dem entzippen nicht klar kommt, braucht noch die originale Dateiendung, um das Archiv wieder zurück zu benennen.


PS: Softmaschine hat mich da gerade auf etwas aufmerksam gemacht, was mir deswegen nicht bewußt war:



hucki schrieb:


> Ach Du Sch...! In TIA hab' ich noch gar nicht archiviert.


Das Archivieren ist wohl erst mit TIA V12 möglich.
:|


----------



## Paul (22 Januar 2014)

@Schmidtchen betr. Bilder #90

Wenn du an ein PAW 20 schickst kommen doch keine 20mA raus.
 27648  entspricht 20mA (100%)  (NICHT 32767!!!!!)

Bei den PEW entspricht auch 27648 100%

Das gilt jedenfalls für S7 Classic würde mich wundern wenn es bei TIA anders ist


----------



## PN/DP (22 Januar 2014)

Tippfehler?

Auch bei den Analogausgängen gilt: 27648 entspricht 20mA

Harald


----------



## Paul (22 Januar 2014)

PN/DP schrieb:


> Tippfehler?
> 
> Auch bei den Analogausgängen gilt: 27648 entspricht 20mA
> 
> Harald


Danke Harald, da habe ich echt was durcheinander gebracht


----------



## Schmidtchen (23 Januar 2014)

Danke für den Hinweis.


----------



## Schmidtchen (24 Januar 2014)

Moin, 

ich hab das mit der Temperaturausgabe (4 bis 20 mA) nochmal neu gemacht. Sollte jetzt eigentlich stimmen. Weis jemand wo ich von Siemens die Datentypen mit der dazugehörigen Auflösung?? (Konnte es über die Hilfe nicht finden) 
Da ja ein REALwert eigentlich ein "Floatwert" ist und der REALwert bei Siemens nur bis 27648 geht (normal wären doch 32767), ist das so richtig? 

Anbei noch ein Bild von der Temperaturausgabe.

Ich habe gestern mit einem Kollegen gesproche


----------



## vollmi (24 Januar 2014)

Gleitpunkt ist bei Siemens 32Bit gross. Wie man die Auflösung ausrechnet steht hier.

http://de.wikipedia.org/wiki/Gleitpunkt

Man kann also in Real deutlich mehr wie 27000 darstellen.

Was du aber wohl meinst ist Integer 16Bit Integer geht wirklich nur bis 32767.

mfG René


----------



## Schmidtchen (24 Januar 2014)

Die Auflösung ergibt sich ja eigentlich aus 2^Bitanzahl....

Ich glaub ich hab das falsch beschrieben, Integer geht bis 32767(16Bit)...warum geht das bei Siemens nur bis 27648 ? Muss ja mein Signal darauf skalieren.

REAL ist eine Siemens Bezeichnung für einen Float-Wert....und hat eig 32 Bit oder?

LG


----------



## vollmi (24 Januar 2014)

Weil ein teil der Integer bandbreite für übersteuerung untersteuerung und Fehlermaske verwendet wird.

Näheres siehst du in den Baugruppendaten
https://support.automation.siemens....objaction=csview&extranet=standard&viewreg=WW

Kapitel Analogwertdarstellung der Analogkarten.

Das hat überhaupt nichts mit der Integerbehandlung an sich zu tun.

mfG René


----------



## Schmidtchen (24 Januar 2014)

Ich wollte mir einen Impuls zum stoppen eines Prozesses generieren, leider funktioniert es nicht.

Die Variable "Abbruchbedingung_Füll" werte ich auf eine negative Flanke aus, wenn diese Abbruchbedingung_Füll von 1 auf 0 wechselt, bekomm ich eine 1 an meinem Timer aber die Zeit läuft nicht ab. Es sollte doch eigentlich funktionieren oder?

Eine andere Frage  noch, ich hab mir ja einen DB für den Timer erzeugt, in dem sollte ich doch dann über PT die Zeitdauer des Impulses eintragen bzw wenn ich das dort habe, wieso muss ich es nochmal bei Value am Timer schreiben. (oder brauch ich das eine nicht...??)

Ich hoffe ich kann am Freitag Nachmittag nochmal auf eure Hilfe zählen  schon mal danke


----------



## Paul (24 Januar 2014)

Schmidtchen schrieb:


> Ich wollte mir einen Impuls zum stoppen eines Prozesses generieren, leider funktioniert es nicht.
> 
> Die Variable "Abbruchbedingung_Füll" werte ich auf eine negative Flanke aus, wenn diese Abbruchbedingung_Füll von 1 auf 0 wechselt, bekomm ich eine 1 an meinem Timer aber die Zeit läuft nicht ab. Es sollte doch eigentlich funktionieren oder?
> 
> ...


Schreib doch einfach mal an deinen Timer einen normalen Eingang oder einen freien Merker hin, den du beliebig setzen/rücksetzen kannst.
Dann siehst du doch, ob es am Timer oder an deiner Flanke liegt.
Flanken scheinen ja so wie so deine besonderen Freunde zu sein.


----------



## hucki (24 Januar 2014)

@Paul,
ich muss Dir Recht geben. Schon nach nur diesem kleinen Ausschnitt, schlägt man die Hände über dem Kopf zusammen.

@Schmidtchen,
warum deklarierst Du denn 2 verschiedene boolsche Variablen, wenn sie dann gleich programmiert sind?
Das kann man doch auch mit einer machen!


----------



## Schmidtchen (27 Januar 2014)

Moin, 

Bei der Variable "Ansteuerung_Ventil" handelt es sich um eine Output-Variable, sodass sich diese nicht im nächsten Netzwerk verarbeiten lässt (Flankenauswertung). Aus diesem Grund hab ich noch eine Variable "Abbruchbedingung_Füll" im STATIC-Bereich deklariert. 

Hab jetzt die Flanke erst mal herausgenommen und wieder probiert aber der timer läuft nicht ab.

Ich hab den Timer als Systembaustein (siehe Foto) muss ich dort denn überhaut eine Zeit an PT deklarieren oder reicht es wenn ich es lokal an der Verwendungsstelle mache??

LG


----------



## vollmi (27 Januar 2014)

Wieso deklarierst du den Timer nicht auch im stat Bereich des aufrufenden bausteins?


----------



## Schmidtchen (27 Januar 2014)

Hab mir eben mal ein weiteres Netzwerk eingefügt und mir einen weiteren TP aber diesmal als Multiinstance deklariert, nun funktioniert das schon mal. 
Áber warum funktioniert die Einzelinstance nicht? (bzw für was würde ich eine Einzelinstance nehmen?)
Jetzt muss ich nur noch die Flankenauswertung dazu bauen. 

LG


----------



## vollmi (27 Januar 2014)

Für timer nimmst du nie einzelinstanzen. Und in Bausteinen die du womöglich kopieren willst sowieso nicht. Wenn du deinen baustein nun zweimal aufgerufen hast ist auch die tp instanz zweimal in verwendung dann tut der timer nicht. Das gilt auch für flanken und alles andere mit instanz.


----------



## Schmidtchen (28 Januar 2014)

Moin, 

Ich bin grad dabei ein paar kleinere Probleme zu beheben. 
Da ich vergeblich hier nach einer Lösung gesucht hab frag ich einfach mal, ich lasse mir das Datum und die Uhrzeit in zwei sepperaten Feldern anzeigen. Aber das Datum stimmt nicht, kann ich das irgendwie einstellen das die Zeit und das Datum aktualisiert wird? Denke mal das KTP 600 (BASIC PANEL) wird einen Wert aus der SPS benötigen, macht man das mit einem speziellen OB oder ....??

Ist das überhaupt möglich, wenn ich das Gerät "autark" verwende bzw. das Gerät mal komplett ausgeschaltet werden kann (Spannungsversorgung unterbrochen). Wäre es da sinnvoller eine Aktualisierungsabfrage beim starten des Gerätes (wenn die CPU in RUN geht) zu machen??


----------



## gerryvel (28 Januar 2014)

Uhrzeitfunktionen













Glossar



RD_SYS_T:  Uhrzeit lesen (S7-1200, S7-1500)


Dieses Kapitel  enthält Informationen zu folgenden Themen:

WR_SYS_T: Uhrzeit stellen (S7-1200, S7-1500)
RD_SYS_T: Uhrzeit lesen (S7-1200, S7-1500)
RD_LOC_T: Lokalzeit lesen (S7-1200, S7-1500)
WR_LOC_T: Lokalzeit schreiben (S7-1200, S7-1500)
SET_TIMEZONE: Zeitzone setzen (S7-1200, S7-1500)
TimeTransformationRule (S7-1200, S7-1500)
SNC_RTCB: Uhrzeitslaves synchronisieren (S7-1500)
TIME_TCK: Systemzeit lesen (S7-1500)
RTM: Betriebsstundenzähler (S7-1200, S7-1500)


----------



## Schmidtchen (28 Januar 2014)

Danke für den Link, aber leider funktioniert dieser nicht.


----------



## kiar (28 Januar 2014)

Moin,

das ist ein Auszug aus Deiner Hilfe 

Raik


----------



## gerryvel (28 Januar 2014)

das ist der Auszug aus der Online-Hilfe, einfach mal rauskopiert. Die Links hat's automatisch gemacht, weil die Hilfe ja HTML macht, sorry.
mkMSITStore:C:\Program%20Files%20(x86)\Siemens\Automation\Portal%20V12\Help\de-DE\ProgExtInstr2MdeDE.chm::/15889165323/17022067723.htm#
Mit "suchen" > Uhrzeitfunktionen landet man genau dort.

Und die Bausteinbezeichnungen hast Du ja auch drin, findest du unter "Erweiterte Anweisung, Datum+Uhrzeit".

Gerry


----------



## HelleBarde (28 Januar 2014)

vollmi schrieb:


> Für timer nimmst du nie einzelinstanzen. Und in Bausteinen die du womöglich kopieren willst sowieso nicht. Wenn du deinen baustein nun zweimal aufgerufen hast ist auch die tp instanz zweimal in verwendung dann tut der timer nicht. Das gilt auch für flanken und alles andere mit instanz.



Hi vollmi,

da bin ich aber anderer Meinung.

Wenn ich einen Timer in einer Ablaufebene starten aber in einer anderen aber dessen Ablauf benötige, dann nehme ich eine einzelne Instanz.
Wenn ich einen Timer in einer Funktion benötige, dann bleibt dir auch nix anderes übrig als eine einzelne Instanz zu verwenden, da gibt es keinen static Bereich.
Wenn ich einen Timer nur innerhalb eines FB benötige, dann nehme ich eine Mulit-Instanz.

Damit ein Timer nicht einen ganzen DB verschwendet, kann man mehrere innerhalb eines globalen DB anlegen. Das fühlt sich an wie in Step7 V5 mit den Timernummern. Nachteile hab ich noch keine besonderen entdeckt. Nur die üblichen wegen des konsistenten Ladens.

'n schön' Tach auch
HB


----------



## Schmidtchen (29 Januar 2014)

Moin, hätte mal ein Frage zur Datentypumwandlung....

Ich möchte eine Messzeit eingeben (im Format: 00:00 hh:mm) und diese auf den gültigen Bereich testen (00:00 < Time < 24:00).

Da ein Größer Gleich nur mit Werten vom Datentyp "Time" arbeiten kann, wollte ich die Variable "Sollwert_Messzeit" von "Time_OF_Day" in Time wandeln, dass schein auch zu funktionieren. Wenn ich aber die untere Grenze (00:00) bzw die obere Grenze (24:00) konvertieren will geht das nicht. 

In welchen Datentyp müsste ich konvertieren um die Zeit weiterverarbeiten zu können? (Bei Time muss ich ja meine Stunden noch in Sekunden umrechnen oder? )



Was ich eigentlich vorhab ist, nach dem prüfen des Gültigkeitsbereiches möchte ich die Zeit die eingegeben wurde ablaufen lassen und mir das in einem anderem Feld anzeigen lassen. 

Oder wäre es ratsam eine Getrennte Eingabe von Stunden und Minuten zu machen und diese zu überprüfen? 

Wie würdet ihr das angehen?


----------



## Schmidtchen (29 Januar 2014)

Schmidtchen schrieb:


> Moin, hätte mal ein Frage zur Datentypumwandlung....
> 
> Ich möchte eine Messzeit eingeben (im Format: 00:00 hh:mm) und diese auf den gültigen Bereich testen (00:00 < Time < 24:00).
> 
> ...



Hab jetzt schon was gefummelt, hab es über eine getrennte Eingabe gemacht und Addiere die Systemzeit mit einem normierten und skalierten Wert. (als Eingabe habe ich einen Integerwert (für Stunden: 00<Stunden< 24 und für Minuten: 00<Minuten<59)

Ich habe 24h auf 86400 Sekunden (24 x 3600 Sekunden)  und  59 Min auf 3540 Sekunden skaliert. Kann es sein das ich auf Millisekunden skalieren muss?? also alles noch mit 1000 multiplizieren??


----------



## Paul (29 Januar 2014)

Du kannst für die Variablen im KTP Grenzwerte vergeben, so dass falsche Werte gar nicht angenommen werden

Die Zeitbasis für IEC Timer ist Mllisekunden


----------



## Schmidtchen (30 Januar 2014)

Ich versuche gerade einen Fehler zu beseitigen, leider klappt es nicht.

Bei der Druckmessung (maximal 400 bar = 4 bis 20 mA) tritt eine gewisse Abweichung von dem erwarteten Wert auf. Ich hatte zu erst den Druck über eine Geradengleichung berechnet, hatte zunächst auch funktioniert war bloß nicht so genau. 

Da ich bei 20 mA einen Druck von ca. 380 bar hatte an statt 400 bar. (Über Geradengleichung berechnet)

Nun wollte ich mit Norm_X und SCALE_X diese Messungenauigkeit beseitigen, klappt aber nicht. 
Ich habe mir für die Signalvorgabe (4 bis 20 mA) einen Kalibrator genommen und den anstatt des Sensors angeklemmt. 
Wenn ich 4 mA einstelle habe ich 25 bar, bzw die AI karte gibt 6950 aus....sollten doch aber eigentlich 5530 sein oder?? 

Was mach ich falsch? Wo liegt der Fehler? 

LG


----------



## vollmi (30 Januar 2014)

Wenn du die karte in der hardware mit 4-20mA eingestellt hast, müsste sie bei 4mA genau 0 anzeigen.


----------



## gerryvel (30 Januar 2014)

stimmt schon, eigentlich müsstest Du weniger sehen. 

Mache doch einfach mit dem Kalibrator 4 mA und stelle den Min an deinem Baustein so ein, das der Ausgang 0 bar bringt, und dann das gleiche für den 20mA Wert, bis du 400 bar siehst. Wenn Du das in einen DB legst und auf' Panel bringst, hast du ein Justiermenü ;-)


----------



## Schmidtchen (31 Januar 2014)

Danke für den Hinweis, hab eben nochmal geschaut aber die Karte ist richtig eingestellt....

Kanal 1 ist IW96 4...20mA

Ich wird mal schauen was ich bei 4 mA und bei 20 mA bekomme und die Werte dann bei der Normierung verwenden.

LG


----------



## vollmi (31 Januar 2014)

Wenn du bei 4mA nicht die Werte aus den baugruppendaten (4mA = 0) bekommst. Dann kannst du davon ausgehen dass da noch ein verdrahtungsproblem besteht.


----------



## Schmidtchen (31 Januar 2014)

Da muss ich nochmal schauen, aber eig hängt bloß der Kalibrator an den Klemmen (sollten geöffnet sein). 
Du hast recht, Sie waren noch zu....(Verdrahtungsfehler) ---> gute Diagnose :s12: --> jetzt passt es  

Also ich hab bei 

4 mA = 6961
20 mA = 32767


----------



## vollmi (31 Januar 2014)

Falscher Wert bei 4mA. Der muss Null sein. Kanal 1 ist bei dir eben nicht als 4 -20ma konfiguriert. Schau dein Bild nochmal an.


----------



## Schmidtchen (31 Januar 2014)

Eben bemerkt, bei 4 mA bekam ich rund -90 bar...hab jetzt 4 mA = 0.0  und 20 mA = 27648 normiert und jetzt Zeit es das richtige an....


----------



## Schmidtchen (3 Februar 2014)

Moin moin, 

ich hab mich nun der Datenerfassung gewidmet. Soll folgendermaßen aussehen (zumindest hatte ich das mir so überlegt) ich ermittle mit einem zyklischen OB (alle 100 MS) den Druck und Addiere diesen zu einer Summe und gleichzeitig lasse ich einen Zähler bis 600 hochzählen (alle 100 MS ++1). Einen Abgleich von Max und Min-Wert des Druckes hab ich auch noch. 

Nun möchte ich jede Minute den Mittelwert (aus Summe_Druck und Zähler) bilden, die Temperatur möchte ich auch erfassen und die Systemzeit auslesen. (dafür hab ich mir einen weiteren OB geholt mit einem Zyklus von 1 Minute. 

Jetzt kommt die eigentliche Frage, kann ich alle diese Sachen in einen Array packen  oder pack ich jedes in einen Array und dann in einem gesamten Array (Array in Array)? 

Was ist da möglich bzw wie würdet ihr das machen?? 

LG


----------



## hucki (3 Februar 2014)

Wozu willst Du Max, Min und Mittelwert in ein Array packen? Die kann man doch jederzeit neu berechnen.


----------



## Schmidtchen (3 Februar 2014)

Ich möchte die Daten dort ablegen und quasi einen Messdatensatz erstellen, mit dem ich ein Diagramm füttern kann bzw. den Datensatz speichern. 

Andere Frage noch, wenn eine Speicherkarte nicht ausreicht zur Datenspeicherung, welche Möglichkeiten der Datenspeicherung hat man noch? 

LG


----------



## hucki (3 Februar 2014)

Das ist ja das, was ich meine.

Du hast schon einen Haufen Messdaten, die Du logischerweise speichern musst, und willst noch einen dreifach so großen Haufen speichern, obwohl Du Dir diese Daten jederzeit berechnen kannst. Also nochmal - wozu?

Ich würde diese Werte immer nur dann berechnen, wenn sie angezeigt werden müssen, aber nicht speichern.


----------



## Schmidtchen (3 Februar 2014)

Ok, also meinst du ich soll die Daten speichern und aus dem Datensatz dann meine Daten die ich Anzeigen will berechnen? (Hab ich das so richtig verstanden?) 

Noch mal zu dem Wozu (kann sein das ich aufm Schlauch stehe) 

Während einer Messung möchte ich mir den Druckverlauf auf dem KTP 600 anzeigen lassen (also man muss  bzw soll den Button Diagramm anwählen um das Diagramm zu sehen). Ursprünglich war geplant 2 oder 3 Messungen (Messdatensätze) zu speichern und wenn man diese sich später anzeigen lassen möchte kann man einen Datensatz anwählen und erzeugt ein Diagramm (Wo auch Max & Min-Werte) angezeigt werden.


----------



## hucki (3 Februar 2014)

Schmidtchen schrieb:


> Ok, also meinst du ich soll die Daten speichern und aus dem Datensatz dann meine Daten die ich Anzeigen will berechnen? (Hab ich das so richtig verstanden?)
> 
> Noch mal zu dem Wozu (kann sein das ich aufm Schlauch stehe)


2x Ja.

Was nimmt wohl mehr Platz weg - eine Formel, die Du immer wieder benutzen kannst, oder die X Ergebnisse dieser Formel?

Deshalb fragte ich: Wozu speichern. Das Ende ist immer das Gleiche: Das Ergebnis wird angezeigt. Egal ob gespeichert oder frisch berechnet.

Excel speichert auch keine Ergebnisse, sondern berechnet sie bei jedem Öffnen neu.


----------



## Schmidtchen (3 Februar 2014)

Ok, jetzt hab ich zumindest schon mal einen Anfang. 

Ich würde also erst mal Blind alle 100 MS die Werte des Drucks in einem Array ablegen? Wird das dann nicht ein bisschen viel? Wären ja dann 600 Messwerte pro Minute und dann mal 24 Stunden gibt ja dann (60x600)x24 =864000 Messwerte (nur für den Druck), da ist Temperatur, und Uhrzeit noch nicht dabei.

Um das nicht so ausufern zulassen, wollte ich ja nur die Mittelwerte speichern (die erzeugen mir nur mein Diagramm)....hab ich die Info am Anfang nicht gegeben? 

LG


----------



## hucki (3 Februar 2014)

Schmidtchen schrieb:


> Um das nicht ausufern zulassen, wollte ich ja nur die Mittelwerte speichern (die erzeugen mir nur mein Diagramm)....hab ich die Info am Anfang nicht gegeben?


Nicht wirklich. Zumindest ist es bei mir nicht angekommen.


----------



## Schmidtchen (3 Februar 2014)

Entschuldige, also ich ermittle alle 100 Millisekunden einen Wert und nach 1 Minute soll ich aus den aufgenommen Werten den Mittelwert bilden und der soll dann gespeichert bzw angezeigt.

Speichern bzw anzeigen muss ich: Mittelwert_Druck jede Minute, dazu die Temperatur und Uhrzeit (Druck abhängig vom Zeitverlauf) 

Unter dem Diagramm steht dann noch Minimalwert und Maximalwert

Deswegen hab ich den Druck alle 100 MS addiert (Istwert + Summe = Summe) und ein Zähler zählt jede 100 MS ++1 
Diese Werte hab ich in einem DB geparkt und hol mir diese nach einer Minute um den Mittelwert zu berechnen (über einen zyklischen OB), da hole ich mir auch die Temperatur und die Uhrzeit...

Jetzt kann ich ja sagen schreib mir jedes mal den Wert in ein Feld, dafür müsste ich doch aber den Mittelwert (Druck), die Temperatur und die Uhrzeit zusammen packen oder immer 3 Felder für einen Messwert nehmen ? 
Oder kann man auch jeden Wert in einem eigen Array schreiben bzw geht das dann auch wieder sinnvoll zu entwirren (damit ich das Diagramm füttern kann)

Ich glaub im TIA V12 gehen nur eindimensionale Arrays oder?? 

LG


----------



## shutdown_TIA12 (3 Februar 2014)

> Ich glaub im TIA V12 gehen nur eindimensionale Arrays oder??



Leg dir ein PLC Datentyp mit einem Array an.
Und in deinem Baustein definierst du einen Array von deinem PLC-Datentypen. Dann haste Array in Array... schwebt dir so was vor?


----------



## Schmidtchen (4 Februar 2014)

Moin, 

Als PLC meinst du lediglich eine Variable vom Datentyp Array oder? 

Was hätte man denn noch für Optionen die Daten zu speichern? (Mittelwert_Druck, Temperatur, Uhrzeit, Maximalwert_Druck und Minimalwert_Druck) 

LG


----------



## Schmidtchen (4 Februar 2014)

Ich muss euch leider nochmal mit einem Problem nerven (zum Thema Flanken)

Vor einem Messvorgang soll der Messbereich ausgewählt werden (am KTP 600 --> Schalter), wird jedoch während einer Messung der Messbereich geändert soll der Prozess gestoppt werden. 

Schaut mal bitte ob ihr einen Fehler seht, ich sehe nämlich keinen.....das eine Bild zeigt während der Messung und eines nach der Bereichsumschaltung während einer Messung. 

Warum schaltet die positive und die Negative Flanke zur gleichen Zeit? (Oder wird damit nur signalisiert das der Operand "True" hat?)

LG


----------



## Schmidtchen (4 Februar 2014)

shutdown_TIA12 schrieb:


> Leg dir ein PLC Datentyp mit einem Array an.
> Und in deinem Baustein definierst du einen Array von deinem PLC-Datentypen. Dann haste Array in Array... schwebt dir so was vor?



Also hab mir eine Struktur vom typ Array angelegt, hab es erst mal auf 11 Felder begrenzt (sollen dann mal 1440 werden). 
Jetzt müssen meine Messwerte nur noch rein geschrieben werden, feste Werte sind ja kein ding (Feldnummer) soll aber selbstständig jede Minute ein Feld weiter hüpfen und wieder einen Wert notieren. 

Da ist jetzt die Frage, ich wollte eig eine zählerhochzählen lassen und dann immer in dem Pfad die sich auf das Feld bezieht ändern. Macht man das so??

Ich wollte das so deklarieren: "Datenspeicher".Messdatensatz_1.Temperatur_ --> i wäre dann meine Feldzahl also 0 bis 1439 geht das überhaupt...

LG_


----------



## HelleBarde (5 Februar 2014)

shutdown_TIA12 schrieb:


> Leg dir ein PLC Datentyp mit einem Array an.
> Und in deinem Baustein definierst du einen Array von deinem PLC-Datentypen. Dann haste Array in Array... schwebt dir so was vor?



Hä???

mache dir für einen Satz Daten einen UDT mit
mittelwert : REAL
Temperatur : REAL oder vielleicht doch INT
Uhrzeit : TOD oder gleich mit datum dann eben DTL oder DT
Maximal : Real
Minimal : Real

und dann in einem DB ein array [0..5999] of datensatz



Array[ 1..10] of Array [2..20] of Dings geht nicht. Aber Array[1..10,2..20] of Dings, das geht.


'n schön' Tach auch
HB


----------



## HelleBarde (5 Februar 2014)

Schmidtchen schrieb:


> Ich muss euch leider nochmal mit einem Problem nerven (zum Thema Flanken)
> 
> Warum schaltet die positive und die Negative Flanke zur gleichen Zeit? (Oder wird damit nur signalisiert das der Operand "True" hat?)
> 
> LG



Die Box zeigt den Wert des Operanden, die nach links herausführende Linie zeigt die Flanke. Da das aber nur für einen Zyklus 1 ist, sind die Chancen, dass du da auch mal grün siehst sehr gering. Außer die Frequenz mit der die Flanke kämen wäre knapp unter der Zykluszeit -- deiner Beschreibung nach eher unwahrscheinlich.

'n schön' Tach auch
HB


----------



## Schmidtchen (6 Februar 2014)

Hallo Leute, 

Kann jetzt meine Messwerte abspeichern, hab mir dazu ein "Array [0 bis 1430] of Struct" angelegt und dort meinen Mittelwert, Temperatur, Max & Min Druck sowie die Uhrzeit. 
Jetzt kommt die spannende Frage, kann ich mit einem Baustein die Struktur auswerten bzw durchlaufen und auf die einzelnen Messwerte zugreifen??(Oder gibt es da nix fertiges?)

 Soll den zweck haben das ich die Daten in meinem HMI in Form eines Diagramms anzeigen lassen möchte.  



Hab ein KTP 600 Basic Color PN und verwende WinCC.


----------



## shutdown_TIA12 (6 Februar 2014)

HelleBarde schrieb:


> Hä???
> ...
> Array[ 1..10] of Array [2..20] of Dings geht nicht. Aber Array[1..10,2..20] of Dings, das geht.



Hallo HelleBarde,

ich wußte nicht, was Schmidtchen wollte und habe das mal in den Raum geworfen. und ich meine, dass es geht... (siehe Bild)


----------



## HelleBarde (9 Februar 2014)

Hallo shutdown_TIA12

du hast Recht, das geht. Man kann einen UDT machen, in dem genau ein Element vom Typ Array drin ist und sonst nix. Aber dann hast du eben kein Array of Array, sondern ein Array of Struct x: Array. 

Wenn man ein Array of Array hat, dann würde der Zugriff "Dings".bums[#i][#j] sein. Bei dir ist der Zugriff "Dings".bums[#i].wert_[#j] und beim mehrdimensionalen kommt "Dings".bums[#i,#j] raus.

Das sind drei verschiedene Dinge! Aber auf der anderen Seite ist das Kniebohren ;-) 

Wenn ein Benutzer so elementare Sachen fragt, dann finde ich, sollte man ihn nicht auf so außergewöhnliche Pfade wie Strukturen mit nur einem Element schubsen.

'n schön' Tach auch
HB


----------

