Anhand FB2 (P_RCV) Nutzdaten des Strings bestimmen

Andy082

Level-2
Beiträge
177
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Abend.

Hab wieder mal ein kleineres/größeres (wird sich hier nun rausstellen) Problem mit meiner Programmierung bzw. meiner Strategie.

Folgende Vorgabe:
Habe eine CP340, parametriert für ASCII, an welche in unregelmäßigen Abständen Strings in variierender Länge übergeben werden.
Hier, für meinen Versuch über eines der vielzähligen RS232-Programme (lookRS 232).
Grundlegend funktioniert das Senden und Empfangen der Strings, bzw. werden diese in ihre entsprechenden DB geschrieben.
Der empfangene String wird auf ein TP 170B ausgegeben.

Mein Problem ist nun aber das Handle des FB2 (P_RCV).
Code:
      CALL  "P_RCV" , "DB_P_RCV"
       EN_R  :=M100.7
       R     :=
       LADDR :=500
       DB_NO :=50
       DBB_NO:=6
       NDR   :="Player-DB".RCV_NDR         //DB50.DBX62.0
       ERROR :=
       LEN   :="Player-DB".RCV_Length     //DB50.DBW60
       STATUS:=

Da ich eben in unregelmäßigen Abständen Daten erhalte, dachte ich mir ich nehme einen Taktmerker (in diesem Falle den M100.7)
Geschrieben wird der empfangene String in den DB50.DBB4 (ab DBB6 46 Zeichen).
Byte 4 trägt den Wert 46, Byte 5 ist sofern ich nicht Byte 4 lade und in Byte 5 kopiere, immer 0.
Daher erhalte ich auf meinem TP auf keine Ausgabe des Strings, da Nutzdaten ja 0. (bitte korrigieren, wenn ich mich täusche)

Ich verstehe das Handbuch und das Zeitdiagramm des FB2 so....
Setze ich EN_R durch meinen Taktmerker, werden die Daten eingelesen.
Wurden alle Daten empfangen, so wird NDR gesetzt und LEN stellt mir gleichzeitig die Länge der empfangenen Daten bereit.

In meinem Fall wird aber NDR nicht 1 und auch an LEN wird nichts außer 0 ausgegeben. Im DB stehen aber alle übetragenen Zeichen bereit.

Sollte ich eventuell EN_R immer setzen, außer wenn NDR 1 ist?

Welcher Schritt fehlt mir, dass ich die Länge des Strings per LEN bestimmen kann?

mfg,
Andy
 
Machen wir mal einen Anfang ...

Hallo,

setze zuerst mal den "EN_R" konstant auf Logisch "1", dann schauen wir mal weiter...

Gruß

Question_mark
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zeig doch mal mehr Code ...

Hallo,

Andy082 schrieb:
In meinem Fall wird aber NDR nicht 1 und auch an LEN wird nichts außer 0 ausgegeben. Im DB stehen aber alle übetragenen Zeichen bereit.

Dazu muss man wissen, dass diese Informationen nur für einen Zyklus bereitstehen. Ein Fehler, der gerne von Programmierern im Zusammenhang mit den Standard-Kommunikationsbausteinen in der S7 gemacht wird, ist es nun mal, diese Tatsache nicht zu wissen oder einfach zu ignorieren.
Man sollte direkt nach dem Aufruf dieser Bausteine die zurückgegebenen Werte (also die OUT-Parameter) mit einer Flankenauswertung auswerten...

Gruß

Question_mark
 
besser wirds aber net... wo is da Fehler versteht.

.....5 Fehler unterscheiden den linken vom rechten Code.

Nein, Scherz beiseite.....

Gesagt getan, aber das Ergeniss bleibt leider das selbe.

Code:
      CALL  "P_RCV" , "DB_P_RCV"
        EN_R  :=TRUE
        R     :=
        LADDR :=500
        DB_NO :=50
        DBB_NO:=6
        NDR   :=#RCV_NDR
        ERROR :=
        LEN   :=#RCV_LEN
        STATUS:=
 
      FP    #RCV_NDR
      L     #RCV_LEN
      T     "Player-DB".RCV_LEN

