Puffer beschreiben

PHANTOMIAS

Level-1
Beiträge
30
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an alle!

Dies ist nun mein letzter Teil der Aufgabe und er beschäftigt sich mit dem Schreiben von Messwerten in den Puffer:
info.jpg
write.jpg

vdt.jpg

So sieht mein OB1 aus, wobei dieser Fehler meldet:
Code:
       U    "PufferFrei"                 // Puffer ist freigegeben
       UN   "PufferVoll"                 // Puffer ist nicht voll
       U    "NeuerMW"                    // Neuer Messwert
       FP   "FlankeNeuerMW"              // liegt als positive Flanke an
       CC   "SchreibePuffer"
         NeuerWert:="AblNeuMW"
         Pufferlaenge:="AnzahlWerte"
         PufferVoll:="PufferVoll"
         PufferFrei:="PufferFrei"
         Ptr:="Pointer"
Er nimmt die "Parameter" nicht an, die ich "SchreibePuffer" mitgeben will. Ändere ich CC in CALL, so wird es fehlerfrei übernommen.
Das Programm (WinSPS) meldet: "Fehler:Befehl ist nicht bekannt" in der Zeile mit NeuerWert:="AblNeuMW". Wenn ich die Zeile lösche, so folgt die nächste Zeile mit gleichem Fehler.
Zudem erscheint wenn ich in der Zeile bin: "Der FB/FC "?? 637" ist nicht mehr vorhanden!" -> Ich habe keine Ahnung was der FB/FC ?? 637 sein soll. Ich arbeite nur mit 43-49.

Was mache ich denn da falsch? -> Somit kann ich auch nicht den FC testen.

