Fb + db

e.daoura

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


ich bin neu in der Welt von S7.


Ich arbeite mit:
- S7 300 = 1x CPU 313C + 4x SM321 + 2x SM322 + 1x CP 342−5
- Step 7 Version 5.4
- AWL


Ich habe vor einen FB11 + seinen DB11 zu erstellen. In dem STAT Variablen Teil habe ich eine Serie von Variablen deklariert: MELDE_BYTE_0 als Byte, MELDE_BYTE_1 als Byte .. bis.. MELDE_BYTE_60 als Byte und VAR1 als INT + VAR2 als INT (insgesamt 64 Byte). In dem FB11 möchte ich einzelne Bits der Variablen MELDE_BYTE_xx + VARX ändern:


1 -kann ich in dem FB11 solche Kommandos schreiben? (im FB11 auf die eigene DB11 über die absoluten Adressen zu zugreifen)
Z.B.


in FB11
Code:
  U M30.1
= DB11.DBX3.1
2- Ist DB11.DBX3.1 aus dem Beispiel gleich Bit 1 aus der Variable MELDE_BYTE_2 ???

2- Sonst wie kann ich ein Bit aus einem Merker-Bit (Z.B. M30.1) in die einzelnen Bits der MELDE_BYTE_XX schreiben?? Zum Beispiel


M30.1 ist 1
möchte ich Bit3 der Variable MELDE_BYTE_XX von Typ BYTE auf dem Wert des Inhaltes von M30.1 setzen ohne dass die anderen Bits geändert werden.


Vielen Dank
Gruß
Emil
 
such mal auf zugriffe auf instanz db. wir haben hier schon oft darüber diskutiert.
ich hoffe dir ist klar, was das für gefahren birgt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Emil,

erst einmal willkommen im Forum!

Zu Deinen Fragen:
1 -kann ich in dem FB11 solche Kommandos schreiben? (im FB11 auf die eigene DB11 über die absoluten Adressen zu zugreifen)
Z.B.

Du Kannst mit
= DB11.DBX3.1
= DIX3.1 (da der DB11 ja der Instanz-DB von Deinem FB11 ist.)
auf die einzelnen Bits zugreifen.

2- Ist DB11.DBX3.1 aus dem Beispiel gleich Bit 1 aus der Variable MELDE_BYTE_2 ???
Das hängt davon ab, was in Deiner Variablentabelle steht, denn
z.BSP. die IN-Variablen stehen vor den STAT-Variablen in Deinem DB.

Grüße
Gebs
 
Danke Gebs für die sehr nützliche Antwort
Danke Audsuperuser. (ich werde es machen)

Aber kann jemand bitte mir noch die folgende Frage beantworten (Ich wäre euch sehr dankbar):

- Wie kann ich einzele Bits einer Variable Z.B. VAR1 von type Byte oder Int ändern? (ohne einen direkten Zugriff auf die Absolute Adresse der Variable)

Zum Beispiel

Eine Variable im Bereich STAT: VAR1 von Type BYTE
Der Wert des Bit3 der Variable VAR1 soll durch den Wert des Bit M30.1 ersetzt werden (ohne dass der Inhalt der Bit0...Bit2 und Bit4..Bit7 der Variable VAR1 geändert zu werden).

Wie macht man das mit AWL.

Danke

Emil
 
Zuletzt bearbeitet:
Das geht über indirekte Adressierung:

Code:
 LAR1  P##VAR1  
 U     M     30.0
 =     DIX [AR1,P#0.3]

Such mal danach hier im Forum. Es gibt eine Menge Threads dazu.

Grüße
Gebs
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Gebs für die sehr nützliche Antwort
Danke Audsuperuser. (ich werde es machen)

Aber kann jemand bitte mir noch die folgende Frage beantworten (Ich wäre euch sehr dankbar):

- Wie kann ich einzele Bits einer Variable Z.B. VAR1 von type Byte oder Int ändern? (ohne einen direkten Zugriff auf die Absolute Adresse der Variable)

Zum Beispiel

Eine Variable im Bereich STAT: VAR1 von Type BYTE
Der Wert des Bit3 der Variable VAR1 soll durch den Wert des Bit M30.1 ersetzt werden (ohne dass der Inhalt der Bit0...Bit2 und Bit4..Bit7 der Variable VAR1 geändert zu werden).

Wie macht man das mit AWL.

Danke

Emil

LAR1 P##VAR1 (Statische Variable)

U E0.0
= DIX [AR1,P#0.3]
 
Hallo,
da geht aber noch was mehr ...
Du könntest z.B. deine Meldungen als ARRAY[1..16] of BOOL anlegen.Dann kannst du auch auf die Einzel-Bitmeldung zugreifen.
Code:
U #my_Eingang
= Meldung[7]
Gruß
LL
 
Nur zur Verständniss:

Nach dem Lesen im Forum kann mir bitte jemand das folgende bestätigen:

1 - Zugreiffen (ändern und lesen von Variablen) auf einem Instanz-DB sowohl aus dem eigenen FB als auch aus einem fremden FB/FC ist eine schlechte Programmierung, da wenn man den FB ändern würde, dabei verschieben sich dann zwangsweise die Variablen bzw. die Adressierungen der Variablen.
"Der Kunde will solche programmierung nicht: er sagt, bei erweiterung dieses FB'S verschiebt sich alles und es passt nix mehr"

2 - Aber so einen Zugriff (siehe Code unten) auf einem Instanz-DB ist in Ordnung und ist eine gute alternative zu Punkt 1. Da hat man keine Probleme mehr, wenn man später neue Variablen in den FB bzw. DB einfügen würde.

LAR1 P##VAR1
U M 30.0
= DIX [AR1,P#0.3]
http://sps-forum.de/showthread.php?t=15536&highlight=instanz+zugriff

Danke
 
Nur zur Verständniss:

Nach dem Lesen im Forum kann mir bitte jemand das folgende bestätigen:

1 - Zugreiffen (ändern und lesen von Variablen) auf einem Instanz-DB sowohl aus dem eigenen FB als auch aus einem fremden FB/FC ist eine schlechte Programmierung, da wenn man den FB ändern würde, dabei verschieben sich dann zwangsweise die Variablen bzw. die Adressierungen der Variablen.
"Der Kunde will solche programmierung nicht: er sagt, bei erweiterung dieses FB'S verschiebt sich alles und es passt nix mehr"

2 - Aber so einen Zugriff (siehe Code unten) auf einem Instanz-DB ist in Ordnung und ist eine gute alternative zu Punkt 1. Da hat man keine Probleme mehr, wenn man später neue Variablen in den FB bzw. DB einfügen würde.

LAR1 P##VAR1
U M 30.0
= DIX [AR1,P#0.3]
http://sps-forum.de/showthread.php?t=15536&highlight=instanz+zugriff

Danke

Zu 1. Genau darum habe ich dich gefragt, ob du dir der risiken bewust bist. wenn du von einem anderen baustein auf den IDB z.B. DB1.DBW10 zugreifst und du änderst die schnittstelle des zugehörigen FBs wird auf ein falsches daten wort gegriffen, was böse folgen haben kann.

zu 2 das funktioniert auch, wenn du den zugehörgen fb/idb änderst
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nur zur Verständniss:

Nach dem Lesen im Forum kann mir bitte jemand das folgende bestätigen:

So kann man es sehen.
Wobei das 2. Beispiel auch nicht gerade schön ist.
Ich würde hier auch ein Array oder eine Struct vorziehen.
Meist definiere ich bei solchen Fällen eine 2. Variable in der passenden Form und übergebe diese dann am Schluß in die Ausgabe-Variable.

Gruß
Dieter
 
Vielen Dank Audsuperuser und
Vielen Dank Dieter.

Ich fange an, langsam die Hintergründe der
Programmierung der S7 zu verstehen ;)


Gruss
Emil
 
Hallo,
also auch von mir dazu noch etwas :
zu 1.)
Das Zugreifen auf die Variablen der eigenen Instanz (symbolisch) ist absolut legitim - dafür sind sie ja gemacht ...
Willst du auf die Variablen eines anderen Bausteins zugreifen, so wäre dafür die Schnittstelle des Bausteins zuständig (IN , OUT , IN_OUT). Benutzt du den Weg, dann kann auch nichts schiefgehen.
Das Zugreifen auf Variablen eines FB über direkte Adressierung ist ganz übel und sollte auf jeden Fall vermieden werden. Einzige Ausnahme hier wäre der bereits dargestellte Weg über Pointer.

Allerdings ist das "Gedächtnis" deines FB's futsch, wenn du am Baustein eine Änderung vornimmst, die den I-DB verändert. Das halte ich aber auch für legitim.

Was hat dein Kunde gegen FB's ?

Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren

Ich fange an, langsam die Hintergründe der
Programmierung der S7 zu verstehen ;)

Und wenn du dich schon mit dem AR1 und Instanz-DBs beschäftigst, dann schau dir auch mal das AR2 an. Das brauchst du spätestens bei Multiinstanzen:)

Gruß
Dieter
 
Zurück
Oben