wie soll das funktionieren?

P

Praktikant ohne Ahnung!

Guest
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ihr Experten, ich brauch mal wieder ein Vorschlag von euch! Ich soll ein Lauflicht machen das im OB100 stehen soll. D.h. wenn ich es anschalte dann soll einmal komplet durchlaufen und wieder zurück und wieder hin und wieder zurück und…. Also eine Endlosschleife!

Steuerung: Simatic S7 CPU 315-2 DP
Bestell Nr. 6ES7-315-2AF03-0AB0 / V 1.2
Typ: MPI Adresse: 31

An der Steuerung hängen 36 Gateway´s , jeder Ausgang soll kurz aufleuchten und dann aus gehen und dann soll der Nächste an gehen und aus gehen dann….

Also es tut mir leid wenn ich zu doof bin, aber falls noch fragen offen sind, bitte stelle.

Mit freundlichen Grüßen
Malte

Für Fehler und Schrift, haftet der Stift!!!
 
der OB100 ist ein Anlauf OB. Der soweit ich weiss nur einaml durchlaufen wird. Es wird dir also nicht möglich sein das Lauflicht darin zu erstellen. Du kannst hier aber die notwendigen Vorbereitungen treffen. z.B einen Startmerker Anstossen und eine Zählvariable Initialisieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Praktikant ohne Ahnung! schrieb:
Also ihr Experten, ich brauch mal wieder ein Vorschlag von euch! Ich soll ein Lauflicht machen das im OB100 stehen soll.
Wer ist auf die Idee gekommen, daß es im OB100 stehen soll? Ein durchgeknallter Pauker? Programme stehen gewöhnlich im OB1. Der wird sowieso schon in einer "Endlosschleife" nach Beendigung erneut ausgeführt. Der OB100 wird einmalig beim Anlauf ausgeführt. Eine Endlosschleife müßte man darin selbst ausdrücklich programmieren. Wenn man das täte, gibt es eine Chance, daß die SPS das "merkt" und in Stop geht. Aber das weiß icht nicht, einfach mal probieren.

Für ein Lauflicht-Programm gibt es folgende Ansätze:
1) Du programmierst eine Schrittkette nach dem Prinzip: Wenn kein Licht an und Takt, dann Licht 1 an. Wenn kein Licht 1 an und Takt, dann Licht 2 an, Licht 1 aus.
2) Du programmierst wiederum eine Schrittkette: Wenn kein Schrittmerker an und Takt, dann Schrittmerker 1 an. Wenn kein Schrittmerker 1 an und Takt, dann Schrittmerker 2 an, Schrittmerker 1 aus.
3) Du schaltest mit dem Takt einen Zähler weiter. Entsprechend dem Zählerstand(n) nimmst du den n-ten Eintrag einer Tabelle, die Muster für die Ausgänge enthält.
Lösung 1 ist furchtbar unflexibel: Wenn jemand ein anderes Muster als 1 Licht pro Schritt verlangt, programmierst du von vorne. Lösung 2 ist etwas besser. Die Zuordnung der Lichter erfolgt separat
Code:
U SCHRITT1
O SCHRITT45
= LICHT6
macht Licht 6 in Schritten 1 und 45 an.
Code:
U SCHRITT1
= LICHT1
...
U SCHRITT36
= LICHT36
Entspricht dann Lösung 1

Lösung 3 ist schwieriger zu programmieren, aber dafür lassen sich beliebige Muster allein durch Ändern der Tabelle erzeugen.
An der Steuerung hängen 36 Gateway´s ,
Sorry, aber was soll das sein?
Für Fehler und Schrift, haftet der Stift!!!
Aber für das überflüssige Komma haftest DU!!!!!!!!
Code:
 
naja, ich habe wenig ahnung dafon! es wurde mir nur gesagt dass ich mit dem OB100 arbeiten soll. es soll eine Endlosschleife sein wo die ausgänge der reihe nach ein und als gehen! wenn es am ende angekommen is soll es Rückwärtz zurück laufen! könnt Ihr mir nicht ein grundvorschlag geben...?
 
ICH ZIEHE MEIN BETRAG von 09:51 zurück da ich die antwort von "Zottel" nicht mitbekommen habe!

