PEWs indirekt adressieren

MatMer

Well-known member
Beiträge
788
Punkte Reaktionen
66
Zuviel Werbung?
->Hier kostenlos registrieren
hallo,
ich möchte mir einen FB erstellen der die Aufgaben der Analog Normierung vornimmt. Den möchte ich so dynamsich wie möglich gestalten. Das bedeutet das man ihn aufrut und dann fast alles angibt, so dass der für mehrer System leicht einsetzbar ist(ihr wisst was ich meine :lol: )

Jetzt habe ich das Problem das PEW dynamsich eingeben zu können. Was ich in einem Buch schon gefunden habe war das:
L P#16.5
T MD4

O E[MD4]

das problem ist jetzt für mich das ich aufjedenfall nen Merker brauche und denn kann ich ja nicht im FB als Eingangsvariable defenieren, oder geht das doch.
Oder was besteht sonst für ne Möglichkeit.
 

Balou

Well-known member
Beiträge
221
Punkte Reaktionen
0
Moin

hmm zum Normieren würde ich den "Scale" von siemens nehmen das ist der FC 105 aus der Standart Liberie

da brauchst du dann auch keinen DB so wie bei einem FB wenn du dann Immernoch Dynamisch adressieren willst schreib dir nen kleinen FC in dem du den PEW wert dynamisch ladst und in ein MW schreibst welches du dann wieder and den Scale FC anfügst

Du findest den FC 105 under Standart Liberie bei der Katekorie TI - S7

MfG Balou
 
OP
MatMer

MatMer

Well-known member
Beiträge
788
Punkte Reaktionen
66
hallo
also es muss jetzt nich unbedingt FB sein ich kann natürlich auch nen FC nehmen.
Ich möchte jetzt nur das man beim Aufruf einfach folgendes eintragen kann.

CALL AnalogNormierung
Eingangsadresse: 272
...
...
...

und im FC selber soll er dann ohne benutzen eins MX.Y, also rein mit Variablen im FC daraus das L PEW 272 machen.
Ich möchte halt nicht das ich nen Merkerbereich dafür vorgeben muss.
Ich wollte halt nur fragen ob das möglich ist.
 

Ralle

Supermoderator
Teammitglied
Beiträge
14.401
Punkte Reaktionen
3.373
Brauchst doch keine Merker nehmen, deklarier dir Temp-Variable, die kannst du am Ende des FC in den Output schreiben und fertig.
 
OP
MatMer

MatMer

Well-known member
Beiträge
788
Punkte Reaktionen
66
Zuviel Werbung?
->Hier kostenlos registrieren
hallo,
ja das weiß ich ja das ich dann einfach sage output real und dann muss ich dann im aufruf die Variable angeben.
Ich habe das Problem mit dem Eingangswort
ich kann ja nicht ne input Variable machen als Int oder Word und dann einfach schreiben
L PEW[#Variable], im Buch steht dafür brauche ich auf jedenfall nen Merker und den muss ich vorher mit der richtigen Adresse Belegen:
L P#272
T MD4
L PEW[MD4]
das klappt ja z.B. schon so, nur ich wollte jetzt Fragen ob das auch irgendwie geht das ich statt dem MD4 ne temp oder statische Variable nehmen kann.
Ich hoffe ich habs jetzt richtig beschrieben.
 

Ralle

Supermoderator
Teammitglied
Beiträge
14.401
Punkte Reaktionen
3.373
Die In-Variable muß als DWord deklariert sein!

Test: DWORD

L PEW[#Test]
oder
L PEW[LD14] (wenn Test auf Lokal-Daten 14 gelandet ist.
 

plc_tippser

Well-known member
Beiträge
2.500
Punkte Reaktionen
301
??????????
Die IN Variable als INT od Word deklarieren. Name Eingang1.

Nun kannst Du
L Eingang1
L5
*i

...

usw. ausführen.

Warum mit Zeigern hantieren?

pt
 

Balou

Well-known member
Beiträge
221
Punkte Reaktionen
0
Moin

noma ich

Wenn du schon Variabel Aufrufen willst dann machst doch so:

IN Variable ist Eing vom Typ INT dort schreibst du Die NR des PEW rein.

Code:
L Eing
SLW 3
LAR 1 
L PEW [AR1,P#0.0]
T ....

MfG Balou
 

Ralf

Well-known member
Beiträge
194
Punkte Reaktionen
50
Nehme immer SLD, sonst ist man bei Adressen von > 8192 im Arsch. Kommt zwar sogut wie nie vor, aber...

Gruß

Ralf
 
OP
MatMer

MatMer

Well-known member
Beiträge
788
Punkte Reaktionen
66
Zuviel Werbung?
->Hier kostenlos registrieren
also das mit dem AR1 hat super geklappt
allerdings hätte ich jetzt die Frage wie man das mit den Bits hinbekommt
also als Beispiel man gibt als word oder int vor (Dez) 96 und der soll daraus z.b A 9.6 machen
geht das oder ist das nicht möglich?
 
OP
MatMer

MatMer

Well-known member
Beiträge
788
Punkte Reaktionen
66
habs doch noch hingekriegt ist zwar ein wenig "gefuscht" aber es geht
habs in bcd gewandelt und dann 2geteilt und beide etwas geschoben und dann verodert
 

Balou

Well-known member
Beiträge
221
Punkte Reaktionen
0
Nabend
das mit den Bits ist genau so nur das du eine Ziffer die du Vorgibst nicht dierekt in bit und Byte aufschlüsseln kannst
also 96 = 9.6 geht net sondern
96 ist das 96 Bit ab 0.0 also 12.0

aufbau des Adressregisters ist dann wie folgt:

0000 0000 0000 0 000
-----------------------^^^^sind die Bitstelle also 0-7
^^^^^^^^^^^ Sind die Bytestellen also das was vor dem
komma steht

So hoffe das man mich Versteht

MfG Balou

Wenn einer nett Fragt mach ich nen FC dafür :D
 
OP
MatMer

MatMer

Well-known member
Beiträge
788
Punkte Reaktionen
66
Zuviel Werbung?
->Hier kostenlos registrieren
ja das wusste ich ja schon wurde oben ja schon gesagt das die rechten 3 bits für die bit schlüssel sind
dann hatte ich halt die 96 einfach in eine bcd zahl gewandelt dann hatte ich schonmal 18.6
war halt so das durch das 4 bit was nicht direkt mitgenutzt wird alles doppelt so hoch war also bei 65 hatte ich dann 12.5 usw...
das ist jetzt meine Lösung:
Code:
      L     #Ausgang1                   //Einlesen der Ersten Byte.Bit Adresse im INT Format ohne Trennzeichen
      ITB                               //Umwandeln in eine BCD Zahl
      T     #Aus_A_Teil1
      L     #Aus_A_Teil1                //Speichern des Wertes um Byte und Bit zu ermitteln
      T     #Aus_A_Teil2
      L     #Aus_A_Teil1                //Ermitteln des Bytes
      SRW   4                           //Löschen der Bit Informationen
      SLW   3                           //Korrigieren der Stellen
      T     #Aus_A_Teil1
      L     #Aus_A_Teil2                //Ermitteln des Bits
      SLW   13                          //Löschen der Byte Information
      SRW   13
      T     #Aus_A_Teil2
      L     #Aus_A_Teil2                //Bit Adresse
      L     #Aus_A_Teil1                //Byte Adresse
      OW                                //Wort Oder
      T     #Aus_A_Teil1                //Adresse für Byte.Bit
      LAR1                              //Ablegen im Adressregister 1
und das funktioniert auch so weit
 

Ralle

Supermoderator
Teammitglied
Beiträge
14.401
Punkte Reaktionen
3.373
@MatMer

Code:
L     #Ausgang1                   //Einlesen der Ersten Byte.Bit Adresse im INT Format ohne Trennzeichen 
      ITB                               //Umwandeln in eine BCD Zahl 
//      T     #Aus_A_Teil1 
//      L     #Aus_A_Teil1                //Speichern des Wertes um Byte und Bit zu ermitteln 
      T     #Aus_A_Teil2 
//      L     #Aus_A_Teil1                //Ermitteln des Bytes 
      SRW   4                           //Löschen der Bit Informationen 
      SLW   3                           //Korrigieren der Stellen 
      T     #Aus_A_Teil1 
      L     #Aus_A_Teil2                //Ermitteln des Bits 
      SLW   13                          //Löschen der Byte Information 
      SRW   13 
      T     #Aus_A_Teil2 
//      L     #Aus_A_Teil2                //Bit Adresse 
      L     #Aus_A_Teil1                //Byte Adresse 
      OW                                //Wort Oder 
      T     #Aus_A_Teil1                //Adresse für Byte.Bit 
      LAR1

Kannst Anweisungen sparen, nach einem Transfer steht der Wert immernoch im Akku und braucht nicht nochmal geladen zu werten. 8)
 
OP
MatMer

MatMer

Well-known member
Beiträge
788
Punkte Reaktionen
66
ja ich hab das jetzt auch schon öfters bei euch gesehen das ich viel zu viel lade aber ist halt gewöhnung und in der schule haben wir nur fup gelernt
(ich befürchte unser lehrer hatte keine ahnung von awl) und im praktikum musst ich dann awl machen und deshalb ist das alles noch nicht sooo sauber
ich versuche mich aber zu verbessern :D :D
 

Balou

Well-known member
Beiträge
221
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Moin
musst du denn das Bit so afrufen oder kannst du auch 2 getrennte Werte für Bit und Byte vorgeben Also einmal als INT der Bytewert also 9 und einmal als INT Wert die Bitnummer also 6

Code:
FUNCTION FC 2 : VOID
TITLE = Bit Aufrufer
VERSION : 0.1


VAR_INPUT
  Adresse : INT ;   //Adresse des aufzurufenden BITs
END_VAR
VAR_OUTPUT
  BITOUT : BOOL ;   //Ausgang des Bits
END_VAR
VAR_TEMP
  BCDZahl : WORD ;  //BCD Zahl
  BITWert : INT ;   //Nummer des BITs
  BYTEWert : INT ;  //Nummer des Bytes
END_VAR
BEGIN
NETWORK
TITLE =

      L     #Adresse; // Laden der Adresse
      ITB   ; //INT to BCD
      T     #BCDZahl; //IN BCD Speicher Abegen
      L     W#16#F; //Maskieren auf  die ersten 4 BIt
      UW    ; 
      BTI   ; //Wandeln nach INT
      T     #BITWert; //Abspeichern
      L     7; //Laden einer 7
      >I    ; //Vergleich auf Größer
      BEB   ; //Wenn größer dann baustein bedingt Benden
      L     #BCDZahl; //Laden der BCD Zahl
      L     W#16#FFF0; //Maskieren auf die letzten 3 Stellen
      UW    ; 
      SRW   4; //Um 4 Stellen nach rechts
      BTI   ; //BCD to INT
      SLW   3; //Um 3 stellen nach Links
      L     #BITWert; //Den BITwert Laden
      OW    ; //Verschmelzen
      LAR1  ; //Ins Adreessregister 1
      U     E [AR1,P#0.0]; //Aufruf des BITs
      =     #BITOUT; //Ausgeben des Bits
END_FUNCTION

So würde ich das schreiben

Ach ja weiß jemand wie man das mit dem Bitaufruf auch noch so hinbekommt das man einen geschlossenen FC Programmieren kann und trotzedem auf M oder A oder E zugreifen kann bei mir steht ja U E ....

MfG Balou
 
OP
MatMer

MatMer

Well-known member
Beiträge
788
Punkte Reaktionen
66
du meinst das mit dem aufruf also hier der eingang E [ar1,p#...]
oder was
hmmmmmm das geht doch bestimmt nicht ganz so einfach
oder verstehe ich dich jetzt falsch
 

Balou

Well-known member
Beiträge
221
Punkte Reaktionen
0
Ja genau das hab ich gemeint
Es muss doch irgendwie gehen das man am FC von außen sagt A oder E oder so.
Kalr das das evtl net ganz einfach ist ader wir sind hier über 500 Leuts das muss doch zu schaffen sein.
Ich werd ma nen neuen Thread aufmachen

MfG Balou
 
Oben