Dezimalzahl in Datenbaustein laden

Alexus85

Level-1
Beiträge
30
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus Leute!

Ich hab hier ein Programm, welches zwar funktioniert aber zu umständlich (Größe) geschrieben ist.
Folgendes Problem:
Ein Eingang, Bsp. E0.1, soll bei einem Sprung 0->1 eine Dezimalzahl, Bsp. 1, in einen Datenbaustein schreiben.
Wenn ein weiterer Eingang, Bsp. E0.2 ebenfalls einen solchen Sprung erfährt, soll die Zahl, Bsp. mit 2, im Datenbaustein überschrieben werden.

Ich hab das mal versucht mit Sprüngen zu verwirklichen....

------------------
FC1:

U E 0.1
UN M 0.1
SPB _001

U E 0.2
UN M 0.2
SPB _002
SPA _100

_001: L 1
T DB1.DBW0
SPA _100

_002: L 2
T DB1.DBW0
SPA _100

_100: BE

------------------

FC2:

U E 0.1
S M 0.1
UN E 0.1
R M 0.1

U E 0.2
S M 0.2
UN E 0.2
R M 0.2

------------------

Die ganze sache funktioniert wie ich es mir vorgestellt hab.
Jetzt zum PROBLEM:
Ich habe nicht zwei Eingänge sonder weit über 100.
Daher würde ein ewig langes Programm entstehen, was ich umgehen möchte.

Habt ihr einen Tipp wie ich das ganze einfacher gestallten kann?
Wichtig ist vorallem, dass der Wert immer vom aktuellsten Eingangs-Sprung überschrieben wird.

Ich sag jetzt schon mal Danke für eure Hilfe!!
MfG
Alex
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
*
//Adressregister initialisieren
      LAR1  P#0.0
//Schleife vorbereiten
      L     200
