Step 7 Verweis auf Instanz-DB in CFC

Benjamin

Level-2
Beiträge
239
Reaktionspunkte
36
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

nach langer Simatic-Abstinenz darf ich mich wieder mit dieser Programmierumgebung beschäftigen. Ich bin dabei einen Modbus RTU Master umzusetzen und soll folgende Anweisung aus dem Handbuch für die Bibliothek befolgen.

Ein Verweis auf den Instanz-Datenbaustein der Anweisungen Modbus_Master oder Modbus_Slave.
Der Parameter MB_DB muss mit dem (statischen und daher an der Anweisung unsichtbaren) Parameter MB_DB der Anweisung Modbus_Master oder Modbus_Slave verschaltet werden.

Dies sieht so aus, dass in den Plan 2 FBs eingefügt werden. Beide bekommen einen Instanz-DB. Der eine Baustein muss nun mit dem Instanz-DB des anderen verknüpft werden. Ich stoße hier aber gleich auf zwei Fragen:
  1. Kann ich den DB oder die Nummer bei dem betreffenden Funktionsbaustein nicht verknüpfen. CFC lässt dies nicht zu.
  2. Bei einer irgendwie gearteten "festen" Verschaltung kann ich ja nie sicher sein, dass sich die Nummern der Instanz-DBs nicht doch noch beim Übersetzen ändern.

2018-08-15 13_02_49-56 SIMATIC Step 7 5.6 + TIA V14 win7 - VMware Workstation_1.jpg

Infos:
  1. CPU ist 317-2 PN/DP (6ES7317-2EK14-0AB0)
  2. CM ist ein CM-PTP über ET200SP (6ES7137-6AA00-0BA0)
  3. Step 7 5.6 + HF5
  4. CFC V9.0
  5. Bibliothek (V1.3) und Übersicht
  6. Handbuch für PtP-Bibliothek
 
So etwas habe ich schon gemacht. Das funktioniert, du musst dir in dem Fall aber einen "Zwischenbaustein" schreiben, auf den du einen beliebigen Bausteinausgang des Quellbausteins (z.B. DONE) verschaltest. Dort extrahierst du die IDB-Nummer und bereitest sie dir so auf das du sie mit dem Anschluss MB_DB verschalten kannst.
Ich glaube nicht das es dafür etwas fertiges gibt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
OK, das mit dem Zwischenbaustein anlegen und Nummer extrahieren hat mich schon einmal weiter gebracht.

Im Siemens Support eine Anleitung gefunden, wie die Instanz-DB Nummer ermittelt werden (Wie können Sie die eigene Instanz-DB Nummer eines Programmbausteins ermitteln, der in der SCL programmiert werden soll?). Hier geht es zwar um die eigene Nummer, aber das hat sich umschreiben lassen.

Code:
FUNCTION_BLOCK leseIDBNummer

VAR_IN_OUT
  X : ANY;
END_VAR

VAR_OUTPUT
  DBNR_I : INT;
  DBNR_W : WORD;
END_VAR

VAR_TEMP
  TempPointer : ANY;
  AnyPointer AT TempPointer:
    STRUCT
      BYTE0 :BYTE;  // Byte 0
      TYP   :BYTE;  // Byte 1        Daten/Parametertyp
      ANZ   :WORD;  // Byte 2+3      Länge der Variablen
      DBNR  :WORD;  // Byte 4+5      DB-Nummer
      BZ    :DWORD; // Byte 6 bis 10 Bereichszeiger 
    END_STRUCT;            
END_VAR

BEGIN
TempPointer := X;                     // Hilfsvariable mit Zeiger auf 
 // Eingang X laden 
 
DBNR_W := AnyPointer.DBNR; // Zugriff auf Byte 4 und 5 
DBNR_I := WORD_TO_INT(DBNR_W); // Zugriff auf Byte 4 und 5 
END_FUNCTION_BLOCK

Über einen Hilfsbaustein kann man dann die entsprechenden Werte weitergeben. Funktioniert aber sicher nur bei lesendem Zugriff. Außerdem ist unschön, dass der Zugriff auf die Instanz-DB Variablen nur über absolute Adressierung erfolgt. Habe leider noch nicht rausgefunden, wie dies symbolisch erfolgen kann.

Code:
FUNCTION_BLOCK IDBFuerModbusRTU

VAR_INPUT
  DBNR : WORD;
END_VAR

VAR_OUTPUT
  OUT : STRUCT
    S_PORT : WORD;
    S_RESP_TO : WORD;
    S_ICHAR_GAP : WORD;
    S_RETRIES : WORD;
    S_MB_CRC : BYTE;
  END_STRUCT;
END_VAR


OUT.S_PORT := WORD_TO_BLOCK_DB(DBNR).DW2530;
OUT.S_RESP_TO := WORD_TO_BLOCK_DB(DBNR).DW2532;
OUT.S_ICHAR_GAP := WORD_TO_BLOCK_DB(DBNR).DW2534;
OUT.S_RETRIES := WORD_TO_BLOCK_DB(DBNR).DW2536;
OUT.S_MB_CRC := WORD_TO_BLOCK_DB(DBNR).DB48;
END_FUNCTION_BLOCK

Mal schauen, ob das so funktioniert ....
 
Zurück
Oben