Counter in einem DB

eine Möglichkeit

Code:
      AUF   DB    10                    // Datenbaustein öffnen
//**************************************************************************************
//**  Aufwärtszähler
//**************************************************************************************
      U     #Ereignis_1                 // Kommendes Ereignis
      FP    #Flanke_1                   // Steigende Flanke auswerten
      SPBN  m001                        // Keine steigende Flanke? Dann weiter. Sonst...
      L     DBW    0                    // Lade Zählerwort 1
      L     1                           // lade 1
      +I                                // addiere
      T     DBW    0                    // speicher neuen Zählerwert
m001: L     DBW    0                    // Lade Zählerwert 1
      L     #CountMax                   // Maximalwert
      >=I                               // erreicht? Dann...
      =     #Erreicht_1                 // Erreicht = 1
      SPBN  m002                        // Nicht erreicht? Dann weiter. Sonst...
      T     DBW    0                    // Zähler auf Max
//**************************************************************************************
//**  Abwärtszähler
//**************************************************************************************
m002: U     #Ereignis_2                 // Kommendes Ereignis
      FP    #Flanke_2                   // Steigende Flanke auswerten
      SPBN  m003                        // Keine steigende Flanke? Dann weiter. Sonst...
      L     DBW    2                    // Lade Zählerwort 2
      L     1                           // lade 1
      -I                                // subtrahieren
      T     DBW    2                    // speicher neuen Zählerwert
m003: L     DBW    2                    // Lade Zählerwert 2
      L     0                           // Minimalwert = 0
      <=I                               // erreicht? Dann...
      =     #Erreicht_2                 // Erreicht = 1
      SPBN  m004                        // Nicht erreicht? Dann weiter. Sonst...
      T     DBW    2                    // Zähler auf 0
m004: NOP   0                           // Ende
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Antwort aber meine Frage ist wahrscheinlich viel simpler als sie erscheint!

Ich möchte nicht die Symboltabelle von Step7 benutzen! Sondern alle Merker, Zeiten, Zähler usw. in einem DB definieren!

Je nach Produkt (Teilenummer) schnappe ich mir dann den DB und die zugehörigen FCs/FBs und kann diese auf eine andere Anlage überspielen. Ein paar Zuweisungen der Datenbereiche und schon bin ich fertig.

Mein Problem: In der Symboltabelle gebe ich z.B. normalerweise an: Symbol = Stückzähler, Adresse = Z1 und Datentyp COUNTER. Damit definiere ich den Zähler!

Geht das auch in einem DB das ich dort einen Zähler (Counter) anlege!

Danke für die Hilfe!
 
Nein. Du kannst in einem DB keinen Zähler oder Timer anlegen.
Ein DB (Datenbaustein) ist dazu gut das du Daten speichern kannst. Also du kannst dort zb in einem Word einen Wert von einem Zähler hinterlegen. (siehe Rumo) oder von einem Timer einen Zeitwert hinterlegen wenn du den Datentyp als S5Time anlegst.
Merker kannst du zb schon machen. Ein Bit von einem Datenbaustein ist im Prinzip das selbe wie ein Merker.

Was willst du eigentlich genau machen?
Ist deine andere Anlage eine eigene SPS?
Willst du das selbe Programm in einer anderen SPS verwenden?
Oder nur die Daten (Werte von Zähler Timer usw) in einer anderen SPS abfragen?

godi
 
Ich bin begeistert wie schnell man hier eine Antwort bekommt. Ein dickes Danke!

Wir haben an jeder Spritzgussmaschine ein festes Grundgestell mit Peripherieplätzen. Das Master Programm auf der SPS ist immer das gleiche aber die Peripherie kann je nach Teilenummer auch mal zwischen den Spritzgussmaschinen wechseln. Deshalb will ich jeden Platz in sich Programmieren, so das ich im Notfall ein Paket aus FCs/FBs und einem globalen DB kopiere und auf einer anderen Anlage (Master) aufspiele. So kann ich dann von dem jeweiligen Platz die E/A dem DB zuweisen und es läuft.

Danke nochmal! :grin:

Gruß Mujo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Am flexiblesten wärst du wenn du zb im OB1 die ganzen Eingänge und Augänge in einen Datenbaustein schreibst.
Die Zähler mit Plus und Minus Programmierst (also keine Standartzähler) und die IEC Timer als Multiinstanz verwendest. Die ganzen Startzeitwerte und Zählwerte würde ich auch in den DB ablegen. Dann kannst du im DB die ganzen Werte beliebig ändern wie du willst.
 
Also wenn der "Notfall" öfter vorkommt,würd ich mir überlegen eine Codierung an die Peripherie zu bauen.

z.b. mit 4 Eingängen kannst du dann 15 verschiedene Peripherien dran hängen und nach Programmnummer identifizieren.

Im Programm dann nur noch auf die Programmnummer reagieren.

So sparst dir den Eingriff in die SPS und hast weniger Stillstandszeiten...

Gruss Andy
 
Ich bin begeistert wie schnell man hier eine Antwort bekommt. Ein dickes Danke!

