# Fragen zu AWL-Programm



## Andi2 (23 Dezember 2010)

Hallo zusammen,

durch Zufall bin ich auf dieses Forum gestoßen, und muß vorneweg gleich mal sagen: Hut ab, schön das es sowas gibt!:s18:

Da ich mich schon seit geraumer Zeit beruflich mit SPS´en verschiedener Hersteller beschäftige, tauchen natürlich auch immer mal wieder Fragen auf, von denen ich hoffe, diese hier beantwortet zu bekommen (...aber ich bin zuversichtlich...).

Da bei meinem Brötchengeber zwischenzeitlich fast alle alten Steuerung auf die Simatic S7 umgebaut worden sind, besuche ich derzeit in unregelmäßigen Abständen Schulungen in München, und versuche natürlich auch, das erlernte Wissen sofort in die Tat umzusetzen.
Dabei haben sich schon (momentan!) zwei Fragen aufgeworfen, die ich hier mal loswerden will.

Frage 1:
Bei einer unserer Umfangreichen Steuerungen habe ich im OB1 eine Programmierung entdeckt, aus der ich nicht schlau werde. Diese lautet: 

Netzwerküberschrift "Eins- und Nullmerker"
U M 0.0
R M 0.0
(Kommentar dazu "Logisch 0")
UN M 0.1
S M 0.1
(Kommentar dazu "Logisch 1")

Wozu dieser Programmteil? Beide Merker werden im Programm recht häufig abgefragt.

Zweite Frage:
Wenn ich einen FB programmiere, werden die statischen Lokaldaten in einen Instanz-Datenbaustein geschrieben, den ich nach der Erstellung des FB erstelle, und dem FB zuweise.
Wenn ich jetzt aber ein vorhandenes Programm habe, bei dem ein FB mit statischen Lokaldaten vorhanden ist, wie finde ich den dazu gehörigen DB heraus, ohne alle programmierten DB´s einzeln aufrufen zu müssen?

Danke schon mal für´s antworten,
der Andi


----------



## marlob (23 Dezember 2010)

Hier werden 2 Merker gebildet die immer entweder logisch 1 (M0.1) bzw. logisch 0 (M0.0) sind.
Die kannst du immer dann einsetzen, wenn du z.B. testweise was deaktivieren oder etwas überbrücken willst. 
Siehe die Signale als Konstanten. Einmal die Konstante TRUE und einmal FALSE


----------



## marlob (23 Dezember 2010)

zum zweiten Teil. Der DB steht meist direkt beim Aufruf dabei.
Also 

```
*
CALL FB1, DB1
```
dann gehört der DB1 beim FB1.
Ausnahmen sind Multiinstanzen.
Wenn du in einem Multiinstanz-FB (z.B. FB3) einen FB (z.B. FB10) als Multiinstanz aufrufst, dann findest du die Daten vom FB10 im DB vom FB3.


----------



## M-Ott (23 Dezember 2010)

Andi2 schrieb:


> Wozu dieser Programmteil? Beide Merker werden im Programm recht häufig abgefragt.


 
Der eine Merker ist immer FALSE, der andere immer TRUE.
Es gibt verschiedene Möglichkeiten, solche Merker zu programmieren, dies ist eine davon. Die Merker kann man verwenden um beispielsweise Programmteile abzuschalten ohne den Code löschen zu müssen (einfach "U M0.0" einfügen) oder auch um Parameter an FBs oder FCs mit Dauer-1 oder -0 zu versorgen.



Andi2 schrieb:


> Wenn ich jetzt aber ein vorhandenes Programm habe, bei dem ein FB mit statischen Lokaldaten vorhanden ist, wie finde ich den dazu gehörigen DB heraus, ohne alle programmierten DB´s einzeln aufrufen zu müssen?


 
Am FB-Aufruf.
Der FB Aufruf sieht (normalerweise) so aus:

Bsp:

CALL FB 10, DB13
 ...
 ...

