60 verschiedene Programme mit 10 Positionen

MK_Auto

Level-1
Beiträge
124
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen vieleicht hat ja einer ne Idee und kann mir helfen.
Habe eine achse die je 10 Positionen Anfährt und das ganze in 60 Programmen. Das heist ich will einen Typ vorwählen und dann die 10 Positionen für die achse bereitstellen bzw auch die werte ändern:
Habe jetzt einen UDT angelegt mit 10 Positionen dieser wird im db 60 mal verwendet. Wie kann ich jetzt auf den einzelnen datenbereich zugreiifen ?
Vielen Dank für die Hilfe
LG Michael*ACK*
 
Zwei Möglichkeiten:

1. Einfacher und Recourcenschonender, nur, wenn du auf der Anlage jeweils nur einen Typ zum jeweiligen Zeitpunkt fährst.

Du definierst den 1. Typ in deinem DB zum aktuellen Typ. Wenn eine Typänderung stattfindet, kopierst du einmalig mit Blockmove (siehe Suche in diesem Forum) den Bereich des angewählten Typs ind den Bereich des aktuellen Typs. Deibn Programm lädt die Daten immer vom aktuellen Typ, also aus Bereich 1. Hat den Vorteil, daß nur einmal bei Typwechsel Daten umkopiert werden müssen.

2. Flexibler, aber auch Recourcenfressender, da ständig gerechnet und kopiert wird, es sei denn, du erkennst einen Wechsel des Datensatzes und lädst dann einmalig um.

Du schreibst einen FC/FB, der den jeweils benötigten Datensatz über indirekte Adressierung (Siehe Suche hier im Forum) aus dem DB liest und an einem Output bereitstellt. Dazu mußt du Datenbaustein, Typnummer und Datensatznummer als Input angeben, daraus den Offset errechnen und diesen Datensatz (wahrscheinlich ein DBD) dann über indirekte Adressierung umkopieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ralle

vielen Dank für deine Antwort. Nein ich will den typ immer vorher Vorwählen also vor programmstart nur suche ich eine Möglichkeit den UDT im DB direkt anzusprechen
 
Da du ja die Struktur in deinem DB kennst kannst du dir ja einen Bausteil schreiben, der mit Hilfe der indirekten Adressierung anhand einer Produktnummer die Werte aus dem entsprechenden Adressbereich läd.

z.B.:
du hast 10 DINT Werte für 10 Positionen und die PrgNummern 1-60. Du weist jeder DINT-Wert belegt 4Byte. Somit belegst du für die Positionen pro Prg 40 Byte. Wenn du also sonst nichts in dem DB hast, belegt Prg1 die Bytes 0 bis 39 Prg2 40-79 u.s.w.
Jetzt kannst du dir mit der Gleichung:

(Programmnummer (2) - 1 )* Belegter Adressbereich (40) = Startadresse (40)
(Programmnummer (7) - 1 )* Belegter Adressbereich (40) = Startadresse (240)

die Adressen der jeweiligen Positionen zugehörig zum Prg berechnen.

Die Startadresse entspricht Position 1 und für jede Weitere Position muss man dann +4 zur Startadresse dazu rechnen.
 
Zuletzt bearbeitet:
Danke für die Antworten

meine Wunschworstellung ist das wenn ich sage mal typ 10 vorwähle ich den 10. udt im DB anspreche
 
Ja nur irgendwie schnall ich das mit dem pointer und dem adressregister nicht.
Will die Typnummer angenummen 1o direkt verarbeiten und dann die 10 DINTs lesen bzw schreiben
 
Vieleicht sollte ich die Ssache noch mal genauer formulieren.
Also ich habe ein op177B dor wähle ich den Typ als zahl vor 1-60
und will den die Achspositionen aus dem UDT DB auslesen und übergeben bzw wenn die Achse neu geteached wird wieder reinschreiben.
Es muss doch eine einfache Lösung geben die Zahl direkt zu verarbeiten ohne 60 schleifen zu drehen oder ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja nur irgendwie schnall ich das mit dem pointer und dem adressregister nicht.
Will die Typnummer angenummen 1o direkt verarbeiten und dann die 10 DINTs lesen bzw schreiben