Wir haben an jeder Spritzgussmaschine ein festes Grundgestell mit Peripherieplätzen. Das Master Programm auf der SPS ist immer das gleiche aber die Peripherie kann je nach Teilenummer auch mal zwischen den Spritzgussmaschinen wechseln. Deshalb will ich jeden Platz in sich Programmieren, so das ich im Notfall ein Paket aus FCs/FBs und einem globalen DB kopiere und auf einer anderen Anlage (Master) aufspiele. So kann ich dann von dem jeweiligen Platz die E/A dem DB zuweisen und es läuft.

Danke nochmal! :grin:

Gruß Mujo

Wir hatten ein ähnliches Problem, aber mit wesentlich mehr Peripheriestationen und haben dann für jede Peripheriestation eine eigene (kleine) CPU eingesetzt, die über einen DP/DP-Koppler mit dem Master kommuniziert. Tauscht man die Peripherie, tauscht man die Kiste mit der CPU mit und diese meldet sich dann entsprehend beim Master an. Programmiergerät etc. ist so nicht nötig beim Peripherietausch.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
neue Möglichkeit

Wenn ich dich richtig verstanden habe, so brauchst du doch nur die Eingänge und Ausgänge flexibel zu gestalten.
Dann würde ich folgendes vorschlagen:

DB 1 "Daten"
Code:
Eingaenge STRUCT   
E_1 DWORD DW#16#0 Eingang 0.0 
E_2 DWORD DW#16#1 Eingang 0.1 
E_3 DWORD DW#16#8 Eingang 1.0 
E_4 DWORD DW#16#82 Eingang 16.2 
 END_STRUCT   
Ausgaenge STRUCT   
A_1 DWORD DW#16#1F9 Ausgang 63.1 
A_2 DWORD DW#16#405 Ausgang 128.5 
 END_STRUCT

Die Eingangs und Ausgangsbytes werden mit 8 multipiziert und die Bitnummer addiert. So berechnet, speicherst du die EA's im DB deiner Wahl.

Code:
      L     "Daten".Eingaenge.E_1
      T     #Eingang1
      L     "Daten".Ausgaenge.A_1
      T     #Ausgang1
      U     E [#Eingang1]
      S     A [#Ausgang1]

Eingang1 und Ausgang1 vom Type TEMP DWORD. Auf diese Art und Weise haben ich bereits eine komplexe Weichensteuerung in unserer Firma realisiert.
 
das ist doch viel zu aufwändig.

ich würde das folgendermassen machen.
am anfang vom ob1 transferierst du alle relevanten eingänge in datenworte.
im programm arbeitest du nur mit den datenbits.
am ende vom ob1 transferierst du datenworte der ausgänge in die ausgänge.

auf meiner homepage findest du zeiten und zähler die mit datenworten arbeiten nach aussen hin aber genauso arbeiten wie die normalen.
damit bist du dann auch was die z/t betrifft flexibel.
 
Da kann man sicher geteilter Meinung sein. In der von mir vorgeschlagenen Variante, braucht er nur den entsprechenden Datenbaustein austauschen, oder wenn man es weiter spinnt, kann man über einen Index auf verschiedene Datenblöcke zurückgreifen.
Das Programm wird sicherlich komplizierter (keine Frage)... aber welcher Aufwand wird betrieben, um alle möglichen Ein.- und Ausgänge an die richtige Stelle zu bringen, wenn du die Variante von dir Volker verwirklichst?
Im übrigen, Volker, bin ich ganz deiner Meinung... Zeiten und Zähler als DW is ne feine Angelegenheit!:cool:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
das ist doch viel zu aufwändig.

ich würde das folgendermassen machen.
am anfang vom ob1 transferierst du alle relevanten eingänge in datenworte.
im programm arbeitest du nur mit den datenbits.
am ende vom ob1 transferierst du datenworte der ausgänge in die ausgänge.

auf meiner homepage findest du zeiten und zähler die mit datenworten arbeiten nach aussen hin aber genauso arbeiten wie die normalen.
damit bist du dann auch was die z/t betrifft flexibel.

So ähnlich habe ich es auch realisert. Mir ist nur wichtig das jede Station für sich IN SICH geschlossen ist und ich je nach Teilenummer nur noch die Eingänge und Ausgänge dem DB zuweise! Falls die Situation mal vorkommt (eher selten, aber vorsorglich) das sie mit einem Produkt auf eine andere Anlage müssen, so kann ich das IN SICH geschlossene Paket einfach auf den anderen Master aufspielen und kurz die Zuweisungen machen! Sollte der Stationsplatz mal wechseln so kann ich auch kurz die Zuweisung ändern. Würde auch eleganter gehen aber ist nicht notwendig, weil so ein Wechsel eher selten vorkommt. Je nach Teilenummer habe ich z. B. eine andere Zuführung mit einer anderen Anzahl an Ein und Ausgängen (Profibusslaves). In dem DB ist dann zusätzlich noch definiert welche Slaves die in der Hardwarekonfiguration hinterlegt sind, aktiv sind oder nicht. Danke nochmal. Meine Frage wäre beantwortet. Ich schaue aber gleich noch auf Deine Homepage.:grin:
 
Hallo!

Kannst Du mir noch den Namen des Projekts sagen in welchem ich Dein Beispiel finde!

Danke!
 
ein beispiel konkret auf deinen fall bezogen liegt da nicht.
im download unter sps/s7-bauteine die timer.zip und die zähler.zip
 
Zurück
Oben