In diesem Beispiel würdest Du den FB10 mit dem DB13 als Instanzdatenbaustein aufrufen.


----------



## M-Ott (23 Dezember 2010)

Verdammt, zu langsam!


----------



## Andi2 (23 Dezember 2010)

*Schnell!!*

Hallo,

vielen Dank für die schnellen Antworten. Die Sache mit den Merkern ist mir jetzt klar, allerdings ist es komisch, daß diese beiden Merker im ganz normalen Programmablauf zum Einsatz kommen, und anscheinden nicht nur für den Testbetrieb.
Bei den erwähnten FB´s handelt es sich tatsächlich um Multiinstanzen (...hatte ich leider noch nicht bei meiner Weiterbildung...), und ich werde mal nachsehen, ob ich wirklich so leicht wie beschrieben den zum FB gehörigen DB finde.
Wenn ich mehr weiß, poste ich selbstverständlich wieder hier.

Grüßle,
der Andi


----------



## Sinix (23 Dezember 2010)

Andi2 schrieb:


> Hallo zusammen,
> 
> durch Zufall bin ich auf dieses Forum gestoßen, und muß vorneweg gleich mal sagen: Hut ab, schön das es sowas gibt!:s18:
> 
> ...



Zu M0.0 und M0.1 schließe ich mich marlob an. Man spricht auch von Systemmerker (taucht bei der neuen S7-1200 auf). Man findet am Ende von OB1 auch oft
UN M0.2
S M0.2
als Merker das der erste SPS-Zyklus durchlaufen ist.

Zu deiner zweiten Frage: Einen zugehörigen Instanz-DB kannst du durch Durchsicht in der Symboltablle finden. Aber nicht alle DBs sind Instanz-DBs und nicht alle FB's haben eine eigene Instanz (sondern sind Multiinstanzen)
Am einfachsten hangelst du dich vom OB1 aus durchs Programm.

MfG


----------



## Sinix (23 Dezember 2010)

M-Ott schrieb:


> Verdammt, zu langsam!



damn, noch langsamer...


----------



## marlob (23 Dezember 2010)

Andi2 schrieb:


> Hallo,
> 
> vielen Dank für die schnellen Antworten. Die Sache mit den Merkern ist mir jetzt klar, allerdings ist es komisch, daß diese beiden Merker im ganz normalen Programmablauf zum Einsatz kommen, und anscheinden nicht nur für den Testbetrieb.
> ...


Das mit dem Testbetrieb war ja nur ein Beispiel. Manchmal braucht man auch mal eine logische 1 bzw. 0 im normalen Programmablauf.


----------



## vierlagig (23 Dezember 2010)

Andi2 schrieb:


> Hallo,
> 
> vielen Dank für die schnellen Antworten. Die Sache mit den Merkern ist mir jetzt klar, allerdings ist es komisch, daß diese beiden Merker im ganz normalen Programmablauf zum Einsatz kommen, und anscheinden nicht nur für den Testbetrieb.



man kann auch konstanten für den normalen betrieb gebrauchen.
erfahrene programmierer haben deshalb meist zwei true und zwei false flags.
einmal für systemfunktionalitäten und zum anderen für inbetriebnahmezwecke ... letztere sollten nach erfolgreicher inbetriebnahme vollständig aus dem programm verschwunden sein...

aber das thema gabs dann auch schon öfter ...


----------



## Andi2 (23 Dezember 2010)

*Schon wieder!*

Hallo zusammen,

die Frage mit dem FB und DB habe ich vorhin vielleicht nicht besonders glücklich formuliert, deshalb hier der zweite Versuch:

Ich rufe in meinem Simatic Manager das Fenster auf, das mir die Bausteine des Programms zeigt (also alle Bausteine, OB´s, FC´s, FB´s, etc.). Naiv wie ich bin dachte ich, ich mache einfach auf den entsprechenden FB einen rechten Mausklick, und in einem Auswahlfenster kann ich mir den zum FB gehörigen DB suchen, doch das geht natürlich nicht! 

