# Schleife Programmieren mit Simatic????



## oli--pro (28 September 2008)

Hallo 
  Ich würde kerne eine kleine schleife Programmieren, ich weiß aber nicht wie??????geht dass Überhaupt????????

  Es soll einfach eine Eingangs Variable so lange +1 gerechnet werden bis die Ausgangs Variable gleich der Eingangs Variable ist.


----------



## Gerhard K (28 September 2008)

```
L 1
next: T #[COLOR=red]huepf[/COLOR]
        L #ende
        >=I
spb    raus
        TAK
        L 1
        +I
        T #[COLOR=red]huepf[/COLOR]
spa    next
 
raus   L 0
        T # loop
```


----------



## oli--pro (28 September 2008)

Danke, dass ging aber schnell ;-) Super 
  und so schwer ist dass ja gar nicht.
  hat jemand mal eine Seite wo alle befehle stehen die es gibt????


----------



## zotos (28 September 2008)

Das ist an sich nichts schweres.

Nur vorne weg: Schleifen sind in SPS Programmen immer kritisch zu betrachten da diese die Zykluszeit in die höhe treiben können und somit einen Watchdog Alarm auslösen können.
Wenn Du z.B. einen DINT wert hast hat dieser einen Bereich von -2147483648 bis 2147483647. Nehmen wir mal an Du beginnst intern mit 0 und willst auf 1000000 kommen dann hättest Du eine Schleife die eine Million mal durchlaufen muss ;o( 

In SCL würde das dann so aussehen:

```
WHILE Zaehler < Sollwert DO
 Zaehler := Zaehler+1;
END_WHILE;
```

In AWL wollte ich mich gerade abmühen aber Gerhard K ist mir netter weise zuvorgekommen (DANKE).

Man kann die oben erwähnte Problematik auch umgehen wenn es das System zulässt kann man anstelle einer Schleife den SPS-Zyklus (des OB1) verwenden (das ist ja quasi eine Endlosschleife). Dies würde dann aber die Laufzeit der Schleife stark nach oben treiben z.B. 1000000 x 10ms das wären dann ca. 2,8 h ;o(

Nun mein Tipp stell doch einfach mal Deine Aufgabenstellung hier rein damit man Dich besser beraten kann.


----------



## vierlagig (28 September 2008)

wobei die variante von gerhard nicht funktionieren wird, denn loop ist ein schlüsselwort und kann nicht als variablenname verwendet werden


----------



## vladi (28 September 2008)

*Hm..*

Hallo Ihr Lieben,



zotos schrieb:


> In SCL würde das dann so aussehen:
> 
> ```
> WHILE Zaehler < Sollwert DO
> ...



Ahm, das ist doch gleich wie: 
Zaehler := Sollwert;

Wozu die Schleife... verstehe ich nicht die Aubgabe von oben...vom oli-pro

Vladi


----------



## Gebs (28 September 2008)

*OP-Liste*

Hallo Oli--Pro,

beim Siemens-Support kannst Du Dir eine OP-Liste runterladen. Da müssten
alle Befehle der S7-400 drin stehen.

Hier der Link
http://support.automation.siemens.com/WW/llisapi.dll/csfetch/19539552/OP-Liste_d.pdf?func=cslib.csFetch&nodeid=19537346&forcedownload=true

Nimm dort die Operationsliste S7-400....

Grüße
Gebs


----------



## oli--pro (28 September 2008)

Also ich möchte ein Motor Steuern.
  Die Drehzahl des Motors wirt über eine Scheibe mit 30 löchern erkannt und über ein Sensor.
  An den Schnellen Zählereingang meiner SPS (313 C) gegeben  und mit ein SFB 48  erkannt.
  Der Motor wird über einen alten Frequenzumrichter gesteuert. Die Steuer Spannung für den Frequenzumrichter ist 0- 10 V DC.  Die Spannung gebe ich über ein FC106 raus.

  Die Drehzahl ist frei Wählbar über ein TP 177A. In U/min 

  Bei momentanen Lösung ist die Drehzahl bis auf +/- 2 Einheiten genau, mir gefehlt aber nicht das der Motor im solche Hübe bekommt. Wollte daher ein langsame Annäherung machen ab +/- 10 Einheiten.
  Ich stehle gleich mal mein Programm rein vielleicht habt ihr ja eine gute Idee


----------



## oli--pro (28 September 2008)

Wie stehle ich das Programm am besten rein???


----------



## vladi (28 September 2008)

*Motor*

Hi,
also du möchtest eine Drehzahlregelung (mit Istwertrückführung über dein HSC) realisieren? Da gibt es Regler FBs(FB41).

Vladi


----------



## Larry Laffer (28 September 2008)

... du kopierst den relevanten Programmteil und fügst ihn in deinen Beitrag ein.

Zu deinem Problem :
Ich glaube, dass du hier versuchst gegen das Schwingverhalten deiner Regelstrecke zu kämpfen. Das bekommst du vermutlich nur dann in den Griff, wenn du eine gewisse "Ungenauigkeit" zuläßt um eben dieses Schwingen zu vermeiden ...

Gruß
LL


----------



## oli--pro (28 September 2008)

dass Funktioniert  aber auch nicht so toll mit dem FB41


----------



## Larry Laffer (28 September 2008)




----------



## zotos (28 September 2008)

vladi schrieb:


> Hallo Ihr Lieben,
> 
> 
> 
> ...



Das trifft nicht nur auf meinen Code sondern auch auf den von Gerhard zu darum habe ich ja auch folgendes geschrieben:



zotos schrieb:


> ...
> Nun mein Tipp stell doch einfach mal Deine Aufgabenstellung hier rein damit man Dich besser beraten kann.



Dazu habe ich das ganze eh für eine Hausaufgabe gehalten.


----------



## harrylask (28 September 2008)

> Wie stehle ich das Programm am besten rein???



und überhaupt, gestehlt wird hier nix, nicht mal rein!


----------



## oli--pro (28 September 2008)

CALL  "FREQUENC" , DB1
       LADDR   :=PEW768
       CHANNEL :=0
       SW_GATE :=M200.0
       MAN_DO  :=
       SET_DO  :=
       JOB_REQ :=
       JOB_ID  :=
       JOB_VAL :=
       STS_GATE:=
       STS_STRT:=
       STS_DO  :=
       STS_C_DN:=
       STS_C_UP:=
       MEAS_VAL:=MD184                  // Eingang Drehzahl 
       COUNTVAL:=
       JOB_DONE:=
       JOB_ERR :=
       JOB_STAT:=
      NOP   0
***************************
      L     MD   184                    // Eingang Drehzahl 
      L     2
      *D    
      T     MD   188                    // Ist Drehzahl Anzeige Eingang in U/min
      L     L#1000
      /I    
      T     MW   120                    // anzeige

*******************************++++   







    L     MD   180       //soll 
      L     MD   188
      >=D   
      =     M     20.0

*****
  UN    M     20.0
      SPB   M
      L     MD   180
      L     MD   188
      -D    
      L     200
      *D    
      L     MW   180
      +D    
      T     MD   192
M:    NOP   0
**********

      L     MD   180
      L     MD   188
      <D    
      =     M     20.1
****************

      UN    M     20.1
      SPB   M1
      L     MD   188
      L     MD   180
      -D    
      L     200
      *D    
      L     MD   180
      -D    
      T     MD   192
M1:   NOP   0
*********************
   L     MD   192
      L     2
      *D    
      DTR   
      T     MD   196
************

      U     M    180.1
      =     L      0.0
      BLD   103
      UN    M    180.0
      SPBNB _001
      CALL  "UNSCALE"
       IN     :=MD196
       HI_LIM :=3.600000e+004
       LO_LIM :=0.000000e+000
       BIPOLAR:=L0.0
       RET_VAL:=MW60
       OUT    :=PAW752
_001: NOP   0


----------



## vladi (28 September 2008)

*Regeln..*

Hi,


oli--pro schrieb:


> dass Funktioniert  aber auch nicht so toll mit dem FB41



FB41-Konfiguration muss auch passen....entspr. der Regelstrecke.
Ich habe mit dem FB viele Regelungen gemacht..alles ok.

V.

P.S. Dein Code: so einfach kann man keine gute Regelung bekommen. Wo wird das Ganze aufgerufen, OB35?


----------



## oli--pro (28 September 2008)

Hey Larry Laffer 
  Der Motor hat aber keine Regelstrecke. Wenn ich den Motor 5 V gebe dann sind das konstante ca.1850 U/Min und die hat er in 2s.


----------



## vladi (28 September 2008)

*Regler*

Dein Motor, deine Istwerterfassung und die SPS zusammen ist die Regelstrecke.

V.


----------



## oli--pro (28 September 2008)

vladi schrieb:


> Hi,
> 
> 
> FB41-Konfiguration muss auch passen....entspr. der Regelstrecke.
> ...


       Im FB…… sry dass ist meine erste größer Programmierung die ich mache.
  Ich hatte mit dem FB 41 auch nur ein P verhalten hin bekommen


----------



## oli--pro (28 September 2008)

vladi schrieb:


> Dein Motor, deine Istwerterfassung und die SPS zusammen ist die Regelstrecke.
> 
> V.



dass ist aber so schnell.


----------



## oli--pro (28 September 2008)

vladi schrieb:


> Hi,
> 
> 
> FB41-Konfiguration muss auch passen....entspr. der Regelstrecke.
> ...


    Kannst du mir vielleicht mal ein Beispiel geben für die Konfiguration????


----------



## vladi (28 September 2008)

*Regler*

Hi,
ja, die Strecke ist fast nur "P", mit ein wenig "I".
Nur P wäre, wenn du Sollwert 555 1/min vorgibst, und dein Motor sofort die 555 1/min hat..eine kleine Verzögerung ist aber drin, und das ist "I"..

Also P/I Regler; Regler im OB35 aufrufen mit 20ms Cycle z.B.(am FB41-Cycle auch 20ms eintragen!); *TI* Parameter ...z.B. 250ms...*GAIN*...sollte man ausprobieren..evtl. mit "*0.1*" anfangen.
Wichtig: *Deadb_W*(Totzonenbreite):wenn dort z.B. "*1.0*" steht, reagiert der Regler nicht, wenn der Istwert *+/- 1* um den Sollwert pendelt.

Im Simatic gibt es das Tool "PID Control parametrieren"; dort kann man grafisch die Vorgänge beobachten und den Regler anpassen.

V.


----------



## oli--pro (28 September 2008)

vladi schrieb:


> Hi,
> ja, die Strecke ist fast nur "P", mit ein wenig "I".
> Nur P wäre, wenn du Sollwert 555 1/min vorgibst, und dein Motor sofort die 555 1/min hat..eine kleine Verzögerung ist aber drin, und das ist "I"..
> 
> ...


    Danke ;-) dann Probiere ich dass die Tage noch mal.
  Warum muss dass in OB35???


----------



## vladi (28 September 2008)

*-*

OB35: feste genaue Aufrufintervallen, braucht der Regelalghorithmus, um genau zu zein. Wenn dein SPS Zyklus fast immer gleich ist, sagen wir 10ms, kannst du den FB41 auch dort aufrufen(CYCLE umstellen nicht vergessen), aber OB35 ist erste Sahne für Profis. 

V.


----------



## FrankW (29 September 2008)

Nur so zur Info,

der Aufrufzyklus des OB 35 wird in den CPU-Objekteigenschaften in der HW-Konfig eingestellt.

MfG
FrankW


----------



## vierlagig (29 September 2008)

schön, dass das thema nochmal hochkommt.

loop kann als variablenname verwendet werden! ich finds nicht schön und bin dafür, dass es vermieden wird ... aber ich revidiere hiermit meine aussage, dass es nicht funktionieren würde.


```
*
      L     4
loop: T     #loop
      //irgendwas
      L     #loop
      LOOP  loop
```
...ich finds furchtbar...


----------

