Array?????

Adenauer

Level-1
Beiträge
121
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo also hier mal ein Problem

Ich habe mehrere Artikle ca 30 .welchen daten zugeordnet sind

Also Gewicht pro meter , Gewichtsaufnahme, Breite,

Die Artikel haben auch Nummern.
So jetzt das eigentliche Prob.
An meiner Maschine habe ich ein OP 3 (leider keine Rezepturen möglich)
Über dies OP3 soll die Art. Nr eingegeben werden und anhand der Nummer die Maschinenegeschwindikeit berechnet werden.
Soweit so gut.
Bisher habe ich es so gelöst das ich für jenden Art. einen DB gemacht habe also DB 27 28 etc.
In die DBs dann die werte für breite gewicht usw.
Am OP wird dann über ein MW der DB aufgerufen und die Werte weiter verarbeitet.
Das geht soweit auch ganz gut. Bis heute hatten wir nur die info dass die Art. nummern bei 27 anfangen wir also schön 27 + ca 30 ok 57 DBs.

Jetzt haben wir aber das Prob das die Art.Nr nicht vortlaufend sind sondern
bei 27 anfangen dann mal nen Sprung auf 100 und was für uns das schlimmste ist über 511 gehen.
Die CPU (313C) kann DBs leider nur bis 511 und jetzt such ich nach ner Lösung.


Was wir schön überlegt haben ist dass ganze über Arrays zu lösen.
Also einen Db mit der Breite einen mit dem Gewich und einen mit der Gewichtsaufnahme.

Wie würdet IHR an die Sache rangehen?
 
Um es für mich einfach (leider etwas unübersichtlich) zu machen würde ich für jeden Artikel einen DB anlegen und zB bei 1 anfangen. In der Steuerung oder im OP würde ich dann die Nummer umkopieren. Also Artikelnummer 27 = DB1.
Mit Arrays wäre es bestimmt eleganter aber sicher auch nicht einfacher :rolleyes:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Idee mit dem konvertieren der nummern habe ich auch schon gehabt.
Dann bräuchte mann aber immer ne liste zum vergleichen. Was ich vermeiden will.
Ausserdem soll es über das OP möglich nachher auch möglich sein neue Art. einzupflegen.
 
Adenauer schrieb:
Die Idee mit dem konvertieren der nummern habe ich auch schon gehabt.
Dann bräuchte mann aber immer ne liste zum vergleichen. Was ich vermeiden will.
Ausserdem soll es über das OP möglich nachher auch möglich sein neue Art. einzupflegen.
Rezeptur im Panel machen? Text zu kurz.
 
Zuletzt bearbeitet:
Als Programmierer aus der Hochsprachenwelt würde ich einen UDT mit einem Feld für die Rezeptnummer und weiteren Feldern für die anderen benötigten Daten (Breite, Gewicht) anlegen. Von diesem UDT wird dann in einem DB ein ausreichend großes Array angelegt.

Beim Hinzufügen eines Rezeptes wird dann einfach immer das erste leere Array-Element verwendet.

Beim Rezeptwechsel muß man einmal von vorne nach hinten das Array nach dem passenden Element durchsuchen.

Wenn irgendwann doch mehr als 30 Rezepte benötigt werden, dann muß nur der DB entsprechend vergrößert werden.


Gruß Axel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Wenn ich es richtig verstanden habe hast du ja nicht sehr viele Daten pro Art. Nummer , warum legst du dir nicht
Die Daten immer nach einander in einem DB ab und ermittelst nur an hand der Art. Nummer die Anfangsadresse des Datenbereichs im DB und lädst die mit SFC 20 dann komplett in einen Bearbeitungs DB mit dem du dann immer rechnest hier wurde auch eine SFC 20 schon vorgestellt mit der du einfach indirekt Adressieren kannst also mit INT werten. Würde mit der Artnummer die Anfangsadresse berechnen z.B.
Die Länge hätte 2 Worte Eingabe im OP „1“ mal 2 = Anfangsadresse DBW2 .
Du müsstest allerdings die ganzen Artnummern anlegen. Und zum werte eingeben könntest Du auch mit diesem Baustein arbeiten in dem du die Daten wieder in einem Bild eingibst diese in einem Dritten DB ablegst und über die Artnummer die Anfangsadresse errechnen mit Tasten Drück rüber speichern in den Daten DB.
Ich hoffe es ist einigermaßen verständlich.


HDD
 
Aber ...

afk schrieb:
Als Programmierer aus der Hochsprachenwelt würde ich ...

Wenn irgendwann doch mehr als 30 Rezepte benötigt werden, dann muß nur der DB entsprechend vergrößert werden.

... es genauso machen. Aber finde erst mal die max. DB-Länge deiner
CPU heraus!