Ich möchte also über irgendeine einfache Funktion genau diese Information beziehen können, nur ich weiß nicht wie. Wenn also jemand eine Idee hat, bitte hier posten.

Mercy,
Andi


----------



## Gebs (23 Dezember 2010)

Hallo Andi,



Andi2 schrieb:


> Bei einer unserer Umfangreichen Steuerungen habe ich im OB1 eine Programmierung entdeckt, aus der ich nicht schlau werde. Diese lautet:
> 
> Netzwerküberschrift "Eins- und Nullmerker"
> U M 0.0
> ...



diese Art der Programmierung stammt noch aus S5-Zeiten, wo es die Befehle
SET und CLR noch nicht gab.

Grüße
Gebs


----------



## vierlagig (23 Dezember 2010)

Gebs schrieb:


> diese Art der Programmierung stammt noch aus S5-Zeiten, wo es die Befehle
> SET und CLR noch nicht gab.
> 
> Grüße
> Gebs



wobei SET und CLR bei der inbetriebnahme echt schwer wieder zu finden sind


----------



## M-Ott (23 Dezember 2010)

Andi2 schrieb:


> Ich möchte also über irgendeine einfache Funktion genau diese Information beziehen können, nur ich weiß nicht wie. Wenn also jemand eine Idee hat, bitte hier posten.


 
Wenn die DBs einen symbolischen Namen haben, dann kannst Du das in der Symbolliste sehr einfach sehen: Der entsprechende DB hat dann als Datentyp "FB xx" wobei xx für die Nummer des FB steht, zu dem der Datenbaustein als Instanzdatenbaustein gehört.


----------



## MSB (23 Dezember 2010)

vierlagig schrieb:


> wobei SET und CLR bei der inbetriebnahme echt schwer wieder zu finden sind



Noch schlimmer als das, und das meine ich jetzt wertfrei:
SET / CLR gibt es ausschließlich bei AWL ... nicht bei KOP/FUP.


----------



## PN/DP (23 Dezember 2010)

Andi2 schrieb:


> Wenn ich jetzt aber ein vorhandenes Programm habe, bei dem ein FB mit statischen Lokaldaten vorhanden ist, wie finde ich den dazu gehörigen DB heraus, ohne alle programmierten DB´s einzeln aufrufen zu müssen?





Andi2 schrieb:


> Naiv wie ich bin dachte ich, ich mache einfach auf den entsprechenden FB einen rechten Mausklick, und in einem Auswahlfenster kann ich mir den zum FB gehörigen DB suchen, doch das geht natürlich nicht!
> 
> Ich möchte also über irgendeine einfache Funktion genau diese Information beziehen können


Im Bausteine-Ordner gibt es eine Spalte "Typ", da steht bei jedem DB, ob er ein normaler Global-Datenbaustein ist oder ein "*Instanzdatenbaustein zu FB xx*". Hier kann man sehr schnell alle Instanz-DB zu einem FB finden.

Und schau Dir mal *Extras > Referenzdaten > Programmstruktur* und *Bausteine-Ordner > Rechts-Mausklick > Bausteinkonsistenz prüfen ...* an.

Harald


----------



## M-Ott (23 Dezember 2010)

PN/DP schrieb:


> Im Bausteine-Ordner gibt es eine Spalte "Typ", da steht bei jedem DB, ob er ein normaler Global-Datenbaustein ist oder ein "*Instanzdatenbaustein zu FB xx*". Hier kann man sehr schnell alle Instanz-DB zu einem FB finden.


 

Peinlich das zugeben zu müssen, aber so breit habe ich die Spalte noch nie gemacht, dass ich das gesehen jemals gesehen hätte. Wieder was gelernt.


----------



## LargoD (23 Dezember 2010)

Andi2 schrieb:


> Naiv wie ich bin dachte ich, ich mache einfach auf den entsprechenden FB einen rechten Mausklick, und in einem Auswahlfenster kann ich mir den zum FB gehörigen DB suchen, doch das geht natürlich nicht!


