-> Hier kostenlos registrieren
Mahlzeit,
ich habe mir schon des öfteren hier Hilfen und Lösungen angelesen, komme aber nun bei Pointern an meine Grenze und muss daher einfach mal nachfragen. Ich bin in der Instandhaltung tätig und denke das ich mit der S7 soweit schon gut zurechtkomme. Letztes Projekt war eine S7 Erweiterung mit Schrittmotorsteuerung über Profibus, dabei konnte ich alle Fragen und Probleme durch Selbststudium lösen [hier war in der tat das Lesen der PB-Daten das kniffligste wenn man es noch nie gemacht hatte]. Bevorzugt nutze ich den KOP, AWL meide ich gerne wenn das Programm es zulässt.
Was möchte ich nun:
Ich will/muss eine Anlagenerweiterung aufbauen mit S7-300 für eine Teileerkennung. Dabei werte ich eine Kamera von oben und Sensorik von unten aus. Am Ende möchte ich für das erkennte Teil (ca 150 verschiedene) eine definierte Nummer haben mit der ich dann weiterarbeiten kann. Das ganze mit Step7 5.5
Hier mal umrandet als Beispiel:
Kamera gibt mir Typ A vor -> Wert 10 (Typen-Werte steigen in 10er Schritten -> 10, 20, 30...)
Sensoren geben mir Form 2 -> Wert 2 (Form-Werte sind 0-9)
-> ergibt Variante 12. Zu dieser Variante steht im DB 1 an 12. Stelle ein DBD -> DB1.DBD48 = 456789 -> Diese Zahl möchte ich als Ergebnis. (andere Varianten haben andere Zahlen)
Also brauche ich ja "nur" einen Pointer auf das DBD48. Leider finde ich das Thema schwer zu verstehen weil da zuviele Zeichenkombinationen zusammenkommen.
aber hier mal mein Stand wie ich glaube das es gehen müsste.
Fragen:
Funktioniert das wirklich so einfach? Ich habe leider noch keine Hardware hier zum testen
Geht es kürzer? Also kann ich in normalen DB-Aufrufen DB1.DBD[AR1,P#0.0] verwenden oder ists da tatsächlich das sauberste einen DB als Zwischenspeicher zu nehmen um von dort "normal" aufzurufen?
kann ich, zur Verkleinerung auch Lokalworte dafür nutzen? (Also statt den DB2 einfach LDW0 und LDW4 nutzen)
[zum verstehen]der P#0.0 (weiterschieben, eher in Verbindung mit Schleife/Zähler?) muss immer dabei sein? Und muss immer zum Typ passen? (DBD P#0.3 -> Stopp, DBB p#0.3 -> Stopp, ...)
wenn ich den DB auchnoch Variabel machen möchte.. wäre es any-Zeiger? Da ist ja gar nicht mehr zu erkennen warum da was passiert..
Ich hoffe das ist soweit verständlich
mfg Beka
ich habe mir schon des öfteren hier Hilfen und Lösungen angelesen, komme aber nun bei Pointern an meine Grenze und muss daher einfach mal nachfragen. Ich bin in der Instandhaltung tätig und denke das ich mit der S7 soweit schon gut zurechtkomme. Letztes Projekt war eine S7 Erweiterung mit Schrittmotorsteuerung über Profibus, dabei konnte ich alle Fragen und Probleme durch Selbststudium lösen [hier war in der tat das Lesen der PB-Daten das kniffligste wenn man es noch nie gemacht hatte]. Bevorzugt nutze ich den KOP, AWL meide ich gerne wenn das Programm es zulässt.
Was möchte ich nun:
Ich will/muss eine Anlagenerweiterung aufbauen mit S7-300 für eine Teileerkennung. Dabei werte ich eine Kamera von oben und Sensorik von unten aus. Am Ende möchte ich für das erkennte Teil (ca 150 verschiedene) eine definierte Nummer haben mit der ich dann weiterarbeiten kann. Das ganze mit Step7 5.5
Hier mal umrandet als Beispiel:
Kamera gibt mir Typ A vor -> Wert 10 (Typen-Werte steigen in 10er Schritten -> 10, 20, 30...)
Sensoren geben mir Form 2 -> Wert 2 (Form-Werte sind 0-9)
-> ergibt Variante 12. Zu dieser Variante steht im DB 1 an 12. Stelle ein DBD -> DB1.DBD48 = 456789 -> Diese Zahl möchte ich als Ergebnis. (andere Varianten haben andere Zahlen)
Also brauche ich ja "nur" einen Pointer auf das DBD48. Leider finde ich das Thema schwer zu verstehen weil da zuviele Zeichenkombinationen zusammenkommen.
aber hier mal mein Stand wie ich glaube das es gehen müsste.
Code:
[FONT=arial]L DB2.DBD0 -> da lege ich die Variante ab (direkt x4 gerechnet wegen DINT)[/FONT]
[FONT=arial]SLD 3 -> Wenn ich es richtig verstanden habe schiebt es hier im Speicher etwas umher, das muss einfach so sein!??
LAR1 -> schreibt das AR1, also eigendlich ist das schon der Pointer bzw die Adresse für den Pointer?
AUF DB1 -> DB erst aufrufen, muss so sein
L DBD [AR1, P#0.0] -> er lädt nun das DBD
T DB2.DBD4 -> da habe ich nun mein Ergebniss[/FONT]
Fragen:
Funktioniert das wirklich so einfach? Ich habe leider noch keine Hardware hier zum testen
Geht es kürzer? Also kann ich in normalen DB-Aufrufen DB1.DBD[AR1,P#0.0] verwenden oder ists da tatsächlich das sauberste einen DB als Zwischenspeicher zu nehmen um von dort "normal" aufzurufen?
kann ich, zur Verkleinerung auch Lokalworte dafür nutzen? (Also statt den DB2 einfach LDW0 und LDW4 nutzen)
[zum verstehen]der P#0.0 (weiterschieben, eher in Verbindung mit Schleife/Zähler?) muss immer dabei sein? Und muss immer zum Typ passen? (DBD P#0.3 -> Stopp, DBB p#0.3 -> Stopp, ...)
wenn ich den DB auchnoch Variabel machen möchte.. wäre es any-Zeiger? Da ist ja gar nicht mehr zu erkennen warum da was passiert..
Ich hoffe das ist soweit verständlich
mfg Beka