Schau dir bitte unbedingt zuerst das Beispiel von Volker zur indirekten Adressierung in der FAQ an! Auch FIFO/LIFO aus der FAQ kann zum Verständnis hilfreich sein.

Sieh auch mal hier rein: http://www.sps-forum.de/showthread.php?t=1330

Da hatte ich mal einen FC angehängt, mit dem kannst du Bereiche umkopieren, ohne dich mit indirekter Adressierung herumplagen zu müssen. Aber Achtung, die Anzahl muß in Bytes angegeben werden, also pro DBD 4 !
 
Vieleicht sollte ich die Ssache noch mal genauer formulieren.
Also ich habe ein op177B dor wähle ich den Typ als zahl vor 1-60
und will den die Achspositionen aus dem UDT DB auslesen und übergeben bzw wenn die Achse neu geteached wird wieder reinschreiben.
Es muss doch eine einfache Lösung geben die Zahl direkt zu verarbeiten ohne 60 schleifen zu drehen oder ?

Deshalb die Daten umkopieren. Auf den Zielbereich greift dann dein TP und der FB für den Servo zu. Nach dem Teachen, den Bereich zurückkopieren. Vor jedem Typwechsel den Bereich umkopieren.
 
Danke Ralle ,
werde ich mir durchlesen
nur zielt meine frage eher wie ich di zahl 1 bis 60 ohne schleifen drehe zu adressieren
 
Also ich habe ein op177B dor wähle ich den Typ als zahl vor 1-60
und will den die Achspositionen aus dem UDT DB auslesen und übergeben bzw wenn die Achse neu geteached wird wieder reinschreiben.
Es muss doch eine einfache Lösung geben die Zahl direkt zu verarbeiten ohne 60 schleifen zu drehen oder ?

Das OP177B hat eine Rezepturverwaltung, da kannst du deine 10 Positionen einrichten und dann einfach 60 Sätze anlegen. Das geht auch über Excel und ne Speicherkarte. Der Bediener wählte dann einfach 1-60 oder eine entsprechende Beschreibung. Dann stehen deine Positionen direkt in den entsprechenden DB-Variablen nämlich genau 10. UDT und Adress-Offset und alles andere brauchst du dann nicht. Warum so kompliziert?
 
rezeptur

Hi,
Das OP177B hat eine Rezepturverwaltung, da kannst du deine 10 Positionen einrichten und dann einfach 60 Sätze anlegen. Das geht auch über Excel und ne Speicherkarte. Der Bediener wählte dann einfach 1-60 oder eine entsprechende Beschreibung. Dann stehen deine Positionen direkt in den entsprechenden DB-Variablen nämlich genau 10. UDT und Adress-Offset und alles andere brauchst du dann nicht. Warum so kompliziert?

der Weg ist auch möglich, ob er einfacher ist...:rolleyes:
Die Beiträge vom Ralle und andere Kollegen bez. indirekte Adressierung sind der richtige Weg, und soooo schwierig ist die Sache nicht. Und ein einigermassen guter Programmierer sollte das können.

Vladi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
der Weg ist auch möglich, ob er einfacher ist...:rolleyes:
Die Beiträge vom Ralle und andere Kollegen bez. indirekte Adressierung sind der richtige Weg, und soooo schwierig ist die Sache nicht. Und ein einigermassen guter Programmierer sollte das können.
Vladi

Zu Zeiten als es noch keine Displays mit viel Speicher gab musste man das so machen, aber wenn er sowieso ein Display mit Rezepturverwaltung hat warum dann so kompliziert. Ausserdem ist die Rezepturverwaltung viel leichter erweiterbar und kosten keinen SPS-Speicher. Den 'richtigen' Weg gibt es IMHO nicht. Ich kann das ganze auch mit einem PC und einer SQL-DB machen. Ist auch nicht 'falsch' nur aufwendiger. :)
 