SRY
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zottel schrieb:
Wer ist auf die Idee gekommen, daß es im OB100 stehen soll? Ein durchgeknallter Pauker?

*:-X*

ich habe mir dein text mehrmals gut durchgelesen! doch ich bin ein praktikant, habe nur etwas ahnung von Visual Basic programierung, und soll ohne nennenswerte kentnisse SPS programieren! wie wird "SCHRITT1" in AWL Übersetzt?
 
am einfachsten geht das imho mit einem schiebregister.

Code:
      UN    M      1.0
      L     S5T#500MS
      SE    T      1
      NOP   0
      NOP   0
      NOP   0
      U     T      1
      =     M      1.0 //taktmerker
Code:
      UN    M      1.0                  //flanke
      SPB   ende
// links schieben
      U     M      1.1                  //linkslauf beendet
      SPB   m001
      L     MD    10
      SLD   1                           //1 nach links schieben
      T     MD    10
      L     MD    10
      L     0
      ==D                               //prüfen ob register laüft
      =     M     13.0                  //wenn nein erstes bit setzen
      U     M     10.7                  //letztes bit erreicht
      S     M      1.1
      SPB   ende                        //sprung zum ende da letztes bit
// rechts schieben
m001: NOP   0
      UN    M      1.1
      SPB   m002
      U     M     13.0                  //erstes bit erreicht
      R     M      1.1
      L     MD    10
      SRD   1
      T     MD    10
m002: NOP   0
ende: NOP   0
      L     MD    10
      T     AD     0                    //in deinen ausgang transferieren
 
laos mal so eine ganz dumme Frage...

kommt der erste code in OB100 und der zweite code in OB1???

...ich stell mich nicht an ich bin wirklich so blöd!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
alles in den OB1 .... ;-)

U M 1.2 // Taktmerker - Impuls
SPBN m100

L MW 120 // Zähler
L 36
>=I
S M 99.7 // Umkehrbit

L MW 120
L 1
<=I
R M 99.7

U M 99.7
SPBN m101

L MW 120
L 1
-I
T MW 120
SPA m100

m101: L MW 120
L 1
+I
T MW 120

m100: NOP 0

L MW 120
L 1
==I
= A 100.0

L MW 120
L 2
==I
= A 100.1


Ist Geschmackssache ... Kannst natürlich auch die Bits schieben ... dann ist halt bei 32 Ende oder es wird etwas aufwändiger

So kannste die Ausgänge aber frei zuordnen ...

Gruß stricky
 
Gesetz dem Fall dass alle Ausgänge in aufsteigender Reihenfolge liegen, hier mein Vorschlag zum Ansteuerung frei wählbarer Anzahl an Lauflichtern und Startadresse des 1.Lauflichtausganges (falls es überhaupt noch interessiert):

Code:
//max.Anzahl der Lauflichtausgänge vorgeben
      L     36
      T     #Max_Anz_Lauflichter

//Prüfe, ob Initialisierung erforderlich
      U     "HM_Lauflicht_Start"        //diesen Merker in OB100 setzen
      SPBN  INIT
//Initialisiere Ausgangszeiger
      L     P#A 20.0                    //Startdadresse der Lauflichtausgänge (hier A20.0)
      T     #tmp_A_ptr_ON
//Initialisiere Ausgangszähler
      L     1
      T     #tmp_A_cnt_ON

//Hilfsmerker 'Lauflicht rückwärts' rücksetzen
      CLR   
      =     "HM_Lauflicht_Rück"

//Hilfsmerker 'Initialisierung' rücksetzen
      CLR   
      =     "HM_Lauflicht_Start"
INIT: NOP   0



//Ausgänge löschen
      UN    T      1
      SPBN  RST
//Initialisiere Ausgangszeiger
      L     P#A 20.0                    //Startdadresse der Lauflichtausgänge
      T     #tmp_A_ptr_OFF
//Initialisiere Ausgangszähler
      L     1
      T     #tmp_A_cnt_OFF
