Step 7 Verwendung der Variablentabelle und Standardbausteine

Mr. Moe

Level-1
Beiträge
14
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin, moin!

Ich schreibe zur Zeit meine Masterarbeit und komme dabei erstmalig mit der SPS-Programmierung in Kontakt. Einen Lehrgang zu Step7 oder allgemein der SPS-Programmierung habe ich nie besuchen können. Ich bin also absoluter Anfänger und Autodidakt.

Ich möchte eine hydraulische Anlage steuern und benutze dafür eine S7-300. Die Grundfunktionen habe ich in eine FC geschrieben und rufe sie mit dem OB1 auf. Eine weitere Teilfunktion habe ich als FB geschrieben und rufe den mit zwei verschiedenen zugehörigen Instanz-DB (für zwei verschiedene Betriebsarten) zyklisch im OB35 auf.


Meine erste Frage ist, wozu man eine Variablentabelle überhaupt braucht? Die Eingänge, Ausgänge, Sollwerte und Variablen lege ich doch schon in der Schnittstelle (IN, OUT, STAT) fest!?:confused:
Braucht man die Variablentabelle nur für die OB1 und OB35? Wenn ja, müssen dort nur die physischen Ein- und Ausgänge (E0.1, A4.0 usw) definiert werden, die in den OB1 und OB35 benutzt werden oder auch Merker und Variablen aus den FC und FB?
Beim Erstellen der Variablentabelle habe ich auch Probleme. Bei "Operand" trage ich die physische Adresse ein, dann will ich der Adresse unter "Symbol" einen Namen geben, doch bei 'Enter' springt der Name in die Spalte mit den Operanden und wird dort natürlich rot:confused:


Meine nächste Frage betrifft die Standardbausteine wie z. B. OB81 --> Stromversorgungsfehler, OB84 --> Hardwarefehler usw.

Die klingen ja teilweise ganz sinnvoll, aber braucht man die? Oder ich frage mal anders, braucht man die bei einer Anlage, die nur im "eigenen Haus" als Demonstrator aufgebaut werden soll, also nicht an einen Kunden geht?


Ich hoffe ich bin bisher nicht völlig auf dem falschen Pfad und ihr könnt mir meine Anfängerfragen beantworten.

VG
Mr. Moe
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK, die Variablentabelle ist also nur für die Überwachung während einer Simulation oder Testlauf. Dann habe ich das wohl mit der Tabelle im S7-Programm unter "Symbole" verwechselt.
Dann dazu die Frage, brauche ich die Symboltabelle oder muss ich die nur anlegen, wenn ich symbolisch Programmieren will?


Zu den OBs, habe ich das richtig verstanden, dass die Fehler OBs nur die Fehlerdiagnose erleichtern, aber nicht notwendig sind?
 
Zu den OBs, habe ich das richtig verstanden, dass die Fehler OBs nur die Fehlerdiagnose erleichtern, aber nicht notwendig sind?

Wenn es für Dich ok ist, dass bei Fehlern die CPU in Stop geht, lass die OBs ruhig weg.

Die Symbolik kannst Du ruhig weglassen.
Gut dokumentierte Software wird überbewertet
 
OK, die Variablentabelle ist also nur für die Überwachung während einer Simulation oder Testlauf. Dann habe ich das wohl mit der Tabelle im S7-Programm unter "Symbole" verwechselt.
Dann dazu die Frage, brauche ich die Symboltabelle oder muss ich die nur anlegen, wenn ich symbolisch Programmieren will?


Zu den OBs, habe ich das richtig verstanden, dass die Fehler OBs nur die Fehlerdiagnose erleichtern, aber nicht notwendig sind?


Mit der Variablentabelle kannst du nicht nur überwachen, sondern auch steuern (schreiben) und
damit in deinen Prozess eingreifen.