Die kleinen von Siemens sind leider nicht nur bei den Baustein-Nummern,
sondern auch bei der max. DB-Länge etwas amputiert. Preiswerte Abhilfe:
z.B. VIPA

Gruß G.
 
@ afk

könntest du deinen Vorschlag vieleicht ein bisschen näher beschreiben??
Hab leider in dieser form von Programmierung noch nicht viel zu tun gehabt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Noch ein Gast schrieb:
... es genauso machen. Aber finde erst mal die max. DB-Länge deiner
CPU heraus!

Die kleinen von Siemens sind leider nicht nur bei den Baustein-Nummern,
sondern auch bei der max. DB-Länge etwas amputiert. Preiswerte Abhilfe:
z.B. VIPA

Gruß G.

AFAIK ist die max. Länge eines DB bei der S7 300 8KByte. Selbst wenn er jeden Wert als Dword ablegt, kann er 2000 Werte in einem DB spaichern, oder?

Wo liegen denn bei den Vipas die Grenzen?
 
Adenauer schrieb:
@ afk
könntest du deinen Vorschlag vieleicht ein bisschen näher beschreiben??
In AWL kann ich leider kein Beispiel liefern, da

afk schrieb:
Als Programmierer aus der Hochsprachenwelt ...
... heißt, das ich Software-Entwickler für PC-Programme bin, und was die SPS-Programmierung angeht, da kann ich den Spezialisten hier im Forum höchstens bei SCL noch einigermaßen folgen.

Aber mit meinem begrenzten Wissen kann ich es zumindest soweit erklären:

1. Du mußt einen UDT (z.B. UDT 1, symb. "Rezept") erzeugen, der ein Feld für die Rezeptnummer, ein Feld für die Breite, ein Feld für das Gewicht, usw. (genau wie bisher die Definition Deines DBs, nur eben zusätzlich mit der Rezeptnummer).

2. Dann erzeugst Du einen DB, in dem Du dann ein Array [1..30] vom Datentyp "Rezept" anlegst.

In SCL kann man dann auf die einzelnen Elemente des Arrays einfach über den Index zugreifen, wie das mit AWL funktioniert weiß ich nicht, das muß Dir einer von den SPS-Profis hier erklären.

Beim Anlegen eines neuen Rezepts fängst Du dann mit Index 1 an zu kontrollieren, ob die Rezeptnummer von Element[Index] = 0 ist, wenn ja, dann Rezept in dem Element speichern, wenn nein, dann Index erhöhen und weiter suchen.

Beim Rezeptwechsel fängst Du auch mit Index 1 an, und kontrollierst, ob die Rezeptnummer von Element[Index] die gesuchte Nummer ist, wenn ja, dann Werte des Elements übernehmen, wenn nein, dann Index erhöhen und weiter suchen.

In beiden Fällen mußt Du die Suche am Ende des Arrays (Index = 30) abbrechen und eine Störmeldung erzeugen.

Ich hoffe, das hilft Dir ein wenig weiter.


Gruß Axel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Data Tables

Hallo Adenauer,

um irgendwelchen Zahlen wieder definierte Werte zuzuordnen, gibt's unter -> Bibliotheken
-> Standard Library
-> TI-S7 converting Blocks
einen fertigen Baustein, dessen Nummer ich gerade nicht weiß.
 
Es wäre auch möglich für jedes Benötigte Element einen DB anlegen.
Z.B. DBRezeptNr, DBBreite, DBHöhe usw. Beim neu anlegen eib leeres Feld im DBRezeptNr suchen und die neue Nr am gefundenen Index eintragen. In den anderen DB's dann einfach am gleichen Index die benötigten Werte eintragen. Somit brauchst du ledigklich ein paar DB's für die benötigten Daten und wenns ganz nobel sein soll noch nen Transfer DB in dem du dann einen UDT oder was auch immer aus den gefunden Daten füllst und weiter verarbeitest.
 
Sprungverteiler

Hallo Adenauer,

manchmal hilft auch mir etwas Nachdenken.
Schau Dir doch mal den SPL-Befehl in der Online-Hilfe an. Eigentlich ist ein Sprungverteiler doch genau das Richtige.
 
commander schrieb:
AFAIK ist die max. Länge eines DB bei der S7 300 8KByte. Selbst wenn er jeden Wert als Dword ablegt, kann er 2000 Werte in einem DB spaichern, oder?

Wo liegen denn bei den Vipas die Grenzen?

Hallo

Bei allen VIPA Speed7 CPUs liegt die maximale DB-Größe (nutzbare Größe) bei 64kB. Bei allen SIEMENS S7-400 und bei SIEMENS S7-318, 317 und 319 ist sie auch 64kB!


Gruß
 
Zurück
Oben