CP340 - Daten über RS232 senden und Empfangen

smartie

Level-1
Beiträge
298
Reaktionspunkte
22
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

habe schon einmal ein paar Fragen zum CP340 und dessen Programmierung hier im Forum gestellt.
Leider aber unter einem etwas irreführendem Titel. (s. S7-Bausteine und ihre Bedeutung)
Da ich diesen Beitrag nicht umbenennen kann, hier die Fortsetzung unter neuem Namen:

Ich möchte Daten von verschiedenen Scannern über RS232 empfangen und an einen Drucker weiterleiten (ebenfalls RS232).

Das geht eigentlich ganz gut, doch jetzt habe ich noch ein kleines Problem:

Wenn z.B. der Handscanner getriggert wird, ohne das der Empfang am CP340 freigegeben worden ist, so wird das Empfangene Telegramm im Puffer des CP abgelegt.
Gebe ich nun den Empfang frei und möchte etwas neues empfangen, so erhalte ich aber den alten Wert aus dem Puffer des CP.

Wie kann ich das verhindern? Im Handbuch des CP340 ist die Rede vom FB12 "P_RESET".
Der FB12 benötigt jedoch noch einen Instanzdatenbaustein.

Und hier komm ich nicht weiter.
Muss ich den Instanzdatenbaustein selber anlegen? - Wie muss der aussehen?
Oder kann ich den irgendwo rausholen (wie z.B. aus einem Programmierbeispiel).

Wäre super wenn mir hier noch jemand weiterhelfen könnte.

Gruß smartie
 
Ruf den FB in Progamm auf, mit der DB-Nummer, die du gerne möchtest. Der Step7-Manager legt dann den entsprechenden Instanz-DB an.

Also schreiben:

Code:
Call FB12, DB12
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der FB12 benötigt jedoch noch einen Instanzdatenbaustein.

Und hier komm ich nicht weiter.
Muss ich den Instanzdatenbaustein selber anlegen? - Wie muss der aussehen?
Oder kann ich den irgendwo rausholen (wie z.B. aus einem Programmierbeispiel).

Wäre super wenn mir hier noch jemand weiterhelfen könnte.

Gruß smartie
Hallo,

grundsätzlich gehört zu jedem FB auch ein Instanz DB. Dieser dient als "Gedächtnis" für die Stat-Variablen des FB. Dies ist auch der entscheidende Unterschied zwischen FB und FC.
Beim FC gibts keine Stat-Variablen.
 
Habs auch grad rausgefunden:

Ich hab einfach nen DB12 angelegt und als InstanzDB auf den FB 12 verlinkt.
Dadurch wurde der Inhalt des DB12 automatisch generiert.

Aber deine Lösung, Ralle, ist mir da symphatischer.

Bei dem Projekt hier stoß ich schon immer wieder an meine Grenzen, hab bis jetzt eher ein paar EA´s programmiert und das auch meistens unter S7-200.
Aber dank Eurer Hilfe komm ich doch immer weiter voran und lerne was dazu. :)

Jetzt hab ich noch ein Anliegen:

Nach dem Einschalten der Anlage muss ich auf mehrere Scanner gleichzeitig schauen, der als erstes getriggert wird (entweder Handscanner oder über
Lichtschranke) soll dann anschließend verarbeitet werden.

Da bekomme ich aber ein Problem mit dem FB2. Ich kann den FB2 ja zu einem Zeitpunkt nur mit einer Parametrierung versehen.
Das heisst also ich kann nur auf einen CP schauen.

Wie bekomme ich es also hin das ich auf mehrere CP´s gleichzeitig schaue?
Kann ich da den FB2 noch mal kopieren? Ich frag jetzt schon mal ohne es auszurobieren, da ich im Moment nur an einem Versuchsaufbau
hocke und nur einen CP vor mir habe.

Morgen wenn ich wieder an der Anlage bin würd ich das dann mal ausprobieren.
Vielleicht kann mir ja schon jemand vorher antworten. (Das ich heut Nacht etwas ruhiger schlafen kann ;) )

Gruß und Danke smartie
 
Hallo smartie,