Der Wunsch, den zum FB gehörenden Instanz-DB zu finden, deutet darauf hin, dass Du das Prinzip der Instanz noch nicht verstanden hast, Sorry.
Es ist ja gerade das besondere an einen FB, dass er statische Variable hat, das bedeutet aber natürlich auch, dass es bei mehrmaligem Aufruf des gleichen FB mehrere Sätze dieser statischen Vaiablen gibt, eben die Instanzen.
Es kann also auch mal viele Instanzen eines FB geben, das können jeweils einzelne DBs sein oder auch Bereiche einer Multiinstanz.

Wozu willst Du eigentlich wissen, wo die Instanzen Deiner Bausteine sind?
Es ist vielleicht  mal interessant, einen Instanz-DB auzusehen, aber eigentlich sollte es beim Programmieren nicht erforderlich sein, zu wissen wo die Instanz ist, außer beim Aufruf selbst natürlich, aber da siehst Du es ja direkt.

Gruß
Erich


----------



## Andi2 (23 Dezember 2010)

*Die Erklärung*

Hallo Erich,



LargoD schrieb:


> Der Wunsch, den zum FB gehörenden Instanz-DB zu finden, deutet darauf hin, dass Du das Prinzip der Instanz noch nicht verstanden hast, Sorry.


Wie bereits oben erwähnt bin ich erst dabei, mir über Schulungen Wissen über die Simatic S7 anzueignen, und wie Du bestimmt auch gelesen hast, war das Thema Mulitinstanzen eben bei meiner ersten Schulung noch nicht dabei. Du brauchst Dich deshalb auch nicht entschuldigen, denn Du hast recht: Das Prizip habe ich noch nicht verinnerlicht, aber ich denke, ich bin auf einem guten Weg!


LargoD schrieb:


> Es ist ja gerade das besondere an einen FB, dass er statische Variable hat, das bedeutet aber natürlich auch, dass es bei mehrmaligem Aufruf des gleichen FB mehrere Sätze dieser statischen Vaiablen gibt, eben die Instanzen.
> Es kann also auch mal viele Instanzen eines FB geben, das können jeweils einzelne DBs sein oder auch Bereiche einer Multiinstanz.
> 
> Wozu willst Du eigentlich wissen, wo die Instanzen Deiner Bausteine sind?
> ...


Momentan bin ich gerade dabei, einen Programmfehler zu suchen. Um diesen zu finden muß ich erst mal das Programm vestehen, daß der Anlagenprogrammieren geschrieben hat. Um dieses tun zu können muß ich im "Fehlerfall" die Zustände verschiedener Lokaldaten wissen, um zu sehen, warum dieser Fehler auftritt. Um diese Daten abrufen zu können, muß ich Einblick in den dem FB zugehörigen Daten im DB haben.

*...und @ Harald: Danke für Deine konstruktiven Tips!:s1: Wenn ich morgen wieder in der Arbeit bin, werde ich gleich mal nachsehen, ob ich Deine Anleitungen in die Tat umsetzen kann.*

Grüßle,
Andi


----------



## Ralle (23 Dezember 2010)

In der Symboltabelle steht in der Spalte neben der DB-Nummer entweder der eigene DB, dann ist es ein Global-DB oder der FB, zu welchem der Instanz-DB gehört.


----------



## Andi2 (24 Dezember 2010)

PN/DP schrieb:


> Im Bausteine-Ordner gibt es eine Spalte "Typ", da steht bei jedem DB, ob er ein normaler Global-Datenbaustein ist oder ein "*Instanzdatenbaustein zu FB xx*". Hier kann man sehr schnell alle Instanz-DB zu einem FB finden.
> 
> Und schau Dir mal *Extras > Referenzdaten > Programmstruktur* und *Bausteine-Ordner > Rechts-Mausklick > Bausteinkonsistenz prüfen ...* an.
> 
> Harald



