TIA Absolute Adressierung / AT-Sicht

TIANO

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

möchte Bitweise auf ein Word zugreifen (S7-300, daher fällt der Slice Befehl raus).
Habe es mit einer absoluten Adressierung (DB2.DBX1.0) probiert, welches klappt, mir aber eine Warnung ausgibt (Die Adresse wird nicht durch eine Variable belegt).
Nun habe ich herausgefunden, dass durch eine AT-Sicht ein Word auf ein Array gelegt werden kann.
Hat jemand Tipps für mich wie ich das am besten mit SCL mache (SCL Neuling)?
 
Moin,
da hast du doch deine Frage schon selbst beantwortet ;)
Lege dir bspw. eine temp-Variable vom typ Word an. Lege dahinter bspw. ein Array of Bool mit der AT-Sicht an.
Dann schreibst du in SCL tempWORD := DB2.DBW0 und kannst anschließend mit tempArray[1] usw arbeiten.
Oder woran hapert es?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

danke für deine schnelle Hilfe.
Habe mir einen neuen FC erstellen (SCL) und als temp-Variable vom typ Word und ein Array vom Typ Bool [0...15] angelgt.
Wie kann ich das Array of Bool als AT-Sicht anlegen?

Bei mir sieht es gerade so aus (Fehler):
n oCEIV8rrhWQAAAABJRU5ErkJggg==
SCL.PNG
 
ah ok
dann mal in drei Bildern erklärt ;)
atSicht1.jpg variable vom Typ "AT" unter der zu überlagernden Variable anlegen

atSicht2.jpg neue Variable wird zur AT-Sicht (zunächst mit selben Datentyp wie Vorgängervariable)

atSicht3.jpg Sicht-Variable in benötigten Datentyp ändern.
 
Und zur grundsätzlichen Nutzung noch mal folgendes Bild:
atSicht4.JPG
Wichtig ist zu verstehen, dass deine Variable auf die die Sicht zeigt und deine Sicht, quasi Zwillinge sind. Alles was du am WORD manipulierst, ist gespiegelt auch in deiner Sicht zu finden. Genauso andersherum, alle Manipulationen in deiner Sicht -> manipulieren auch dein WORD.
Also selber Speicherbereich - nur unterschiedliche Interpretationen der Daten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank :)) Genau sowas habe ich gesucht.

SCL3.jpg


Habe dann die tempWord in einen Datenbaustein, wo sich die Variable mit dem Datentyp "Word" befindet, kopiert.



DB.jpg



Wenn ich nun die absolute Adressierung durchführe erhalte ich den gleichen Fehler ( Adresse nicht durch eine Variable belegt)

Fehler.PNG
 
Zuletzt bearbeitet:
Wie gesagt, dein Use-Case wäre jetzt:
  1. DB-Variable in dein Temp-Word laden.
  2. Bit mit der Sicht (Array) manipulieren
  3. Temp-Word wieder zurück in den DB laden
 
Ich persönlich finde den Slice Befehl einfacher anzuwenden um auf einzelne Bits zuzugreifen.


slice.png

Ich lese erst jetzt das es um eine 300er geht von daher fällt der Slice Befehl aus.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich stehe komplett auf dem Schlauch.
Geschieht die Manipulation der Arrays im SCL? also durch einen Programmierbefehl?

DBarry.jpg
 

Anhänge

  • DBarray.jpg
    DBarray.jpg
    55,2 KB · Aufrufe: 31
Zuletzt bearbeitet:
Das war natürlich nur ein Beispiel ohne Funktion. Deine Funktionalität musst du natürlich jetzt selbst in SCL vornehmen.
Was hast du denn genau mit deinem Word vor?
 
Ich möchte eigentlich nur ein Signal (True/False, welches sich im anderen DB befindet) im Bit eines Words abspeichern.

Also vom DB9.DX0.0 welches den Zustand True/False erfragt und diesen dann in dem Word DB10.DBX0.0 abspeichern
Dann vom DB9.DBX0.1 Zustand True/False -> Word DB10.DBX0.1

Bis ich eine Variable Word für die ganzen Zustände habe.


Deshalb auch das Bild: Fehler.PNG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
:confused: das verstehe ich nicht so ganz. Das bringt dir doch keine neuen Informationen. Dann könntest du ja auch gleich:
Code:
[COLOR=#333333]%DB10.DBX0.0 := %[/COLOR][COLOR=#333333]DB9.DBX0.0;
[/COLOR][COLOR=#333333]%DB10.DBX0.1 := %[/COLOR][COLOR=#333333]DB9.DBX0.1;
[/COLOR][COLOR=#333333]%DB10.DBX0.2 := %[/COLOR][COLOR=#333333]DB9.DBX0.2;
[/COLOR].
.
.

Oder aber halt gleich das ganze Word einfach kopieren:

Code:
[COLOR=#333333]%DB10.DBW0 := %[/COLOR][COLOR=#333333]DB9.DW0;
[/COLOR]
 
Mein vorhaben ist, dass ich die ganzen Bits (welche einen Signalzustand erfassen) zu einem Word zusammenfasse. Diese würde ich dann für die HMI-Meldung nutzen (da nur Word oder Int erlaubt).
 
Ahh ok. Dann sag mir mal bitte wo sich deine Melde-Bits befinden und in welcher Form?
DB10 mit den Wörtern war ja wohl für die Anbindung ans HMI gedacht? Also wo stehen die Melde-Bits (DB9 ?) und sind sie als Bit Word oder oder oder gespeichert?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Genau das DB10.DBW0 (Variable mit dem Typ Word) ist für das HMI gedacht.
Die Melde-Bits sind im DB9.DBX0.0 - DB9.DBX2.0 (Variable mit dem Typ Bool) gespeichert

Bedeutet eigentlich: ich habe ein leeres Word, welche ich mit meinen Bits füllen möchte.
 
Jetzt hab ich es verstanden :ROFLMAO:
Ja dann kannst du bei deinem Baustein mit deinen Beiden Variablen (Word und Sicht auf Word) bleiben.
Vorgehen:
  1. Bits aus DB9 (Melde-Bits) in Sicht-Array kopieren
  2. Word auf das die Sicht zeigt in den DB10 (HMI-Anbindung) kopieren
Code könnte z.B. so aussehen:
Code:
// Umkopieren der Melde-Bits in Sicht auf Word
tempArray[0] := %DB9.DBX0.0;
tempArray[1] := %DB9.DBX0.1;
...
tempArray[15] := %DB9.DBX1.7;

// Sicht in Melde-DB kopieren
%DB10.DBW0 := tempWord;
man könnte das allerdings auch in einer schönen FOR-Schleife machen ;)
 
Zurück
Oben