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..
- 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:
- Parameterdaten: 16#03230020
- Konfigurationsdaten: 16#03230021
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