Speichern von Werten in einem Datenbaustein

robertganss

Level-1
Beiträge
13
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

mein Anliegen ist folgendes:

Ich will einen Funktionsbaustein erstellen, der auf einen Wert in einem Datenbaustein zugreift und diesen wieder an einer anderen Adresse in dem selbem Datenbaustein ablegt.

Am Ende soll es so aussehen:

Im OB will ich eine Verknüpfung zu dem FB. Wenn ich ein bestimmtes Eingangssignal erhalte, soll dieser FB den Wert aus dem Datenbaustein von der Adresse 90 laden und an der Adresse 62 dieses DB wieder ablegen. Die Werte sind vom Typ Word (W#16#0)

Das wars eigentlich, mein Problem ist, dass ich mich noch nicht so besonders mit der S7 vertraut bin, und noch nicht einmal weiß, ob man Werte überhaupt im Datenbaustein ablegen kann.

Mir wäre am meisten geholfen wenn jemand sich die Mühe macht, mir die Vorgehensweise genau zu erklären.

Schon mal vielen Dank im vorraus
Robert
 
Kein Problem ...
Der Befehl dafür heißt :

L DBW 90
T DBW 62
wenn der DB schon mit AUF DB .. aufgeschlagen wurde. Sonst :

L DB10.DBW 90
T DB10.DBW 62
oder eine andere DB-Nummer deiner Wahl ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau das hatte ich schon versucht!

vielleicht ist mein problem auch, dass der DB schon mit einem FB verbunden ist. Dieser DB war bei einer Bedienungssoftware für einen Schrittmotor dabei. Die Frage ist jetzt, wie und ob ich diesen Datenbaustein von einem Instanz_DB zu einem Globalen ändern kann, ohne dass ich die Funktionsweise zwischen dem dazugehörigen FB 10 und dem DB 101 zerstöre ?!
 
Du programmierst das dann entweder hinter (oder vor) dem FB-Aufruf in dem aufrufenden Baustein oder wenn der FB von dir ist (oder du den Quellcode hast) dann in demselben. Innerhalb des FB's läuft das Laden und Transferieren dann nur symbolisch - also :
L Wert_1_xyz
T Wert_2_abc
... oder wie immer die DW's benannt sind ...
 
Ich würde den Instanz-DB in Ruhe lassen, um die weitere Funktion des Schrittmotors nicht zu gefährden:(

Mach eine Kopie davon, oder wenn es nur ein einzelner Wert ist, kopiere eben nur diesen in einen neuen DB.

Wie, steht ja schon oben...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das sind alles sehr hilfreiche Tipps, aber warum ich diesen Wert in dem DB ändern will:
Der FB greift auf diesen Wert zu und die Ansteuerung des Schrittmotors weiss damit, welchen Fahrauftrag er starten soll. Ich muss also zwangsweise diesen einen Wert verändern, damit ich z.b. nach abschluss des ersten Fahrauftrages, welcher in der Ansteuerung des Motors gespeichert ist, der Ansteuerung mitteilen kann welchen Fahrauftrag diese als nächstes starten soll.

Ich will also gezielt diesen Wert z.b. in einer Schrittkette beliebig verändern können.

Mich würde auch interessieren, wie das funktioniert, dass man im OB einen FB aufruft und dieser dort dann als symbol mit eigen progrmmierten Eingängen erscheint. Wie ich einen Fb in den OB lad, weiss ich, aber nicht, wie man bestimmten Befehlen des FB einen Eingang seines Symboles im OB zuordnet !

vielen Dank
 
Hallo Robertgans,

geht es hier auch um den Kollmorgen.
Was für eine Schrittkettenprogramierung nimmst Du denn , Graph oder von Hand.
Wenn das von Hand programmiert wird kannst Du einfach an deinen Schrittmerker ein Move setzen, welches dir den Fahrauftrag in den DB schreibt.
Bei Graph setzt Du z.B einen Merker (auch wenn das manchen nicht gefällt), der dann in deinem Baustein für den Motor per Move den Wert in den DB schreibt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das wäre aber schon komisch, wenn man von außen im Instanz-DB Daten umkopieren muß. Hat den Der FB keine IN-Parameter, mit denen man die entsprechenden Funktionen auswählt und Aktionen auslöst?
 
Also der FB10, mit dem man den Motor ansteuern kann hat keinen Eingang oder ähnliches um einen Fahrauftrag anzuwählen.
Der FB10 nutzt auch eigentlich den DB110 (und nopch zwei andere Bausteine SF15 und SF16 oder so, aber die will und kann ich auch nicht ändern, dort stehen für sps nur die parameter für die ansteuerung für den servostar drin) für die Ansteuerung des Motors.Der DB101, bei dem ich teile der Daten ändern möchte ist ein "NUTZ.DB" (so wird er von der Firma genannt) und dient extra dazu in zu benutzen und umzuschreiben, der FB10 holt sich nur die Startwerte aus dem DB101, z.b. eben welchen FAhrauftrag er starten soll, wenn eben der Eingang "Start_MT" gesetzt wird!

Ich hab jetzt einen FB geschrieben um bestimmte Daten in dem DB 101 ändern zu können, aber es funkt noch nicht richtig:

In meinem FB steht:

U #Fahrauftrag1
L 1
T DB101.DBW62.0

U #Fahrauftrag2
L 2
T DB101.DBW62.0
usw.

bis Fahrauftrag 4. dann hab ich noch die 4 Fahraufträge oben bei "IN" als BOOL deklariert.

Als ich diesen Baustein dann im OB aufrufen wollte, muss man ja noch einen DB oben angeben, aber der war dann nur rot! was hab ich falsch gemacht ??? (siehe anhang)
 

Anhänge

  • DB101.jpg
    DB101.jpg
    33,7 KB · Aufrufe: 40
ohoh,

es wäre tatsächlich sinnvoll, wenn du dir vorher entweder die S7-Hilfe oder noch besser ein Fachbuch oder die Tutorials auf der Siemens-Homepage zum Thema FC, FB, Instanz-DB durcharbeitest.

Ein Instanz-DB wird beim Aufruf eines FB mit angegeben. Ist er nicht vorhanden, wird er vom System erstellt. Du solltest also zuerst mal deinen vorhandenen DB101 umbenennen und dann deinen FB-Aufruf nochmals neu erstellen. Alle Daten im Instanz-DB deines FB- kommen aus dem Deklarationsteil des FB. Wenn du selbst an den DB Hand anlegst und dort noch zusätzliche Datenanfügst oder welche löscht, wird er nicht mehr vom System akzeptiert, er wird rot dargestellt. Das Gleiche passiert, wenn dein DB101 eine ätere Version ist, also nicht mehr zu deinem zwischenzeitlich geänderten FB paßt.

Daten im Nutz-DB, der dann wohl ein globaler DB ist, der keinem FB als Instanz-DB zugeordnet ist, kannst du natürlich von außen ändern, dazu ist er ja da, Daten in einem Instanz-DB solltest du nach möglichkeit nicht beschreiben, das sollte nur der FB tun, dem der DB "gehört".

Dein Code ist so nicht richtig.

Code:
U  #Fahrauftrag1
L  1
T  DB101.DBW62.0

U  #Fahrauftrag2
L  2
T  DB101.DBW62.0
Das U #FahrauftragX wirkt sich nicht auf Ladebefehle aus, diese sind nicht (maxi hör gut zu :ROFLMAO:) VKE-abhängig.

Also:

Code:
      U     #Fahrauftrag1
      SPBN  NEX1
      L     1
      SPA   END

NEX1: U     #Fahrauftrag2
      SPBN  NEX2
      L     2
      SPA   END

NEX2: U     #Fahrauftrag3
.
.
.

END:  T     DB101.DBW   62
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
U  #Fahrauftrag1
SPBN NEX1
L  1
SPA ENDE
 
NEX1: U  #Fahrauftrag2
SPBN NEX2
L  2
SPA ENDE
 
NEX2: ...
.
.
.
 
ENDE:  T  DB101.DBW62

Eigentlich braucht man für diese paar Programmzeilen keinen FB, es sollte auch ein FC ausreichen.

Also einfach einen FC2 mit dem Programmcode von Ralle erstellen.

Gruß Kai
 
Vielen dank für die mühe !

da ich versucht habe, durch möglichst wenig arbeit viel zu erreichen, habe ich vieles in dem tutorial bei siemens überflogen oder ausgelassen!
werde in den nächsten wochen das mal nachholen. da es aber nur für private zwecke ist, wollte ich möglichst schnell zu einem ergebnis kommen.

ich hätte aber noch eine frage:

ich hab nirgends nachlesen können, wie ich im nachhinein herausfinde, ob ein DB ein instanz-DB oder ein glober ist.
Ich weiss auch nicht wie ich an einem FB sehe, welchem Instanz-DB er zugeortnet ist.

Ich selber hatte mir auch schon gedacht, ich schreibe diese programmzeilen in den dazugehörigen FB, aber wenn ich dann im OB den FB akualisiere, nimmt er mir auch nicht mehr den Datenbaustein an.

Und jetzt werd ich mich ein wenig an die Unterlagen setzen und lernen.

Vielen Dank im vorraus
 
Gute Frage.

1. Du kannst dir in den Referenzdaten die Programmstruktur anzeigen lassen. Dort steht neben einem FB, dessen IDB, allerdings nur, wenn der FB im Programm auch verwendet, also aufgerufen wird.

2. In der Symboldatei steht bei einem IDB in der Spalte Datentyp der dazugehörige FB.
 
Hi,

nach allen Hilfen die ich erhalten habe, bin ich leider auf keinen grünen Zweig gekommen.
Ich hab jetzt das Programm im Anhang beigefügt, wer Lust hat eine Blick drüber zu werfen würde mir eine große Freude machen.
Der NutzDB ist der Db 101 und im FB2 hab ich versucht auf ihn zuzugreifen!
Hat nicht funktioniert, hab wahrscheinlich noch viel zu wenig Ahnung von dem ganzen!!
Wenns jemand schafft mir nur den FB2 richtig zu erstellen und ihn den OB einzufügen wäre mir sehr viel geholfen.

Vielen Dank
 

Anhänge

  • Robert_3.zip
    393,7 KB · Aufrufe: 5
Du hast in Deinem Programmcode eine Endlosschleife drin:

Code:
      U     #Fahrsatz1
      SPBN  NEX1
      L     1
      SPA   ENDE
 
[COLOR=red]NEX1[/COLOR]: U     #Fahrsatz2
      SPBN  NEX2
      L     2
      SPA   ENDE
 
NEX2: U     #Fahrsatz3
      SPBN  NEX3
      L     3
      SPA   ENDE
 
NEX3: U     #Fahrsatz4
      [COLOR=red]SPBN  NEX1[/COLOR]
      L     4
      SPA   ENDE
 
ENDE: T     DB101.DBW   62

Außerdem brauchst Du für diese paar Zeilen Programmcode keinen FB und damit auch keinen Instanz-DB.

Du solltest also folgendes machen:

Deinen FB2 löschen und einen neuen FC2 mit folgendem Programmcode anlegen:

Code:
      U     #Fahrsatz1
      SPBN  NEX1
      L     1
      SPA   AUSG
 
NEX1: U     #Fahrsatz2
      SPBN  NEX2
      L     2
      SPA   AUSG
 
NEX2: U     #Fahrsatz3
      SPBN  NEX3
      L     3
      SPA   AUSG
 
NEX3: U     #Fahrsatz4
      SPBN  ENDE
      L     4
      SPA   AUSG
 
AUSG: T     "NUDB".Axis.Motion_Task_No
 
ENDE: BEA

Gruß Kai
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und der FB2/DB2 ( bzw. FC2 mit Kai's Änderung !!! ) ist nirgendwo aufgerufen.

Und Obacht: Im FB10 NW12 wird das DW62 vom DW90 überschrieben.
Vermutlich ein REset to Default, aber leider nicht kommentiert.
Das DW90 ist aber im DB nicht existent, könnte also zu problemen führen.

Grüße dtsclipper
 
Vielen Dank für die Programmkorrektur !

das mit dem Verweis im FB10 auf DBW 90 hatte ich gewusst, hatte nicht aktuelle version geschickt, aber vielen dank, dass ihr euch so damit beschäftig habt.
Was mir jetzt noch sehr am Herzen liegen würde: Da der FB2 (jetzt FC2) auf den DB101 zugreift muss man das ja auch im OB angeben?! Also wenn man den FB2 im OB aufruft, und dann den DB101 (NutzDB) beim FB2 einträgt, erscheint er rot, wenn das noch gelöst werden kann, wären meine Probleme gelöst !

Robert
 
Was mir jetzt noch sehr am Herzen liegen würde: Da der FB2 (jetzt FC2) auf den DB101 zugreift muss man das ja auch im OB angeben?! Also wenn man den FB2 im OB aufruft, und dann den DB101 (NutzDB) beim FB2 einträgt, erscheint er rot, wenn das noch gelöst werden kann, wären meine Probleme gelöst !

Der DB, der am FB2 eingetragen wird, ist der so genannte Index-DB des FB2. Der Index-DB wird dem FB2 zugeordnet und enthält interne Daten des FB2. Als Index-DB für den FB2 muss man einen neuen, noch nicht verwendeten DB auswählen. Als Index-DB kann man z. B. den DB2 auswählen.

Der DB101 hingegen ist ein globaler DB, der keinem FB direkt zugeordnet ist. Der DB101 kann Daten für alle FBs und FCs im Programm enthalten, d. h. alle Bausteine können auf den DB101 zugreifen. Der DB101 wird im Programm schon verwendet und kann daher nicht als Index-DB für den FB2 verwendet werden. Wenn man den DB101 am FB2 einträgt, erscheint er also rot.

Gruß Kai
 
Zurück
Oben