TIA Probleme mit symbolischer Adressierung

CaptainB

Level-1
Beiträge
17
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo alle zusammen,

folgendes Anliegen lässt mich unruhig schlafen:

Mit folgendem Code möchte ich einen FB aufrufen.

A "DB_Flanken".FP_T_Hand
S #M_Start_Hand

A #M_Start_Hand
CC "Hand"

Dieser Code befindet sich in einem FB Betriebsarten, welcher folgendermaßen aufgerufen wurde.

CALL "Betriebsarten", "DB_Betriebsarten" //"DB_Betriebsarten" = DB3

Mein Merker #M_Start_Hand wird allerdings nicht gesetzt. In allen anderen Stellen im Programm funktioniert diese Herangehensweise, nur hier nicht.

Folgendes habe ich mit unterschiedlichen Resultaten ausprobiert:

Benutze ich einen anderen Merker, welcher ebenfalls symbolisch adressiert ist, funktioniert es.
Adressiere ich den Merker M_Start_Hand absolut mit DBX2.0 (Adresse für M_Start_Hand im DB3), funktioniert es.
Versuche ich M_Start_Hand anderweitig zu setzen, funktioniert es nicht.

Eine Flanke am Merker FP_T_Hand kommt definitiv an.
Der Merker M_Start_Hand wird nicht anderweitig zurückgesetzt, auch wenn alles dafür spricht.

Das System:

TIA V12 SP1
CPU 312

ebenfalls habe ich das ganze mit S7-PLCSIM V12 simuliert, gleiches Verhalten.


Für alle Tips und Trick schon mal ein "Dankeschön" im Voraus.

Schöne Grüße
 
Zuletzt bearbeitet:
Ist #M_Start_Hand in Static deklariert oder in Temp?
Ist der Instanz-DB DB3 konsistent und in die CPU geladen? - ggf. mal neu erzeugen und laden.

Wird #M_Start_Hand wirklich nirgendwo zurückgesetzt? Vielleicht außerhalb per absolutem Zugriff auf das DB3.DBX2.0 oder indirekt? Hast du indirekt adressierende Programmteile? Kommunizieren andere SPS oder HMI mit Deiner SPS?
Kannst Du DB3.DBX2.0 steuern (mit einer Variablentabelle?)?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo PN/DP,

1.) #M_Start_Hand ist in Static deklariert
2.) DB ist konsistent und geladen, wurde auch schon gelöscht und neu erzeugt, sowie wieder übertragen = keine Änderung
3.) Mit dem OB100 rufe ich eine Initialisierung auf, wo ich sämtliche Merker zurücksetze. Wenn es an der Initialisierung liegt, sollte eigentlich gar kein Merker funktionieren.
4.) Keine indirekte adressierten Programmteile
5.) Variable lässt sich nicht Steuern oder Forcen

Eigenartiger Weise, werden bei der Querverweisliste nicht alle Positionen angezeit, in welchen ich die Variable benutze.
Je nachdem, in welchem FB ich die Variable markiere und auf "Querverweis-Informationen" klicke, bekomme ich unterschiedliche Teilergebnisse.

Schöne Grüße
 
Zuletzt bearbeitet:
Hab es hinbekommen, weiß allerdings nicht was verkehrt war:

In meinem FB "Hand" welchen ich aufrufen wollte, war folgender Programmteil:

A "T_Spanner_einf"
FP #F_VAR_6 (*Static DB12.DBX2.5*)
AN "T_Spanner_ausf"
A "B_Spanner_ausgef"
AN "B_Spanner_eingef"
R "DB_Hand".H_V_Spanner_ausf (*Output DB12.DBX0.2*)
S "DB_Hand".H_V_Spanner_einf (*Output DB12.DBX0.3*)

Wenn ich diesen Code auskommentiert habe, hat es funktioniert. Also habe ich die Flankenfunktion in einen extra FB ausgelagert und nun funktioniert es.
Vielleicht habt ihr ja eine Idee warum es vorher nicht funktioniert hat. Wirklich befriedigend ist die Lösung nicht, da ich nicht weiß was ich falsch gemacht habe.