FC:
Code:
       L    #Ptr
       LAR1
       L    #NeuerWert
       T    MW [AR1,P#0.0]

       L    #Ptr
       L    16
       +I
       T    #Ptr

       L    #Ptr
       L    #Pufferlaenge
       >=I
       SPB  VOLL

VOLL  :NOP  1
       S    #PufferVoll
       R    #PufferFrei
Stimmt zumindest der FC theoretisch oder sind da Fehler oder Unschönheiten enthalten?

Gruß -PHANTOMIAS-
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für deine Antwort.
Ich habe mir deinen Link nun ein paarmal durchgelesen, jedoch muss ich sagen, dass ich es nicht verstehe was hier gemacht wird.
Soll ich bei mir schreiben:
Code:
       L    #Ptr
       SLD            3
       LAR1
       L    #NeuerWert
       T    MW [AR1,P#0.0]

       L    #Ptr
       L    16
       +I
       T    #Ptr

       L    #Ptr
       L    #Pufferlaenge
       >=I
       SPB  VOLL

VOLL  :NOP  1
       S    #PufferVoll
       R    #PufferFrei
Aber wie gesagt, verstehen tue ich es nicht. Ist das ein Muss oder nur eine Verschönerung?

Gruß -PHANTOMIAS-
 
...
[/code]Aber wie gesagt, verstehen tue ich es nicht. Ist das ein Muss oder nur eine Verschönerung?

Gruß -PHANTOMIAS-
Das muss schon so. Lese mal den Link von Volker durch. Vor allem diesen Absatz

...
Schon besser. Aber warum schieben wir 3 nach links?
Das liegt am Aufbau des Pointer. vereinfacht: Byteadress(16Bit).Bitadress(3Bit). (genauerers im Bild im Anhang)
Die 30 liegt also durch das schieben in der Byteadresse. die Bitadresse ist 0.
...
 
Okay, habe nochmal die Dokumentation durchwälzt, das SLD 3 ist klar, das schiebt den Inhalt von Akku1 3 Stellen nach links.
Und es hat irgendwas mit dem Verschub zu tun, dass ich korrekt darauf zugreife.

Stimmt das so wie es oben im Code-teil notiert habe?

Würde das so laufen wie in der Aufgabenstellung gefordert falls mein OB1 mitspielen würde?

Gruß -PHANTOMIAS-
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
Code:
       U    "PufferFrei"                 // Puffer ist freigegeben
       UN   "PufferVoll"                 // Puffer ist nicht voll
       U    "NeuerMW"                    // Neuer Messwert
       FP   "FlankeNeuerMW"              // liegt als positive Flanke an
       CC   "SchreibePuffer"
         NeuerWert:="AblNeuMW"
         Pufferlaenge:="AnzahlWerte"
         PufferVoll:="PufferVoll"
         PufferFrei:="PufferFrei"
         Ptr:="Pointer"
...
Also, um dir helfen zu können, solltest du schon angeben wie deine Variablen und Eingänge parametriert sind bzw. von welchem Typ sie sind

FC:
Code:
       L    #Ptr
       LAR1
       L    #NeuerWert
       T    MW [AR1,P#0.0]

       L    #Ptr
       L    16
       +I
       T    #Ptr

       L    #Ptr
       L    #Pufferlaenge
       >=I
      [COLOR=Red] SPB  VOLL

VOLL  :NOP  1
       S    #PufferVoll
       R    #PufferFrei[/COLOR]
Stimmt zumindest der FC theoretisch oder sind da Fehler oder Unschönheiten enthalten?
Das rote wird zwar funktionieren, ist aber ziemlich wertfrei
 
Stimmt!

Der Fehler:
Fehler.jpg


FC:
Vdt.jpg


Symboltabelle:
Symbol.jpg



Wertfrei? Hmm, ich sollte vielleicht nach SPB VOLL in der nächsten Zeile ein BE notieren?

Gruß -PHANTOMIAS-
 
Um beurteilen zu können, was an deiner Routine läuft und korrekt ist und was nicht würde ich gerne wissen (sorry Volker), welchen Wert du in Pointer übergibst ... also, was steht als Startwert da drin ?
Ist der Inhalt P#40.0 um MW40 zu adressieren ? Dann wäre das mit SLD3 falsch ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du meinst was L #Ptr hat?

Das habe ich im anderen Forums-Beitrag mit Aufgabenstellung (http://www.sps-forum.de/showthread.php?t=19247).
Hier nochmal der Aufgabentext zum Initialisieren:
info.jpg
init.jpg


Und das mache ich beim Initialisieren:
Code:
        L    P#       40.0
       T    "Pointer"
       S    "PufferFrei"
       R    "PufferVoll"
Brauche ich dann das SLD 3 nicht bei mir zu integrieren?

Gruß -PHANTOMIAS-
 
... genau das war die Frage ...
Dann sehe ich an folgender Stelle ein Problem :
Code:
      L    #Ptr
       L    16  [COLOR=darkgreen]// hier könntest du auch L P#2.0 schreiben - ist schöner
[/COLOR]     [COLOR=red][B]  +I  // <- hier sollte +D stehen
[/B][/COLOR]       T    #Ptr
Code:
[COLOR=red][B]       L    #Ptr    // keine Format-Übereinstimmung
       L    #Pufferlaenge
[/B][/COLOR]       >=I
       SPB  VOLL
Im 2. Block vergleichst du einen Pointer (DWORD) mit einem INT-Wert. Hier muss natürlich das Format passen. Pufferlänge ist ja warscheinlich 5 (aber bestimmt nicht P#50).

Gruß
LL
 
Okay, dann sieht der Code nun so aus:
Code:
       L    #Ptr
       SLD            3
       LAR1
       L    #NeuerWert
       T    MW [AR1,P#0.0]

       L    #Ptr
       L    P#        2.0
       +D
       T    #Ptr

       L    #Ptr
       L    #Pufferlaenge
       >=I
       SPB  VOLL

VOLL  :NOP  1
       S    #PufferVoll
       R    #PufferFrei
Muss das SLD 3 nun stehenbleiben oder muss es weggenommen werden?

Da hast du recht, ich vergleiche hier ja Äpfel mit Birnen. Also was ich machen würde bzw. was ich mir denke, wobei ich nicht weiß wie man das in AWL macht:
Pufferlaenge ist 5, das ist im Prinzip eine Konstante. Ich müsste 5*MW (also 5*2 Byte) nehmen und das in eine Hilfs-Variable des Typs DWORD speichern und dann vergleichen, oder?

Gruß -PHANTOMIAS-
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Als erstes ... den SLD-Befehl benötigst du in diesem Fall natürlich nicht, da du den Wert ja schon im Pointer-Format übergibst ...

Da hast du recht, ich vergleiche hier ja Äpfel mit Birnen. Also was ich machen würde bzw. was ich mir denke, wobei ich nicht weiß wie man das in AWL macht:
Pufferlaenge ist 5, das ist im Prinzip eine Konstante. Ich müsste 5*MW (also 5*2 Byte) nehmen und das in eine Hilfs-Variable des Typs DWORD speichern und dann vergleichen, oder?

Mein Ansatz wäre hier so ähnlich ...
Du müßtest einen Ende-Pointer berechnen ... also Start-Pointer + Länge als Pointer.
 
Hmm, ich habe es nun mal fest gemacht, wobei ich dann auch keine #Pufferlaenge benötigen würde. Und eigentlich kann ich mir dann auch #EndePtr schenken und es ist recht sinnlos. Habe alles durchwälzt, weiß nicht wie ich das mittels AWL umsetzen soll.
Code:
       L    #Ptr
       SLD            3
       LAR1
       L    #NeuerWert
       T    MW [AR1,P#0.0]

       L    #Ptr
       L    P#        2.0
       +D
       T    #Ptr

       L    P#       40.0
       L    P#       10.0
       +D
       T    #EndePtr

       L    #Ptr
       L    #EndePtr
       >=I
       SPB  VOLL

VOLL  :NOP  1
       S    #PufferVoll
       R    #PufferFrei
Gruß -PHANTOMIAS-
 
Ich verstehe deinen letzten Beitrag nicht ...
auf jeden Fall hast du darin noch einen Fehler :
Code:
       L    #Ptr
       L    #EndePtr
       >=I
       SPB  VOLL
[COLOR=red]// hier fehlt noch die Alternativ-Behandlung !!! Sonst ist IMMER voll ...[/COLOR]
VOLL  :NOP  1
Gruß
LL
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Zu meinem letzten Beitrag:
"Mein Ansatz wäre hier so ähnlich ...
Du müßtest einen Ende-Pointer berechnen ... also Start-Pointer + Länge als Pointer."
-> Ich weiß nicht wie ich das in AWL umsetzen soll.

Okay, dann mache ich ein BE hin, denn das Rücksetzen des PufferVoll wird in einem anderen FC gemacht (Initialisierung)

Code:
       L    #Ptr
       SLD            3
       LAR1
       L    #NeuerWert
       T    MW [AR1,P#0.0]

       L    #Ptr
       L    P#        2.0
       +D
       T    #Ptr

       L    P#       40.0
       L    P#       10.0
       +D
       T    #EndePtr

       L    #Ptr
       L    #EndePtr
       >=D
       SPB  VOLL
       BE

VOLL  :NOP  1
       S    #PufferVoll
       R    #PufferFrei
Gruß -PHANTOMIAS-
 
Zuletzt bearbeitet:
warum nicht so :
Code:
       L    #Ptr
[COLOR=red]       SLD            3  // wird NICHT benötigt !!!
[/COLOR]       LAR1
       L    #NeuerWert
       T    MW [AR1,P#0.0]

       L    #Ptr
       L    P#        2.0
       +D
       T    #Ptr

       L    P#       40.0
       L    P#       10.0
       +D
       T    #EndePtr

       L    #Ptr
       L    #EndePtr
       >=D
       SPB  VOLL
      [COLOR=red] SPA Ende[/COLOR]

VOLL  :NOP  1
       S    #PufferVoll
       R    #PufferFrei
 
[COLOR=red]Ende: Nop 0[/COLOR]
 
Hmm, warum ein absoluter Sprung auf Ende, statt ein BE zu machen?
Worin besteht der Vorteil?

Hmm, aber mein eigentliches Problem ist immer noch dieser Teil:
Code:
       L    P#       40.0
       L    P#       10.0
       +D
Den habe ich so notiert, da ich nicht weiß wie man das "dynamisch" lösen kann. In #Pufferlaenge, welches ein int-Wert aufnehmen kann, steht die max. Anzahl der möglichen Werte, die aufgenommen werden sollen.
Und #Pufferlaenge sollte ich ja irgendwie unterkriegen.

Gruß -PHANTOMIAS-
 
Hallo.

Vielen Dank für die Antwort.
Hier muss dann das SLD 3 mit rein? Und der #EndePtr hätte bei Pufferlaenge 5 den Wert P #50.0 ?
Ich dachte nämlich wenn ich auf P #40.0 10 addiere, dann würde der Zeiger P #41.2 sein, also 10 Bits aufaddiert und nicht Bytes. Zumindest habe ich das so in meinen Vorlesungsunterlagen stehen mit dem Beispiel:

Code:
L P #10.0
L 5
+I
T #Zeiger // -> #10.5
Kann aber gut sein, dass das so nicht stimmt, da man alle Vorlesungsinhalte mit Vorsicht genießen sollte :-D

Gruß -PHANTOMIAS-
 
Hallo.

Vielen Dank für die Antwort.
Hier muss dann das SLD 3 mit rein? Und der #EndePtr hätte bei Pufferlaenge 5 den Wert P #50.0 ?
Ich dachte nämlich wenn ich auf P #40.0 10 addiere, dann würde der Zeiger P #41.2 sein, also 10 Bits aufaddiert und nicht Bytes. ...
Durch das SLD 3 verschiebst du ja deinen Wert aus #Pufferlänge ja um 3 Stellen nach links. Und ein Pointer setzt sich so zusammen
Byteadresse(16 Bit).Bitadresse(3Bit). Also steht nach dem schieben eine Null an der Bitadresse und du addierst Bytes.
Ansonsten einfach noch mal hier lesen
http://www.sps-forum.de/showthread.php?t=8887
 
Zurück
Oben