Step 7 Bedingter Bit move in einen DB

1010

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hilfe!!

Habe ein Problem, erst mal zu Anfang eine Warnung bin kein Profi in der Programmierung.

Folgende Situation: Ich habe ein Bit nennen wir es mal M0.0 und einen DB nennen ihn wir mal DB0 und einen INT im DB0 zB DB0.DBW0

Nun will ich wenn am INT die dezimal 1 ist das Bit M0.0 in DB0.DBX2.0 schreiben dies wäre ja noch einfach aber wenn der INT jetzt dezimal 2 hat will ich das Bit in DB0.DBX2.1 schreiben und der Wert im DBD0dbx2.0 soll aber der alte Wert bleiben (also so wie er bei INT dezimal 1 war). Und dies mit Dezimalzahlen 1-200
Wie mache ich dies am besten??
Mit einem Wort, Real; INT etc. würde ich es ja moven aber ich kann ja kein Bit Moven??:confused:

FUP oder KOP Beispiel wäre echt genial.
 
Verstehe ich das richtig?
Du willst dein Bit in Abhängigkeit von DBW0 (mit Wert 1-200)
in DBX2.0, DBX2.1, DBX2.2 ... DBX26.7 schreiben?

Was willst du mit dem MOVE?
Willst du 200 mal den MOVE aufrufen?
Du brauchst eine Routine, die das Ziel ermittelt und dann das Bit im Ziel ablegt.

In AWL wird das wohl am einfachsten mit einem Pointer gehen.

FUB/KOP erscheint mir dafür äußerst ungeeignet zu sein.
Du müsstest einen Baustein erstellen, der in FUB/KOP verwendet wird.

Wenn es SCL sein darf, kann ich dir zeigen, wie das geht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wann soll das Bit übernommen werden?
Immer/zyklisch?
Oder abhängig von einem Ereignis?
Oder wenn der INT-Wert ungleich NULL ist?

Was soll passieren, wenn der INT-Wert z.B. mehrere Zyklen auf 1 steht und der Merker 0.0 seinen Zustand ändert?
Soll der erste oder der letzte Zustand übernommen werden?

Und DB0 glaube ich, kann du nicht verwenden.
 
Das Bit soll mit einem Triggerereigniss in den DB geschoben werden z.B Flanke Pos m0.6 oder so, dan schreibe den aktuellen zustand in den DB an die dazu gehörige stelle.
Weiteres Problem ist das die Bit in dem DB nicht hintereinander sitzen sondern wild durcheinander im DB verteilt sind (nicht meine schuld :D) z.B. dezimal 3 ist DBX2.7, dezimal 4 ist DBX3.5, dezimal 5 ist DBX6.3........absolut willenlos.

sorry von SCL hab ich keinen Plan
 
Das Übertragen eines Bits in den DB, ohne den Rest im DB zu verändern ist eine einfache Zuweisung.
KOP:
Bit_to_DB_001.PNG

FUB:
Bit_to_DB_002.PNG

Wenn noch ein Triggerbit dazukommt, brauchst du noch eine Möglichkeit der bedingten Ausführung.
z.B. ein Sprung oder ein Baustein mit Freigabeeingang.

Aber das Hauptproblem ist, wie weiß die Routine, an welche Stelle das Bit zu schreiben ist?
Willst du für jeden INT-Wert eine eigene Routine programmieren?
Oder gibt es irgendeinen Zusammenhang, bei welchem INT-Wert welches Datenbit beschrieben werden soll?

Auch wenn du von SCL „keinen Plan“ hast, hast du den SCL-Editor zur Verfügung?

Wie du siehst, habe ich aus deinen Angaben nur eine Unmenge von Fragen.
Vielleicht erklärst du mal die Anwendung für diese Aufgabe.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erklärung:
Es gibt 200 Arbeitsrezepturen, in einer Visu werden diverse Werte (Real,Int und Bit) eingegeben die in der angewählten Rezeptnr. 1-200 abgespeichert werden soll.
Alle Rezeptparameter von allen Rezepten stehen in einem DB, der DB wurde mittels UDT beschrieben.

UDT:
INT
INT
REAL
INT
BIT

und das ganze 200mal.

Nun gibt es auf der Visu eine E/A Feld für die Rezeptnr. und einen Button "Werte in SPS speichern" wird dieser gedrückt, sollen die eingegebenen Werte in den DB in die Richtige Rezeptnr. eingetragen werden. Werden nun die Werte verändert sollen sie erst dann in den DB geschoben werden wenn wieder der Button "Werte in SPS speichern" betätigt wird.
 
Dies passt jetzt überhaupt nicht zu deinen bisherigen Aussagen.
Dort wolltest du die Bits in DBX2.0. DBX2.1 DBX2.7 DBX3.5 … haben.

Wenn der DB mit einem UDT aufgebaut ist, liegen aber alle BITs im DB immer auf Adresse IRGENDWAS.0
Vielleicht zeigst du uns mal deinen DB.

Idealerweise hat dein DB folgenden Aufbau:
Rezepte : Array[1..200] of UDT
 
Alle 200 UDT wurden Handschriftlich eingetragen vermutlich copy & paste
und ja das Bit ist immer auf .0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wen alle recepten hinter einander ins DB liegen konte Sie das Pointer Adress von das bit berechenen.
Jede UDTist 12 byte lang und dass bit belegt bit10.0 von der UDT.
Wenn Sie in KOP oder FUP programmiert, mach ein Temp var DWORD name BitAdress. Und ein INT Hilfword.
L Receptnummer
L 1
-I
T Hilfword

L Hilfword
L 12
* I
T Hilfword

L Hilfword
L 10
+I
T Hilfword // BYTE ADRESS VON BIT

L Hilfword
L 8
*I
T BitAdress

Auf DBxxx // DBnr mit recepten
U M 0.0
= DBX [BitAdress] //scheibe zustand von M 0.0 in bit von recept
 
Zurück
Oben