Byte im DB in Bits auflösen

Zuviel Werbung?
-> Hier kostenlos registrieren
Mogren, ich habe es jetzt mit einem Platzhalter gemacht:

Anhang anzeigen 31554

funktioniert.
Funktioniert nur zufällig!

Dein Code funktioniert nur, wenn die Instanz im IDB an Adresse DBX0.0 beginnt. Sobald man die Instanz als Multiinstanz in einem Mutter-FB benutzt, dann ist das meistens nicht mehr der Fall. Dann muß zur relativen Adresse in dieser Instanz noch der Multiinstanz-Offset (Offset dieser Instanz im Mutter-IDB) addiert werden. Den Multiinstanz-Offset bekommt die Instanz beim Aufruf im Adressregister AR2 als P#DBXn.0 mitgeteilt. Bei nicht-multiinstanzfähigen FB enthält AR2 immer P#DBX0.0

Bei allen Zugriffen auf Instanzvariablen gehen multiinstanzfähige FB davon aus, daß im DI-Register (DINO) und im Adressregister AR2 die Anfangsadresse seiner Instanz stehen, deshalb kann man nicht auf die eigenen Instanzvariablen zugreifen, solange das DI-Register oder AR2 verändert sind.
Details siehe z.B. die Hilfe zu STEP7 > Hinweise zur Änderung von Register-Inhalten

Pointer auf eine FB-(Multi-)Instanzvariable erstellen (FB multiinstanzfähig und FB nicht-multiinstanzfähig):
Code:
//Pointer auf Instanzvariable InstVar erstellen (Variable in Bausteinparametern oder Static)
      L     P##InstVar                  // relative Adresse der #InstVar in dieser Instanz (Kennung DI)
      TAR2                              // Offset dieser Instanz (Kennung DB) im IDB
      UD    DW#16#FFFFFF                // Bereichskennung (DB) ausblenden
      +D
      LAR1                              // AR1: absolute Adresse #InstVar im IDB (Kennung DI)

//funktioniert auch so 'rum
      TAR2                              // Offset dieser Instanz (Kennung DB) im IDB
      UD    DW#16#FFFFFF                // Bereichskennung (DB) ausblenden
      L     P##InstVar                  // relative Adresse der #InstVar in dieser Instanz (Kennung DI)
      +D
      LAR1                              // AR1: absolute Adresse #InstVar im IDB (Kennung DI)
Pointer auf eine TEMP-Variable erstellen (alle FB und FC und OB):
Code:
      L     P##TempVar                  // relative Adresse der #TempVar in TEMP (Kennung L)
      LAR1                              // AR1: relative Adresse #TempVar in TEMP (Kennung L)

//funktioniert auch kurz
      LAR1  P##TempVar                  // AR1: relative Adresse #TempVar in TEMP (Kennung L)

