Vorrangschaltung mit S7 300 für 6 Öfen

Das mit dem automatischen Abschalten nach Trocknugszeitende funktioniert mit der Schaltung so aber nicht. Hier kannst du nur Abschalten wenn ein Benutzer den Austaster drückt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das mit dem automatischen Abschalten nach Trocknugszeitende funktioniert mit der Schaltung so aber nicht. Hier kannst du nur Abschalten wenn ein Benutzer den Austaster drückt.
Hi,
ist klar. Das Bild ist nur total vereinfacht und zur Erklärung wie das im Prinzip laufen soll.
In Wahrheit kommt natürlich noch einiges vor den Aus- / Eintastern. Das ist eine ziemlich komplexe Steuerung über Prozessregler mit Durchlüftungs- und Spülvorgängen.

Gruß
Udo
 
Hallo Paule
Wie kann man in einer Schleife feststellen welches Bit in einem Wort gesetzt wurde? In SCL ist es sicher einfacher als AWL-Sprache. Kannst du mir zeigen wie das geht, Du bist sicher stark in SCL!!!
 
Hallo Udo,

hier mal eine Möglichkeit:
DB 2 für die Prioritäten
FC 2 sucht den nächsten freien Platz
FC 3 übergibt die angewählte Ofennummer in die Liste
(Noch keine Absicherungen wegen überlauf und so)
Code:
DATA_BLOCK "Priorität"
TITLE =
VERSION : 0.1
 
  STRUCT  
   Prio : ARRAY  [1 .. 10 ] OF 
   INT ; 
  END_STRUCT ; 
BEGIN
   Prio[1] := 0; 
   Prio[2] := 0; 
   Prio[3] := 0; 
   Prio[4] := 0; 
   Prio[5] := 0; 
   Prio[6] := 0; 
   Prio[7] := 0; 
   Prio[8] := 0; 
   Prio[9] := 0; 
   Prio[10] := 0; 
END_DATA_BLOCK
 
FUNCTION FC 2 : VOID
TITLE =
VERSION : 0.1
 
VAR_INPUT
  Ofen_Nummer : INT ; 
END_VAR
VAR_TEMP
  Zeiger : DWORD ; 
END_VAR
BEGIN
NETWORK
TITLE =
      L     P#0.0; 
      T     #Zeiger; 
      AUF   "Priorität"; 