Eine Symboltabelle ist auch dann sinnvoll, wenn du absolut programmieren willst. Schliesslich
steht dann nämlich auch ein Klartext an jedem Absolutoperanden als Erläuterung dran.

Die Fehler-OB braucht man nicht nur zur Diagnose, sie "fangen" einen auftretenden Fehler auch
ab. Damit kannst du eine Fehlerreaktion programmieren, damit die Steuerung entsprechend
auf den Fehler reagieren kann.

Und wie AUDSUPERUSER schon schrieb:
Bei auftretenden Fehlern und nicht vorhandenen Fehler-OB geht deine CPU in Stop. Die OB sind
also durchaus notwendig, sie dienen nicht nur der Diagnose.

.
 
Wenn es für Dich ok ist, dass bei Fehlern die CPU in Stop geht, lass die OBs ruhig weg.

Behalten die Ausgänge den bei einem Stop die Aktualwerte, werden sie einfach spannunglos oder wechseln sie auf die Anfangswerte? Im Manual der CPU habe ich zum Stichwort Stop nichts passendes gefunden, nur Erklärungen zum Remanenzverhalten der DBs bei Wechsel Stop-Run...

Wenn die aktuellen Werte beibehalten werden, bräuchte ich wohl doch den ein oder anderen Fehler OB. Dazu melde ich mich vielleicht nochmal am Montag;)

Die Symbolik kannst Du ruhig weglassen.
Gut dokumentierte Software wird überbewertet

Verstehe;) Bisher hatte ich die Ein- und Ausgänge wenigstens in den Kommentaren der Netzwerke "beschriftet". Aber dann mache ich es damit gleich sauber.

Erst mal Danke für die Hilfe, ich bin nun wieder ein Stück schlauer.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine weitere Teilfunktion habe ich als FB geschrieben und rufe den mit zwei verschiedenen zugehörigen Instanz-DB (für zwei verschiedene Betriebsarten) zyklisch im OB35 auf.
Wirklich im OB35? Das ist nur sinnvoll wenn es sich um ein programmteil handelt welcher zwingend in einem festem zeitraster aufgerufen werden soll.
Ansonsten solltest du das im OB1 oder einem anderen FC/FB aufrufen die zyklisch vom ob1 aufgerufen werden.
 
@vollmi

Dann suche ich mal in den technischen Daten der Analogkarte.

@volker
Ja, so war es beabsichtigt. Ich will eine Rampensignal auf ein Proportionalventil geben. Die Idee dafür am besten den OB35 zu verwenden hab ich hier geklaut:ROFLMAO:
 
@vollmi

Dann suche ich mal in den technischen Daten der Analogkarte.

@volker
Ja, so war es beabsichtigt. Ich will eine Rampensignal auf ein Proportionalventil geben. Die Idee dafür am besten den OB35 zu verwenden hab ich hier geklaut:ROFLMAO:


Wow, erst 4 Beiträge geschieben, und schon kennst Du die Suchfunktion.
Super, das sind Traumfragesteller.

Und Regelungen, wenn Du die Siemensbausteine verwendest, musst Du im OB machen, da eine feste Abtastrate gebraucht wird.
Das was Du am FB angibst, sollte mit der Einstellung in der Hardwarekonfig übereinstimmen.
Du kannst die CycleTime vom OB35 in den Tempdaten aber auch auslesen, und dem RegelFB übergeben
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@AUDSUPERUSER

Kannst du deinen letzten Post noch irgendwie anders erklären?

In welchem OB muss ich die Regelungen machen, ist der OB35 nicht richtig? Die Zykluszeit habe ich für meine Zwecke in der HW-konfig angepasst.

Welche Angaben des FB müssen mit welchen Einstellungen der HW-Konfig übereinstimmen?

Zu der Sache ob ein Fehler OB nötig ist, habe ich rausgefunden, mein Analogmodul schaltet bei einem CPU Stop strom- und spannungslos. Das würde bei einem Fehler zumindest nichts schrotten;) ABER:

Ich habe heute versucht mein Programm zu testen mit S7-PLCSIM, aber die CPU geht in Stop. Kann man sich im PLCSIM irgendwie anzeigen lassen warum sie in Stop gegangen ist oder braucht man auch hier die Fehler OBs. Kann es auch durch falsche Einstellungen in PLCSIM zum Stop kommen?
 
Hallo,

ich führe meinen Thread mal weiter, hoffentlich findet ihn nochmal jemand ;)

Ich bin jetzt so weit, dass ich mein Programm simuliert habe, es dabei durchläuft und das tut, was es soll. Nur macht es dies nur langsamer, als ich es brauche.

Konkret läuft es wie gewünscht, wenn ich den OB35 in Zeiten von 45 ms oder mehr aufrufe. Verringere ich die Zykluszeit, geht die CPU in Stop. Stelle ich die Aufrufzeit z.B. auf 30 MS, läuft das Programm noch ab und zu durch. Bei 5 ms, so wie ich es eigentlich brauche, geht gar nichts mehr. Da ich eine Hochgeschwindigkeitsachse habe, kann ich die Zeiten nicht einfach zu Gunsten einer gröberen Stufung anheben.

Meine erste Theorie war, dass meine CPU (312C mit 0,2 ms/kAW) zu langsam ist. Darum habe ich sie gegen eine 313C mit 0,1 ms/kAW getauscht. Die Zykluszeiten konnte ich damit aber nicht verringern.

Hat jemand eine Idee, woran mein Problem liegen könnte?
 
Hallo,
dein Problem ist das, was das Programm macht und außerdem auch die CPU.
Der OB35 hat eine Überwachung, die anschlägt, wenn er (wieder) aufgerufen werden soll, obwohl der letzte Aufruf noch nicht abgearbeitet ist. Ich vermute, dass das dein Problem ist.
Konkret bedeutet das Folgendes :
- Das, was dein Baustein macht, ist zu langwierig. Möglicherweise machst du im OB35-Zyklus mehr als nötig. ich würde hier NUR Aufzeichnen und nichts weiter machen.
- Das Obige trifft so nicht zu - dann ist die Leistung der CPU zu schwach. Nun hast du dir mit der 312 bzw. 313 ja auch nicht gerade die Rennpferde von Siemens ausgesucht.
- Beides ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was meinst du mit Aufzeichnen? Ich verstehe den begriff in diesem Zusammenhang nicht.

In meinem OB35 steht eigentlich nur drin, dass ein einzelner FB aufgerufen werden soll, wenn bestimmte Eingänge geschaltet sind. Das ganze zwei mal. Einmal mit einem DB1 und einmal mit einem DB2. Ich habe auch schonmal versucht eine Betriebsart rauszunehmen, dass nur ein DB benutzt wird. Besser wurde das nicht.

Bringt es was eine 319 zu versuchen? Würde ich nur ungern (so kurz vor dem Ziel ;) )machen, da ich dann auch ein anderes digitale SM brauche und das meine ganzen Adressierungen durcheinander bringt, da ich bisher auch die Eingänge der 312 benutzt habe...

EDIT: Wie kann ich mir die Bearbeitungszeiten anzeigen lassen?
 
"Aufzeichnen" ist vielleicht auch falsch gewählt - ich habe das wieder von meiner typischen Anwendung abgeleitet ... 8)

Das Diskutieren der CPU ist m.E. erst müssig - was ganz genau (am Besten der Code davon) machst du denn nun im OB35.

Gruß
Larry
 
Hier der Code vom OB35, erstellt habe ich es mit FUP und nur in AWL vom Programm übersetzen lassen.

