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

Ergebnis 1 bis 10 von 10

Thema: Indirekt per Zeiger in DB schreiben

  1. #1
    Registriert seit
    13.01.2011
    Beiträge
    39
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen...
    Ich möchte mithilfe einer Index-Variable indirekt in einen DB schreiben.
    Das Ganze soll in SCL stattfinden, es sei denn, es gibt fertige Funktionen in FUP ?!

    Hintergrund:
    Ich hab 72 INT Werte in einem DB, die ich von einer CPU zur anderen schicken muss.
    Beide CPUs (314 ifm) liegen im MPI Netzwerk.
    Ursprünglich wollte ich die einfach per GD verknüpfen, aber leider sprenge ich hier den Rahmen der Ressourcen.
    Also möchte ich die Daten nacheinander schicken, denn eigentlich hat die Übertragung, sprich Aktualisierung der zweiten CPU, einen ganzen Tag lang Zeit
    Allein aus dieser Sicht, wäre die permanente zyklische Übertragung Wahnsinn ^^
    Sicherlich kann ich das auch per PUT und GET erledigen, aber dann muss ich trotzdem noch die Daten in den DB schiessen...



    Es soll in etwa so aussehen:
    Zeigervariable X

    Eingang:
    DB 101 als DB_Block (72 INT Werte)

    Sekundentakt oder ähnliches als Startsignal

    Bei pos Flanke vom Sekundentakt:

    x ablegen in DB100.DBW0
    DB101.x ablegen in DB100.DBW1

    x:=x+1

    if (x>72) then
    x:=0;

    (wobei ich ja immer den zweifachen Wert haben muss um den Wert zu lesen, ich weis, ich weis... Der Erste Wert liegt auf DB101.DBW2, also 2,4,6...)


    DB100 liegt komplett in der Globale Daten Tabelle



    Bei der Empfänger CPU:

    a:= DB100.DBW0
    b:=DB100.DBW1

    if (a<> 0) then

    DB101.a := b

    End_if;


    Naja, ich weis, die Syntax ist mal ordentlich daneben, aber ich wollte nur versuchen zu verdeutlichen, was ich eigentlich vorhab.
    Mein Problem ist, ich komme aus dem Bereich der Hochsprachen, und bei AWL versteh ich nur noch Stuttgart21 oder so ähnlich. *g*

    Hat wer ein paar Schlüsselworte, wonach ich suchen kann ?
    Danke Euch !

    Binatone
    Geändert von Binatone (08.03.2013 um 02:20 Uhr)
    Zitieren Zitieren Indirekt per Zeiger in DB schreiben  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Wenn du aus den Hochsprachen kommst, dann ist SCL für dich ja genau das Richtige.
    Im DB solltest du ein Array anlegen (z.Bsp. Array[1..100] of Int, hat je zwei Byte), dann kannst du in SCL einfach per Indexvariablen auf das Array zugreifen, wie das auch in C, Basic oder Delphi gemacht wird.

    kleiner Hinweis zu deinem Text: Wenn du das mit den geraden Adressen weißt, solltest du es auch beachten

    Vorteil des Array, du adressierst symbolisch und braucht dich nicht um die tatsächliche Ausrichtung der Daten im DB zu kümmern.
    Damit das geht mußt du aber auch dem DB selbst schon ein Symbol zuweisen und dann in deinem SCL-Baustein über das Symbol gehen.

    Bsp:

    X := 2;
    MyInt := "MyDB".MxArray[X];
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  3. #3
    Registriert seit
    13.01.2011
    Beiträge
    39
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo Ralle
    Danke für die schnelle Antwort!

    Das Problem ist, ich möchte und kann die Struktur des DB nicht verändern, weil dann müsste ich das ganze Pogramm umstricken, welches auf den DB in der Empfangs CPU zugreift.
    Ich muss also jeden INT Wert irgendwie in den bestehenden DB schieben.
    Gibts denn da keine Möglichkeit, nichtmal in SCL ?

    Beim Lesen ist das ja alles noch kein Problem, das Senden geht auch per put und get.
    Aber um dann in der Empfangs CPU die Daten in den DB zu kriegen muss es doch auch ne Möglichkeit geben

    Gruß
    Binatone

  4. #4
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.709
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Hallo,
    der Vorschlag von Ralle mit dem Array in dem DB ist der eleganteste Weg.
    Du kannst natürlich auch alles so lassen (würde ich aber hier nicht denn du müßtest ja nur die Deklaration des ohnehin schon vorhandenen Datenbereichs in dem DB ändern).
    SCL (und das würde ich hier benutzen und nicht AWL) kann es so oder so - bei einem Array hast du nur halt weniger Arbeit ...

    Gruß
    Larry

  5. #5
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.218
    Danke
    533
    Erhielt 2.696 Danke für 1.948 Beiträge

    Standard

    Ja, es geht auch absolut, aus dem Kopf in etwa so:

    WORD_TO_BLOCK_DB(DB_Merken).DW[Wort_Index] := 1000;

    Dann mußt du aber natürlich wieder selbst aufpassen, wo genau du im DB hingreifst.
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.709
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    @Ralle:
    so ungefähr richtig.
    Man muß hier nur beachten, dass bei dieser Form des Zugriffs immer Bit, Byte, Word bzw. in diesem Fall DWord bearbeitet wird. Möchte man mit Real's (z.B.) arbeiten dann muß man auch noch casten (DWORD_to_REAL(WORD_TO_BLOCK_DB(DB_Merken).DW[Wort_Index]) := 123.456 ;

    Gruß
    Larry

  7. #7
    Registriert seit
    13.01.2011
    Beiträge
    39
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Danke für die Antworten !

    @Larry Laffer:

    Ich bin mir nicht sicher, ob ich mit nem Array weniger Arbeit hab.
    Denn wenn ich die Deklaration im Datenbereich des DB ändere, hat dann nicht jeder andere Baustein ein Problem damit z.B. auf "DB101.DBW12" Zugriff zu bekommen ?
    Und wenn dem so ist, muss ich dann nicht all diese Bausteine erstmal anpassen, bevor überhaupt wieder was geht ?

    Da erscheint mir Ralles "WORD_TO_BLOCK_DB(DB_Merken).DW[Wort_Index] := 1000;" schon einfacher...

    Ich hab ja durchweg die INT Werte und dementsprechend eine sehr einfache Adressvergabe.
    DB101.DBW2 (4,6,8,10...)

    Ich werd das ma probieren, ob da was hüstelt oder nicht

    Danke Euch !

    Binatone

  8. #8
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.709
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Wenn deine anderen Bausteine mit DB101.DBW12 arbeiten dann ändern sich für die gar nichts.
    In deinem SCL-Script könntest du aber mit dem Array-Index arbeiten und müßtest dir nicht die Word-Adresse errechnen. Das ist für die Übersictlichkeit schon zuträglicher.
    Aber es ist dein Programm und du hast die Arbeit damit - du mußt es selber wissen und entscheiden ...

    Gruß
    Larry

  9. #9
    Registriert seit
    13.01.2011
    Beiträge
    39
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Ok Larry, ich befolge Deinen Tip

    Dann sag mir mal eben, worauf ich achten muss, damit das funzt.
    Kein komplettes Script, aber so, das ich es verstehe.

    Arrays kenn ich selbstverständlich.
    Aber Array und DB zusammen spielen lassen, da komm ich nicht mit, glaub ich

  10. #10
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.709
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    OK ...
    Für SCL ist es bei dieser Form des Zugriffs notwendig, dass der DB symbolisch ansprechbar ist - er muß also einen symbolischen Namen haben - das machst du im Step7-Symbolik-Editor.
    Nehmen wir einmal an, dass dein DB101 den symbolisch Namen "Daten" von dir bekommen hat. In ihm gibt es eine Variable Messung als Array [1..100] of INT (z.B.).
    Dann könntest du nun in SCL so auf die Elemente darin zugreifen :
    Code:
    meineVariable := "Daten".Messung[7] ;
    
    oder 
    
    "Daten".Messung[12] := 1234 ;
    
    oder in einer FOR-TO-Schleife ...
    oder ...
    Gruß
    Larry

Ähnliche Themen

  1. Zeiger
    Von snowleopard1702 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 10.05.2011, 17:07
  2. Indirekt in Datenbaustein schreiben
    Von Gina_Jin im Forum Simatic
    Antworten: 41
    Letzter Beitrag: 10.02.2011, 17:48
  3. Antworten: 4
    Letzter Beitrag: 01.09.2008, 12:45
  4. Zeiger???
    Von Jochen Kühner im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 03.09.2004, 08:33
  5. Any-Zeiger
    Von Anonymous im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 16.10.2003, 20:28

Lesezeichen

Berechtigungen

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