einfacher zufallsgenerator

linuxluder

Level-1
Beiträge
171
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
hi,

ich bin (immer noch) blutiger STEP7-Anfänger. Wer könnte mir bei der Lösung folgendes Problemes helfen?

Beim Setzen eines Merkers soll ein Zufallsgenerator gestartet werden, der einen Ausgang alle x min (0< x < 15) für y min (0 < y < 5) setzt.

Wie macht man sowas?

Danke
Gruß Jo
 
Hallo Jo,
gib doch einfach mal "Zufallsgenerator" in der Foren-Suche ein ... da gibt es ein paar Beiträge zu dem Thema ...

Gruß
LL
 
ich würde den "zufallsgenerator" dauerhaft laufen lassen und zwar als zyklusweise addition bis 15 und eine bis 5, also:

Code:
*
      L     MW    10
      +     1
      T     MW    10
      L     15  //bzw. für MW12 dann 5
      <=I   
      SPB   noze
      L     0
      T     MW    10
noze: NOP   0
wenn der merker eins ist, soll ja dann für die ermittelte zeit einen ausgang als pulspause ansteuern. also zu erst, das MW10 und MW12 wegspeichern, in MW14 und MW16 z.b..

Code:
*
      U     M      1.0
      FP    M      1.1
      SPBN  end
      L     MW    10
      T     MW    14
end:  NOP   0
da unsere ermittelten zeiten ja minuten sind und wir aber sekunden brauchen, würde ich diese noch alá

Code:
*
      L     MW    10
      L     60
      *I 
      T     MW    14
in sekunden im selben zug umrechnen.

für den taktgenerator nehme ich meinen puls-pause-(variabel) FC1691:

Code:
*
FUNCTION "PULSE_GENERATOR_VAR" : VOID
TITLE =PULSE_GENERATOR_VARI
//DATE:     03.04.2008
//AUTHOR:   4lagig
//VERSION:  V0.1 BasicVer
AUTHOR : '4lagig'
FAMILY : BoolGF
VERSION : 0.1


VAR_INPUT
  xPlcPulse : BOOL ;    
  xOn : BOOL ;    
  dOnTime : DINT ;    
  dOffTime : DINT ;    
END_VAR
VAR_IN_OUT
  dOnDelay : DINT ;    
  dOffDelay : DINT ;    
  xHelpFlag : BOOL ;    
  xOut : BOOL ;    
END_VAR
BEGIN
NETWORK
TITLE =

      U     #xOn; 
      U     #xPlcPulse; 
      FP    #xHelpFlag; 
      SPBN  end; 

      U     #xOut; 
      SPBN  off; 

      L     #dOnDelay; 
      L     1; 
      +I    ; 
      T     #dOnDelay; 

      L     #dOnDelay; 
      L     #dOnTime; 
      >=I   ; 
      SPBN  end; 
      R     #xOut; 

      L     0; 
      T     #dOnDelay; 
      SPA   end; 

off:  L     #dOffDelay; 
      L     1; 
      +I    ; 
      T     #dOffDelay; 

      L     #dOffDelay; 
      L     #dOffTime; 
      >=I   ; 
      SPBN  end; 
      S     #xOut; 

      L     0; 
      T     #dOffDelay; 


end:  SET   ; 
      SAVE  ; 
      BEA   ; 
END_FUNCTION
an xPlcPulse würde ich den 1s-takt (Mx.5) anlegen, an xOn den freigabe merker.

fast fertig, den ausgang noch beschaltet und schick ist.

ja, ich weiß, das ist nur quasi zufall, aber kaum reproduzierbar
 
Zuletzt bearbeitet:
pass wegen den datentypen auf...ist mir beim zusammenschreiben jetz nicht so aufgefallen, der FC1691 arbeitet mit dint, also entweder den auf int umschreiben oder die sekunden werte in doppelwörter schreiben

habs jetz mal so simuliert:

Code:
*
      L     MW    10
      +     1
      T     MW    10
      L     15
      <=I   
      SPB   noze
      L     0
      T     MW    10
noze: NOP   0

      L     MW    12
      +     1
      T     MW    12
      L     5
      <=I   
      SPB   noz1
      L     0
      T     MW    12
noz1: NOP   0

      U     M      1.0
      FP    M      1.1
      SPBN  end
      L     MW    10
      L     60
      *I    
      T     MD    14
      L     MW    12
      L     60
      *I    
      T     MD    18

end:  NOP   0

      CALL  "PULSE_GENERATOR_VAR"
       xPlcPulse:=M2.5
       xOn      :=M1.0
       dOnTime  :=MD14
       dOffTime :=MD18
       dOnDelay :=MD22
       dOffDelay:=MD26
       xHelpFlag:=M1.2
       xOut     :=A0.0
wobei du die eigentlich addition und begrenzung auch in einen extra FC geben könntest
 
Zuletzt bearbeitet:
Zurück
Oben