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

Ergebnis 1 bis 8 von 8

Thema: DB Inhalt (3 Array's vom Typ Bool) gesplittet an Digitalausgang senden

  1. #1
    Registriert seit
    24.10.2012
    Beiträge
    26
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    CPU: CPU 315-2 PN/DP 6ES7 315-2EH14-0AB0
    Software: Siemens Tia Portal V11 SP2 Update 4



    Hallo Zusammen

    Ich hoffe jemand kann mir helfen. Ich arbeite seit kurzem mit dem Tia Portal. Nun möchte ich den Inhalt eines DB's an verschiende Ausgangsbits senden

    Der DB1 ist so aufgebaut:
    A: Array [0-200] of Bool //Verwendet wird aber nur 1-12
    B: A: Array [0-200] of Bool //Verwendet wird aber nur 1-12

    Digitalausgang:
    Variable 1-8 A100.0-A100.7
    Variable 9-16 A101.0-A001.7
    Variable 17-24 A102.0-A102.7

    Soweit so gut. Nun kommt das Problem. Folgende Kopierfunktion soll Automatisiert werden:

    von Array A
    DB1.DBX0.1 = A100.0
    DB1.DBX0.2 = A100.1
    .....
    DB1.DBX.2.6 = A102.5
    DB1.DBX.2.7 = A102.6


    von Array B
    DB1.DBX26.1 = A103.0
    DB1.DBX0.26 = A103.1
    .....
    DB1.DBX28.6 = A105.5
    DB1.DBX28.7 = A105.6


    Ein Ähnliches Problem (kopieren und zuweisen von DB's) habe ich Dank eurer Hilfe mit SCL und einer For Schleife gelöst.

    Ich stehe in diesem Fall hier gerade auf dem Schlauch...

    Danke Schonmal!
    Geändert von K5286 (29.10.2012 um 20:25 Uhr)
    Zitieren Zitieren DB Inhalt (2 Array's vom Typ Bool) an Digitalausgang senden  

  2. #2
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.572
    Danke
    63
    Erhielt 259 Danke für 219 Beiträge

    Standard

    Wenn ich das richtig verstanden habe, möchtest Du das nicht alles per Direktzuweisung machen, um Schreibarbeit zu sparen.

    Ich würde das trotzdem so zuweisen, damit das Programm lesbar bleibt.
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

  3. #3
    K5286 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.10.2012
    Beiträge
    26
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    @Tigerente:

    Du hast schon recht, es wäre übersichtlicher, jedoch gibt es auch Maschinen, bei denen sind die Arrays voll ausgelastet und in diesem Fall würde ich mir gerne Arbeit ersparen.

    Die einzige Möglichlichkeit es noch etwas zu vereinfachen ist, das ich die Augänge umkonfiguriere, sodass sie fortlaufend sind....
    Jedoch bleibt dann noch die Problematik, dass alle Werte aus Array A auf alle "geraden Bits" geschrieben werden müssen und alle Werte aus Array B an alle "ungeraden Bits" geschrieben werden müssen.

    ???

    Eine Hilfe wäre es schon, wenn mir jemand sagen könnte wie ich überhaupt in SCL DB-Werte vom Typ Array-Bool direkt an Digitalausgänge sende.

  4. #4
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    wenn es mathematisch nicht abbildbar ist oder sich dies als zu schwierig erweist, dann halte es wie tigerente
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  5. #5
    K5286 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.10.2012
    Beiträge
    26
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich habe de Anforderungen nun etwas umgestellt. Um das ganze, Adressen technisch, zu erleichtern. (Siehe Oben)

    Du Hauptfrage ist, wie ich einen Teil DB z.B.: einen Array vom Typ Bool Digitalausgängen zuweisen kann?

  6. #6
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Standard

    Würde zu einer Schleife tendieren ...
    Siehe dazu meinen Beitrag (ich hatte es damals andersrum geplant, also Eingänge in ein Array of Bool in einem DB schreiben).

    Syntax sollte so aussehen:
    Code:
    A[Byteadresse,Bitadresse] := DB1.DX[Byteadresse,Bitadresse]
    Datenbaustein beschreiben

    mfg

    PS: Bin übrigens bei der Möglichkeit 1 verblieben!

  7. #7
    K5286 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    24.10.2012
    Beiträge
    26
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    @Nutellahase:

    Ich hatte deine Anweisung für einfaches zuweisen von Ausgängen schon ausprobiert. Jedoch Akzeptiert SCL weder ein A bzw. Q als Ausgangsadresse.

    Ich habe auch deine Version einer SCL-Schleife probiert. Dort stellt sich auch das selbe Problem da (siehe Makierung). Wie ich mich kenne, sehe ich den Wald vor lauter Bäumen nicht. Also guckt doch mal über mein Programm und gibt mir nen Feedback.
    Unbenannt.png
    Danke

  8. #8
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hm also ich weiß nicht ob sowas im TIA Portal geht aber normalerweise sollte es schon funktionieren! Nur zwei Sachen:

    1. Solltest du schreiben: A[Byteadresse,Bitadresse] := "Dein_DB".Dein_Array[Index]; du hast die Zustände der Ausgänge dem Array zugewiesen und nicht umgekehrt
    2. Wirst du so nur jeden zweiten Ausgang damit ansprechen (oder war das einfach nur zum Test einmal reinkopiert??) ... du musst einen mathematischen Bezug zu deinem Array-Index und deinen Ausgängen finden.

    EDIT: Habe es soeben probiert, bei mir funktioniert es. Wenn ich allerdings schreibe db.blabla := Ausgang[blabla] meldet er mir eine ungültige Zuweisung (allerdings in Step7 nicht TIA Portal)

    Hier der funktionierende Code:
    Code:
    FUNCTION "Test":VOID
    
    VAR_INPUT
        Liste: ARRAY [1..100] OF BOOL;
    END_VAR
    
    VAR_TEMP
        Index: INT;
        Byteadresse: INT;
        Bitadresse: INT;
    END_VAR
    
    BEGIN
    
    FOR Index := 1 TO 100 DO
        Byteadresse := ((Index-1) / 8) + *deine Startadresse*;        // *deine Startadresse* ist hier der Offset z.B. 100 => A100.0, A100.1, A100.2, usw.
        Bitadresse  := ((Index-1) MOD 8);
        A[Byteadresse,Bitadresse] := Liste[Index];
    END_FOR;
    
    END_FUNCTION
    Natürlich musst du hier auch Liste von Output nach Input ändern! Oder gleich In_Out (aber im Prinzip greifst du ja nur lesend auf die Liste zu!)

    Ist jetzt z.B. "Test_DB".Testarray[1] = "1", dann wird A100.0 ebenfalls "1".

    Ich hoffe es hilft dir weiter!
    Allerdings möchte ich auch noch anmerken (wie im anderen Thread), dass du keine Querverweise in den Referenzdaten zu den Ausgängen finden wirst!! Und das ganze funktioniert nur wenn die Ausgänge direkt hintereinander liegen!

    mfg
    Geändert von nutellahase (30.10.2012 um 19:32 Uhr)

Ähnliche Themen

  1. Antworten: 8
    Letzter Beitrag: 22.04.2011, 22:58
  2. Multiplex-Variable vom Typ Bool setzen?
    Von mercury_26 im Forum HMI
    Antworten: 16
    Letzter Beitrag: 20.04.2011, 09:35
  3. Array of Bool auf 0 vergleichen
    Von Nordischerjung im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 02.07.2010, 09:25
  4. Antworten: 4
    Letzter Beitrag: 07.01.2007, 18:42
  5. Bool-Array in Byte-Array
    Von Techniker im Forum Sonstige Steuerungen
    Antworten: 10
    Letzter Beitrag: 13.01.2006, 19:12

Lesezeichen

Berechtigungen

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