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
Bei der Nutzung der virtuellen Schnittstelle ist die Port-Nummer aus dem System Manager zu entnehmen

Port

Read/Write

2

0 - Read
1 - Write

Read - ReadIndication
Write - WriteIndication

Number of AR

2

0x0000

-

API
Application Process Identifier

4

0x00000000

-

Slot

2

Slot Nummer
0x0000-0x7FFF

IndexOffset High Word

SubSlot

2

SubSlot Nummer
0x0000-0x8FFF

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