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

K5286

Level-2
Beiträge
28
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
DB Inhalt (2 Array's vom Typ Bool) an Digitalausgang senden

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!

 
Zuletzt bearbeitet:
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@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.
 
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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!
 
@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
 
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
 
Zuletzt bearbeitet:
Zurück
Oben