Parameter- und Konfigurationsdaten an die SPS weiterleiten

Um die Parameter- und Konfigurationsdaten an die SPS übertragen zu können, müssen diese im Slave an den ADS-Server gesendet werden. Die entsprechende Option wird über TwinCAT aktiviert.

Gehen Sie wie folgt vor:

1. Wählen Sie links im Strukturbaum den PROFIBUS-Slave aus,
2. Aktivieren Sie die Option SetPrm/ChkCfg handled by ADS Server..
Parameter- und Konfigurationsdaten an die SPS weiterleiten 1:
3. Verwenden Sie den Port 851 für die erste SPS-Task.
Die Daten werden nun über ADS-Indication an die SPS gesendet. In der SPS müssen die Daten angenommen und quittiert werden.

Daten in der SPS annehmen und quittieren

Zunächst sollten Sie überprüfen, woher die Daten stammen. Der CX7031 unterstützt bis zu 4 Slaves, die in der Portnummer des Slaves codiert sind, nämlich in der PROFIBUS-Adresse + 0x1000hex.

Das Telegramm ist im IdxOffset codiert:

Beim Starten des Masters erhalten Sie immer zwei Indikationen, die Sie beide mit Result=0 quittieren müssen, ansonsten wird ein Fehler an den entsprechenden PROFIBUS-Master gesendet und die Verbindung nicht aufgebaut.

Code-Beispiel:

VAR
   i               : INT;
   sNetId          : STRING;
   nPort           : UINT;
   udInvokeId      : UDINT;
   iCase           : INT;
   udGroup         : UDINT;
   udOffset        : UDINT;
   udLenght        : UDINT
   ptrByte         : POINTER TO BYTE; (* Datenpointer *)

   strPrmData2     : ARRAY[0..127] OF BYTE;
   strCfgData2     : ARRAY[0..127] OF BYTE;
   strPrmData3     : ARRAY[0..127] OF BYTE;
   strCfgData3     : ARRAY[0..127] OF BYTE;
   fbAdsWriteInd   : ADSWRITEIND;
   fbAdsWriteRes   : ADSWRITERES;
   bExecute        : BOOL;
   stAdsInfo AT %I*: ST_AmsAddr;
   nState    AT %I*: WORD;
   UnKonwnoffset   : UDINT;
END_VAR

fbAdsWriteInd(
   CLEAR := ,
   VALID => ,
   NETID => ,
   PORT => ,
   INVOKEID => ,
   IDXGRP => ,
   IDXOFFS => ,
   LENGTH => ,
   DATAADDR => );

IF fbAdsWriteInd.VALID THEN
   (* You have to check the NETID and port number if you use ADS notification also for other things *)
   i := i + 1;
   sNetId := fbAdsWriteInd.NETID;            // AMD Net ID from device (CX7031)
   nPort := fbAdsWriteInd.PORT;              // PB Adresse + 1000 dec
   udInvokeId := fbAdsWriteInd.INVOKEID;     // for the Response
   udGroup := UDINT_TO_DWORD(fbAdsWriteInd.IDXGRP);
   udOffset := fbAdsWriteInd.IDXOFFS;        // Prm or Cfg Data
   udLength := fbAdsWriteInd.LENGTH;         // Len of the data
   ptrByte := fbAdsWriteInd.DATAADDR;        // Pointer from the data

   fbAdsWriteRes.RESULT := 0;                // Result without Error, if you want to send an Error use "1" 

   IF nPort = 1002 THEN // Slave with Adress 2
      CASE udOffset OF
         16#03230020:       // Prm Data 
            MEMCPY(ADR(strPrmData2), ptrByte, udLength);
         16#03230021:       // Cfg Data
            MEMCPY(ADR(strCfgData2), ptrByte, udLength);
         ELSE
            fbAdsWriteRes.RESULT := 1;
            UnKnownOffset := udOffset;
      END_CASE
   END_IF

   IF nPort = 1003 THEN   // Slave with Adress 3
      CASE udOffset OF
         16#03230020:       // Prm Data 
            MEMCPY(ADR(strPrmData3), ptrByte, udLength);
         16#03230021:       // Cfg Data
            MEMCPY(ADR(strCfgData3), ptrByte, udLength);
         ELSE
            fbAdsWriteRes.RESULT := 1;
            UnKnownOffset := udOffset;
      END_CASE
   END_IF

   IF iCase = 0 THEN
      iCase := 10;      // Send response
   END_IF
END_IF

CASE iCase OF
   0: (* WAIT *);
   10: (* send ADS-Response *)    
      fbAdsWriteRes(
         NETID := sNetId,
         PORT := nPort,
         INVOKEID := udInvokeId,
         RESULT := ,
         RESPOND := TRUE);

      fbAdsWriteInd(CLEAR := TRUE); (* confirm ADS-Indication *)
      iCase := 20;
   
   20: 
      fbAdsWriteRes(RESPOND := FALSE);
      fbAdsWriteInd(CLEAR := FALSE);
      iCase := 0;
END_CASE