Step 7 Ginge das auch eleganter?

spirit

Level-1
Beiträge
961
Reaktionspunkte
23
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Ihr,

hänge da schon mal wieder an einem Problemchen.

Es sollen z.B. alle Zähler (DINT) auf einmal gelöscht; also mit Null beschrieben werden:

Code:
      L     L#0
      T     "Zaehler_DB".Z1
      T     "Zaehler_DB".Z2
      T     "Zaehler_DB".Z3
      T     "Zaehler_DB".Z4

usw.


Könnte man das auch kürzer mittels eines Pointers lösen, z.B. in der Art:

Code:
  L L#0
  T P#"Zaehler_DB".DBX0.0 BYTE16

Vielen Dank!
 
Ja, geht. Ist dann aber nicht mehr in den Querverweisen zu finden.

Stichwort: Schleife mit indirekter Adressierung (speicherindirekt, registerindirekt), SFC21 FILL, SFC20 BLKMOV, ...

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok danke Harald,

habe das jetzt mal so versucht - klappt aber noch nicht:

Code:
      L     L#0
      T     MD    90

      CALL  "BLKMOV"
      SRCBLK :=MD90
      RET_VAL:=MW55
      DSTBLK :=P#DB10.DBX14.0 BYTE16

Wo liegt da noch der Hund begraben? ;)
 
Hilfe zum SFC20, sinngemäß:
"Ist das angegebene Quellfeld kürzer als das Zielfeld, dann werden nur so viele Daten kopiert wie das Quellfeld lang ist."

Nimm SFC21 FILL

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich finde es immer wieder interessant was so alles gemacht wird um ein Programm unübersichtlicher zu machen.
Das sieht aus als hat man viel Freizeit.:ROFLMAO:
 
Ok, dann ist das ok.
Ich bin immer noch der Meinung man sollte Programme so schreiben das es ein Instandhalter ohne große Programmiererfahrung auch lesen kann.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, dann ist das ok.
Ich bin immer noch der Meinung man sollte Programme so schreiben das es ein Instandhalter ohne große Programmiererfahrung auch lesen kann.

na ja, einen Bereich mit dem SFC20 bzw. 21 platt machen, sollte man schon lesen können,
vor allen dingen weil diese Bausteine mit F1 schnell erklärt sind. Wo willst du anfangen und
wo willst du aufhören, beim SR-Gliedern, oder darf es auch ein wenig mehr sein?
 
na ja, einen Bereich mit dem SFC20 bzw. 21 platt machen, sollte man schon lesen können,
vor allen dingen weil diese Bausteine mit F1 schnell erklärt sind. Wo willst du anfangen und
wo willst du aufhören, beim SR-Gliedern, oder darf es auch ein wenig mehr sein?

Was spricht denn gegen einen eindeutigen einfachen Code wie z.b.
L L#0
T "Zaehler_DB".Z1
T "Zaehler_DB".Z2
T "Zaehler_DB".Z3
T "Zaehler_DB".Z4 ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja ... sehe ich nicht so ... 8)

Ich kann hier Rudi nur zustimmen. Im Fall des ursprünglichen Codes sieht man (sogar symbolisch) ganz genau was passieren soll und an welche Variablen es geht. Das ist im Falle des Gebrauchs des SFC Fill nun wirklich nicht der Fall - der Ersteller weiß natürlich, was er gemacht hat und es funktioniert ja auch - aber jemand fremdes, der da dran kommt, dem wird sich der Code so nicht auf Anhieb erschließen ...

Gruß
Larry
 
der Ersteller weiß natürlich, was er gemacht hat und es funktioniert ja auch - aber jemand fremdes, der da dran kommt, dem wird sich der Code so nicht auf Anhieb erschließen ...

Da sollte ja hoffentlich im Netzwerkkommentar sowas wie "hier wird Zaehler_DB.Z1 bis Z4 auf 0 gesetzt" stehen. Aber trotzdem bin ich auch der Meinung dass im Code, welcher dem Instandhalter zugänglich ist, die ausführliche Variante besser ist. Vorausgesetzt das sind nicht 500 Zeilen. In nem FB welcher OOP-mäßig verwendet wird, find ich die Variante mit dem SFC besser. An diesen FB sollte der normale Instandhalter dann auch nicht dranmüssen.

