Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 9 von 9

Thema: Bedingter Bit move in einen DB

  1. #1
    Registriert seit
    13.09.2013
    Beiträge
    8
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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??

    FUP oder KOP Beispiel wäre echt genial.
    Zitieren Zitieren Bedingter Bit move in einen DB  

  2. #2
    Registriert seit
    20.01.2009
    Beiträge
    190
    Danke
    32
    Erhielt 15 Danke für 14 Beiträge

    Standard

    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.

  3. #3
    Registriert seit
    20.01.2009
    Beiträge
    190
    Danke
    32
    Erhielt 15 Danke für 14 Beiträge

    Standard

    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.

  4. #4
    1010 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    13.09.2013
    Beiträge
    8
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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 ) 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

  5. #5
    Registriert seit
    20.01.2009
    Beiträge
    190
    Danke
    32
    Erhielt 15 Danke für 14 Beiträge

    Standard

    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.

  6. #6
    1010 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    13.09.2013
    Beiträge
    8
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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.

  7. #7
    Registriert seit
    20.01.2009
    Beiträge
    190
    Danke
    32
    Erhielt 15 Danke für 14 Beiträge

    Standard

    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

  8. #8
    1010 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    13.09.2013
    Beiträge
    8
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Alle 200 UDT wurden Handschriftlich eingetragen vermutlich copy & paste
    und ja das Bit ist immer auf .0

  9. #9
    Registriert seit
    24.10.2007
    Ort
    Niederlande
    Beiträge
    673
    Danke
    22
    Erhielt 143 Danke für 135 Beiträge

    Standard


    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

  10. Folgender Benutzer sagt Danke zu JoopB für den nützlichen Beitrag:

    1010 (29.04.2015)

Ähnliche Themen

  1. TIA Kann man einen Datenbaustein abfragen ob ein Bit 1 ist...?
    Von pfeiffersepp im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 23.05.2014, 08:41
  2. Per SCL ein Bit in einen DBD schreiben
    Von SEAL im Forum Simatic
    Antworten: 18
    Letzter Beitrag: 11.01.2012, 16:07
  3. Antworten: 12
    Letzter Beitrag: 31.07.2006, 16:39
  4. Bedingter Bausteinaufruf
    Von hannes im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 21.07.2005, 09:02
  5. Gibt es einen 13-Bit Scalierer ??
    Von Gerd im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 04.08.2004, 12:33

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •