P_RCV_RK in altem Projekt

vollmi

Level-3
Beiträge
5.433
Reaktionspunkte
1.409
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi zusamme. Ich versuche grad aus einem alten Projekt schlau zu werden.

Eine S7-300 kommuniziert per RK512 mit einem übergeordneten Rechner.
Aber aus dem Aufbau der Kommunikation werde ich irgendwie nicht schlau. Hier mal ein Auszug.

Code:
      SET   
      =     M    200.0
      =     M    200.1
      =     M    200.2
      =     M    200.3
      =     M    200.4
      =     M    200.5
      =     M    200.6


      CALL  "P_RCV_RK" , DB7
       EN_R    :=M200.0
       R       :=
       LADDR   :=272
       DB_NO   :=110
       DBB_NO  :=0
       L_TYP   :=
       L_NO    :=MW204
       L_OFFSET:=MW206
       L_CF_BYT:=MW208
       L_CF_BIT:=MW210
       NDR     :=M201.0
       ERROR   :=M202.0
       LEN     :=MW212
       STATUS  :=MW214

      CALL  "P_RCV_RK" , DB7
       EN_R    :=M200.1
       R       :=
       LADDR   :=272
       DB_NO   :=111
       DBB_NO  :=0
       L_TYP   :=
       L_NO    :=MW204
       L_OFFSET:=MW206
       L_CF_BYT:=MW208
       L_CF_BIT:=MW210
       NDR     :=M201.1
       ERROR   :=M202.1
       LEN     :=MW212
       STATUS  :=MW214

      CALL  "P_RCV_RK" , DB7
       EN_R    :=M200.2
       R       :=
       LADDR   :=272
       DB_NO   :=112
       DBB_NO  :=0
       L_TYP   :=
       L_NO    :=MW204
       L_OFFSET:=MW206
       L_CF_BYT:=MW208
       L_CF_BIT:=MW210
       NDR     :=M201.2
       ERROR   :=M202.2
       LEN     :=MW212
       STATUS  :=MW214

Wohlgemerkt die Kommunikation funktioniert, wenn man nix verändert. Ich weiss blos nicht wieso?

warum wird da jedesmal der gleiche Instanzdb übergeben? Steht da irgendein tieferer Sinn dahinter den ich nicht verstehe?

Ist das dann so Zufall das es funktioniert hat?
Ich würde das jetzt gerne etwas besser aufbauen. Also die Rückmeldungen auf einen db bringen (für jeden RCV einen eigenen Bereich) und natürlich die Instanz individualisieren. Habe ich da Probleme zu erwarten?

mfG René
 
P_SND_RK funktioniert!

Hallo Rene,


ich kann mir auch keinen Reim darauf machen, warum. Würde aber darauf tippen, dass die Programmzeilen von einem S5ler erstellt wurden, der mit den instanzierbaren FBs von S7 schlicht überfordert war.

Ich habe keine Erfahrung mit mehreren Instanzen eines "P_RCV_RK", weiß aber aus eigener Erfahrung, dass das im Falle des Gegenstücks "P_SND_RK" funktioniert!

Dein Post hat mich aber etwas verunsichert. Poste hier dochmal bitte, ob Deine Programmänderung funktioniert hat. Danke.

Mfg.: Heiko.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...das hab ich heute in der Online-Hilfe zu den CP341-Funktionsbausteinen gefunden:

Funktionsbausteine CP341

Beschreibung

Im Anwenderprogramm darf für jeden eingesetzten CP*341 gleichzeitig immer nur ein FB*P_SND_RK und ein FB*P_RCV_RK aufgerufen werden.
 
Das ist jetzt interessant im Handbuch S7Cp341a.pdf steht.
Gleichzeitig bearbeitbare Aufträge
Im Anwenderprogramm darf für jeden eingesetzten CP 341 nur ein aktiver und ein passiver
Auftrag programmiert werden. Während der CP 341 einen aktiven Auftrag abwickelt, kann er
gleichzeitig einen passiven Auftrag bearbeiten.
Außerdem dürfen Sie nur
● 1 Instanz-Datenbaustein für den FB P_SND_RK und
● 1 Instanz-Datenbaustein für den FB P_RCV_RK,
da im Instanz-Datenbaustein die für den internen Ablauf des FBs notwendigen Zustände
abgelegt sind.