Ich had ein kleines beispiel gemacht wie man das in Wincc flexible indirekt adressieren kan. (Wincc Flexible 2007)
Wenn Sie ein alteres WinCC flex habe und meine Beispiel nicht offen kunte, mach die variable so: Sie legen als erste die variable mit die adresse an, voor pos1 = DB100.DBD2 zb AdressePos1 uzw. Die adresse fur die positie's in das recept DB100.DBW[AdressePos1] uzw.
Wenn sie das so macht benodige sie 20 tags fur die 10 positie's in die 60 recepten + ein tag fur das recept nummer
 

Anhänge

  • Test_01.zip
    2,2 MB · Aufrufe: 5
Ich kann dir nicht so richtig folgen, was meinst du???
Hallo Ralle
ich meine damit das ich wenn ich den Typ 1-60 vorwähle ich ja irgendwie meinen pointer stricken muss
aso muss ich erstmal schauen welchen Typ habe ich und dann den adressbereich festlegen oder ??
Also die zahlen von 1 - 60 durchladen und wenns nicht passt springen bzw wenns passt adressierung vornehmen
das meinte ich eine einfache löseung wenn zB Typ 44 ist die Zahl 44 als quasi variable nehmen

Gruss Michael
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Pointer

Hi,
jawohl, ich denke so:
Code:
L  Typ  // dein Programmtyp, Integer
L   1    // weil Programmtyp 1...60 ist
-D      // ich möchte aber im DB bei 0 anfangen..
L  40   // so lang ist z.B dein Bereich Daten pro Typ, kannst machen wie du wilst
*D
SLD 3 // Pointer daraus machen, fertig
LAR1   // ab ins Adressregister damit
 
AUF DB "Daten"
L  DBD[AR1, P#0.0]    // erster Daten DBD
T  DB10.DBD0   // Baustein für aktl. Daten
AUF DB "Daten"
L  DBD[AR1, P#4.0]  // zweiter Daten DBD
T  DB10.DBD4   // Baustein für aktl. Daten
usw.

D.h. deine Adresse im Pointer hat hier die Werte je nach Programmtyp:
1->0
2->40
3->80
4->120 usw.

ACHTUNG mit der Geschichte:
AUF DB "Daten"
L DBD[AR1, P#0.0] // erster Daten DBD
T DB10.DBD0 // Baustein für aktl. Daten, die SPS öffnet DB10 hier..
AUF DB "Daten" // SONST bleibt noch DB10 offen!!!
L DBD[AR1, P#4.0] // zweiter Daten DBD
T DB10.DBD4 // Baustein für aktl. Daten
AUF DB "Daten"
.....
Gruss: Vladi
 
Hallo Vladi ich danke dir ich glaube da komme ich solangsam mit
hat mir schon mal sehr geholfen
nur bin ich nicht der erfahrene AWL programmierer kann ich die 10 DINTS mir im Baustein ablegen und dann in kop schleben usw ?
Gruss Michael
 
Hallo Vladi ich danke dir ich glaube da komme ich solangsam mit
hat mir schon mal sehr geholfen
nur bin ich nicht der erfahrene AWL programmierer kann ich die 10 DINTS mir im Baustein ablegen und dann in kop schleben usw ?
Gruss Michael

Ich meinte es auch so, wie Vladi das dann gezeigt hat.

Das hier:

AUF DB "Daten"
L DBD[AR1, P#0.0] // erster Daten DBD
T DB10.DBD0 // Baustein für aktl. Daten

kannst du

1. 10 x hintereinander machen:

AUF DB "Daten"
L DBD[AR1, P#0.0] // erster Daten DBD
T DB10.DBD0 // Baustein für aktl. Daten
AUF DB "Daten"
L DBD[AR1, P#4.0] // zweiter Daten DBD
T DB10.DBD4 // Baustein für aktl. Daten
AUF DB "Daten"
L DBD[AR1, P#8.0] // erster Daten DBD
T DB10.DBD8 // Baustein für aktl. Daten
AUF DB "Daten"
L DBD[AR1, P#12.0] // zweiter Daten DBD
T DB10.DBD12 // Baustein für aktl. Daten

...

2. in einer Schleife durchlaufen lassen

3. diesen FC machen lassen (enthält intern den SFC 20, BLK_MOVE)
siehe mein Link weiter oben
 
Zurück
Oben