Netzwerk 1
U "Sen_Stoessel"
= L 20.0
BLD 103
U "S_Zylinder"
= L 20.1
BLD 103
U(
U "Sen_Stoessel"
U "K_Pumpe"
U "K_Testbetrieb"
UN "S_Notaus"
O
U "K_Testbetrieb"
UN "S_Notaus"
U "K_Pumpe"
U "S_Zylinder"
)
SPBNB _001
CALL "Zyklischer Ablauf" , "Daten_Testbetrieb"
Stoessel :=L20.0
man_Zylinder:=L20.1
_001: NOP 0

Netzwerk 2
U "Sen_Stoessel"
= L 20.0
BLD 103
U "S_Zylinder"
= L 20.1
BLD 103
U(
U "Sen_Stoessel"
U "K_Pumpe"
UN "K_Testbetrieb"
UN "S_Notaus"
O
UN "K_Testbetrieb"
UN "S_Notaus"
U "K_Pumpe"
U "S_Zylinder"
)
SPBNB _002
CALL "Zyklischer Ablauf" , "DB_Normalbetrieb"
Stoessel :=L20.0
man_Zylinder:=L20.1
_002: NOP 0


EDIT: Mit der 319-3 CPU bin ich muskulöse 5 ms weiter runter gekommen. Fehlen nur noch 35:rolleyes:
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
OK ... die Anweisungen, die du direkt im OB35 stehen hast, sind es nicht.
Was macht denn der FB "Zyklischer Ablauf" so ...? (Davon wäre der Code m.E. sehr viel interessanter)
Das du das mit der allein CPU so nicht gelösst bekommst hatte ich (glaube ich) erwähnt ...

Gruß
Larry
 
Konkret läuft es wie gewünscht, wenn ich den OB35 in Zeiten von 45 ms oder mehr aufrufe. Verringere ich die Zykluszeit, geht die CPU in Stop.
Warum genau geht die CPU in STOP? Was steht im Diagnosepuffer?

EDIT: Wie kann ich mir die Bearbeitungszeiten anzeigen lassen?
Die Zykluszeiten sind wie der Diagnosepuffer unter "Zielsystem > Baugruppenzustand" zu finden.

Harald
 
Zuletzt bearbeitet:
Im FB3 steht etwas mehr:
Netzwerk 1:

Code:
 U(    
      L     #MD18
      L     #MD10
      <=R   
      )     
      U(    
      U(    
      L     #MW10
      L     #SchritteMD10
      <=I   
      )     
      SPBNB _001
      L     #MW10
      L     1
      +I    
      T     #MW10
      UN    OV
      SAVE  
      CLR   
_001: U     BIE
      )     
      SPBNB _002
      L     #MD18
      L     #AnstiegMD10
      +R    
      T     #MD18
      UN    OV
      SAVE  
      CLR   
_002: U     BIE
      R     #Merker_Durchlauf

Netzwerk 2:

Code:
  U(    
      L     #MD18
      L     #MD11
      >=R   
      )     
      U(    
      U(    
      L     #MW10
      L     #SchritteMD10
      >=I   
      )     
      U(    
      L     #MW11
      L     #SchritteMD11
      <=I   
      )     
      SPBNB _003
      L     #MW11
      L     1
      +I    
      T     #MW11
      UN    OV
      SAVE  
      CLR   
_003: U     BIE
      )     
      SPBNB _004
      L     #MD18
      L     #AnstiegMD11
      +R    
      T     #MD18
_004: NOP   0

Netzwerk 3:

Code:
   U(    
      L     #MD12
      L     #MD18
      <=R   
      )     
      U(    
      U(    
      L     #MW11
      L     #SchritteMD11
      >=I   
      )     
      U(    
      L     #MW12
      L     #SchritteMD12
      <=I   
      )     
      SPBNB _005
      L     #MW12
      L     1
      +I    
      T     #MW12
      UN    OV
      SAVE  
      CLR   
_005: U     BIE
      )     
      SPBNB _006
      L     #MD18
      L     #AnstiegMD12
      -R    
      T     #MD18
_006: NOP   0

Netzwerk 4