Und in der Onlinehilfe steht genau:
Gleichzeitig bearbeitbare Aufträge:

Im Anwenderprogramm kann gleichzeitig immer nur ein aktiver und ein passiver Auftrag bearbeitet werden. Während der CP 341 einen aktiven Auftrag abwickelt, kann er gleichzeitig einen passiven Auftrag bearbeite

Das hört sich für mich schon etwas seltsam an. Heisst also ich kann nach dem Handbuch FBs wie ich lustig bin am Start haben, aber nur ein Instanzdb dafür. Also für jeden FB den gleichen. Und die Onlinehilfe ist in mehreren Arten zu deuten.
 
Hallo zusammen !

Hallo Rene,
....
ch kann mir auch keinen Reim darauf machen, warum. Würde aber darauf tippen, dass die Programmzeilen von einem S5ler erstellt wurden, der mit den instanzierbaren FBs von S7 schlicht überfordert war.
....
Mfg.: Heiko.

ich habe folgendes gefunden:

Anwendung von Koppelmerkern
Vor dem Empfang von Daten wird der im RK 512-Telegrammkopf angegebne Koppelmerker abgeprüft. Die Daten werden nur übertragen, wenn der Koppelmerker den Wert "0" hat. Nach Abschluss des Übertragungsvorganges wird der Koppelmerker vom Funktionsbaustein auf den Wert "1" gesetzt und am Funktionsbaustein für einen Zyklus (NDR) der Koppelmerker ausgegeben.
Im Anwenderprogramm kann durch Auswertung des Koppelmerkers erkannt werden, dass die übertragenen Daten bearbeitet werden können. Sobald die Daten bearbeitet wurden, muss der Anwender den Koppelmerker wieder auf "0" setzen. Ein SEND-Auftrag vom Kommunikationspartner ist wieder möglich.

_CF_BYT 1
OUTPUT
INT
Koppelmerkerbyte auf lokaler CPU
0 ≤ L_CF_BYTE ≤ 255255 bedeutet: ohne Koppelmerker

L_CF_BIT 1
OUTPUT
INT
Koppelmerkerbit auf lokaler CPU
0 ≤ L_CF_BIT ≤ 7

Die Koppelmerker werden jeweils vom Verbindungspartner direkt in die CPU geschrieben bzw. umgekehrt.

Ich denke, dass hier vielleicht damit gearbeitet und das Senden/Empfangen gesteuert wird...

Der Hinweis kommt hierher:
https://www.automation.siemens.com/...31&TopicID=28248377739&Highlight=koppelmerker P_RCV_RK&Query=koppelmerker P_RCV_RK&cssearchengine=NEW


gruss
 
Warum soll man nicht den selben IDB verwenden? :confused:

Man muss sich doch so und so sich darum kümmern, dass immer nur ein Aufruf aktiv ist. Es wird eben nacheinander der IDB bei jedem Aufruf neu befüllt.


bike
 
Warum soll man nicht den selben IDB verwenden? :confused:

Man muss sich doch so und so sich darum kümmern, dass immer nur ein Aufruf aktiv ist. Es wird eben nacheinander der IDB bei jedem Aufruf neu befüllt.

Nicht zwingend. Im IDB kannst du auch Daten abspeichern und beim nächsten abruf des Bausteins nur abfragen.
Vielleicht hast du dir einen FIFO gebaut und speicherst im IDB bei jedem Aufruf des Bausteins einen Wert und schiebst alle schon gespeicherten nach hinten. Da wäre es fatal wenn der gleiche IDB nochmal benutzt wird von einem zweiten FIFO der ganz einen anderen Wert einfach dazwischenspeichert.

mfG René
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nicht zwingend. Im IDB kannst du auch Daten abspeichern und beim nächsten abruf des Bausteins nur abfragen.
Vielleicht hast du dir einen FIFO gebaut und speicherst im IDB bei jedem Aufruf des Bausteins einen Wert und schiebst alle schon gespeicherten nach hinten. Da wäre es fatal wenn der gleiche IDB nochmal benutzt wird von einem zweiten FIFO der ganz einen anderen Wert einfach dazwischenspeichert.