//Alle Lauflichtausgänge rücksetzen (Schleife)
AGAI: CLR   
      =     A [#tmp_A_ptr_OFF]

      L     #tmp_A_cnt_OFF
      L     #Max_Anz_Lauflichter
      <I    
      SPBN  NCLR
//Zähler Ausgangsnummer erhöhen
      L     #tmp_A_cnt_OFF
      L     1
      +I    
      T     #tmp_A_cnt_OFF
//Pointer für Ausgang erhöhen
      L     #tmp_A_ptr_OFF
      L     1
      +D    
      T     #tmp_A_ptr_OFF
      SPA   AGAI                        //zwingender Sprung bis alle Ausgänge abgelöscht sind
NCLR: NOP   0
RST:  NOP   0


//Hilfsmerker 'Lauflicht rückwärts' setzen
      L     #tmp_A_cnt_ON
      L     #Max_Anz_Lauflichter
      >=I   
      S     "HM_Lauflicht_Rück"

//Hilfsmerker 'Lauflicht rückwärts' löschen
      L     #tmp_A_cnt_ON
      L     1
      <=I   
      R     "HM_Lauflicht_Rück"


//Lauflicht vorwärts ansteuern
      L     #tmp_A_cnt_ON
      L     #Max_Anz_Lauflichter
      <I    
      UN    T      1
      UN    "HM_Lauflicht_Rück"
      SPBN  VCNT

//Lauflichtausgang EIN
      SET   
      =     A [#tmp_A_ptr_ON]

//Zähler Ausgangsnummer erhöhen
      L     #tmp_A_cnt_ON
      L     1
      +I    
      T     #tmp_A_cnt_ON
//Pointer für Ausgang erhöhen
      L     #tmp_A_ptr_ON
      L     P#0.1
      +D    
      T     #tmp_A_ptr_ON

//Einschaltdauer je Lauflichtausgang starten
      L     S5T#500MS
      CLR   
      SV    T      1
      SET   
      SV    T      1
VCNT: NOP   0

//Lauflicht rückwärts ansteuern
      L     #tmp_A_cnt_ON
      L     1
      >I    
      UN    T      1
      U     "HM_Lauflicht_Rück"
      SPBN  RCNT
//Lauflichtausgang EIN
      SET   
      =     A [#tmp_A_ptr_ON]

//Zähler Ausgangsnummer verringern
      L     #tmp_A_cnt_ON
      L     1
      -I    
      T     #tmp_A_cnt_ON
//Pointer für Ausgang verringern
      L     #tmp_A_ptr_ON
      L     P#0.1
      -D    
      T     #tmp_A_ptr_ON
//Einschaltdauer je Lauflichtausgang starten
      L     S5T#500MS
      CLR   
      SV    T      1
      SET   
      SV    T      1
RCNT: NOP   0
 
...es Geht immer noch nicht!

Bei dem Vorschlag von stricky funktioniert es leider auch nicht *cry*

nairolf: also ich bin leider kein experte so wie ihr alle, also habe ich noch einpaar fragen

Code:
 T     #Max_Anz_Lauflichter

für was steht das und was muss ich eingeben, weil bei mir wir es rot angezeigt.

Code:
  U     "HM_Lauflicht_Start"        //diesen Merker in OB100 setzen
muss ich nur diese Zeile in OB100 setzten? und für was steht "HM_Lauflicht_Start"?

Code:
T     #tmp_A_ptr_ON
is leider auch rot! für was steht das und was müüste ich eintragen?
genau so wie
Code:
T     #tmp_A_cnt_ON

kann ich egal welchen hilfsmercker benutzen
Code:
=     "HM_Lauflicht_Rück"


[highlight]aber das war´s erst mal für diesen eintrag!!![/highlight]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kurze Hilfestellung

Hallo,

Folgende Variablen im Lokaldatenbereich des OB1 bzw. Deines FC's in den Du die Funktion evtl. packst, anlegen:
#Max_Anz_Lauflichter (INT-Variable)
#tmp_A_cnt_ON (INT-Variable)
#tmp_A_cnt_OFF (INT-Variable)
#tmp_A_ptr_ON (DINT-Variable)
#tmp_A_ptr_OFF (DINT-Variable)

In der Symboltabelle legst Du folgendes an:
HM_Lauflicht_Start (freies Merkerbit Deiner Wahl)
HM_Lauflicht_Rück (freies Merkerbit Deiner Wahl; Hilfsmerker vor Vor-/Rückwärtsbewegung Deines Lauflichts)
T1 (freier Timer; im Beispiel Timer 1; Parameter zum einstellen der Leuchtdauer je Lauflicht LED)

Im OB100 schreibst Du dann:

Code:
SET
= HM_Lauflicht_Start


Dieser Hilfsmerker wird im Anlauf der CPU (also u.a. Einschalten) gesetzt und intialisiert damit Dein Lauflicht (Vorwärtsbewegung und Beginn bei Lauflichtausgang 1 gemäß Pointerdefinition, in meinem Beispiel A20.0)

Bei mir hats geklappt. Ist nicht der sauberste Code, gerade durch die 2 Variablen, eine für den Pointer und eine zum Vergleichen (ON/OFF).
Genauso wird bei einer entsprechend hohen Anzahl von Ausgängen durch das Löschen der Ausgänge in einer Schleife die Zykluszeit erhöht, aber bei 36 Ausgängen sicher kein Problem.

Hoffe ich konnte Dir helfen, kurzes Feedback wäre nett.

Cu, nairolf
 
ich sage dir erst mal danke nairolf!!!

leider kann ich es nicht testen, aber am Montag!

wenn ich es getestet habe sag ich sofort bescheid!

mfg
Malte
 
hatte nicht richtig gelesen das es 36 bit waren.
meine obige lösung klappt nur bis 32.

hier mal eine lösung für 36 bits

alles in den ob1
Code:
// takt erzeigen
      UN    M      1.0
      L     S5T#500MS
      SE    T      1
      U     T      1
      =     M      1.0
 
// zählen
      U     M      1.0
      UN    M      1.1
      ZV    Z      1
      U     M      1.0
      U     M      1.1
      ZR    Z      1
      L     Z      1
      L     32
      >I    
      SPB   m003
// für 1-32
      L     1
      T     MD    10                    //bit 1 setzen
      L     Z      1
      L     MD    10
      SLD                               // um zählerstand nach links schieben
      T     MD    10
// für 33-36
m003: NOP   0
      L     1
      T     MB     9
      L     Z      1
      L     32
      -I    
      L     MB     9
      SLW   
      T     MB     9
      L     Z      1
      L     35
      >=I   
      S     M      1.1                  //hochzählen fertig
      UN    Z      1
      R     M      1.1                  //runterzählen fertig
//ausgänge zuweisen
      L     MB     9
      T     AB     0
      L     MD    10
      T     AD    1
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo volker,

prinzipiell ist Deine Variante wesentlich weniger 'codeintensiv'.
Du musst jedoch noch die Initialisierung im OB100 berücksichtigen
(so hatte ich es jedenfalls verstanden), also Merkerinhalt(e), Zählrichtung und Zählerstand initialisieren. Vielleicht habe ich ja auch über's Ziel hinausgeschossen, da ich dachte, sch... auf die Anzahl der LED'S, mach's einstellbar

Schönes WE
 
also im ob100 musst du nicht viel machen.

//ob100
L 0
T MB 9
T MD 10
SET
R Z 1
CLR
= M 1.1


hättest du dich auf 32 beschränkt wärs einfacher geworden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So, ich bin wieder im dienst!
Sorry Leute, die (für mich unverständlichen [da ich wirklich nur Praktikant bin])begriffe von nairolf, die kann ich nicht umsetzten!!!
Aber die Idee Volker steigert meine Laune ins unermessliche! Es funzt leider nur der Ausgang 11 bis 15, aber die dann richtig!!! Vor und zurück…..
Also aufgabe noch nicht erreicht *doubleCRY*
 
.........kann es sein das hier noch die alte zeit ihr unwessen treibt?


is mir gerade mal so eingefallen
 
Hallo Praktikant !

Hab den von mir geposteten Code mal per PLC-Sim ausprobiert,
und das hat geklappt (egal mit wie vielen Lauflichtern).

Was genau ist Dir unklar an "meinen" Begriffen ?

Vielleicht kann man einiges aufklären...

Cu, nairolf
 
Zurück
Oben