Schöne Grüße
 
Hi

wie oft wird der FB "Hand" im Zyklus aufgerufen?

Wenn du diesen mit der gleichen Instanz mehrfach aufrufst, dann macht dir der zweite Aufruf die gespeicherte Flanke aus dem ersten kaputt.

Und warum schreibst du nicht
R #H_V_Spanner_ausf (*Output DB12.DBX0.2*)
S #H_V_Spanner_einf (*Output DB12.DBX0.3*)

auf deine eigene Instanz solltest du immer lokal Zugreifen. Wenn jemand anders in ein paar Wochen in deinen Code schaut, wird er dir danken.

'n schön' Tach auch
HB


 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi HellaBarde,

FB "Hand" rufe ich nur einmal auf. Der Flankenmerker wurde auch nur einmal benutzt.
Ich hab deshalb nicht lokal adressiert, weil ich den FB "Hand" bedingt in AWL aufrufe, also
mit CC "Hand".
Dadurch ist für diesen FB kein DB instanziert, sodass ich bei den Variablen den DB mit angeben muss.

Schöne Grüße
 
Ich hab deshalb nicht lokal adressiert, weil ich den FB "Hand" bedingt in AWL aufrufe, also
mit CC "Hand".
Dadurch ist für diesen FB kein DB instanziert, sodass ich bei den Variablen den DB mit angeben muss.
Auf was sollte dieses im FB denn zugreifen: FP #F_VAR_6 (*Static DB12.DBX2.5*)
Auf TEMP?
Wenn #F_VAR_6 in STAT deklariert ist, dann hat dies wohl eher auf DB3.DBX2.5 zugegriffen - weil ja DB3 als IDB des aufrufenden Bausteins FB "Betriebsarten" geöffnet ist.

Wenn Du einen FB aufrufst, dann MUSST Du dafür sorgen, daß er eine korrekte Ablaufumgebung erhält. Der Code im FB kann nicht wissen, durch welche möglicherweise unsauberen Schweinereien außerhalb er aufgerufen wurde.
Das ist nicht allein nur eine passende DB-Nummer im DB2-Register (DI), sondern, wenn der FB als "multiinstanzfähig" eingestellt ist, dann muß auch AR2 mit P#DBX0.0 initialisiert werden.

Warum schreibst Du den Baustein "Hand" überhaupt als FB? Als FC hättest Du nicht diese Versorgungs-Probleme.

Wenn Du nicht weißt, wie man einen FB fachgerecht in AWL bedingt aufruft, dann programmiere den Aufruf in FUP oder KOP und schaue Dir dann den erzeugten Aufruf in AWL an. Dann wirst Du sehen, daß ein bedingter FB-Aufruf NICHT mit CC realisiert wird, sondern ein "normaler" voll ausprogrammierter CALL bedingt übersprungen wird.


Wenn ich sehe, daß Du Deinen FB "Hand" nur bedingt aufrufst, dann ahne ich schon Deine nächsten Probleme, die aus dem nur bedingten Aufruf resultieren, z.B.:
In dem FB willst Du eine steigende Flanke des "T_Spanner_einf" erkennen - ist garantiert, daß "T_Spanner_einf" sich nicht ändert während der FB "Hand" gar nicht aufgerufen wird?

Harald
 
Hi HellaBarde,

FB "Hand" rufe ich nur einmal auf. Der Flankenmerker wurde auch nur einmal benutzt.
Ich hab deshalb nicht lokal adressiert, weil ich den FB "Hand" bedingt in AWL aufrufe, also
mit CC "Hand".
Dadurch ist für diesen FB kein DB instanziert, sodass ich bei den Variablen den DB mit angeben muss.

Schöne Grüße

Au weh
dann kann FP #F_VAR_6 nicht funktionieren
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

das fällt dann wohl unter die Kategorie "dummer Programmierfehler".

Ich hab deshalb einen FB verwendet, weil ich meine ganzen Variablen im DB abspeichern kann, was wohl
bei einem FC nicht geht, laut Informationssystem von TIA. Dann können meine anderen FB's wann sie wollen auf
die Variablen zugreifen.