mfG René

Stimmt fast.
Wenn ich eine Funktion schreibe, die sich allgemein etwas merken soll, dann hat die immer einen Global DB.
Doch war das ja nicht deine Frage.
Du hast gefragt ob du das so machen kannst und ich schreibe: ja.


bike
 
Bei dem Baustein scheint das so zu funktionieren. Allerdings ist das doch sehr ungewöhnlich wie ich finde.

Wenn du alles in Globalen DBs speicherst, wozu brauchst du dann einen IDB?

Wollen wir eine Grundsatzdiskussion beginnen?
Ein FB hat einen IDB, der nur ihm gehört.
Wenn sich mehrere FB Aufrufe einen IDB teilen, dann muss sich jeder FB bei dem Aufruf darum kümmern, dass nicht Mist vom Vorgänger noch drin steht oder er überschreibt ohne Überprüfung.
IDB sind nach meiner Meinung so wie Lokaldaten zu betrachten.

Aber mach doch bitte wie du willst, ich wollte dir nur deine Frage beantworten.

bike
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bevor wir uns jetzt die Köpfe einschlagen um den Sinn von Instanz-DBs zurück zum Thema.

Zitat Online-Hilfe

Ist vom Kommunikationspartner als Datenziel "DB" angegeben, werden die Daten in den im RK 512-Telegrammkopf spezifizierten Datenbereich abgelegt. Dem Anwender werden mit Hilfe der Parameter (L_...) der Typ des Zielbereiches (L_TYP), die Ziel-Datenbausteinnummer (L_NO, nur relevant bei L_TYP = DB), der Offset im Zielbereich (L_OFFSET) sowie die Länge (LEN) der übertragenen Daten angezeigt. Ist vom Partner das Datenziel "DX" angegeben, werden die Daten in dem Datenbaustein (DB), der durch die Parameter DB_NO und DBB_NO spezifiziert ist, abgelegt.

Ich habe im Moment leider keine CP341 da zum Ausprobieren. Aber das würde doch theoretisch bedeuten, dass ein (1!) einziger P_RCV_RK genügt um alle Aufträge zu bearbeiten!
 
Allerdings wenn man so wie hier mehrere DBs hat die übertragen werden müsste man ja für jeden Bereich wieder ein Baustein aufrufen und für jeden Bereich die DB_NO := DBB_NO := erneut angeben.

Anyway. Ich habe den Aufruf jetzt so gelassen mit einem IDB und der Emfpang und Versand funktioniert. Ich nur die Statusausgaben auf individuelle DB Bereiche gelegt um unterscheiden zu können wo es ein Problem gibt.

Scheinbar ist die Zuweisung ein und desselben IDBs an den Baustein wirklich korrekt, auch wenn ich das so noch nie gesehen habe bei Siemens.
Sonst wird ja die Koordination über die Schnittstelle gemacht.

Danke für die Hilfe.

mfG René
 
Guten Abend, kann mir jemand einen Link oder eine Tabelle zukommen lassen, wo die Fehlernummern am Parameter STATUS der Bausteine FC7 (P_RCV_RK) und FC8 (P_SND_RK) enthalten sind? In allen Siemens Dokumenten habe ich immer nur gelesen, dass hier ein Fehlercode ausgegeben wird, aber nirgends steht was er bedeutet... Vielen vielen Dank!
 
Vielen Dank für die Antwort, aber aus dem Kapitel werde ich nicht schlau. Hatte als Fehler 830 und konnte dazu keinen Hilfetext finden. Habe dann die HW-Config geöffnet, hier steht ja glücklicherweise ein Klartext drin. Dank Google bin ich dann schnell zur Lösung gekommen, ich hatte die falsche Parität eingestellt.
Trotzdem vielen vielen Dank dafür!
 
Wie ist denn der CP parametriert ??? Wenn der CP passiv mit niedriger Prio ist dann brauchst du an den FB7 nur EN_R auf True setzen und die LADDR zu beschalten und die Kiste funzt.
 
Zuletzt bearbeitet:
Zurück
Oben