nur mal so zum Verständnis.
Warum wird der CP zum Empfang nicht immer freigegeben.
Wenn der Scanner von Hand getriggert wird, und du eine Bedingung hast, die den Empfang ermöglichen soll, kanst Du den Empfang ja immer einschalten. Nur wenn deine Bedingung erfüllt ist, wertest Du die Daten aus. Das verhindert Timingprobleme bei ein und ausschalten bzw. beim triggern.
Ist vieleicht nicht auf deine Anwendung umsetzbar, aber ist nur so ein Tipp auf Grund Deiner Angaben.
Vieleicht kannst Du die Anwendung noch präziser beschreiben.

EDITH Sagt:
Zeitüberschneidung der antworten.
Du kannst für jeden CP einen FB für Receive anlegen, aber jeder bekommt einen eigenen Instanzdb (Multiinstanz mal ausgenommen)
Wenn Du die dann im Programm hintereinander legst, sieht Du am Ausgang welcher CP gerade Daten empfangen hat.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie Steve81 schon schrieb, der DB ist das "Gedächtnis des FB". Wenn du mehrere CP hast kannst du für jeden einen FB2 mit je einem anderen Instanz-DB nutzen. Die äußere Beschaltung mußt du natürlich auch für die entsprechende CP machen. Was nicht geht, ist 2x FB2 mit dem selben Instanz-DB gleichzeitig nutzen. Auch kannst du nur jeweils einen Auftrag an einen CP geben, nicht 2 oder 3 Aufträge an den selben CP gleichzeitig.
 
Hallo jabba,

ich habe mehrere CP´s an meiner S7-300. Daran hängen 3 Scanner (2 feste und ein Handscanner) und ein Drucker.

Nach dem einschalten kann der Bediener entweder den Handscanner verwenden der an einem CP hängt, oder die Palette kommt
über die Fördertechnik und löst einen der festen Scanner aus, der an einem anderen CP hängt.

Das heisst also ich kann sowohl vom Handscanner, als auch vom Einlaufscanner etwas empfangen. Da aber beide an unterschiedlichen
CP´s hängen bekomm ich doch ein Problem mit dem FB2, der ja in einem Moment nur auf einen CP parametriert werden kann.

Oder versteh ich da was falsch?

Gruß smartie
 
Das heisst also ich kann sowohl vom Handscanner, als auch vom Einlaufscanner etwas empfangen. Da aber beide an unterschiedlichen
CP´s hängen bekomm ich doch ein Problem mit dem FB2, der ja in einem Moment nur auf einen CP parametriert werden kann.

Oder versteh ich da was falsch?

Gruß smartie

Du kannst den FB2 kopieren, so dass du für jeden CP einen eigenen FB und einen dazugehörigen Instanz-DB hast.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber ist es so das FB und der dazgehörige InstanzDB immer gleich heissen müssen?

Ganz am Anfang hatte ich aber glaube ich ein Problem als ich FB2 und FB 3 umbenennen wollte, irgendwie hat das nicht funktioniert.
Vielleicht hab ich da was übersehen. Probiers morgen gleich noch mal aus.

smartie
 
Aber ist es so das FB und der dazgehörige InstanzDB immer gleich heissen müssen?

Das müssen sie nicht, ist aber übersichtlicher.

Ganz am Anfang hatte ich aber glaube ich ein Problem als ich FB2 und FB 3 umbenennen wollte, irgendwie hat das nicht funktioniert.
Vielleicht hab ich da was übersehen. Probiers morgen gleich noch mal aus.

smartie

Also normal kann man einen Baustein kopieren und einfach einen neuen Namen vergeben z.B. FB2 --> FB12
Der Instanz DB muss dann für den neuen FB12 neu generiert werden.

EDIT: Den FB2 mehrmals aufrufen so wie bei jabbas Beispiel ist besser als das kopieren des FB.
 
Zuletzt bearbeitet:
Mal ein kurzes Beispiel,

Code:
      CALL  "P_RCV" , DB10
       EN_R  :=M0.0              // Immer ein High Signal
       R     :=M0.1                // Reset z.B. nach Anlauf OB100
       LADDR :=100
       DB_NO :=20
       DBB_NO:=0
       NDR   :=M12.0
       ERROR :=
       LEN   :=
       STATUS:=
      CALL  "P_RCV" , DB11
       EN_R  :=M0.0
       R     :=M0.1
       LADDR :=116
       DB_NO :=21
       DBB_NO:=0
       NDR   :=M12.1
       ERROR :=
       LEN   :=
       STATUS:=
      NOP   0
 
      U     M     12.0
      SPB   SC1
      U     M     12.1
      SPB   SC2
      SPA   NIX