next: T     #iLoopCounter
//Eingang Abfragen
      U     E [AR1,P#0.0]
      SPBN  nich
//Nummer berechnen und ausgeben
      L     -1
      L     #iLoopCounter
      *I    
      +     200
      T     #iNumber
//Adressregister erhöhen und solange Schleifenzähler > 0 zurück zu next
nich: +AR1  P#0.1
      L     #iLoopCounter
      LOOP  next
 
@4L
Damit erwischst Du "nur" den gesetzten Eingang mit der höchsten Adresse aber nicht zwangsläufig den, der als letzter gekommen ist.

Besser wäre:

Code:
*
//Adressregister initialisieren
      LAR1  P#0.0
//Schleife vorbereiten
      L     200
next: T     #iLoopCounter
//Eingang Abfragen
      U     E [AR1,P#0.0]
  [COLOR=red]    FP    M[AR1,P#0.0][/COLOR]
      SPBN  nich
//Nummer berechnen und ausgeben
      L     -1
      L     #iLoopCounter
      *I    
      +     200
      T     #iNumber
//Adressregister erhöhen und solange Schleifenzähler > 0 zurück zu next
nich: +AR1  P#0.1
      L     #iLoopCounter
      LOOP  next
[/QUOTE]
 
@4L
Damit erwischst Du "nur" den gesetzten Eingang mit der höchsten Adresse aber nicht zwangsläufig den, der als letzter gekommen ist.

ich nenne das "room for improvement" :D

aber wenn schon, dann

Code:
*
//Adressregister initialisieren
      LAR1  P#0.0
[COLOR="Red"][B]      AUF   DB [#iDBNo][/B][/COLOR]
//Schleife vorbereiten
      L     200
next: T     #iLoopCounter
//Eingang Abfragen
      U     E [AR1,P#0.0]
      FP    [COLOR="red"][B]DBX[/B][/COLOR][AR1,P#0.0]
      SPBN  nich
//Nummer berechnen und ausgeben
      L     -1
      L     #iLoopCounter
      *I    
      +     200
      T     #iNumber
//Adressregister erhöhen und solange Schleifenzähler > 0 zurück zu next
nich: +AR1  P#0.1
      L     #iLoopCounter
      LOOP  next

laut seiner sprungverteilung wollte er aber die höchste adresse, oder? ;)
 
Der FC1 von Alex ermittelt - im Gegensatz zu seiner Erklärung - die niedrigste Eingangsnummer, die gerade "springt".
Was will er wohl tatsächlich? Die Nummer des "aktuellsten Sprungs"? Was soll passieren, wenn es mehrere "aktuellste" gibt?

Es scheint irgendeinen seltsamen metaphysischen Zusammenhang zu geben ... Programmierer, die sich nicht so eindeutig
ausdrücken können, schreiben ziemlich oft auch solchen Code:
Code:
U E 0.1
S M 0.1
UN E 0.1
R M 0.1
Das kommt womöglich davon, das die nur in Setzen und Rücksetzen denken können?

Auf diese geniale Weise kann man schon mal sehr viele Zeilen Code einsparen:
Code:
U E 0.1
= M 0.1

@Alexus85
Besser noch, Du schaust Dir mal den Flanken-Befehl FP an, das spart noch mehr Codezeilen.
Und wenn Du platzsparend gleich Word- oder Doppelwordweise die Flankenerkennung durchführen willst,
da haben wir hier auch ein FAQ dazu.

Und wenn Du nochmal genau beschreiben könntest was Du brauchst, dann gibt es sicher eine noch kürzere Lösung.

Harald
 
Sprünge

Mein Chef sagt
Je mehr sprünge im Programm sind um so unfähiger ist der Programmierer
Er mag eh kein AWL

Manchmal muss man springen aber im ernst ich habe auch mal ein Programm mit vielen sprüngen gehabt --> IBN totales desaster nach 2 Tagen Rückbau auf altstand der Anlage --> Fazit: gelernt nicht so viel zu springen bringt nur Ärger.

und wie wäre dies so allgemein gefragt eben aus dem Ärmel mit einer Movebox ?
Eingang mit FP als Eneable und die Zahl in den DB gehauen?

nur ein Gedanke nicht gleich Hauen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also zunächst mal vielen Dank für die große Beteiligung an meinem Problem. Ich bin mir sicher ihr werdet mir helfen können.

Zur Erklärung meines umständlichen, bzw. schlechten Programmierungsstils kann ich nur sagen, dass ich das nicht hauptberuflich oder hobbymäßig, und somit oft mache. Ich habe weder einen Kurs belegt und muss mich stets neu einlesen und einarbeiten. Es fehlt mir also auch die nötige Erfahrung umständliche Programmzeilen kompakt und einfach zusammenzufassen.

Da eine genaue Beschreibung meines Problem gewünscht wurde, hier kommt sie:

An ein CP-Modul lässt sich ein Drucker anschließen. In der H.Konfig lässt sich der auszugebene Text in einer Tabelle (SDB) eingeben.
Eine in einem Datenbaustein stehende Nummer gibt an welcher Text aus der Tabelle gedruckt werden soll. Diese Nummern sind ganz normale Dez.Zahlen (2; 13; 240;...)

Jetzt habe ich viele Eingänge (>100). Jeder Eingang soll einer Textzeile entsprechen. Wenn ein Eingang von 0-1 wechselt soll der zugehörige Text gedruckt werden. Wenn ein weiterer Eingang von 0-1 wechselt soll nur dieser und nicht der vorherige gedruckt werden. ---> JA, es könnten auch mehrer Meldungen, wenn auch selten, gleichzeitig kommen. Da wäre es natürlich wünschenswert wenn alle ausgedruckt werden.
Jeder Eingang muss also seine Nummer in diesen Datenbaustein schreiben.

Jetzt sollte das ganze halt nicht in einem seitenlangen Programmtext enden.

Ich hoffe jetzt ist es noch klare, was ich bräuchte.

Dank euch allen!
 
Zuletzt bearbeitet:
*ROFL* *ROFL*

die forensoftware ist geil!

meine antwort auf den beitrag von 8:55 habe ich bereits 8:54 erstellt

*ROFL* *ROFL*
 
Zuletzt bearbeitet:
Hallo 4L,

bei Deinen Links fehlt noch "WWW."

Kann es sein, dass Du dich mit Lichtgeschwindigkeit bewegst?
Dann kannst Du auch auf Beiträge antworten, die noch nicht geschrieben wurden!:-D

Grüße
Gebs
 
Kann es sein, dass Du dich mit Lichtgeschwindigkeit bewegst?
Dann kannst Du auch auf Beiträge antworten, die noch nicht geschrieben wurden!:-D

sieht ja stark danach aus

Mordor_FRI schrieb:
Sprünge im Programmcode

und kannst du die aussage von deinem chef noch irgendwie mit argumenten untermauern? ansonsten ist es ja doch nur heiße luft und nicht der mühe wert, diskutiert zu werden
 
Habe inzwischen einen neuen Chef (Chef = Abteilungsleiter), sollte auch nicht diskutiert werden, war nur ne bemerkung am rande, das man bei sprüngen seeehhrrr vorsichtig sein muss (eigene Erfahrung)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Habe inzwischen einen neuen Chef (Chef = Abteilungsleiter), sollte auch nicht diskutiert werden, war nur ne bemerkung am rande, das man bei sprüngen seeehhrrr vorsichtig sein muss (eigene Erfahrung)

dann berichte doch von deinen erfahrungen, ist doch sicher für einige andere auch hilfreich
 
Moin Alexus85,

jetzt kann man mit Deiner genauen Aufgabenbeschreibung in Beitrag #12 was anfangen.
Leider habe ich jetzt nicht die Zeit zum helfen, doch vielleicht hilft Dir mittlerweile jemand anders ...

Harald
 
Eigene Erfahrung

@ Vierlagig (und die die es interresiert)
Es ging um eine Filterabsaugung 37 Filter mussten nach einer individuellen Maske abgereinigt werden. Nebenbei Stop der Automatik Handanwahl, Manuelle absaugung, Notfallprogramm sobald ein Filter voll meldet usw. habe nur den Teil des Programmes geschrieben und die VISU. (WINCC)
War mein erstes größeres Programm. Zeit für Inbetriebnahme SA+SO bis 22:00. Habe vorher nur Visual Pascal und ein Wenig C++ programmiert.
Also leicht andere ansätze in der Struktur. hatte im FC nacher ca 180 Sprünge. Die haben mir das Genick gebrochen. Sprünge wurden nicht sauber ausgeführt etc. Habe nacher alles "neu" geschrieben und auf sprünge verzichtet. (Es waren noch 5 über, ging nicht anders) Neue Inbetriebnahme, wieder 2 Tage, SO Mittag lief die Kiste soweit das Produktion anfahren konnte.
 
Zurück
Oben