Bedingt habe ich immer deshalb verwendet, weil ich mir die Deklaration der Outputvariablen beim Aufruf spare.
Dann wird der Code übersichtlicher, finde ich jedenfalls.


Schöne Grüße
 
Hart aber herzlich

das fällt dann wohl unter die Kategorie "dummer Programmierfehler".
Nein, das fällt unter "völlig ahnungslos"


Ich hab deshalb einen FB verwendet, weil ich meine ganzen Variablen im DB abspeichern kann, was wohl
bei einem FC nicht geht, laut Informationssystem von TIA. Dann können meine anderen FB's wann sie wollen auf
die Variablen zugreifen.
Wie Du gesehen hast: Durch Deine ganze Scheixxe ohne Instanz-DB kann Dein FB keine eigenen Variablen speichern, sondern muß genau wie ein FC voll qualifiziert auf globale DB zugreifen.
Außerdem haben andere FB sowieso NICHT auf Variablen zuzugreifen, die ein FB lokal deklariert.


Bedingt habe ich immer deshalb verwendet, weil ich mir die Deklaration der Outputvariablen beim Aufruf spare.
Stell Dir mal vor wieviele Aufrufvariablen Du sparst, wenn Du gar keine erst deklarierst...


Dann wird der Code übersichtlicher, finde ich jedenfalls.
Also ich kann leider nur sagen, Deine Ideen sind nicht übersichtlich sondern einfach nur Scheixxe. :roll:
Ich empfehle Dir, mal einen SPS-Programmierlehrgang zu besuchen. BEVOR Du an richtigen Maschinen 'rumprogrammierst.

Harald
 
Hallo Harald,

vielleicht solltest du mal einen Kurs in Sachen Anstand und Benehmen absolvieren. Du verlässt hier eindeutig den Rahmen der
Höflichkeit. Denk einfach mal darüber nach, über deine Zitat: "Scheixxe". Es ist immer wieder beeindruckend, wie mutig manche
Leute im Foren sind.
Für deine fachlichen Tips auf jeden Fall danke, für alles andere solltest du dir ein anderes Format zulegen.

Schöne Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich kann Harald prinzipiell verstehen.
Was du so schreibst zeugt nicht von üertrieben viel Verständnis der Programmiererei. Und wenn dann jemand mit deinen Fähigkeiten eine Anlage umprogrammiert oder neu schreibt und jemand wie Harald dann an der Anlage auch mal was machen soll hat er natürlich das Problem, dass er nicht verstehen kann was das Programm machen soll.

Der Empfehlung, einen Kurs zu absolvieren kann ich nur voll und ganz zustimmen.
 
Hallo Aventinus,

natürlich kann ich ihn auch verstehen, es ging mir alleine um den "Ton" der Kritik, nicht um den fachlichen Inhalt.
Einerseits Leute als völlig Ahnungslos darzustellen, wenn man nicht mal ansatzweise deren Background versteht ist schon
ziemlich mutig.
Und dass man von DB's nocht nicht viel gehört hat, wenn man aus der S7-200 und CoDeSys 2.3 Welt kommt ist wohl verständlich.
Also nächstes mal einfach ein bisschen drüber nachdenken, bevor man wie sonst was auf der Tastatur rumhackt und seine geistigen
Ergüsse preisgibt ^^

Schöne Grüße
 
Hallo CaptainB,

OK, wenn Du meine "Hart aber herzlich"-Worte unter Männern nicht verträgst, dann entschuldige ich mich hiermit bei Dir für meine Wortwahl.
Doch ich bleibe bei meiner Feststellung Deiner "völligen Ahnungslosigkeit" in Sachen S7-Programmierung - die hast Du schließlich selber bewiesen. Wie schonmal angeschnitten: Wenn Du noch nicht ausreichend Ahnung von AWL hast dann programmiere solange nur in KOP oder FUP und schau Dir dann die AWL-Ansicht an.

Schöne Grüße
Harald
 
Zurück
Oben