SC1:  NOP   0                           // Daten von Scanner 1
      SPA   NIX
SC2:  NOP   0                           // Danten von Scanner 2
      SPA NIX
NIX:  NOP   0
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für die Erklärung, probier ich morgen gleich mal aus. :)

Bin nur grad am überlegen ob ich das für alle CP´s mache, oder nur für die die
auch wirklich zur gleichen Zeit aktiv sein können.

smartie
 
Hi jabba,

da stichst du gleich in die nächste offene Wunde bei mir, mit den ganzen Sprungbefehlen kann ich nicht viel anfangen (wie gesagt komme aus der S7-200er Ecke).

Aber du schaust, mit einem FB auf zwei unterschiedliche InstanzDB zur gleichen Zeit, welche wiederum auf zwei unterschiedliche CP´s schauen.

Das wäre in meinem Fall ja erst mal eine weniger schreibaufwändige Variante in Vergleich zu der von steve81, wo ich ja für jeden CP den FB2 kopieren müsste.

Aber was stellst du mit den Sprungbefehlen an?
Irgendwie machen die doch gar nichts, oder?

smartie
 
Genau, die Sprungbefehle machen im Beispiel nix.

Der Ablauf sieht so aus.
Beide CP´s sind immer auf Empfang , wenn das Signal EN_R auf 1 bleibt.
Wenn Du jetzt extern triggerst oder einer den Handscanner benutzt,
kommt für einen Zyklus (ACHTUNG nur für einen Zyklus) das Signal NDR.
Dieses sagt dir, das Daten am CP empfangen wurden.
Die Sprungbefehle sagen jetzt nur, wenn Daten von CP1 = M12.0 dann springe nach SC1.
Dort fügst Du deinen Code ein, z.B. würde ich die gescannten Daten in einen anderen DB kopieren, und mir einen Merker setzen ; Neue Daten erhalten.
Ganz wichtig ist, das in der Hardwareconfig die Einstellungen richtig sind, damit der CP das Ende einer Übertragung erkennt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du kannst den FB2 kopieren, so dass du für jeden CP einen eigenen FB und einen dazugehörigen Instanz-DB hast.

Aber das wäre Unsinn. Ein FB2 (du kannst ihn auch in FB100 umbenennen, falls du schon einen eigenen FB2 hast) für alle CP, aber jeweils ein anderer DB. Gib den DB ordentliche symbolische Namen, dann kommt man damit problemlos klar :D.
 
Danke Euch allen für Eure Tipps, werde das morgen mal ausprobieren.

Ich denke ich werde mich für die Variante, wie jabba sie beschreibt entscheiden. Wäre ja auch super unübersichtlich für jeden CP einen eigenen FB und DB zu haben.

Aber im Allgemeinen läuft mein Programm ja soweit schon ganz gut , bis eben auf die Geschichte mit den beiden gleichzeitig aktiven Scannern, wie gesagt morgen weiß ich mehr.

smartie
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber das wäre Unsinn. Ein FB2 (du kannst ihn auch in FB100 umbenennen, falls du schon einen eigenen FB2 hast) für alle CP, aber jeweils ein anderer DB. Gib den DB ordentliche symbolische Namen, dann kommt man damit problemlos klar :D.
Antwort an den kleinen Nils:
der FB bleibt bitteschön gleich, der DB ändert sich!

Ihr habt natürlich Recht :s1: (Allein schon wegen dem Speicherplatz)!

Ich entschuldige mich hiermit unterwürfigst für diesen Aussetzer::oops:
Also normal kann man einen Baustein kopieren und einfach einen neuen Namen vergeben z.B. FB2 --> FB12
Der Instanz DB muss dann für den neuen FB12 neu generiert werden.
(Wobei die Aussage an sich nicht falsch sondern nur für die Anwendung von smartie schlecht ist)

Hab mich ja aber gestern schon korrigiert.
EDIT: Den FB2 mehrmals aufrufen so wie bei jabbas Beispiel ist besser als das kopieren des FB.
 
Also ich hab die Änderungen vorgenommen und, oh Wunder, es funktioniert.

Ich kann jetzt auf beide Scanner gleichzeitig schauen, der der als erstes ein Result ausgibt wird dann weiter verarbeitet.

Danke nochmal :-D

smartie
 
Zurück
Oben