Record Daten
PROFINET Record Daten
PROFINET Record Daten können auch über die SPS direkt empfangen werden. Dafür wird in der SPS ein "Indication" gesetzt (READINDICATION für das Lesen und WRITEINDICATION für das Schreiben). Die RECORD Daten-Struktur ist wie folgt beschrieben:
WORD RW;
#define PN_READ 0
#define PN_WRITE 1
WORD NrOfAR;
DWORD API;
WORD Slot;
WORD SubSlot;
PNIO_RECORD RecordData;
Record Data
WORD Index;
WORD Length; //zum Lesen auf 0
WORD TransferSequence;
WORD LengthOfAligned;
Tabelle PROFINET RECORD DATEN abgebildet auf ADS
PROFINET | Länge in Byte | Kommentar | ADS |
---|---|---|---|
- | String | AMS NET ID des PROFINET Device | AMSNETID |
- | 2 | 0xFFFF | Port |
Read/Write | 2 | 0 - Read | Read - ReadIndication |
Number of AR | 2 | 0x0000 | - |
API | 4 | 0x00000000 | - |
Slot | 2 | Slot Nummer | IndexOffset High Word |
SubSlot | 2 | SubSlot Nummer | IndexOffset Low Word |
Record Data Index | 2 | 0x0000-0x1FFF | IndexGroup Low Word |
- | 2 | 0x8000 | IndexGroup High Word |
Record Data Length | 2 | zum Lesen auf "0" | LENGTH |
Record Data Transfer Sequence | 2 | fortlaufende Nummer | - |
Record Data Length of Aligned | 2 | kann Null sein | - |
Beispiel für das Lesen von Daten, der PROFINET Controller will Daten über die Record Daten von einem Beckhoff Device lesen. Bei diesem Beispiel werden alle RecIndex Werte angenommen und immer das gleiche zurückgegeben - 10 Byte die im Datenarray "Data" stehen.
CASE i OF
0: ADSREADIND(
CLEAR:=FALSE ,
VALID=> ,
NETID=> ,
PORT=> ,
INVOKEID=> ,
IDXGRP=> ,
IDXOFFS=> ,
LENGTH=> );
IF ADSREADIND.VALID THEN
IdxGroup:=ADSREADIND.IDXGRP;
IdxOffset:=ADSREADIND.IDXOFFS ;
i:=10;
END_IF
10: ADSREADRES(
NETID:=ADSREADIND.NETID,
PORT:=ADSREADIND.PORT,
INVOKEID:=ADSREADIND.INVOKEID ,
RESULT:=0 ,
LEN:=10 ,
DATAADDR:=ADR(Data),
RESPOND:=TRUE );
i:=20;
ADSREADIND(CLEAR:=TRUE);
20: i:=0;
ADSREADRES(RESPOND:=FALSE);
END_CASE