PN_AINFO (STRUCT) ¶ TYPE PN_AINFO : STRUCT Alarm information of a profinet device (see: RALARM ). (see IEC 61158-6) InOut: Name Type Comment BlockType UINT BlockType BlockLength UINT Length (in bytes) of field AlarmData Version UINT version high + low AlarmType UINT Alarm type API UDINT Application Process Identifier Slot UINT Slot number Subslot UINT Subslot number ModuleIdentNumber UDINT Module Identification number SubmoduleIdentNumber UDINT Submodule Identification number AlarmSpecifier UINT Alarm Specifier Bit 0 to 10: SequenceNumber Bit 11: ChannelDiagnosis Bit 12: ManufacturerSpecificDiagnosis Bit 13: SubmoduleDiagnosisState Bit 14: not used Bit 15: ARDiagnosisState USI UINT UserStructure Identifier AlarmData ARRAY [0..(Constants.MAX_PN_ALARM_DATA - 1)] OF BYTE Alarm information (0..n) bytes)
RALARM (FB) ¶ FUNCTION_BLOCK RALARM The RALARM function block is used to receive alarm information of alarms from a PROFIBUS DP or a PROFINET IO subsystem. Code-Example: receive Alarm PROGRAM PLC_PRG VAR ralarm : CommFB.RALARM ; alarm : CommFB.AINFO_TYPE ; convertID : CommFB.ID_TO_ADDR ; addr : CommFB.ADDR_TYPE ; message : STRING ; END_VAR ralarm.EN := TRUE ; ralarm.MODE := CommFB.RALARM_MODE.ALL_ALARMS ; // receive all alarms from all devices connected to the controller ralarm.F_ID := PN_Controller.MasterID ; // Filter ID, if MODE = ALL_ALARMS use MasterID here, else the ID of a slot/subslot ralarm ( ainfo := alarm ); WHILE ( ralarm.NEW ) DO convertID ( EN := TRUE , ID := ralarm.ID , ADDR := addr ); IF ( convertID.ENO ) THEN IF ( addr.SYSTEM = CommFB.IO_SYSTEM_TYPE.PROFINET_IO ) THEN message := 'Station ' ; message := concat ( message , addr.PN.D.STATIONNAME ); message := concat ( message , ' (Slot = ' ); message := concat ( message , TO_STRING ( addr.PN.SLOT )); message := concat ( message , ') sends an alarm !' ); //Log Alarm to PLC-Logger CmpLog.LogAdd2 ( CmpLog.LogConstants.LOG_STD_LOGGER , 555 , CmpLog.LogClass.LOG_WARNING , 0 , 0 , message ); END_IF END_IF ralarm ( ainfo := alarm ); // exec-again END_WHILE InOut: Scope Name Type Comment Input EN BOOL Enable MODE INT Function specifier, see RALARM_MODE enum F_ID DWORD Slot / subslot identification to filter the alarms to receive. | If MODE = RALARM_MODE.ALL_ALARMS user MasterID Output ENO BOOL Function enabled, no error NEW BOOL New alarm received STATUS DWORD Host Controller interface status ID DWORD Identifier of the slot / subslot the alarm is received from (see: AddressConcept ) LEN INT Length of the received data record Inout AINFO AINFO_TYPE Alarm data that has been received
RALARM_MODE (ENUM) ¶ TYPE RALARM_MODE : Filter scope of RALARM .F_ID input. Attributes: qualified_only InOut: Name Initial Comment ALL_ALARMS 1 If the Host Controller interface has received an alarm, all function block outputs are updated. The alarm is acknowledged. ALARM_BY_ID 2 Receive an alarm for the slot or subslot the identification of which is given in F_ID input, all function block outputs are updated. The alarm is acknowledged ALARM_BY_SLOT 3 Receive an alarm for the slot the identification of which is given in F_ID input AND for all of it’s subslots ALARM_BY_DEVICE 4 Receive an alarm for the device the identification of which is given in F_ID input AND for all of it’s slots and subslots
RDIAG (FB) ¶ FUNCTION_BLOCK RDIAG Read Diagnosis data from DP Slave. This service is for Profibus only, Profinet uses a different, more advanced Diagnosis. Code-Example: Profibus DP Diagnosis PROGRAM PLC_PRG VAR readDiag : CommfB.RDIAG ; diag : CommFB.DP_DIAG ; sMessage : STRING ; END_VAR readDiag.REQ := TRUE ; readDiag.ID := CommFB.ID ( EN := TRUE , Master := CIFX_PB.MasterID , SEGMENT := 0 , STATION := 3 , SLOT := 0 ); readDiag.MLEN := TO_INT ( SIZEOF ( diag )); readDiag ( DINFO := diag ); IF ( readDiag.VALID ) THEN IF ( diag.status1.Diag.Station_Non_Existent ) THEN sMessage := 'Station with Address = 3 is not available !' ; END_IF END_IF InOut: Scope Name Type Comment Input REQ BOOL Request ID DWORD Identifier of a of DP-slave (see: AddressConcept ) MLEN INT maximum length to be read Output VALID BOOL New diagnosis data received and is valid BUSY BOOL FB is busy ERROR BOOL Error detected STATUS DWORD Last detected status LEN INT Length of diagnosis data Inout DINFO DP_DIAG Read diagnosis data (see: DP_DIAG
RDREC (FB) ¶ FUNCTION_BLOCK RDREC Read Process Data Record (RDREC) This function block executes an acyclic read of user or system record-data. The function is invoked when REQ input is equal to TRUE. The ID parameter identifies the slot or subslot of the Field Device the data record is read from. The INDEX input of the READ function block contains an integer which identifies the data record to be read, e.g. Profinet Diagnosis- or I&M-Data. The MLEN parameter specifies the count of bytes which shall be read as an maximum. The variable given as RECORD parameter shall be at least of MLEN byte. If the data record is read successfully, the VALID output indicates that the read data record is stored in the RECORD parameter. The LEN output contains the actual length of the data that has been read in byte. If an error occurred, the ERROR output indicates an error and the STATUS output contains the error code. Code-Example: use RDREC to read the diagnosis of a PN-Slave PROGRAM PLC_PRG VAR rdrec : CommFB.RDREC ; buffer : ARRAY [0..255] OF BYTE ; readError : DWORD ; diagReader : ProfinetCommon.DiagnosisDataReader ; channelDiag : ProfinetCommon.ChannelDiagnosisData ; END_VAR // Read Diagosis-Data: rdrec.ID := pnDevice.ID ; // "pnDevice" is a Profinet slave in the device tree rdrec.INDEX := TO_INT ( ProfinetCommon.DiagnosisRecordIndex.Device ); // = 16#F80C --> get all diagnosis for this device rdrec.MLEN := TO_INT ( SIZEOF ( buffer )); rdrec.RECORD := ADR ( buffer ); rdrec (); IF ( rdrec.VALID AND rdrec.REQ ) THEN //here we have valid data diagReader.InitData ( rdrec.RECORD , TO_UINT ( rdrec.LEN )); WHILE ( diagReader.Read ()) DO ; // do something useful with diag-data END_WHILE ELSIF ( rdrec.ERROR ) THEN readError := rdrec.STATUS ; // read service failed END_IF rdrec.REQ := rdrec.BUSY ; // only read once InOut: Scope Name Type Comment Input REQ BOOL Request ID DWORD Identifier of a slot / subslot of a Field Device (see: AddressConcept ) INDEX INT Index of the data record MLEN INT maximum length to be read RECORD POINTER TO BYTE Read data record Output VALID BOOL New data record received and is valid BUSY BOOL FB is busy ERROR BOOL Error detected STATUS DWORD Last detected status LEN INT Length of the read data record
SETIO_PART (FB) ¶ FUNCTION_BLOCK SETIO_PART The SETIO_PART function block sets the output data for a subset of the output data associated to a slot or subslot of a Field Device. The output data are addressed within the slot or subslot through the OFFSET and LEN parameters. The SETIO_PART function block sets the output data to the Host Controller interface into the cyclically written output data of the Field Device. The function block is invoked by a 1 of the EN input. If the Output data are stored successfully and the Field Device is still cyclically communicating, the ENO output is set to 1. If the Output data are stored successfully and the Field Device is still cyclically communicating, the ENO output is set to 1 Never use GETIO-/SETIO_PART FBs concurrently with %I/%Q-Input/Output-Mapping for the same slot/subslot ! InOut: Scope Name Type Comment Input EN BOOL Enable ID DWORD Identifier of a slot / subslot of a Field Device OFFSET INT Offset of the subset of output data LEN INT Length of the output data to write OUTPUTS POINTER TO BYTE IO data object to write Output ENO BOOL Flag indication sending data OK STATUS DWORD Last detected status ERROR BOOL Flag indication an error
SLOT_ID (FUN) ¶ FUNCTION SLOT_ID : DWORD Provides the ID of a Profibus slot to a given Profibus DP-slave handle InOut: Scope Name Type Initial Comment Return SLOT_ID DWORD Input EN BOOL TRUE ID DWORD Handle to a DP-slave or a slot SLOT BYTE Slot number Output ENO BOOL
DP_AINFO (STRUCT) ¶ TYPE DP_AINFO : STRUCT Alarm information of a profibus device (see: RALARM ). (see IEC 61158-6) InOut: Name Type Comment D_LEN BYTE Length of the alarm information: 4 .. 63 bytes ATYPE BYTE Alarm Type SLOT BYTE Slot number ASPEC BYTE Alarm Specifier Bit 0 to 1: 0: no further differentiation 1: Alarm appears and the related module is disturbed 2: Alarm disappears and the related module has no further errors 3: Alarm disappears and the related module is still disturbed Bit 2: Additional acknowledge Bit 3 to 7: Sequence number of alarm ADD_INFO ARRAY [0..58] OF BYTE Additional alarm information
DP_DIAG (STRUCT) ¶ TYPE DP_DIAG : STRUCT Data structure containing DP Slave diagnosis data (see: RDIAG ). (see IEC 61158-6) InOut: Name Type Comment status1 IIoDrvProfibus.DP_StationStatus1 DP station status 1 status2 IIoDrvProfibus.DP_StationStatus2 DP station status 2 status3 IIoDrvProfibus.DP_StationStatus3 DP station status 3 Diag_Master_Add USINT address of the DP-master (Class 1) which has parameterised this DP-slave (255 means invalid or no parameterisation). Ident_Number UINT Ident Number of DP slave ExtDiag ARRAY [0..235] OF BYTE Extended Diagnosis Data
ErrorCode (ENUM) ¶ TYPE ErrorCode : The STATUS output has the data type DWORD which is interpreted as a packed array of four bytes. Byte 0: Function_Num Byte 1: Error_Decode Byte 2: Error_Code_1 Byte 3: Error_Code_2 The Elements are used as specified in IEC 61158-6 (Profibus DP, Profinet IO) Exception: If Function_Num has a value of 16#40, no protocol element is used. This is the case for example if the validation of one input parameter failed. In this case Error_Decode value of 16#82..16#8F reports an error at parameter number 2 - 15. Other fixed error codes are defined in this enum. Attributes: qualified_only InOut: Name Initial Comment NONE 0 No error INVALID_ID 16#40820000 Invalid ID UNKNOWN 16#40000100 Unknown error NOT_IMPLEMENTED 16#40000101 Function not implemented RDIAG_PROFINET 16#40000102 tried to use RDIAG on Profinet device STACK_NOT_RUNNING 16#40000103 Stack not running. NO_RESSOURCE 16#40000104 Out of ressources or ressource busy. BUFFER_SIZE 16#40000105 specified local data-buffer size too small INVALID_STATE 16#40000110 requested operation not possible in this state ADDRESS_NOT_UNIQUE 16#40000111 target-address is not unique ADDRESS_INVALID 16#40000112 address is invalid or unreachable (e.g. different IP subnet) DEVICE_NOT_FOUND 16#40000113 unable to detect/address target-device DEVICETYPE_MISMATCH 16#40000114 target device has wrong type for requested operation TIMEOUT 16#40000115 Operation timed out