Aber das ist natürlich alles persönliche Ansichtssache und auch vom Projekt/Kunden abhängig... Spätestens wenn die Projekte größer/umfangreicher/komplizierter werden, ist es für den "kleinen Instandhalter"* eh schwierig.

Aber so ähnliche Diskussionen gabs hier ja schon mehrfach.

*das ist nicht abwertend gemeint. Bei größeren Projekten(>10000 I/Os vielleicht) braucht man eigentlich jemanden, der sich Vollzeit mit dem SPS-Programm+Visu befasst.


Gruß.
 
Was spricht denn gegen einen eindeutigen einfachen Code wie z.b.
L L#0
T "Zaehler_DB".Z1
T "Zaehler_DB".Z2
T "Zaehler_DB".Z3
T "Zaehler_DB".Z4 ?
Ich sehe das schon ein wenig anders,
es ist ja lobenswert bei der Erstellung eines Programms auch die Instandhalter im Hinterkopf zu haben,
aber man muss die dabei aber auch nicht für dümmer halten als die im Regelfall sind.

Wenn man jetzt die Variablen im Zähler DB also Z1 und so noch in ein Struct packt, dann ist sogar der SFC21 vollsymbolisch.
Insbesondere ist es dann auch egal, wie viele und welche Datentypen involviert sind.

Mfg
Manuel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
es ist ja lobenswert bei der Erstellung eines Programms auch die Instandhalter im Hinterkopf zu haben,
aber man muss die dabei aber auch nicht für dümmer halten als die im Regelfall sind.

Das ist sehr unterschiedlich... Wir haben nen Kunden, welcher nur Merker versteht*... selbst wenn wir Stat oder Temp Variablen in nem FB verwenden kapiern die das nicht....

*wieder nicht abwertend bzw. verallgemeinernd gemeint.

Gruß.
 
Ich denke es ist egal wie gelöscht wird.
Traut den Instandhaltern einfach etwas zu.
Wenn das sinnvoll und klar dokumentiert ist, dann klappt das auch.

Mich interessiert, warum immer wieder versucht wird alles zu verkomplizieren.
Ein Netzwerk mit Überschrift: Zähler auf Null setzen ist ausreichend.
Doch müssen da indirekte Adressierung sein?
Es ist einfacher, wenn mit Adressen gearbeitet. Man kann dann in QVL etwas finden.


bike
 
Wenn man jetzt die Variablen im Zähler DB also Z1 und so noch in ein Struct packt, dann ist sogar der SFC21 vollsymbolisch.
Insbesondere ist es dann auch egal, wie viele und welche Datentypen involviert sind.
Das sehe ich auch so!
Und wer das nicht lesen kann, sollte sich mal überlegen ob nicht vielleicht ein Anfängerkurs angebracht wäre, oder jemand es einem erklären kann.
 
Ok danke Harald,

habe das jetzt mal so versucht - klappt aber noch nicht:

Code:
      L     L#0
      T     MD    90

      CALL  "BLKMOV"
      SRCBLK :=MD90
      RET_VAL:=MW55
      DSTBLK :=P#DB10.DBX14.0 BYTE16

Wo liegt da noch der Hund begraben? ;)

Übrigens ist die Verwendung von ungeraden Adressen bei MW *pfui*.

Meine Meinung zur Programmierphilosophie:

Da gibt es nicht schwarz & weiß. Will ich nur ein paar Zähler nullen, schreib ich die untereinander. Das geht schnell, ist gut lesbar und birgt weniger Fehlerquellen.
Bei mehr als 10 würde ich das dann auch indirekt adressieren.
 
Im Idealfall programmiert man das Programm richtig und eine gute Meldungsanzeige, dann muss der Instandhalter nichts programmieren :)


Und gibt man dir die Zeit wenn eine Anlage läuft das Programm zu optimieren ?
Meine Erfahrung 95 % der Programme sind nicht fertig !
Ist aber keine Schuldzuweisung an die Programmierer. Einfach die fehlende Zeit wenn eine Anlage einmal läuft.
 
Zurück
Oben