Code:
   U(    
      L     #MD13
      L     #MD18
      <=R   
      )     
      U(    
      U(    
      L     #MW12
      L     #SchritteMD12
      >=I   
      )     
      U(    
      L     #MW13
      L     #SchritteMD13
      <=I   
      )     
      SPBNB _007
      L     #MW13
      L     1
      +I    
      T     #MW13
      UN    OV
      SAVE  
      CLR   
_007: U     BIE
      )     
      SPBNB _008
      L     #MD18
      L     #AnstiegMD13
      -R    
      T     #MD18
_008: NOP   0

Code:
  U(    
      L     #MD18
      L     #MD14
      <=R   
      )     
      U(    
      U(    
      L     #MW13
      L     #SchritteMD13
      >=I   
      )     
      U(    
      L     #MW14
      L     #SchritteMD14
      <=I   
      )     
      SPBNB _009
      L     #MW14
      L     1
      +I    
      T     #MW14
      UN    OV
      SAVE  
      CLR   
_009: U     BIE
      )     
      SPBNB _00a
      L     #MD18
      L     #AnstiegMD14
      +R    
      T     #MD18
      UN    OV
      SAVE  
      CLR   
_00a: U     BIE
      S     #Merker_Durchlauf

Netzwerk 6

Code:
     U     #M13_1
      =     L      0.0
      BLD   103
      CALL  "UNSCALE"
       IN     :=#MD18
       HI_LIM :=1.000000e+001
       LO_LIM :=-1.000000e+001
       BIPOLAR:=L0.0
       RET_VAL:=#MW20
       OUT    :="V_Prop"
      NOP   0

Netzwerk 7

Code:
   U(    
      L     #MW14
      L     #SchritteMD14
      >=I   
      )     
      U(    
      O(    
      U     #Stoessel
      BLD   100
      FP    M      0.4
      )     
      O(    
      U     #man_Zylinder
      BLD   100
      FP    M      0.5
      )     
      )     
      =     L      0.0
      U     L      0.0
      SPBNB _00b
      L     #MW10
      L     #MW10
      -I    
      T     #MW10
_00b: NOP   0
      U     L      0.0
      SPBNB _00c
      L     #MW11
      L     #MW11
      -I    
      T     #MW11
_00c: NOP   0
      U     L      0.0
      SPBNB _00d
      L     #MW12
      L     #MW12
      -I    
      T     #MW12
_00d: NOP   0
      U     L      0.0
      SPBNB _00e
      L     #MW13
      L     #MW13
      -I    
      T     #MW13
_00e: NOP   0
      U     L      0.0
      SPBNB _00f
      L     #MW14
      L     #MW14
      -I    
      T     #MW14
_00f: NOP   0

Ich vermute ich habe einfach zu viele DB Aufrufe drin zum schreiben und lesen der Variablen. Falls ihr euch über die Addition als Zähler wundert, ich wusste nicht wo ich bei jedem Aufruf einen Flankenwechsel herbekomme, damit ein Zähler zählt.

Im Baugruppenzustand steht im Diagnosepuffer:

1 Neue Anlaufinformationen im Betriebszustand STOP
2 STOP durch Zeitfehler (OB nicht geladen oder nicht möglich bzw. kein FRB vorhanden)
3 OB-Anforderungsfehler


Ich habe mal während der kurzen Funktion des Programms die Zykluszeiten beobachtet, die liegen meist zwischen 10 und 15 ms. Aber manchmal gibt's auch Ausreißer bis zu 150 ms. Dann geht's natürlich in STOP.

Falls ihr keine Möglichkeit seht, den FB zu beschleunigen, spiele ich schonmal etwas mit einer neuen CPU 314C - DP rum, die eine vorgefertigte Positionierfunktion SFB44 bietet. Vielleicht ist die schneller als mein zusammengebasteltes Gebilde :sad:
 
Zurück
Oben