W:    L     DBW [#Zeiger]; 
      L     0; 
      ==I   ; 
      SPB   NULL; 
      L     #Zeiger; 
      L     P#2.0; 
      +D    ; 
      T     #Zeiger; 
      SPA   W; 
NULL: L     #Ofen_Nummer; 
      T     DBW [#Zeiger]; 
END_FUNCTION
 
FUNCTION FC 3 : VOID
TITLE =
VERSION : 0.1
BEGIN
NETWORK
TITLE =Ofen 1
      U     M      1.0; // Einschaltbefehl Ofen 1
      UN    M      1.2; // Ofen 1 in Liste eingetragen
      FP    M      1.1; // Flanke
      SPBN  xxx; 
      CALL FC     2 (
           Ofen_Nummer              := 1);
      SET   ; 
      S     M      1.2; // Ofen 1 in Liste eingetragen
xxx:  NOP   0; 
NETWORK
TITLE =Ofen 2
      U     M      2.0; // Einschaltbefehl Ofen 2
      UN    M      2.2; // Ofen 2 in Liste eingetragen
      FP    M      2.1; // Flanke
      SPBN  yyy; 
      CALL FC     2 (
           Ofen_Nummer              := 2);
      SET   ; 
      S     M      2.2; // Ofen 2 in Liste eingetragen
yyy:  NOP   0; 
END_FUNCTION

was nun noch fehlt ist die Möglichkeit einen Ofen wieder abzuwählen.
Dazu Ofennummer aus der Liste suchen und löschen.
Liste neu sortieren, sprich leere Zeilen in der Liste durch die vollen (hinteren) ersetzen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

Hallo Paule
Wie kann man in einer Schleife feststellen welches Bit in einem Wort gesetzt wurde? In SCL ist es sicher einfacher als AWL-Sprache. Kannst du mir zeigen wie das geht, Du bist sicher stark in SCL!!!

geht auch anders, ohne Schleife.

Code:
FUNCTION FC 1 : VOID

VAR_INPUT
  IN : WORD ;    
END_VAR
VAR_OUTPUT
  POS : INT ;    
END_VAR
VAR_TEMP
  Zaehler : INT ;    
END_VAR

BEGIN
      L     #IN; 
      L     W#16#0; 
      ==I   ; 
      SPB   OUT; //Sprung zu OUT wenn kein Bit = TRUE
      TAK   ; //IN
      L     W#16#8000; 
      ==I   ; 
      SPB   OUT1; //Sprung zu OUT1 wenn Bit 16 = TRUE

      TAK   ; //IN
      ITD   ; //wandeln
      DTR   ; //in REAL
      LN    ; //natürlicher Logarithmus von IN
      L     6.931000e-001; //natürlicher Logarithmus von 2
      /R    ; 
      RND   ; //Ergebniss REAL wandeln in INT
      L     1; //Eins dazu addieren
      +I    ; 
      T     #POS; //Position ausgeben
      BEA   ; //Ende
OUT:  T     #POS; // => 0 kein Bit
      BEA   ; //Ende
OUT1: L     16; // => 16 Bit 16
      T     #POS; //Ende

END_FUNCTION
Gruss Daniel
 
Hier eine Vorschlage von mir:

Code zum Eintrag ins FiFo:
Code:
U E124.1
FP M124.1
L 1
spb ok

U E124.2
FP M124.2
L 2
spb ok
....

ok: T Eintrag

Fifo:

Den Code fürs Fifo solltest du mit dem was hier steht: http://www.sps-forum.de/showthread.php?t=8887&highlight=fifo eingendlich Zusammenfrikeln können. (Ganz unten Filo, je nach Puffergröße kannst du dann im höchsten Byte deine nummer auslesen)

jetzt musst du halt noch verhindern, das ein Ofen 2 mal eingetragen wird, und das der Filo FC solange aufgerufen wird bis im höchsten byte eine ofennumer steht!
 
Hi,

Hallo Paule
Wie kann man in einer Schleife feststellen welches Bit in einem Wort gesetzt wurde? In SCL ist es sicher einfacher als AWL-Sprache. Kannst du mir zeigen wie das geht, Du bist sicher stark in SCL!!!

und das selbe in SCL.

Code:
FUNCTION FC1 : VOID

VAR_INPUT
    IN : WORD;
END_VAR

VAR_OUTPUT
    POS : INT;
END_VAR

BEGIN

    IF IN = 0 THEN                          //wenn kein Bit = TRUE 
        POS := 0;                           //POS = 0
    ELSIF WORD_TO_INT(IN) = -32768 THEN     //wenn Bit 16 = TRUE
        POS := 16;                          //POS = 16
    ELSE
        POS := REAL_TO_INT(LN(INT_TO_REAL(WORD_TO_INT(IN))) / 6.931000e-001) + 1;
    END_IF;
     
END_FUNCTION

Gruss Daniel
 
Den Code fürs Fifo solltest du mit dem was hier steht: http://www.sps-forum.de/showthread.php?t=8887&highlight=fifo eingendlich Zusammenfrikeln können. (Ganz unten Filo, je nach Puffergröße kannst du dann im höchsten Byte deine nummer auslesen)

jetzt musst du halt noch verhindern, das ein Ofen 2 mal eingetragen wird, und das der Filo FC solange aufgerufen wird bis im höchsten byte eine ofennumer steht!
Hast du überhaupt gelesen was ich geschrieben habe? :twisted:
Bei mir braucht er nichts "Zusammenfrikeln" und das verhindern das nicht zweimal der gleiche Ofen eingetragen wird habe ich auch schon vorgesehen.
AWL-Quelle übersetzen und es läuft, was man von deinem Wahnsinns Code jetzt nicht wirklich behaupten kann.

Schreib ihm doch lieber den Teil der noch fehlt:
Das Austragen aus der Liste und das erneute sortieren.
 
Hast du überhaupt gelesen was ich geschrieben habe? :twisted:
nee, nur überflogen, das war wahrscheinlich das Problem.

Bei mir braucht er nichts "Zusammenfrikeln" und das verhindern das nicht zweimal der gleiche Ofen eingetragen wird habe ich auch schon vorgesehen.
AWL-Quelle übersetzen und es läuft, was man von deinem Wahnsinns Code jetzt nicht wirklich behaupten kann.

Schreib ihm doch lieber den Teil der noch fehlt:
Das Austragen aus der Liste und das erneute sortieren.

Da Paule mich so freundlich gebeten hat, hier etwas code von mir ;-)
(untested)

Code:
      U     E    124.1
      FP    M    124.1
      L     1
      SPB   ok

      U     E    124.2
      FP    M    124.2
      L     2
      SPB   ok

//usw...
      L     0
ok:   T     DB20.DBW   20

      SET   
      R     #warda
//Fifo...
      AUF   DB    20
      L     0
      LAR1  

sl:   L     DBW [AR1,P#0.0]
      L     0
      ==I   
      SPB   sieb
      SPA   prf
sieb: L     DBW [AR1,P#2.0]
      T     DBW [AR1,P#0.0]
      L     0
      T     DBW [AR1,P#2.0]

prf:  L     DBW [AR1,P#0.0]
      L     DBW   20
      ==I   
      S     #warda

      L     P#2.0
      +AR1  
      TAR1  
      L     128                         // 16 SLD3 ==>128, da 18 letzer Registerplatz
      <=I   
      SPB   sl

      U     #warda
      BEB   
      L     DBW   20
      T     DBW   18

DB20.DBW20 ist der EIntragplatz, DB20.DBW0 steht der aktulle Ofen. Einfach abnullen, dann sollte der nächste vorgeschoben werden!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
ist klar. Das Bild ist nur total vereinfacht und zur Erklärung wie das im Prinzip laufen soll.
In Wahrheit kommt natürlich noch einiges vor den Aus- / Eintastern. Das ist eine ziemlich komplexe Steuerung über Prozessregler mit Durchlüftungs- und Spülvorgängen.

Du hast also in Deiner Schaltung für jeden Ofen einen Ein- und Aus-Taster?

Und wenn der Trockenprozess für den jeweiligen Ofen läuft, kannst Du dann mit dem Aus-Taster den Trockenprozess abbrechen?

Oder darf der Trockenprozess nicht abgebrochen werden und muss bis zum Ende laufen?

Gruß Kai
 
Absolut,
Code:
      L     0
ok:   T     DB20.DBW   20
 
      SET   
      R     #warda
//Fifo...
      AUF   DB    20
      L     0
      LAR1  
 
sl:   L     DBW [AR1,P#0.0]
      L     0
      ==I   
      SPB   sieb
      SPA   prf
sieb: L     DBW [AR1,P#2.0]
      T     DBW [AR1,P#0.0]
      L     0
      T     DBW [AR1,P#2.0]
 
prf:  L     DBW [AR1,P#0.0]
      L     DBW   20
      ==I   
      S     #warda
 
      L     P#2.0
      +AR1  
      TAR1  
      L     128                         // 16 SLD3 ==>128, da 18 letzer Registerplatz
      <=I   
      SPB   sl
 
      U     #warda
      BEB   
      L     DBW   20
      T     DBW   18
sorry Jochen das ist ein NOP 0
Vielleicht solltes du bei deinen Hochsprachen bleiben, was ich so lese ist das deine Welt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
noch ne kleine Änderung, so können auch Ofen ausgetragen werden, welche noch nicht ganz vorne sind...

Code:
      SET   
      R     #austragen

//Taster fürs eintragen
      U     M     99.0
      FP    M    124.1
      L     1
      SPB   ok

      U     M     99.1
      FP    M    124.2
      L     2
      SPB   ok
//usw...

//Taster fürs austragen
      SET   
      S     #austragen

      U     M     99.2
      FP    M    124.1
      L     1
      SPB   ok

      U     M     99.3
      FP    M    124.2
      L     2
      SPB   ok
//usw...

      L     0
ok:   T     DB20.DBW   20

      SET   
      R     #warda
//Fifo...
      AUF   DB    20
      L     0
      LAR1  

sl:   L     DBW [AR1,P#0.0]
      L     0
      ==I   
      SPB   sieb

//Hier noch zum austragen
      U(    
      L     DBW [AR1,P#0.0]
      L     DBW   20
      ==I   
      )     
      U     #austragen
      SPB   sieb

      SPA   prf
sieb: L     DBW [AR1,P#2.0]
      T     DBW [AR1,P#0.0]
      L     0
      T     DBW [AR1,P#2.0]

prf:  L     DBW [AR1,P#0.0]
      L     DBW   20
      ==I   
      S     #warda

      L     P#2.0
      +AR1  
      TAR1  
      L     128                         // 16 SLD3 ==>128, da 18 letzer Registerplatz
      <=I   
      SPB   sl

      U     #warda
      O     #austragen
      BEB   
      L     DBW   20
      T     DBW   18
 
Was soll denn funktionieren?
Ich dachte wir reden davon wenn ein Ofen deaktiviert wurde, er in der Liste ausgetragen wird und die Liste neu sortiert wird.
Oder was genau soll der Code bewirken?

Ich dache am Anfang ging's nur um einen Ofen ins Fifo einzutragen und nach vorn zu schieben, das einschalten hat er ja schon realisiert. Wenn er dann den ersten Eintrag abgelöscht hat, kam der nächste nach.

Hab noch ne weitere Version angehängt, in welcher ein Ofen auch aus der Liste zwischendrin gelöscht werden kann.
 
Zurück
Oben