Das Erstellen eines Pointers für die indirekte Adressierung eines Bitfeldes (*) ist also viel einfacher, wenn das Bitfeld in TEMP liegt. In Deinem Fall ist es aber tatsächlich günstiger, wenn das Eingangsbyte direkt in ein Bitfeld in der Instanz (Static) kopiert wird. Dein Code müßte also etwa so aussehen:
Code:
//#EingangsByte_Antrieb in Static Struktur #Eingang_Word kopieren
      L     P##Eingang_Word             // relative Adresse der Struktur #Eingang_Word in dieser Instanz (Kennung DI)
      TAR2                              // Offset dieser Instanz (Kennung DB) im IDB
      UD    DW#16#FFFFFF                // Bereichskennung (DB) ausblenden
      +D
      LAR1                              // AR1: absolute Adresse der Struktur #Eingang_Word im IDB (Kennung DI)

      L     #EingangsByte_Antrieb
      T DIW [AR1, P#0.0]                // "T W [AR1, P#0.0]" geht auch


(*) Bitfeld: Ein STRUCT oder ARRAY beginnt immer an einer geraden "glatten" Word-Adresse n.0 und belegt immer ganze Vielfache von Words. Auch wenn man nur 8 Bits braucht belegt das Struct 16 Bits oder 8 Bits + 1 ungenutztes Byte.
Wenn das Bitfeld einfach 8 aufeinanderfolgend deklarierte Bools sind, dann kann man auch nur 1 Byte auf dieses Bitfeld kopieren, die Adresse des ersten Bits muß bei n.0 beginnen. Allerdings dürfen die 8 Bits dann nicht in einer STRUCT liegen, weil man kann nicht die Adresse von Struktur-Membern referenzieren, sondern nur die Anfangsadresse der Struktur selber - "P##Struct.Member" geht nicht.

Harald
 
Zuletzt bearbeitet:
Code:
LAR1  P##Eingang_Word
TAR2
[COLOR="#FF0000"]+AR1[/COLOR]
L #Eingansbyte_Antrieb
T W[AR!,P#0.0]
Vorsicht, das +AR1 funktioniert nur bis Multiinstanzadressen kleiner 4kB. Die Operation +AR1 addiert AKKU1-L als vorzeichenbehaftete 16-Bit-Zahl - addiert oder subtrahiert also einen 15-Bit-Offset!
Hilfe zu AWL - +AR1 Addiere AKKU 1 zum Adreßregister 1 schrieb:
+AR1 (Addiere zu AR1) addiert einen Versatz, der entweder in der Anweisung oder in AKKU1-L angegeben wird, zum Inhalt von AR1. Die Ganzzahl (16 Bit) wird zunächst vorzeichenrichtig auf 24 Bit erweitert und danach zu den niederwertigsten 24 Bit von AR1 (Teil der relativen Adresse in AR1) addiert. Der Teil der Bereichskennung in AR1 (Bits 24, 25 und 26) wird nicht verändert.

+AR1: Die Ganzzahl (16 Bit), die zum Inhalt von AR1 addiert werden soll, wird durch den Wert in AKKU1-L angegeben. Zulässig sind Werte von -32768 bis +32767.

Harald
 
Zuletzt bearbeitet:
Hi,
neuer Antrieb mit mehr Eingängen, neues Problem.
Würde hier auch gerne die Ausgabe noch mache. Sprich das ich ab FB nur das EB anschreiben muss.



Netz_1.png

Netz_2.png

Netz.jpg




Eaton.png
 
Zuletzt bearbeitet:
neuer Antrieb mit mehr Eingängen
Dann übergib einfach noch zusätzlich das dritte Byte. Oder jedes der 3 Byte einzeln. (Je nachdem was Deine Symbolik zuläßt.)
Wenn wie in Deinem Beispiel die 3 Bytes im PAE (%E...) liegen, sollte es auch funktionieren, wenn Du 4 aufeinanderfolgende Bytes als DWORD übergibst und davon nur die 3 ersten (höchstwertigen) Bytes nimmst.

Die Deklaration (Bitadressen) Deiner Bits in der Struktur "Eingangswort_0" passt nicht zur im 4. Bild gezeigten Dokumentation. Sorgfältig kontrollieren! Wenn man schon solche indirekten Programmier-Schweinereien benutzt dann sollte man auch sehr genau verstehen was man da tut und wie das funktioniert.

Übrigens liegt Dein Istwert auf %EW3 (nicht %EW2).
Und Du brauchst in Netzwerk2 den Istwert nicht so umständlich indirekt kopieren. Das geht direkt.

Code:
//#Eingangsbytes_Antrieb in Static Struktur #Eingangswort_0 kopieren
      L     P##Eingangswort_0           // relative Adresse der Struktur #Eingangswort_0 in dieser Instanz (Kennung DI)
      TAR2                              // Offset dieser Instanz (Kennung DB) im IDB
      UD    DW#16#FFFFFF                // Bereichskennung (DB) ausblenden
      +D
      LAR1                              // AR1: absolute Adresse der Struktur #Eingangswort_0 im IDB (Kennung DI)

      L     #Eingangsbytes_Antrieb      // DWORD
      TAW
      T DIB [AR1, P#2.0]                // drittes Byte
      TAD
      TAW                               // (das TAW kann evtl. entfallen - Deklaration in der Struct anpassen)
      T DIW [AR1, P#0.0]                // erstes und zweites Byte

//#Istwert in Static kopieren
      L     #Istwert                    // von Input
      T     #Istdrehzahl                // in Static

Bei mehr als 4 Bytes Eingangsdaten wird es übersichtlicher, statt der Bytes die Anfangsadresse als POINTER oder besser als Struct/UDT zu übergeben. Allerdings leiden die Querverweise darunter und um das sauber zu strukturieren sollten die Eingangsdaten dann in einer Struktur bzw. UDT deklariert werden.


neues Problem.
Würde hier auch gerne die Ausgabe noch mache. Sprich das ich ab FB nur das EB anschreiben muss.
:confused: Erkläre Deinen Wunsch nochmal genauer.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei mehr als 4 Bytes Eingangsdaten wird es übersichtlicher, statt der Bytes die Anfangsadresse als POINTER oder besser als Struct/UDT zu übergeben. Allerdings leiden die Querverweise darunter und um das sauber zu strukturieren sollten die Eingangsdaten dann in einer Struktur bzw. UDT deklariert werden.

Würde das schon gerne einmal ordentlich machen. Am liebsten wäre mir, wenn ich an meinem Baustein nur das eine DWord anschschreiben muss.


:confused: Erkläre Deinen Wunsch nochmal genauer.

Genau wie im Eingang des Bausteins, würde ich gerne am Ausgang nur z.B. EW0 anschreiben wollen.
Somit werden alle Werte direkt an den Drehzahlstarter gesendet. Freigabe, Sollwert, Start, usw.
 
Hallo,

ich hänge leider immer noch an dem Projekt. Bekomme den Drehzahlstarter nicht ordentlich angelesen bzw. ans laufen
 
Zurück
Oben