Ich hoffe wir verstehen unter Flankenauswerung das selbe.
Wenn man meine Beiträge liest, merkt man, dass ich erst seit 3 Monaten programmiere, nur zu meiner Verteidigung. :D

mfg,
Andy


P.S.: mehr Code ist da nicht....
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Big thx

Klar, dass ich über diesen Klotz wieder stolpern musste und vergessen hab, dass gewisse Operationen auch ohne VKE ablaufen.

So sieht das Ganze nun aus.....

Code:
   CALL  "P_RCV" , "DB_P_RCV"
       EN_R  :=TRUE
       R     :=
       LADDR :=500
       DB_NO :=50
       DBB_NO:=6
       NDR   :=#RCV_NDR
       ERROR :=
       LEN   :=#RCV_LEN
       STATUS:=
 
     UN    #RCV_NDR
     SPB   REND
 
     FP    #RCV_NDR
     L     #RCV_LEN
     T     DB50.DBB    5
 
REND: NOP   0

...und funktionieren tut's wie erwarten auch.

Großes Danke an dieser Stelle.


mfg,
Andy
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Einfach nur optimieren ..

Hallo,

Andy082 schrieb:
mach pls mal ein Bsp wie du es denn schreiben würdest....

Dein Code war schon ok, nur die vom mir zitierte Zeile


ist eigentlich überflüssig, das meinte ich mit optimieren..
Diese Zeile einfach rausstreichen, hat keine Wirkung.
Ansonsten hast Du sehr schnell verstanden, auf was ich hinauswollte und das in Eigeninitiative verfolgt, da antwortet man gerne.

Gruß

Question_mark
 
Ok, war nur etwas verwundert was du mit überflüssig meintest....

Dass eine Abfrage auf eine steigende Flanke zB FP E0.0 unnötig ist, wenn ich zuvor auf ein VKE=1 zB UN E0.0 warte und rausspringe ,scheint logisch.


Trotzdem nochmals danke.... :rolleyes:


mfg,
Andy
 
Zuletzt bearbeitet:
Ok, war nur etwas verwundert was du mit überflüssig meintest....

Dass eine Abfrage auf eine steigende Flanke zB FP E0.0 unnötig ist, wenn ich zuvor auf ein VKE=1 zB UN E0.0 warte und rausspringe ,scheint logisch.


Trotzdem nochmals danke.... :rolleyes:


mfg,
Andy

Ihr seid ja zum richtigen Ergebnis gelangt! :ROFLMAO:

Ein Hinweis trotzdem noch zum FP.

Laden und Transferrieren ist VKE-unabhängig. Wenn du also irgendwann doch mal mit FP arbeitest dann:

Code:
U E 0.0
FP M0.0 (hier bitte eine statische Variable oder einen Merker oder ein Datenbausteinbit aber keine [B]TEMP[/B]
SPBN NIX

dein Code wird hier genau einmal bei steigender Flanke abgearbeitet

NIX: NOP 0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Welt lebt von dummen Ideen.....

So, als Feedback, damit hier im Forum nicht alle Post so plötzlich enden oder unvollständig erscheinen, ne' kurze Rückmeldung wofür das Ganze denn nun gut war...

- siehe Datei im Anhang -

Ich sende quasi von meinem TP aus einen INT in Stringform (40048 = '40048' Umwandlung in einem eigenen SCL-Programm) über meine CP340 an meinen PC. Hier wartet ein kleines C++/WinAPI-Programm auf ein gültiges Kommando für Winamp, welches per SendMessage() übergeben wird.
In einem Zyklus von 250ms wird der Titel des Winamp-Fensters erfasst (Liednummer - Interpret - Songname) in einen String gewandelt und an die SPS zurückgesendet und somit am Panel ausgegeben.

Das Ganze kommt in meine bereits einige Male erwähnte Haussteuerung und dient als Musicbox für's gesamte Haus. :-D


mfg,
Andy
 

Anhänge

  • Film.zip
    3,2 MB · Aufrufe: 20
Zurück
Oben