Hallo Harald,

also ich habe alle Deine Vorschläge mal durch probiert, und am einfachsten ist die Methode, den Typ in der Bausteinliste einzusehen. Allerdings ist zu beachten, daß man die Ansicht auf "Details" stellt, da in der Ansicht "Symbole" und "große Symbole" diese Spalte nicht erscheint.

Bis demnächst, und an alle ein schönes Weihnachten,
der Andi


----------



## bike (24 Dezember 2010)

Gebs schrieb:


> Hallo Andi,
> 
> 
> 
> ...



Einspruch!
Man kann nicht über Referenz SET und CLR finden, was öfter notwendig sein kann, und wie oben schon geschrieben wurde  funktioniert dies nur in AWL.
Daher sind 0 und 1 Merker für System und Inbetriebnahme, auch bei S7 wichtig und notwendig.

bike


----------



## peter(R) (24 Dezember 2010)

@ bike

Einspruch stattgegeben !!

ohne "immer 0" und "immer 1"  ist es unelegant.


peter(R)


----------



## Proxy (24 Dezember 2010)

Ich benutz sogar gerne 4 Logische Merker. Ich weiß es gibt nur 2 Zustände...

Die Logischen für den Betrieb. 
"Logisch 1" sowie "Logisch 0" 
und beim Inbetriebnahmen und Programmentwicklung die Merker
"Inbe Log 1" und "Inbe Log 0"
und am Ende suche ich nach den letzen 2 Merkern die dann nicht mehr da sein dürfen. Weil alle teile in betrieb genommen wurden.


----------



## vierlagig (24 Dezember 2010)

Proxy schrieb:


> Ich benutz sogar gerne 4 Logische Merker. Ich weiß es gibt nur 2 Zustände...
> 
> Die Logischen für den Betrieb.
> "Logisch 1" sowie "Logisch 0"
> ...



du bistn fuchs


----------



## Drutbluck (7 Januar 2011)

Ein FB ist eigentlich eine Funktion mit einem Datentyp (der Datentyp ist aufgebaut wie ein struct in C).

Dieser Datentyp kann Vorlage für einen DB sein, oder als Unterstruktur (Multiinstanz) in weiteren FBs vorkommen.

Um alle Vorkommen des FBs, sowohl Aufrufe als auch Verwendung des Datentyps, zu finden, gibt es bestimmt Möglichkeiten in den "Referenzdaten". Ich gehe anders vor. Ich generiere die Quelle (sofern sie nicht schon vorliegt) und suche per Textsuche nach dem Namen des FBs. Der steht bei: DB-Definitionen, FB-Aufrufen mit DB, Multiinstanz-Definitionen.

Um alle Vorkommen der Datenstruktur zu finden: erfasse alle FBs, die den gesuchten FB als Multiinstanz enthalten, auch indirekt, und speichere die Zugriffspfade. Dann erfasse alle DBs, die die gefundenen FBs als Vorlage nutzen.


Zum Sinn und Unsinn von "true" und "false" Bits: sie werden auch in anderen Programmiersprachen oft in irgendeiner Form verwendet, sind also nicht ungewöhnlich. Die Konstruktion "UN bit; S bit;" sieht eher ungewöhnlich aus, wenn man meint, dass es auch SET und CLR oder aehnliches gibt.

Ich habe noch nie nach "true" und "false" oder nach SET und CLR suchen müssen, genauso wenig wie ich zB nach der Zahl 0 suche. Wenn etwas im Programm konstant gesetzt werden muss, dann ist das eben so, ist nichts ungewöhnliches, und ist nichts wovon man alle Vorkommen auflisten müsste. Wenn es aber darum geht, Stellen mit temporärem Code zu markieren, dann können _separate_ Bits wie "Inbe Log 0" (bei mir dann eher tmp_false) hilfreich sein.

Ich finde auch SET nicht mehr oder weniger elegant als "U true".


----------

