plc4good.org.ua

Source: MB_PAC94 CPU connect to SENTRON PACs via profinet



sentron pac



Áëîê ïðåäíàçíà÷åí äëÿ ñâÿçè ñ Sentron PAC óñòðîéñòâàìè äëÿ èçìåðåíèÿ ïàðàìåòðîâ ýëåêòðîïèòàíèÿ, ÷åðåç âíóòðåííèé profinet ïîðò êîíòðîëëåðà







sentron pac

MB_PAC94 ïîçâîëÿåò ñîåäèíÿòüñÿ PLC, ñ âñòðîåííûì profinet èíòåðôåéñîì è ìíîæåñòâåííûìè PAC óñòðîéñòâàìè ñ



Ôóíêöèÿ âçÿòà èç simatic_modbustcp_sentron_pac_demo(ññûëêà íà áèáëèîòåêó âíèçó ìàòåðèàëà)





Áëîê êðîìå ãèãàíòñêèõ ðàçìåðîâ, èíòåðåñåí åùå è íàëè÷èåì ìàñòåð êëþ÷à, êîòîðûé çàáàâíî ñìîòðèòñÿ íà ôîíå ðåàëèçàöèè çàùèòû ïðèâÿçêîé ê èíäèâèäóàëüíîìó íîìåðó CPU )





Name: FB111
Symbolic Name: MB_PAC94
Symbol Comment:
Family: COMM
Version: 1.0
Author: SIEMENS
Last modified: 07/13/2012
Use: FB103,SFB4,SFC1,SFC20,SFC24,SFC51,SFC52
Size: 36528bytes
Signature: compiled by SCL compiler version: SCLCOMP K05.03.06.00_01.03.00.01 release





{
Scl_ResetOptions ;
Scl_OverwriteBlocks:=           'y' ;
Scl_GenerateReferenceData :=    'y' ;
Scl_S7ServerActive:=            'n' ;
Scl_CreateObjectCode:=          'y' ;
Scl_OptimizeObjectCode:=        'y' ;
Scl_MonitorArrayLimits:=        'n' ;
Scl_CreateDebugInfo :=          'n' ;
Scl_SetOKFlag:=                 'n' ;
Scl_SetMaximumStringLength:=    '254'
}
FUNCTION_BLOCK FB1111
TITLE ='MB_PAC94'
AUTHOR : SIEMENS
FAMILY : COMM
NAME : MB_PAC94
VERSION : '1.0'
// reversed by komatic
 
VAR_INPUT
  INIT : BOOL ;    //TRUE: read in and initialize CONFIG_DB
  CONFIG_DB : BLOCK_DB ;    //DB number of the PAC config block
  MONITOR : TIME  := T#500MS;    //Time to wait for connection and data handling
  REG_KEY : STRING  [17 ] := '                 ';    //Registration key for licensing
  REG_KEY_b AT REG_KEY :
  STRUCT
            length: BYTE;
            act_length: BYTE;
            str: ARRAY [0..15] OF BYTE;
  END_STRUCT;
 
  CYCLICAL : TIME  := T#5S;    //0s: no processing; >0s: cyclical processing
  CONN_CNT : INT ;    //Count of connections, which are established parallel in 1 CPU cycle
  CONN_WAIT : TIME ;    //Time to wait to initiate the grouped connections
END_VAR
VAR_OUTPUT
  DONE : BOOL ;    //Job finished without error
  ERROR : BOOL ;    //Job finished with error
  STATUS : WORD ;    //Error number
  IDENT_CODE : STRING  [18 ];    //Identification for licensing   
END_VAR
VAR
  TEST_DB : STRUCT    
   RET_WERT : INT ;   
   LENGTH : WORD ;   
   WRITE_PROTECT : BOOL ;   
  END_STRUCT ;   
  sSTATUS_FUNC : STRING  [8 ];   
  Max_Number_of_IDs : INT  := 94;   
  Used_Number_of_IDs : INT ;   
  Not_Used_Number_of_IDs : INT ;   
  Max_Number_of_PACs : INT  := 512;   
  Used_Number_of_PACs : INT ;   
  Not_Used_Number_of_PACs : INT ;   
  Number_of_finished_IDs : INT ;   
  Start_Address_IDs : INT ;   
  TON : SFB4;   
  TON_CYCLICAL : SFB4;   
  Cycle_start : BOOL ;   
  Cycle_running : BOOL ;   
  CPU_Data_Read : BOOL  := TRUE;   
  sINIT : BOOL ;   
  sANLAUF_FEHLER : BOOL ;   
  Last_Data_Area : BOOL ;   
  Current_PAC_Error : BOOL ;   
  More_IDs_found : BOOL ;   
  More_PACs_found : BOOL ;   
  Read_FW : BOOL ;   
  Check_interrupt : BOOL ;   
  Connection_type : BYTE  := B#16#11;   
  Local_device_id : BYTE ;   
  Local_tsap_id_len : BYTE ;   
  sTI : INT ;   
  sCONFIG_DB : WORD ;   
  sCONFIG_DB_Length : WORD ;   
  sSTATUS_TEMP : WORD ;   
  sSTATUS_TIMER : WORD ;   
  sSTATUS_CODE : STRING  [17 ]; 
  sSTATUS_CODE_b AT sSTATUS_CODE :
    STRUCT
            length: BYTE;
            act_length: BYTE;
            str: ARRAY [0..15] OF BYTE;
    END_STRUCT;
 
  sMONITOR : TIME ;   
  id_nr : INT ;   
  i : INT ;   
  j : INT ;   
  k : INT ;   
  L : INT ;   
  pos : INT ;   
  reg : INT ;   
  TCP_COMM_Durchlaeufe : INT ;   
  sIDB_Nr : WORD ;   
  sExc_BytCnt_StaAdr : DINT ;   
  snd_time : BYTE ;   
  rcv_time : BYTE ;   
  sAREA_1 : ARRAY  [1 .. 2 ] OF CHAR  := 'M', 'O';   
  sAREA_2 : ARRAY  [1 .. 4 ] OF CHAR  := 'D', 'B', 'U', 'S';   
  sACODE : ARRAY  [0 .. 17 ] OF BYTE ;   
  sSTATUS : WORD ;   
  First_STATUS : WORD ;   
  RET_VALUE : INT ;   
  sTCP_COMM : STRUCT    
   CONN_ESTABLISHED : BOOL ;   
   BUSY : BOOL ;   
   DONE : BOOL ;   
   ERROR : BOOL ;   
   STATUS : WORD ;   
   STATUS_FUNC : STRING  [8 ];   
  END_STRUCT ;   
  sTimestamp : DATE_AND_TIME ;
  sTimestamp_st AT sTimestamp : STRUCT
   a : DWORD;
   b : DWORD;
  END_STRUCT
  CPU_DATA : STRUCT    
   Index : WORD ;   
   CPUIdent : ARRAY  [1 .. 20 ] OF BYTE ;   
   Reserved : WORD ;   
   MajorVersion : WORD ;   
   MinorVersion_1 : BYTE ;   
   MinorVersion_2 : BYTE ;   
  END_STRUCT ;   
  Data_Blocks : STRUCT    
   Enable : ARRAY  [1 .. 8 ] OF BOOL  := TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE;   
   Start_Address : ARRAY  [1 .. 8 ] OF WORD  := W#16#D5, W#16#EA62, W#16#EA63, W#16#EA64, W#16#1, W#16#CD, W#16#205, W#16#AF1;   
   Length : ARRAY  [1 .. 8 ] OF WORD  := W#16#2, W#16#1, W#16#1, W#16#1, W#16#4A, W#16#A, W#16#2, W#16#14;   
   Address_in_DB : ARRAY  [1 .. 8 ] OF WORD  := W#16#B6, W#16#1, W#16#2, W#16#3, W#16#12, W#16#A6, W#16#BA, W#16#BE;   
  END_STRUCT ;  
 
Data_Blocks_w AT Data_Blocks : STRUCT
c : ARRAY[1..1] OF WORD;
b : ARRAY[1..8] OF WORD;
a : ARRAY[1..10] OF WORD
  END_STRUCT
  TCP_COMM : FB103;   
  Connection : ARRAY  [1 .. 94 ] OF STRUCT    
   STATE : STRUCT    
    AUFTRAG_LAEUFT : BOOL ;   
    SEND : BOOL ;   
    RECV1 : BOOL ;   
    RECV2 : BOOL ;   
    CON : BOOL ;   
    DISCON : BOOL ;   
   END_STRUCT ;   
   Used : BOOL ;   
   Running : BOOL ;   
   Conn_established : BOOL ;   
   Error : BOOL ;   
   Done : BOOL ;   
   Finished : BOOL ;   
   Number_of_PACs : INT ;   
   Number_of_first_PAC : INT ;   
   Address_in_ConfigDB : WORD ;   
   sConn : DINT ;   
   Conn : STRUCT    
    block_length : WORD  := W#16#40;   
    id : WORD ;   
    connection_type : BYTE  := B#16#11;   
    active_est : BOOL  := TRUE;   
    local_device_id : BYTE ;   
    local_tsap_id_len : BYTE ;   
    rem_subnet_id_len : BYTE ;   
    rem_staddr_len : BYTE  := B#16#4;   
    rem_tsap_id_len : BYTE  := B#16#2;   
    next_staddr_len : BYTE ;   
    local_tsap_id : ARRAY  [1 .. 16 ] OF BYTE  := B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0;   
    rem_subnet_id : ARRAY  [1 .. 6 ] OF BYTE  := B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0;   
    rem_staddr : ARRAY  [1 .. 6 ] OF BYTE  := B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0;   
    rem_tsap_id : ARRAY  [1 .. 16 ] OF BYTE  := B#16#1, B#16#F6, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0;   
    next_staddr : ARRAY  [1 .. 6 ] OF BYTE  := B#16#0, B#16#0, B#16#0, B#16#0, B#16#0, B#16#0;   
    spare : WORD ;   
   END_STRUCT ;   
   PAC : STRUCT    
    T_Blocks_running : BOOL ;   
    Current_PAC_running : BOOL ;   
    Data_Area_finished : INT ;   
    Current_Data_Area : INT ;   
    Curr_PAC_Number : INT ;   
    Current_DB : WORD ;   
    Current_DB_Length : WORD ;   
   END_STRUCT ;   
   Enable_Found : BOOL ;   
   Delete_Data_Curr_PAC : BOOL ;   
   ENQ : BOOL ;   
   sWRITE_READ : BOOL ;   
   DATA_TRANSFER : BOOL ;   
   SEND_RCV : BOOL ;   
   CONNECT_DISCONNECT : BOOL ;   
   sFUNC_CODE : BYTE ;   
   sLEN_RECV2 : INT ;   
   TCP_COMM_Length : INT ;   
   Current_TI : INT ;   
   MONITOR : TIME ;   
   T_CONN : ARRAY  [1 .. 5 ] OF WORD ;   
   T_DATA : ARRAY  [1 .. 5 ] OF WORD ;   
   TCP_COMM_Instance : STRUCT    
    ID : WORD ;   
    DATA_TRANSFER : BOOL ;   
    SEND_RCV : BOOL ;   
    CONNECT_DISCONNECT : BOOL ;   
    KEEP_ALIVE : BOOL ;   
    ANLAUF : BOOL ;   
    LENGTH : INT ;   
    MONITOR : TIME ;   
    LOGGING_LEVEL : INT  := 1;   
    MESSAGE_COUNT : INT  := 15;   
    WAIT_TIME : TIME  := T#8MS;   
    CONN_DB : WORD ;   
    CONN_ESTABLISHED : BOOL ;   
    BUSY : BOOL ;   
    DONE : BOOL ;   
    ERROR : BOOL ;   
    STATUS : WORD ;   
    STATUS_FUNC : STRING  [8 ];   
    ENQ : BOOL ;   
    UDT_CONN : ARRAY  [1 .. 10 ] OF BYTE ;   
    DATA : ARRAY  [1 .. 10 ] OF BYTE ;   
    FTCON_REQ : BOOL ;   
    FTCON_ID : WORD ;   
    FTCON_DONE : BOOL ;   
    FTCON_BUSY : BOOL ;   
    FTCON_ERROR : BOOL ;   
    FTCON_STATUS : WORD ;   
    FTCON_CONNECT : ARRAY  [1 .. 10 ] OF BYTE ;   
    FTCON_REQ_old : BOOL ;   
    FTCON_SFC_active : BOOL ;   
    DUMMY_2 : BYTE ;   
    FTSEND_REQ : BOOL ;   
    FTSEND_ID : WORD ;   
    FTSEND_LEN : INT ;   
    FTSEND_DONE : BOOL ;   
    FTSEND_BUSY : BOOL ;   
    FTSEND_ERROR : BOOL ;   
    FTSEND_STATUS : WORD ;   
    FTSEND_DATA : ARRAY  [1 .. 10 ] OF BYTE ;   
    FTSEND_REQ_old : BOOL ;   
    FTSEND_SFC_active : BOOL ;   
    DUMMY_3 : BYTE ;   
    FTRCV_EN_R : BOOL ;   
    FTRCV_ID : WORD ;   
    FTRCV_LEN : INT ;   
    FTRCV_NDR : BOOL ;   
    FTRCV_BUSY : BOOL ;   
    FTRCV_ERROR : BOOL ;   
    FTRCV_STATUS : WORD ;   
    FTRCV_RCVD_LEN : INT ;   
    FTRCV_DATA : ARRAY  [1 .. 10 ] OF BYTE ;   
    FTRCV_REQ_old : BOOL ;   
    FTRCV_SFC_active : BOOL ;   
    DUMMY_4 : BYTE ;   
    FTDISCON_REQ : BOOL ;   
    FTDISCON_ID : WORD ;   
    FTDISCON_DONE : BOOL ;   
    FTDISCON_BUSY : BOOL ;   
    FTDISCON_ERROR : BOOL ;   
    FTDISCON_STATUS : WORD ;   
    FTDISCON_REQ_old : BOOL ;   
    FTDISCON_SFC_active : BOOL ;   
    DUMMY_5 : BYTE ;   
    TON_IN : BOOL ;   
    TON_PT : TIME ;   
    TON_Q : BOOL ;   
    TON_ET : TIME ;   
    TON_STATE : BYTE ;   
    TON_STIME : TIME ;   
    TON_ATIME : TIME ;   
    TDISCON_MONITORING : TIME ;   
    MONITOR_TIME : TIME ;   
    Number_of_Function : INT ;   
    Save_STATUS : INT ;   
    Save_ERROR : BOOL ;   
    Save_DONE : BOOL ;   
    MONITOR_active : BOOL ;   
    TCON_Req : BOOL ;   
    TSEND_Req : BOOL ;   
    TRCV_Req : BOOL ;   
    TDISCON_Req : BOOL ;   
    TCON_Busy : BOOL ;   
    TSEND_Busy : BOOL ;   
    TRCV_Busy : BOOL ;   
    TDISCON_Busy : BOOL ;   
    ENQ_Save : BOOL ;   
    OrderErrorDiscon : BOOL ;   
    Logging_Level_Old : INT ;   
   END_STRUCT ;   
  END_STRUCT ;   
  RDSYSST : STRUCT    
   RET_WERT : INT ;   
   REQ : BOOL ;   
   BUSY : BOOL ;   
   SZL_HEADER : STRUCT    
    LENTHDR : WORD ;   
    N_DR : WORD ;   
   END_STRUCT ;   
   SZL_11C_5 : STRUCT    
    index : WORD ;   
    serialn : ARRAY  [0 .. 23 ] OF CHAR ;   
    res : ARRAY  [1 .. 4 ] OF WORD ;   
   END_STRUCT ;   
  END_STRUCT ;   
 
  sHoldingRegisterState : ARRAY  [0 .. 24 ] OF BYTE ;   
  device_tsap : ARRAY  [1 .. 6 ] OF BYTE ;   
  device_tsap_st AT device_tsap : STRUCT
  t : INT;
  s : WORD
  w : WORD;
  END_STRUCT;
  BasicTypes : STRING  [19 ]; 
  BasicTypes_b AT BasicTypes :
  STRUCT
            length: BYTE;
            act_length: BYTE;
            str: ARRAY [0..15] OF BYTE;
  END_STRUCT;
 
  SendBuffer : ARRAY  [1 .. 260 ] OF BYTE ;   
  SendBuffer_w AT SendBuffer : ARRAY [1..130] OF WORD;
  RecvBuffer : ARRAY  [1 .. 260 ] OF BYTE ;   
  RecvBuffer_w AT RecvBuffer : ARRAY [1..130] OF WORD;
  Device : INT ;   
  Next_ID_Address : INT ;   
  sSEND_BUFFER : DINT ;   
  sRECV_BUFFER : DINT ;   
  BytePointer : DWORD ;  
  BytePointer_w AT BytePointer : ARRAY[0..1] OF WORD
  sCONN_CNT : INT ;
  sCONN_WAIT : TIME ;   
  start_Cons : INT ;   
  TON_CONN_CNT : SFB4;   
  TON_CONN_CNT_running : BOOL ;   
  Conn_cnt_full : BOOL ;   
  Next_ID : BOOL ;   
  LOGGING_LEVEL : INT ;   
  MESSAGE_COUNT : INT  := 15;   
  WAIT_TIME : TIME  := T#8MS;   
  wCONN_DB : WORD ;   
  address : DINT ;   
END_VAR
VAR_TEMP
  TCON_Struct : STRUCT    
   ANY_id : WORD ;   
   Length : WORD ;   
   DB_Number : WORD ;   
   Byte_Pointer : DWORD ;   
  END_STRUCT
TCON_Struct_any AT TCON_Struct : ANY
  TDATA_Struct : STRUCT    
   ANY_id : WORD ;   
   Length : WORD ;   
   DB_Number : WORD ;   
   Byte_Pointer : DWORD ;   
  END_STRUCT ;  
TDATA_Struct_any AT TDATA_Struct : ANY
  SRCBLK_Struct : STRUCT    
   ANY_id : WORD ;   
   Length : WORD ;   
   DB_Number : WORD ;   
   Byte_Pointer : DWORD ;   
  END_STRUCT
  SRCBLK_Struct_any AT SRCBLK_Struct : ANY;
  DSTBLK_Struct : STRUCT    
   ANY_id : WORD ;   
   Length : WORD ;   
   DB_Number : WORD ;   
   Byte_Pointer : DWORD ;   
  END_STRUCT ;   
DSTBLK_Struct_any AT DSTBLK_Struct : ANY;
 
  tSProductID : STRING  [19 ];   
  tSProductID_b AT tSProductID : STRUCT
    length      : BYTE;
    act_length  : BYTE;
    str : ARRAY [0..17] OF BYTE;
    END_STRUCT;
  tALicenseKey : ARRAY  [0 .. 17 ] OF BYTE ;   
END_VAR
BEGIN
IF Check_interrupt THEN (*A7d0*)
    Cycle_running:=FALSE;
    Cycle_start:=FALSE;
    sANLAUF_FEHLER:=TRUE;
    ERROR:=TRUE;
    STATUS:=W#16#A080;
END_IF; (*A7d0*)
Check_interrupt:=TRUE;
DSTBLK_Struct.ANY_id:=W#16#1002;
SRCBLK_Struct.ANY_id:=W#16#1002;
DONE:=FALSE;
IF NOT(sANLAUF_FEHLER) THEN (*A7d1*)
    ERROR:=FALSE;
    STATUS:=W#16#0;
END_IF; (*A7d1*)
IF CPU_Data_Read THEN (*A7d2*)
    IF NOT(Read_FW) THEN (*A7d3*)
        RDSYSST.RET_WERT:=RDSYSST(REQ := TRUE
         ,SZL_ID := W#16#111
         ,INDEX :=  W#16#6
         ,BUSY := RDSYSST.BUSY
         ,SZL_HEADER := RDSYSST.SZL_HEADER
         ,DR :=  CPU_DATA
         );
    ELSE (*A7d3*)
         RDSYSST.RET_WERT:=RDSYSST(REQ := TRUE
         ,SZL_ID := W#16#111
         ,INDEX :=  W#16#7
         ,BUSY := RDSYSST.BUSY
         ,SZL_HEADER := RDSYSST.SZL_HEADER
         ,DR :=  CPU_DATA
         );
    END_IF;     //RDSYSST_at.a[17]
    IF NOT RDSYSST.BUSY THEN (*A7d2*)
        IF RDSYSST.RET_WERT=0 THEN (*A7d6*)
            IF NOT(Read_FW) THEN (*A7d7*)
                CASE WORD_TO_INT(BYTE_TO_WORD(CPU_DATA.CPUIdent[8]) AND W#16#F) OF
                    1 :
                        Local_device_id:=B#16#1;
                    4 :
                        IF CPU_DATA.CPUIdent[6]=B#16#33 THEN (*A7dd*)
                            Local_device_id:=B#16#2;
                        ELSE
                            Local_device_id:=B#16#5;
                        END_IF;
                    6 :
                        Local_device_id:=B#16#5;
                    5,7 :
                        Local_device_id:=B#16#2;
                        Read_FW:=true;
                    8 :
                        Local_device_id:=B#16#3;
                ELSE:
                    ERROR:=true;
                    STATUS:=W#16#A086;
                END_CASE;
                CPU_Data_Read:=(ERROR) OR Read_FW;
            ELSE
                IF WORD_TO_INT(CPU_DATA.MajorVersion AND W#16#FF)<=2 THEN
                    IF BYTE_TO_INT(CPU_DATA.MinorVersion_1) <5 THEN
                        Connection_type:=B#16#1;
                    END_IF; (*A7e6*)
                END_IF;   
                CPU_Data_Read:=FALSE;
                Read_FW:=FALSE;
            END_IF;   
        ELSE   
            ERROR:=TRUE;
            sANLAUF_FEHLER:=TRUE;
            STATUS:=INT_TO_WORD(RDSYSST.RET_WERT);
            sSTATUS_FUNC:='RDSYSST';
        END_IF;   
    END_IF;
END_IF; (*A7d2*)
 
IF (NOT(sINIT)) AND INIT THEN (*A7e9*)
    IF Cycle_running THEN (*A7ea*)
        ERROR:=TRUE;
        STATUS:=W#16#A096;
    ELSE (*A7ea*)
        SRCBLK_Struct_any:=sIDB_Nr;
        sIDB_Nr:=SRCBLK_Struct.DB_Number;
        Check_interrupt:=FALSE;
        sANLAUF_FEHLER:=FALSE;
        ERROR:=FALSE;
        Cycle_start:=FALSE;
        Cycle_running:=FALSE;
        Last_Data_Area:=FALSE;
        More_IDs_found:=FALSE;
        Read_FW:=FALSE;
        More_PACs_found:=FALSE;
        STATUS:=W#16#0;
        sSTATUS:=W#16#0;
        sSTATUS_TEMP:=W#16#0;
        sSTATUS_FUNC:='        ';
        sSTATUS_CODE:='';
        Used_Number_of_PACs:=0;
        Used_Number_of_IDs:=0;
        Not_Used_Number_of_IDs:=0;
        Not_Used_Number_of_PACs:=0;
        Number_of_finished_IDs:=0;
        Start_Address_IDs:=0;
        Device:=0;
        sTI:=0;
        sCONFIG_DB:=W#16#0;
        sCONFIG_DB_Length:=W#16#0;
        Next_ID_Address:=sTI;
        First_STATUS:=sCONFIG_DB_Length;
        sTCP_COMM.CONN_ESTABLISHED:=FALSE;
        sTCP_COMM.BUSY:=FALSE;
        sTCP_COMM.DONE:=FALSE;
        sTCP_COMM.ERROR:=FALSE;
        sTCP_COMM.STATUS:=W#16#0;
        sTCP_COMM.STATUS_FUNC:='';
        TON(IN := FALSE  );
        TON_CYCLICAL(IN := FALSE );
        TON_CONN_CNT(IN := FALSE );
        TON_CONN_CNT_running:=FALSE;
        Conn_cnt_full:=FALSE;
        start_Cons:=0;
        Next_ID:=FALSE;
        sCONN_CNT:=0;
        sCONN_WAIT:=T#0MS;
       
        FOR id_nr:=1 TO Max_Number_of_IDs  BY 1 DO
            Connection[id_nr].STATE.AUFTRAG_LAEUFT:=FALSE;
            Connection[id_nr].STATE.SEND:=FALSE;
            Connection[id_nr].STATE.RECV1:=FALSE;
            Connection[id_nr].STATE.RECV2:=FALSE;
            Connection[id_nr].STATE.CON:=FALSE;
            Connection[id_nr].STATE.DISCON:=FALSE;
            Connection[id_nr].Conn_established:=FALSE;
            Connection[id_nr].Used:=FALSE;
            Connection[id_nr].Error:=FALSE;
            Connection[id_nr].Done:=FALSE;
            Connection[id_nr].Finished:=FALSE;
            Connection[id_nr].Number_of_PACs:=0;
            Connection[id_nr].Number_of_first_PAC:=0;
            Connection[id_nr].Address_in_ConfigDB:=W#16#0;
            Connection[id_nr].PAC.T_Blocks_running:=FALSE;
            Connection[id_nr].PAC.Current_PAC_running:=FALSE;
            Connection[id_nr].PAC.Data_Area_finished:=0;
            Connection[id_nr].PAC.Current_Data_Area:=0;
            Connection[id_nr].PAC.Curr_PAC_Number:=0;
            Connection[id_nr].PAC.Current_DB:=W#16#0;
            Connection[id_nr].Enable_Found:=FALSE;
            Connection[id_nr].Delete_Data_Curr_PAC:=FALSE;
            Connection[id_nr].ENQ:=FALSE;
            Connection[id_nr].Current_TI:=0;
            Connection[id_nr].Conn.id:=W#16#0;
        END_FOR;
        SRCBLK_Struct_any:=sIDB_Nr;
        sIDB_Nr:=SRCBLK_Struct.DB_Number;
        SRCBLK_Struct_any:=SendBuffer[1];
        sSEND_BUFFER:=DWORD_TO_DINT(SHR(IN:=(DW#16#FFFFFF AND SRCBLK_Struct.Byte_Pointer),N:=3));
        SRCBLK_Struct_any:=RecvBuffer[1];
        sRECV_BUFFER:=DWORD_TO_DINT(SHR(IN:=(DW#16#FFFFFF AND SRCBLK_Struct.Byte_Pointer),N:=3));
        IF sIDB_Nr=Block_DB_TO_WORD(CONFIG_DB) THEN
            sSTATUS:=W#16#A07E;
        ELSE
            TEST_DB.RET_WERT:=TEST_DB(DB_NUMBER := Block_DB_TO_WORD(CONFIG_DB)
            ,DB_LENGTH := TEST_DB.LENGTH
            ,WRITE_PROT := TEST_DB.WRITE_PROTECT
            );
            IF TEST_DB.RET_WERT<>0 THEN (*A7f0*)
                sSTATUS:=INT_TO_WORD(TEST_DB.RET_WERT);
                sSTATUS_FUNC:='TEST_DB';
            ELSIF WORD_TO_DINT(TEST_DB.LENGTH)<(Max_Number_of_PACs/8)+14 THEN (*A7f2*)
                sSTATUS:=W#16#A001;
            ELSE (*A7f2*)
                sCONFIG_DB:=Block_DB_TO_WORD(CONFIG_DB);
                sCONFIG_DB_Length:=TEST_DB.LENGTH;
                FOR i:=0 TO (Max_Number_of_PACs/32)-1 BY 1 DO
                    CONFIG_DB.DD[4*i]:=DW#16#0;
                END_FOR;
                IF CONFIG_DB.DD[(Max_Number_of_PACs/8)+2]<>DW#16#6FFFFFFD THEN (*A7f5*)   
                    sSTATUS:=W#16#A07F;
                ELSE (*A7f5*)
                    Start_Address_IDs:=(Max_Number_of_PACs/8)+2;
                    FOR id_nr:=1 TO Max_Number_of_IDs BY 1 DO
                        FOR i:=Start_Address_IDs TO WORD_TO_INT(sCONFIG_DB_Length)-12 BY 1 DO
                            IF CONFIG_DB.DD[i]=DW#16#6FFFFFFD THEN
                                Connection[id_nr].Conn.id:=CONFIG_DB.DW[i-2];
                                Connection[id_nr].Address_in_ConfigDB:=INT_TO_WORD(i-2);
                                Start_Address_IDs:=i+1;
                                IF Connection[id_nr].Conn.id<>W#16#0 THEN
                                    IF WORD_TO_INT(Connection[id_nr].Conn.id)>4095 THEN
                                        sSTATUS:=W#16#A07A;
                                    ELSE
                                        IF (id_nr<>1) AND (Connection[id_nr].Conn.id<>W#16#0) THEN 
                                            FOR k:=1 TO id_nr-1 BY 1 DO
                                                IF Connection[id_nr].Conn.id=Connection[k].Conn.id THEN
                                                    sSTATUS:=W#16#A07B;
                                                    EXIT;
                                                END_IF;   
                                            END_FOR;
                                        END_IF;
                                        IF sSTATUS=W#16#0 THEN (*A803*)
                                            Connection[id_nr].Conn.local_device_id:=Local_device_id;
                                            Used_Number_of_IDs:=Used_Number_of_IDs+1;
                                            Connection[id_nr].Used:=TRUE;
                                            RET_VALUE:=BLKMOV(SRCBLK := Connection[id_nr].TCP_COMM_Instance
                                                   ,DSTBLK := TCP_COMM
                                                   );
                                            IF RET_VALUE<>0 THEN (*A804*)
                                                sSTATUS:=INT_TO_WORD(RET_VALUE);
                                                sSTATUS_FUNC:='BLKMOV';
                                            END_IF; (*A804*)
                                            TCP_COMM.ENQ:=FALSE;
                                            TCP_COMM( ENQ:=TCP_COMM.ENQ
                                            ,ANLAUF := TRUE
                                               );
                                            RET_VALUE:=BLKMOV(SRCBLK := TCP_COMM
                                                   ,DSTBLK := Connection[id_nr].TCP_COMM_Instance
                                                   );
                                            IF RET_VALUE<>0 THEN (*A804*)
                                                sSTATUS:=INT_TO_WORD(RET_VALUE);
                                                sSTATUS_FUNC:='BLKMOV';
                                            END_IF; (*A804*)
                                        END_IF;
                                    END_IF;
                                ELSE       
                                    Not_Used_Number_of_IDs:=Not_Used_Number_of_IDs+1;
                                END_IF;   
                                IF id_nr=Max_Number_of_IDs THEN (*A7fa*)
                                    FOR L:=WORD_TO_INT(Connection[id_nr].Address_in_ConfigDB)+4 TO WORD_TO_INT(sCONFIG_DB_Length)-12 BY 1 DO
                                        IF CONFIG_DB.DD[L]=DW#16#6FFFFFFD THEN (*A80a*)
                                            More_IDs_found:=TRUE;
                                            Next_ID_Address:=L-2;
                                            EXIT;
                                        END_IF;
                                    END_FOR;
                                END_IF;
                                EXIT;
                            END_IF;
                        END_FOR;
                        IF (i>=(WORD_TO_INT(sCONFIG_DB_Length)-12)) OR (sSTATUS<>W#16#0) THEN (*A80b*)
                            EXIT;
                        END_IF;   
                    END_FOR;
                    IF Used_Number_of_IDs=0 THEN
                        sSTATUS:=W#16#A07A;
                    END_IF;        
                    IF sSTATUS=W#16#0 THEN
                        FOR id_nr:=1  TO Used_Number_of_IDs+Not_Used_Number_of_IDs BY 1 DO
                            IF id_nr<>(Used_Number_of_IDs+Not_Used_Number_of_IDs) THEN (*A810*)
                                Connection[id_nr].Number_of_PACs:=(WORD_TO_INT(Connection[id_nr+1].Address_in_ConfigDB)-WORD_TO_INT(Connection[id_nr].Address_in_ConfigDB)-6)/8;
                                IF ((WORD_TO_INT(Connection[id_nr+1].Address_in_ConfigDB)-WORD_TO_INT(Connection[id_nr].Address_in_ConfigDB))-6) MOD 8<>0 THEN
                                    sSTATUS:=W#16#A07F;
                                END_IF;
                            ELSE       
                                IF NOT(More_IDs_found) THEN
                                    Next_ID_Address:=WORD_TO_INT(sCONFIG_DB_Length);
                                END_IF;
                                Connection[id_nr].Number_of_PACs:=(Next_ID_Address-WORD_TO_INT(Connection[id_nr].Address_in_ConfigDB)-6)/8;
                                IF ((Next_ID_Address-WORD_TO_INT(Connection[id_nr].Address_in_ConfigDB))-6) MOD 8<>0 THEN
                                    sSTATUS:=W#16#A07F;
                                END_IF;
                            END_IF;
                            IF id_nr=1 THEN (*A815*)
                                Connection[id_nr].Number_of_first_PAC:=1;
                            ELSE
                                Connection[id_nr].Number_of_first_PAC:=Connection[id_nr-1].Number_of_first_PAC+Connection[id_nr-1].Number_of_PACs;   
                            END_IF;
                            IF (Connection[id_nr].Conn.id<>W#16#0) AND (Used_Number_of_PACs<>Max_Number_of_PACs) THEN (*A817*)
                                IF (Used_Number_of_PACs+Connection[id_nr].Number_of_PACs)<=Max_Number_of_PACs THEN (*A818*)
                                Used_Number_of_PACs:=Used_Number_of_PACs+Connection[id_nr].Number_of_PACs;
                                ELSE
                                    Not_Used_Number_of_PACs:=(Not_Used_Number_of_PACs+Connection[id_nr].Number_of_PACs)-(Max_Number_of_PACs-Used_Number_of_PACs);
                                    Connection[id_nr].Number_of_PACs:=Max_Number_of_PACs-Used_Number_of_PACs;
                                    Used_Number_of_PACs:=Used_Number_of_PACs+Connection[id_nr].Number_of_PACs;
                                    More_PACs_found:=TRUE;
                                    STATUS:=W#16#A087;
                                END_IF; (*A819*)
                                IF (Used_Number_of_PACs=Max_Number_of_PACs) AND (Used_Number_of_IDs>id_nr) THEN (*A81a*)
                                    Not_Used_Number_of_IDs:=(Not_Used_Number_of_IDs+Used_Number_of_IDs)-id_nr;
                                    Used_Number_of_IDs:=id_nr;
                                END_IF;
                                FOR i:=1 TO Connection[id_nr].Number_of_PACs BY 1 DO
                                    Connection[id_nr].PAC.Current_DB:=DWORD_TO_WORD(CONFIG_DB.DD[(WORD_TO_DINT(Connection[id_nr].Address_in_ConfigDB)+6)+((2*i-1)*4)]);
                                    IF Connection[id_nr].PAC.Current_DB=W#16#0 THEN
                                        sSTATUS:=W#16#A019;
                                    ELSIF Connection[id_nr].PAC.Current_DB=sCONFIG_DB OR Connection[id_nr].PAC.Current_DB=sIDB_Nr THEN
                                        sSTATUS:=W#16#A07E;
                                    ELSE
                                        TEST_DB.RET_WERT:=TEST_DB(DB_NUMBER :=Connection[id_nr].PAC.Current_DB
                                                  ,DB_LENGTH :=TEST_DB.LENGTH
                                                  ,WRITE_PROT :=TEST_DB.WRITE_PROTECT );
                                        IF TEST_DB.RET_WERT<>0 THEN (*A81e*)
                                            ERROR:=TRUE;
                                            sSTATUS:=INT_TO_WORD(TEST_DB.RET_WERT);
                                            sSTATUS_FUNC:='TEST_DB';
                                        END_IF;
                                    END_IF;       
                                    IF CONFIG_DB.DB[(WORD_TO_INT(Connection[id_nr].Address_in_ConfigDB)+6)+((2*i-2)*4)]=B#16#0 OR
                                       CONFIG_DB.DB[(WORD_TO_INT(Connection[id_nr].Address_in_ConfigDB)+6)+((2*i-2)*4)]=B#16#7F OR
                                       CONFIG_DB.DB[(WORD_TO_INT(Connection[id_nr].Address_in_ConfigDB)+6)+((2*i-2)*4)]=B#16#FF
                                    THEN
                                        sSTATUS:=W#16#A07C;
                                        EXIT;
                                    END_IF;
                                END_FOR;
                            ELSE
                                Not_Used_Number_of_PACs:=Not_Used_Number_of_PACs+Connection[id_nr].Number_of_PACs;
                                Connection[id_nr].Used:=false;
                            END_IF;   
                        END_FOR;
                    END_IF;
                END_IF;   
            END_IF;
        END_IF;   
        //-------------------
        IF Connection_type=B#16#1 THEN
            FOR i:=1 TO Max_Number_of_IDs BY 1 DO
                Connection[i].Conn.connection_type:=Connection_type;
                Connection[i].Conn.rem_tsap_id[1]:=B#16#F6;
                Connection[i].Conn.rem_tsap_id[2]:=B#16#1;
            END_FOR;
        END_IF;
        IF sSTATUS<>W#16#0 THEN
            ERROR:=true;
            STATUS:=sSTATUS;
        END_IF;
        sANLAUF_FEHLER:=ERROR;
        sSTATUS_TEMP:=sSTATUS;
        sSTATUS_TIMER:=sSTATUS_TIMER OR W#16#20;
    END_IF;
END_IF;
sINIT:=INIT;
IF NOT(sANLAUF_FEHLER) THEN (*A827*)
    TEST_DB.RET_WERT:=TEST_DB(DB_NUMBER :=Block_DB_TO_WORD(CONFIG_DB)
              ,DB_LENGTH :=TEST_DB.LENGTH
              ,WRITE_PROT :=TEST_DB.WRITE_PROTECT );
    IF TEST_DB.RET_WERT<>0 THEN (*A81e*)
        ERROR:=TRUE;
        STATUS:=INT_TO_WORD(TEST_DB.RET_WERT);
        sSTATUS_FUNC:='TEST_DB';
    ELSE
        IF (Block_DB_TO_WORD(CONFIG_DB)<>sCONFIG_DB) OR (TEST_DB.LENGTH<>sCONFIG_DB_Length) THEN (*A827*)
            ERROR:=TRUE;
            STATUS:=W#16#A080;
            sANLAUF_FEHLER:=true;
            Cycle_running:=false;
            Cycle_start:=false;
        END_IF;
    END_IF;
END_IF;
IF (NOT(ERROR)) AND (NOT(CPU_Data_Read)) THEN (*A82b*)
    TON_CYCLICAL(IN :=TRUE 
       ,PT := CYCLICAL
      );
    IF (CYCLICAL>T#0MS) AND TON_CYCLICAL.Q THEN (*A82c*)
        TON_CYCLICAL(IN :=FALSE 
           ,PT := CYCLICAL
          );
        TEST_DB.RET_WERT:=TEST_DB(DB_NUMBER :=Block_DB_TO_WORD(CONFIG_DB)
                  ,DB_LENGTH :=TEST_DB.LENGTH
                  ,WRITE_PROT :=TEST_DB.WRITE_PROTECT );
        IF TEST_DB.RET_WERT<>0 THEN (*A81e*)
            sSTATUS:=INT_TO_WORD(TEST_DB.RET_WERT);
            sSTATUS_FUNC:='TEST_DB';
        ELSIF (TEST_DB.LENGTH<>sCONFIG_DB_Length) THEN (*A827*)
            Cycle_running:=false;
            Cycle_start:=false;
            ERROR:=TRUE;
            STATUS:=W#16#A080;
            sANLAUF_FEHLER:=true;
        ELSE
            Cycle_start:=true;
        END_IF;
        IF (NOT(ERROR)) AND Cycle_running THEN (*A82c*)
            STATUS:=W#16#A089;
        END_IF;
    END_IF;
    IF ((NOT(Cycle_running)) AND Cycle_start) AND (NOT(ERROR)) THEN (*A831*)
        IF MONITOR<T#20MS THEN (*A832*)
            STATUS:=W#16#A007;
            ERROR:=TRUE;
            Cycle_start:=FALSE;
        ELSE (*A832*)
            sMONITOR:=MONITOR;
            Cycle_running:=Cycle_start;
            Cycle_start:=FALSE;
            Connection[id_nr].Enable_Found:=false;
            Number_of_finished_IDs:=0;
            IF CONN_CNT=0 THEN (*A834*)
                sCONN_CNT:=0;
                sCONN_WAIT:=T#0MS;
            ELSIF CONN_CNT>Max_Number_of_IDs THEN (*A836*)
                sCONN_CNT:=Max_Number_of_IDs;
                sCONN_WAIT:=CONN_WAIT;
            ELSE (*A836*)
                sCONN_CNT:=CONN_CNT;
                sCONN_WAIT:=CONN_WAIT;
            END_IF;       
            FOR id_nr:=1 TO Max_Number_of_IDs BY 1 DO
                Connection[id_nr].PAC.Curr_PAC_Number:=1;
            END_FOR;
            device_tsap_st.t:=DINT_TO_INT(TIME_TO_DINT(MONITOR));
            device_tsap_st.w:=sCONFIG_DB_Length;   
        END_IF;   
    END_IF;   
    IF NOT ERROR AND Cycle_running THEN
        FOR id_nr:=1 TO Max_Number_of_IDs BY 1 DO
            IF (First_STATUS=W#16#0) AND (sSTATUS<>W#16#0) THEN (*A83c*)
                First_STATUS:=sSTATUS;
            END_IF; (*A83c*)
            sSTATUS:=W#16#0;
            IF (((WORD_TO_DINT(Connection[id_nr].Conn.id))<>0) AND
            (NOT(Connection[id_nr].Finished))) AND Connection[id_nr].Used
            THEN (*A83d*)
                FOR TCP_COMM_Durchlaeufe:=1 TO 3 BY 1 DO
                   
                    IF (NOT(Connection[id_nr].Conn_established)) AND Conn_cnt_full THEN (*A840*)
                        Next_ID:=TRUE;
                        EXIT;
                    END_IF;   
                    IF NOT Connection[id_nr].PAC.T_Blocks_running THEN
                        Connection[id_nr].T_CONN[1]:=W#16#1002;
                        Connection[id_nr].T_CONN[2]:=W#16#40;
                        Connection[id_nr].T_CONN[3]:=sIDB_Nr;
                        SRCBLK_Struct_any:=Connection[id_nr].Conn.block_length;
                        Connection[id_nr].sConn:=DWORD_TO_DINT(SHR(IN:=(DW#16#FFFFFF AND SRCBLK_Struct.Byte_Pointer),N:=3));
                        BytePointer:=((SHL(IN:=DINT_TO_DWORD(Connection[id_nr].sConn),N:=3)) AND DW#16#FFFFFF) OR DW#16#84000000;
                        Connection[id_nr].T_CONN[4]:=BytePointer_w[0];
                        Connection[id_nr].T_CONN[5]:=BytePointer_w[1];
                        FOR i:=1 TO Connection[id_nr].Number_of_PACs BY 1 DO
                            IF NOT Connection[id_nr].PAC.Current_PAC_running THEN
                                IF Connection[id_nr].Number_of_PACs=1 AND Connection[id_nr].Conn_established THEN
                                    Device:=Device+1;
                                END_IF;
                                Connection[id_nr].PAC.Current_DB:=
                                DWORD_TO_WORD(CONFIG_DB.DD[WORD_TO_INT(Connection[id_nr].Address_in_ConfigDB)+6+(4*Connection[id_nr].PAC.Curr_PAC_Number)+(Connection[id_nr].PAC.Curr_PAC_Number-1)*4]);   
                                TEST_DB.RET_WERT:=TEST_DB(DB_NUMBER :=Connection[id_nr].PAC.Current_DB
                                          ,DB_LENGTH :=Connection[id_nr].PAC.Current_DB_Length
                                          ,WRITE_PROT :=TEST_DB.WRITE_PROTECT );
                                IF TEST_DB.RET_WERT=0 THEN
                                    Connection[id_nr].PAC.Data_Area_finished:=0;
                                    Connection[id_nr].PAC.Current_Data_Area:=1;
                                    EXIT;
                                ELSE
                                    Connection[id_nr].Error:=true;
                                    sSTATUS:=INT_TO_WORD(TEST_DB.RET_WERT);
                                    sSTATUS_FUNC:='TEST_DB';
                                    WORD_TO_BLOCK_DB(sCONFIG_DB).DX[INT_TO_DINT(((Connection[id_nr].Number_of_first_PAC+Connection[id_nr].PAC.Curr_PAC_Number)-1)/8),
                                    INT_TO_DINT(((Connection[id_nr].Number_of_first_PAC+Connection[id_nr].PAC.Curr_PAC_Number)-1) MOD 8 -1 )]:=true;
                                    IF Connection[id_nr].PAC.Curr_PAC_Number=Connection[id_nr].Number_of_PACs THEN
                                        Connection[id_nr].Finished:=true;
                                        EXIT;
                                    ELSE
                                        Connection[id_nr].PAC.Curr_PAC_Number:=Connection[id_nr].PAC.Curr_PAC_Number+1;
                                    END_IF;
                                END_IF;
                                Connection[id_nr].PAC.Current_Data_Area:=1;
                            END_IF;   
                        END_FOR;
                    END_IF;
                    IF Connection[id_nr].Finished THEN
                        EXIT;
                    END_IF;   
                    IF (NOT(Connection[id_nr].PAC.T_Blocks_running)) AND (NOT(Connection[id_nr].STATE.DISCON)) THEN (*A84b*)
                        FOR i:=Connection[id_nr].PAC.Current_Data_Area TO 8 BY 1 DO
                            Connection[id_nr].sFUNC_CODE:=B#16#0;
                            IF Data_Blocks.Enable[Connection[id_nr].PAC.Current_Data_Area] THEN
                                Connection[id_nr].Enable_Found:=true;
                                WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DX2.0:=false;
                                IF Connection[id_nr].PAC.Current_Data_Area<=4 THEN
                                    IF WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DX[0,Connection[id_nr].PAC.Current_Data_Area-1] THEN
                                        Connection[id_nr].sWRITE_READ:=true;
                                        Connection[id_nr].sFUNC_CODE:=B#16#10;
                                        EXIT;
                                    ELSE
                                        Connection[id_nr].PAC.Data_Area_finished:=Connection[id_nr].PAC.Data_Area_finished+1;
                                    END_IF;
                                ELSE
                                    Connection[id_nr].sWRITE_READ:=false;
                                    Connection[id_nr].sFUNC_CODE:=B#16#3;
                                    EXIT;
                                END_IF;
                            ELSE
                                Connection[id_nr].PAC.Data_Area_finished:=Connection[id_nr].PAC.Data_Area_finished+1;
                                IF Connection[id_nr].PAC.Current_Data_Area=8 THEN
                                    Last_Data_Area:=Connection[id_nr].Enable_Found;
                                    IF NOT Connection[id_nr].Enable_Found THEN
                                        sSTATUS:=W#16#A088;
                                        Connection[id_nr].Delete_Data_Curr_PAC:=true;
                                    END_IF;
                                END_IF;
                            END_IF;   
                            IF Connection[id_nr].PAC.Current_Data_Area<8 THEN
                                Connection[id_nr].PAC.Current_Data_Area:=Connection[id_nr].PAC.Current_Data_Area+1;
                            END_IF;
                        END_FOR;
                        IF Connection[id_nr].sFUNC_CODE<>B#16#0 THEN
                            IF Connection[id_nr].Conn_established THEN
                                Connection[id_nr].STATE.SEND:=true;
                                Connection[id_nr].STATE.AUFTRAG_LAEUFT:=false;
                            ELSE
                                IF (WORD_TO_INT(device_tsap_st.s)=0) OR (Device<WORD_TO_INT(device_tsap_st.s)) THEN
                                    Device:=Device+1;
                                    Connection[id_nr].STATE.CON:=true;
                                    Connection[id_nr].STATE.AUFTRAG_LAEUFT:=false;
                                ELSE
                                    Connection[id_nr].Delete_Data_Curr_PAC:=true;
                                    EXIT;
                                END_IF;   
                            END_IF;
                            Connection[id_nr].PAC.Current_PAC_running:=true;
                            Connection[id_nr].PAC.T_Blocks_running:=true;
                        END_IF;
                    END_IF;   
                    IF NOT Last_Data_Area AND
                       NOT Connection[id_nr].STATE.SEND AND
                       NOT Connection[id_nr].STATE.RECV1 AND
                       NOT Connection[id_nr].STATE.RECV2 AND
                       NOT Connection[id_nr].STATE.CON AND
                       NOT Connection[id_nr].STATE.DISCON
                    THEN
                        EXIT;
                    END_IF;   
                   
                   
                    IF Connection[id_nr].STATE.RECV1 THEN
                        IF NOT Connection[id_nr].STATE.AUFTRAG_LAEUFT THEN
                            Connection[id_nr].T_DATA[1]:=w#16#1002;
                            Connection[id_nr].T_DATA[2]:=w#16#6;
                            Connection[id_nr].T_DATA[3]:=sIDB_Nr;
                            BytePointer:=SHL(IN:=DINT_TO_DWORD(sRECV_BUFFER),N:=3) AND DW#16#FFFFFF OR DW#16#84000000;
                            Connection[id_nr].T_DATA[4]:=BytePointer_w[0];
                            Connection[id_nr].T_DATA[5]:=BytePointer_w[1];
                            Connection[id_nr].DATA_TRANSFER:=true;
                            Connection[id_nr].SEND_RCV:=false;
                            Connection[id_nr].TCP_COMM_Length:=6;
                            Connection[id_nr].MONITOR:=sMONITOR;
                            Connection[id_nr].ENQ:=true;
                            Connection[id_nr].STATE.AUFTRAG_LAEUFT:=true;
                        END_IF;   
                    ELSIF Connection[id_nr].STATE.RECV2 THEN
                        IF NOT Connection[id_nr].STATE.AUFTRAG_LAEUFT THEN
                            Connection[id_nr].DATA_TRANSFER:=true;
                            Connection[id_nr].SEND_RCV:=false;
                            Connection[id_nr].TCP_COMM_Length:=Connection[id_nr].sLEN_RECV2;
                            Connection[id_nr].MONITOR:=sMONITOR;
                            BytePointer:=SHL(IN:=DINT_TO_DWORD(sRECV_BUFFER+6),N:=3) AND DW#16#FFFFFF OR DW#16#84000000;
                            Connection[id_nr].T_DATA[4]:=BytePointer_w[0];
                            Connection[id_nr].T_DATA[5]:=BytePointer_w[1];
                            Connection[id_nr].ENQ:=true;
                            Connection[id_nr].STATE.AUFTRAG_LAEUFT:=true;
                        END_IF;
                    ELSIF Connection[id_nr].STATE.SEND THEN
                        IF NOT Connection[id_nr].STATE.AUFTRAG_LAEUFT THEN
                            Connection[id_nr].T_DATA[1]:=w#16#1002;
                            Connection[id_nr].T_DATA[2]:=w#16#104;
                            Connection[id_nr].T_DATA[3]:=sIDB_Nr;
                            BytePointer:=SHL(IN:=DINT_TO_DWORD(sSEND_BUFFER),N:=3) AND DW#16#FFFFFF OR DW#16#84000000;
                            Connection[id_nr].T_DATA[4]:=BytePointer_w[0];
                            Connection[id_nr].T_DATA[5]:=BytePointer_w[1];
                            Connection[id_nr].DATA_TRANSFER:=true;
                            Connection[id_nr].SEND_RCV:=true;
                            Connection[id_nr].MONITOR:=T#0ms;
                            Connection[id_nr].ENQ:=true;
                            Connection[id_nr].STATE.AUFTRAG_LAEUFT:=true;
                            SendBuffer_w[2]:=W#16#0;
                            SendBuffer[7]:=B#16#1;
                            sTI:=sTI+1;
                            Connection[id_nr].Current_TI:=sTI;
                            SendBuffer_w[1]:=INT_TO_WORD(sTi);
                            IF Connection[id_nr].sWRITE_READ THEN
                                SendBuffer[8]:=B#16#10;
                                SendBuffer_w[6]:=Data_Blocks_w.a[Connection[id_nr].PAC.Current_Data_Area];
                                SendBuffer[13]:=INT_TO_BYTE(WORD_TO_INT(Data_Blocks_w.a[Connection[id_nr].PAC.Current_Data_Area])*2);
                                SendBuffer_w[3]:=INT_TO_WORD(BYTE_TO_INT(SendBuffer[13])+7);
                                Connection[id_nr].TCP_COMM_Length:=WORD_TO_INT(SendBuffer_w[3])+6;
                                SendBuffer_w[5]:=Data_Blocks_w.b[Connection[id_nr].PAC.Current_Data_Area];
                                SendBuffer[14]:=B#16#0;
                            ELSE
                                SendBuffer_w[3]:=W#16#6;
                                SendBuffer[8]:=B#16#3;
                                Connection[id_nr].TCP_COMM_Length:=12;
                                SendBuffer_w[5]:=Data_Blocks_w.b[Connection[id_nr].PAC.Current_Data_Area];
                                SendBuffer_w[6]:=Data_Blocks_w.a[Connection[id_nr].PAC.Current_Data_Area];
                            END_IF;
                        END_IF;
                    ELSIF Connection[id_nr].STATE.CON THEN
                        IF NOT Connection[id_nr].STATE.AUFTRAG_LAEUFT THEN
                            IF NOT Connection[id_nr].Conn_established THEN
                                IF sCONN_CNT<>0 THEN
                                    start_CONS:=start_CONS+1;
                                    IF start_CONS=sCONN_CNT THEN
                                        Conn_cnt_full:=true;
                                        IF sCONN_WAIT > T#0ms THEN
                                            TON_CONN_CNT(IN :=TRUE 
                                               ,PT := sCONN_WAIT
                                              );
                                            TON_CONN_CNT_running:=true;
                                        END_IF;
                                    END_IF;
                                END_IF;
                                IF Connection_type<>B#16#1 THEN
                                    Connection[id_nr].Conn.rem_staddr[1]:=CONFIG_DB.DB[(WORD_TO_DINT(Connection[id_nr].Address_in_ConfigDB)+6)+(Connection[id_nr].PAC.Curr_PAC_Number-1)*8];
                                    Connection[id_nr].Conn.rem_staddr[2]:=CONFIG_DB.DB[(WORD_TO_DINT(Connection[id_nr].Address_in_ConfigDB)+7)+(Connection[id_nr].PAC.Curr_PAC_Number-1)*8];
                                    Connection[id_nr].Conn.rem_staddr[3]:=CONFIG_DB.DB[(WORD_TO_DINT(Connection[id_nr].Address_in_ConfigDB)+8)+(Connection[id_nr].PAC.Curr_PAC_Number-1)*8];
                                    Connection[id_nr].Conn.rem_staddr[4]:=CONFIG_DB.DB[(WORD_TO_DINT(Connection[id_nr].Address_in_ConfigDB)+9)+(Connection[id_nr].PAC.Curr_PAC_Number-1)*8];
                                ELSE
                                    Connection[id_nr].Conn.rem_staddr[4]:=CONFIG_DB.DB[(WORD_TO_DINT(Connection[id_nr].Address_in_ConfigDB)+6)+(Connection[id_nr].PAC.Curr_PAC_Number-1)*8];
                                    Connection[id_nr].Conn.rem_staddr[3]:=CONFIG_DB.DB[(WORD_TO_DINT(Connection[id_nr].Address_in_ConfigDB)+7)+(Connection[id_nr].PAC.Curr_PAC_Number-1)*8];
                                    Connection[id_nr].Conn.rem_staddr[2]:=CONFIG_DB.DB[(WORD_TO_DINT(Connection[id_nr].Address_in_ConfigDB)+8)+(Connection[id_nr].PAC.Curr_PAC_Number-1)*8];
                                    Connection[id_nr].Conn.rem_staddr[1]:=CONFIG_DB.DB[(WORD_TO_DINT(Connection[id_nr].Address_in_ConfigDB)+9)+(Connection[id_nr].PAC.Curr_PAC_Number-1)*8];
                                END_IF;
                                Connection[id_nr].ENQ:=true;
                                Connection[id_nr].DATA_TRANSFER:=false;
                                Connection[id_nr].MONITOR:=sMONITOR;
                                Connection[id_nr].CONNECT_DISCONNECT:=true;
                                Connection[id_nr].STATE.AUFTRAG_LAEUFT:=true;
                            ELSE
                                Connection[id_nr].STATE.CON:=false;
                                Connection[id_nr].STATE.SEND:=true;
                            END_IF;
                        END_IF;
                       
                    ELSIF Connection[id_nr].STATE.DISCON AND Connection[id_nr].Conn_established THEN
                        IF NOT Connection[id_nr].STATE.AUFTRAG_LAEUFT THEN
                            Connection[id_nr].STATE.CON:=false;
                            Connection[id_nr].STATE.SEND:=false;
                            Connection[id_nr].STATE.RECV1:=false;
                            Connection[id_nr].STATE.RECV2:=false;
                            Connection[id_nr].STATE.AUFTRAG_LAEUFT:=true;
                            Connection[id_nr].DATA_TRANSFER:=false;
                            Connection[id_nr].CONNECT_DISCONNECT:=false;
                            Connection[id_nr].MONITOR:=sMONITOR;
                            Connection[id_nr].ENQ:=true;
                        END_IF;
                    END_IF;   
                    RET_VALUE:=BLKMOV(SRCBLK := Connection[id_nr].T_CONN
                           ,DSTBLK :=  TCON_Struct
                           );
                    IF RET_VALUE<>0 THEN
                        sSTATUS:=INT_TO_WORD(RET_VALUE);
                        sSTATUS_FUNC:='BLKMOV';
                        Current_PAC_Error:=true;
                        EXIT;
                    END_IF;
                    RET_VALUE:=BLKMOV(SRCBLK := Connection[id_nr].T_DATA
                           ,DSTBLK :=  TDATA_Struct
                           );
                    IF RET_VALUE<>0 THEN
                        sSTATUS:=INT_TO_WORD(RET_VALUE);
                        sSTATUS_FUNC:='BLKMOV';
                        Current_PAC_Error:=true;
                        EXIT;
                    END_IF;
                    RET_VALUE:=BLKMOV(SRCBLK := Connection[id_nr].TCP_COMM_Instance
                           ,DSTBLK :=  TCP_COMM
                           );
                    IF RET_VALUE<>0 THEN
                        sSTATUS:=INT_TO_WORD(RET_VALUE);
                        sSTATUS_FUNC:='BLKMOV';
                        Current_PAC_Error:=true;
                        EXIT;
                    END_IF;
                   
                    TCP_COMM(ID := Connection[id_nr].Conn.id
                       ,DATA_TRANSFER := Connection[id_nr].DATA_TRANSFER
                       ,LENGTH := Connection[id_nr].TCP_COMM_Length
                       ,SEND_RCV := Connection[id_nr].SEND_RCV
                       ,CONNECT_DISCONNECT := Connection[id_nr].CONNECT_DISCONNECT
                       ,MONITOR := Connection[id_nr].MONITOR
                       ,LOGGING_LEVEL := LOGGING_LEVEL
                       ,MESSAGE_COUNT := MESSAGE_COUNT
                       ,WAIT_TIME := WAIT_TIME
                       ,CONN_DB := WORD_TO_BLOCK_DB(wCONN_DB)
                       ,ENQ :=  Connection[id_nr].ENQ
                       ,UDT_CONN :=  TCON_Struct_any
                       ,DATA :=  TDATA_Struct_any
                       );
                    sTCP_COMM.CONN_ESTABLISHED:= TCP_COMM.CONN_ESTABLISHED;
                    sTCP_COMM.BUSY:= TCP_COMM.BUSY;
                    sTCP_COMM.DONE:= TCP_COMM.DONE;
                    sTCP_COMM.ERROR:= TCP_COMM.ERROR;
                    sTCP_COMM.STATUS:= TCP_COMM.STATUS;
                    sTCP_COMM.STATUS_FUNC:= TCP_COMM.STATUS_FUNC;
                    Connection[id_nr].Conn_established:=sTCP_COMM.CONN_ESTABLISHED;
                    IF Connection[id_nr].sFUNC_CODE<>B#16#0 AND NOT (sTCP_COMM.BUSY OR sTCP_COMM.DONE OR sTCP_COMM.ERROR) THEN
                        Cycle_running:=false;
                        Cycle_start:=false;
                        sANLAUF_FEHLER:=true;
                        ERROR:=true;
                        STATUS:=W#16#A080;
                    END_IF;
                    RET_VALUE:=BLKMOV(SRCBLK := TCP_COMM
                           ,DSTBLK :=   Connection[id_nr].TCP_COMM_Instance
                           );
                    IF RET_VALUE<>0 THEN
                        sSTATUS:=INT_TO_WORD(RET_VALUE);
                        sSTATUS_FUNC:='BLKMOV';
                        Current_PAC_Error:=true;
                        EXIT;
                    END_IF;
                    IF Connection[id_nr].STATE.RECV1 THEN
                        IF sTCP_COMM.DONE THEN
                            Connection[id_nr].STATE.RECV1:=false;
                            Connection[id_nr].STATE.AUFTRAG_LAEUFT:=false;
                            Connection[id_nr].sLEN_RECV2:=WORD_TO_INT(RecvBuffer_w[3]);
                            IF RecvBuffer_w[1]<>INT_TO_WORD(Connection[id_nr].Current_TI) THEN
                                sSTATUS:=W#16#A009;
                                Current_PAC_Error:=true;
                            ELSIF RecvBuffer_w[2]<>W#16#0 THEN
                                sSTATUS:=W#16#A00F;
                                Current_PAC_Error:=true;
                            ELSIF Connection[id_nr].sLEN_RECV2<3 OR Connection[id_nr].sLEN_RECV2>253 THEN
                                sSTATUS:=W#16#A01A;
                                Current_PAC_Error:=true;
                            ELSE
                                Connection[id_nr].T_DATA[2]:=INT_TO_WORD(Connection[id_nr].sLEN_RECV2);   
                                Connection[id_nr].ENQ:=true;
                                Connection[id_nr].TCP_COMM_Length:=Connection[id_nr].sLEN_RECV2;   
                                Connection[id_nr].STATE.RECV2:=true;
                            END_IF;   
                        ELSIF sTCP_COMM.ERROR THEN
                             Connection[id_nr].STATE.AUFTRAG_LAEUFT:=false;
                             Connection[id_nr].STATE.RECV1:=false;
                             Connection[id_nr].Error:=true;
                             sSTATUS:=sTCP_COMM.STATUS;
                             sSTATUS_FUNC:=sTCP_COMM.STATUS_FUNC;
                        ELSE        
                            EXIT;
                        END_IF;       
                        IF sSTATUS<>W#16#0 THEN
                            WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DD4:=DINT_TO_DWORD(DWORD_TO_DINT(WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DD4)+1);
                            WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DW8:=sSTATUS;
                            Current_PAC_Error:=true;
                            EXIT;
                        END_IF;   
                    ELSIF Connection[id_nr].STATE.RECV2 OR Last_Data_Area THEN
                        IF NOT Last_Data_Area AND sTCP_COMM.DONE THEN
                            IF Connection[id_nr].sWRITE_READ THEN
                                sExc_BytCnt_StaAdr:=WORD_TO_DINT(RecvBuffer_w[5]);
                            ELSE
                                sExc_BytCnt_StaAdr:=BYTE_TO_DINT(RecvBuffer[9]);
                            END_IF;
                            IF RecvBuffer[7]<>1 THEN
                                sSTATUS:=W#16#A00A;
                                Current_PAC_Error:=true;
                            ELSIF RecvBuffer[8]<>Connection[id_nr].sFUNC_CODE THEN
                                IF (Connection[id_nr].sFUNC_CODE)=(BYTE_TO_WORD(RecvBuffer[8]) AND W#16#7F)THEN
                                    IF Connection[id_nr].sLEN_RECV2<>3  THEN
                                        sSTATUS:=W#16#A00E;
                                    ELSIF sExc_BytCnt_StaAdr=1 THEN
                                        sSTATUS:=W#16#A091;
                                    ELSIF sExc_BytCnt_StaAdr=2 THEN
                                        sSTATUS:=W#16#A092;
                                    ELSIF sExc_BytCnt_StaAdr=3 THEN
                                        sSTATUS:=W#16#A093;
                                    ELSIF sExc_BytCnt_StaAdr=4 THEN
                                        sSTATUS:=W#16#A094;
                                    ELSE
                                        sSTATUS:=W#16#A095;
                                    END_IF;
                                ELSE
                                    sSTATUS:=W#16#A00B;
                                END_IF;
                                Current_PAC_Error:=true;
                            ELSE   
                                IF Connection[id_nr].sWRITE_READ THEN
                                    IF Connection[id_nr].sLEN_RECV2<>6 THEN
                                        sSTATUS:=W#16#A00E;
                                        Current_PAC_Error:=true;
                                    ELSIF WORD_TO_DINT(Data_Blocks.Start_Address[Connection[id_nr].PAC.Current_Data_Area])<>sExc_BytCnt_StaAdr THEN
                                        sSTATUS:=W#16#A00D;
                                        Current_PAC_Error:=true;
                                    ELSIF Data_Blocks.Length[Connection[id_nr].PAC.Current_Data_Area]<>RecvBuffer_w[6] THEN  
                                        sSTATUS:=W#16#A00C;
                                        Current_PAC_Error:=true;
                                    ELSE
                                        WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DX[0,Connection[id_nr].PAC.Current_Data_Area-1]:=false;
                                        Connection[id_nr].STATE.RECV2:=false;
                                        Connection[id_nr].STATE.AUFTRAG_LAEUFT:=false;
                                    END_IF;   
                                ELSE
                                    IF WORD_TO_INT(Data_Blocks.Length[Connection[id_nr].PAC.Current_Data_Area])*2<>sExc_BytCnt_StaAdr THEN
                                        sSTATUS:=W#16#A00C;
                                        Current_PAC_Error:=true;
                                    ELSIF (WORD_TO_INT(Data_Blocks.Length[Connection[id_nr].PAC.Current_Data_Area])*2+3)<>Connection[id_nr].sLEN_RECV2 THEN
                                        sSTATUS:=W#16#A00E;
                                        Current_PAC_Error:=true;
                                    ELSIF (Connection[id_nr].sLEN_RECV2-3)+WORD_TO_DINT(Data_Blocks.Address_in_DB[Connection[id_nr].PAC.Current_Data_Area])>WORD_TO_DINT(Connection[id_nr].PAC.Current_DB_Length) THEN
                                        sSTATUS:=W#16#A003;
                                        Current_PAC_Error:=true;
                                    ELSE   
                                        SRCBLK_Struct.ANY_id:=W#16#1002;
                                        SRCBLK_Struct.Length:=INT_TO_WORD(WORD_TO_INT(Data_Blocks.Length[Connection[id_nr].PAC.Current_Data_Area])*2);
                                        SRCBLK_Struct.DB_Number:=sIDB_Nr;
                                        SRCBLK_Struct.Byte_Pointer:=SHL(IN:=DINT_TO_DWORD(9+sRECV_BUFFER),N:=3) AND DW#16#FFFFFF OR DW#16#84000000;
                                        DSTBLK_Struct.Length:=SRCBLK_Struct.Length;
                                        DSTBLK_Struct.DB_Number:=(Connection[id_nr].PAC.Current_DB);
                                        DSTBLK_Struct.Byte_Pointer:=SHL(IN:=Data_Blocks.Address_in_DB[Connection[id_nr].PAC.Current_Data_Area],N:=3) AND DW#16#FFFFFF OR DW#16#84000000;
                                        RET_VALUE:=BLKMOV(SRCBLK := SRCBLK_Struct_any
                                               ,DSTBLK :=  DSTBLK_Struct_any
                                               );
                                        IF RET_VALUE<>0 THEN
                                            sSTATUS:=INT_TO_WORD(RET_VALUE);
                                            sSTATUS_FUNC:='BLKMOV';
                                            Connection[id_nr].Error:=true;
                                            Current_PAC_Error:=true;
                                        ELSE
                                            Connection[id_nr].STATE.RECV2:=false;
                                            Connection[id_nr].STATE.AUFTRAG_LAEUFT:=false;
                                        END_IF;
                                    END_IF;   
                                END_IF;   
                                Connection[id_nr].PAC.T_Blocks_running:=false;
                                Connection[id_nr].PAC.Data_Area_finished:=Connection[id_nr].PAC.Data_Area_finished+1;
                            END_IF;       
                        ELSIF sTCP_COMM.ERROR THEN
                            Connection[id_nr].STATE.AUFTRAG_LAEUFT:=false;
                            Connection[id_nr].STATE.RECV2:=false;
                            Connection[id_nr].Error:=true;
                            sSTATUS:=sTCP_COMM.STATUS;
                            sSTATUS_FUNC:=sTCP_COMM.STATUS_FUNC;
                        ELSIF NOT ((Connection[id_nr].PAC.Current_Data_Area=8) AND NOT Data_Blocks.Enable[Connection[id_nr].PAC.Current_Data_Area]) THEN
                            EXIT;
                        END_IF;
                       
                        
                        IF sSTATUS<>W#16#0 THEN
                            WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DD4:=DINT_TO_DWORD(DWORD_TO_DINT(WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DD4)+1);
                            WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DW8:=sSTATUS;
                            Current_PAC_Error:=true;
                            EXIT;
                        END_IF;
                        Last_Data_Area:=false;
                        IF Connection[id_nr].PAC.Data_Area_finished>=8 OR Current_PAC_Error THEN
                            IF Connection[id_nr].Enable_Found AND NOT Current_PAC_Error   THEN
                                WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DX2.0:=true;
                                RET_VALUE:=READ_CLK(CDT :=  sTimestamp);
                                IF RET_VALUE=0 THEN
                                    WORD_TO_BLOCK_DB(sCONFIG_DB).DX[(((Connection[id_nr].Number_of_first_PAC+Connection[id_nr].PAC.Curr_PAC_Number)-1)/8),
                                                                   ((((Connection[id_nr].Number_of_first_PAC+Connection[id_nr].PAC.Curr_PAC_Number)-1) MOD 8) -1)]:=false;
                                    WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DD10:=sTimestamp_st.a;
                                    WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DD14:=sTimestamp_st.b;
                                ELSE
                                    sSTATUS:=INT_TO_WORD(RET_VALUE);
                                    Current_PAC_Error:=true;
                                    EXIT;
                                END_IF;
                            END_IF;   
                            IF Connection[id_nr].Number_of_PACs<>1 THEN
                                Connection[id_nr].STATE.RECV2:=false;
                                Connection[id_nr].STATE.DISCON:=true;
                                Connection[id_nr].PAC.T_Blocks_running:=true;
                                Connection[id_nr].STATE.AUFTRAG_LAEUFT:=false;
                            ELSE
                                Connection[id_nr].Done:=Connection[id_nr].Done OR sTCP_COMM.DONE;
                                Connection[id_nr].ERROR:=Connection[id_nr].ERROR OR sTCP_COMM.ERROR;
                            END_IF;
                            IF Connection[id_nr].PAC.Curr_PAC_Number=Connection[id_nr].Number_of_PACs AND NOT Connection[id_nr].STATE.DISCON THEN
                                Connection[id_nr].Finished:=true;
                                EXIT;
                            ELSE
                                IF NOT Connection[id_nr].STATE.DISCON THEN
                                    Connection[id_nr].PAC.Curr_PAC_Number:=Connection[id_nr].PAC.Curr_PAC_Number+1;
                                END_IF;
                            END_IF;
                        ELSE
                            Connection[id_nr].PAC.Current_Data_Area:=Connection[id_nr].PAC.Current_Data_Area+1;
                        END_IF;
                    ELSIF Connection[id_nr].STATE.SEND THEN
                        IF sTCP_COMM.DONE THEN
                            Connection[id_nr].STATE.SEND:=false;
                            Connection[id_nr].STATE.RECV1:=true;
                            Connection[id_nr].STATE.AUFTRAG_LAEUFT:=false;
                        ELSIF sTCP_COMM.ERROR THEN
                            Connection[id_nr].STATE.AUFTRAG_LAEUFT:=false;
                            Connection[id_nr].STATE.SEND:=false;
                            Connection[id_nr].Error:=true;
                            sSTATUS:=sTCP_COMM.STATUS;
                            sSTATUS_FUNC:=sTCP_COMM.STATUS_FUNC;
                        ELSE
                            EXIT;
                        END_IF;
                        IF sSTATUS<>W#16#0 THEN
                            WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DD4:=DINT_TO_DWORD(DWORD_TO_DINT(WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DD4)+1);
                            WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DW8:=sSTATUS;
                            Current_PAC_Error:=true;
                            EXIT;
                        END_IF;
                    ELSIF Connection[id_nr].STATE.CON THEN
                        IF sTCP_COMM.CONN_ESTABLISHED THEN
                            Connection[id_nr].STATE.CON:=false;
                            Connection[id_nr].STATE.SEND:=true;
                            Connection[id_nr].STATE.AUFTRAG_LAEUFT:=false;
                        ELSIF sTCP_COMM.ERROR THEN
                            Connection[id_nr].Error:=true;
                            sSTATUS:=sTCP_COMM.STATUS;
                            sSTATUS_FUNC:=sTCP_COMM.STATUS_FUNC;
                            WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DD4:=DINT_TO_DWORD(DWORD_TO_DINT(WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DD4)+1);
                            WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DW8:=sSTATUS;
                            Current_PAC_Error:=true;
                            EXIT;
                        ELSE
                            EXIT;
                        END_IF;   
                    ELSIF Connection[id_nr].STATE.DISCON THEN
                        IF sTCP_COMM.DONE THEN
                            Connection[id_nr].STATE.DISCON:=false;
                            Connection[id_nr].STATE.AUFTRAG_LAEUFT:=false;
                            Connection[id_nr].PAC.T_Blocks_running:=false;
                            Connection[id_nr].PAC.Current_PAC_running:=false;
                        ELSIF sTCP_COMM.ERROR THEN
                            Connection[id_nr].ERROR:=true;
                            Connection[id_nr].STATE.DISCON:=false;
                            Connection[id_nr].STATE.AUFTRAG_LAEUFT:=false;
                            Connection[id_nr].PAC.T_Blocks_running:=false;
                            Connection[id_nr].PAC.Current_PAC_running:=false;
                            sSTATUS:=sTCP_COMM.STATUS;
                            sSTATUS_FUNC:=sTCP_COMM.STATUS_FUNC;
                            WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DD4:=DINT_TO_DWORD(DWORD_TO_DINT(WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DD4)+1);
                            WORD_TO_BLOCK_DB(Connection[id_nr].PAC.Current_DB).DW8:=sSTATUS;
                        ELSE
                            EXIT;
                        END_IF;
                        IF Connection[id_nr].PAC.Curr_PAC_Number=Connection[id_nr].Number_of_PACs THEN
                            Connection[id_nr].Error:=Connection[id_nr].Error OR sTCP_COMM.ERROR;
                            Connection[id_nr].Done:=Connection[id_nr].Done OR sTCP_COMM.DONE;
                            Connection[id_nr].Finished:=true;
                            Connection[id_nr].PAC.Curr_PAC_Number:=0;
                            EXIT;
                        ELSE
                            Connection[id_nr].PAC.Curr_PAC_Number:=Connection[id_nr].PAC.Curr_PAC_Number+1;
                        END_IF;
                    ELSE
                        Connection[id_nr].STATE.SEND:=false;
                        Connection[id_nr].STATE.RECV1:=false;
                        Connection[id_nr].STATE.RECV2:=false;
                        Connection[id_nr].STATE.CON:=false;
                        Connection[id_nr].STATE.AUFTRAG_LAEUFT:=false;
                        Connection[id_nr].STATE.DISCON:=true;
                        ERROR:=true;
                        sSTATUS:=W#16#A01F;
                        EXIT;
                    END_IF;
                END_FOR;
                IF NOT Next_ID THEN
                    IF Current_PAC_Error THEN
                        WORD_TO_BLOCK_DB(sCONFIG_DB).DX[INT_TO_DINT(((Connection[id_nr].Number_of_first_PAC+Connection[id_nr].PAC.Curr_PAC_Number)-1)/8),
                        INT_TO_DINT(((Connection[id_nr].Number_of_first_PAC+Connection[id_nr].PAC.Curr_PAC_Number)-1) MOD 8 -1 )]:=true;
                        Connection[id_nr].Error:=true;
                        Current_PAC_Error:=false;
                        IF (WORD_TO_DINT(sSTATUS)>=40960 AND WORD_TO_DINT(sSTATUS)<41216) OR 
                           (RET_VALUE<>0 AND Connection[id_nr].Conn_established)
                        THEN
                            Connection[id_nr].STATE.SEND:=false;
                            Connection[id_nr].STATE.RECV1:=false;
                            Connection[id_nr].STATE.RECV2:=false;
                            Connection[id_nr].STATE.CON:=false;
                            Connection[id_nr].STATE.DISCON:=true;
                            Connection[id_nr].STATE.AUFTRAG_LAEUFT:=false;
                            Connection[id_nr].Delete_Data_Curr_PAC:=false;
                        ELSE
                            Connection[id_nr].Delete_Data_Curr_PAC:=true;
                        END_IF;   
                    END_IF;
                    IF Connection[id_nr].Delete_Data_Curr_PAC THEN
                        Connection[id_nr].Delete_Data_Curr_PAC:=false;
                        WORD_TO_BLOCK_DB(sCONFIG_DB).DX[INT_TO_DINT(((Connection[id_nr].Number_of_first_PAC+Connection[id_nr].PAC.Curr_PAC_Number)-1)/8),
                        INT_TO_DINT(((Connection[id_nr].Number_of_first_PAC+Connection[id_nr].PAC.Curr_PAC_Number)-1) MOD 8 -1 )]:=true;
                        Connection[id_nr].STATE.SEND:=false;
                        Connection[id_nr].STATE.RECV1:=false;
                        Connection[id_nr].STATE.RECV2:=false;
                        Connection[id_nr].STATE.CON:=false;
                        Connection[id_nr].STATE.DISCON:=false;
                        Connection[id_nr].STATE.AUFTRAG_LAEUFT:=false;
                        Connection[id_nr].PAC.Current_PAC_running:=false;
                        Connection[id_nr].PAC.T_Blocks_running:=false;
                        IF Connection[id_nr].PAC.Curr_PAC_Number=Connection[id_nr].Number_of_PACs OR Device = WORD_TO_INT(Device_tsap_st.s) THEN
                            Connection[id_nr].PAC.Curr_PAC_Number:=0;
                            Connection[id_nr].Finished:=true;
                        ELSE   
                            Connection[id_nr].PAC.Curr_PAC_Number:=Connection[id_nr].PAC.Curr_PAC_Number+1;
                        END_IF;
                    END_IF;
                    IF Connection[id_nr].Finished THEN
                        Number_of_finished_IDs:=Number_of_finished_IDs+1;
                        Connection[id_nr].PAC.Current_PAC_running:=false;
                        Connection[id_nr].PAC.Curr_PAC_Number:=0;
                        Connection[id_nr].PAC.T_Blocks_running:=false;
                    END_IF;
                        Connection[id_nr].Conn_established:=sTCP_COMM.CONN_ESTABLISHED;
                ELSE
                    Next_ID:=false;
                END_IF;   
            END_IF;
        END_FOR;
    END_IF;
END_IF;
REG_KEY_b.act_length:=B#16#11;
tSProductID:='PAC...XV94501MB1.';
 
IF (sSTATUS_TIMER AND W#16#60) <> W#16#0 THEN
    IF (sSTATUS_TIMER AND W#16#20) <> W#16#0 THEN
        RDSYSST.REQ:=true;
        sSTATUS_TIMER:=sSTATUS_TIMER OR W#16#4000;
    ELSE
        RDSYSST.REQ:=false;
    END_IF;
 
 
    RDSYSST.RET_WERT:=RDSYSST(
     REQ :=  RDSYSST.REQ
    ,SZL_ID := W#16#11C     // SSL-ID W#16#xy1C - Component Identification
    ,INDEX :=   W#16#5      // W#16#0005: Serial number of the module
    ,BUSY := RDSYSST.BUSY
    ,SZL_HEADER := RDSYSST.SZL_HEADER
    ,DR := RDSYSST.SZL_11C_5
    );
           // Serial number OF the module; character STRING with MAX. length OF 24
           // characters. Shorter numbers are filled with B#16#00.
           // Note: This serial number is unique world-wide FOR SIMATIC components AND
           // permanently associated TO the CPU hardware, that is, it remains unchanged
           // when a firmware update is performed.
    IF RDSYSST.BUSY     THEN
        sSTATUS_TIMER:=(sSTATUS_TIMER AND W#16#FFBF) OR W#16#40;
    ELSE
        sSTATUS_TIMER:=sSTATUS_TIMER AND W#16#FF9F;
        IF RDSYSST.RET_WERT<>0 THEN
            sSTATUS_TIMER:=sSTATUS_TIMER AND W#16#FFFB;
            ERROR:=true;
            STATUS:=W#16#A084;
        ELSE
            FOR i:= 0 TO 16 BY 1 DO
                // result - string with symbols in range 'A'-'M'
                sACODE[INT_TO_DINT(i)]:=INT_TO_BYTE(BYTE_TO_INT(CHAR_TO_BYTE(RDSYSST.SZL_11C_5.serialn[INT_TO_DINT(i)]) XOR (tSProductID_b.str[INT_TO_DINT(i)])) MOD 13 + 65);
            END_FOR;
            sACODE[17]:=B#16#32; // '2'
            j:=BLKMOV( SRCBLK := sACODE, DSTBLK := IDENT_CODE);
        END_IF;
    END_IF;
END_IF;       
   
   
IF sACODE[17]=B#16#32 THEN// '2'
    reg:=0;
    WHILE reg<=16 DO
        IF REG_KEY_b.str[reg] <> sSTATUS_CODE_b.str[reg] THEN
            device_tsap_st.s:=W#16#0;
            FOR L:=1 TO 3 BY 1 DO
                IF BLKMOV(SRCBLK := IDENT_CODE, DSTBLK := sACODE )=0 THEN
                    IF L=1 THEN
                        tSProductID_b.str[3]:=b#16#30;
                        tSProductID_b.str[4]:=b#16#32;
                        tSProductID_b.str[5]:=b#16#30;
                        tSProductID_b.str[16]:=b#16#32;
                    ELSIF L=2 THEN
                        tSProductID_b.str[3]:=b#16#31;
                        tSProductID_b.str[4]:=b#16#30;
                        tSProductID_b.str[5]:=b#16#30;
                        tSProductID_b.str[16]:=b#16#33;
                    ELSE
                        tSProductID_b.str[3]:=b#16#35;
                        tSProductID_b.str[4]:=b#16#31;
                        tSProductID_b.str[5]:=b#16#32;
                        tSProductID_b.str[16]:=b#16#34;
                    END_IF;
               
                    FOR i:=0 TO 16 BY 1 DO
                        rcv_time:= SHL(IN:=B#16#1, N:=BYTE_TO_INT(INT_TO_BYTE(i) AND 7));
           
                        FOR k:=0 TO 7 BY 1 DO
                            snd_time:= SHL(IN:=B#16#1, N:=7-k);
                            pos:=i/8*8+k;
                           
                            IF (tSProductID_b.str[i] AND snd_time) = snd_time THEN
                                sHoldingRegisterState[pos]:=sHoldingRegisterState[pos] OR rcv_time ;
                            END_IF;
                        END_FOR;
                    END_FOR;
       
                    FOR i:=0 TO 16 BY 1 DO
                        tALicenseKey[i]:=(sACODE[i] XOR sHoldingRegisterState[i]) XOR INT_TO_BYTE(i+1);
                        tALicenseKey[i]:=INT_TO_BYTE(BYTE_TO_INT(tALicenseKey[i]) MOD 26 + 65); // 65='A'
                    END_FOR;                    
                   
                    FOR i:=0 TO 23 BY 1 DO
                        sHoldingRegisterState[i]:=B#16#0;   
                    END_FOR;   
                    tALicenseKey[17]:=B#16#0;
                    IF BLKMOV(SRCBLK := REG_KEY,DSTBLK := sACODE)=0 THEN
                        FOR i:=0 TO 16 BY 1 DO
                            IF tALicenseKey[i]<>sACODE[i] THEN
                                sSTATUS_TIMER:=sSTATUS_TIMER AND W#16#FFFB;                              
                                EXIT;
                            END_IF;
                            IF i=16 THEN
                                sSTATUS_TIMER:=sSTATUS_TIMER OR W#16#4;
                                IF L=1 THEN
                                    device_tsap_st.s:=W#16#14;
                                ELSIF L=2 THEN
                                    device_tsap_st.s:=W#16#64;
                                ELSE
                                    device_tsap_st.s:=W#16#200;
                                END_IF;
                            END_IF;
                        END_FOR;
                   
                        BasicTypes:='_DIDGKFMPIHMKGDL_';
                        FOR i:=0 TO 16 BY 1 DO
                            IF REG_KEY_b.str[i]<>BasicTypes_b.str[i] THEN
                                EXIT;
                            ELSE
                                IF i=16 THEN
                                    sSTATUS_TIMER:=sSTATUS_TIMER OR W#16#4;
                                    EXIT;
                                END_IF;
                            END_IF;
                        END_FOR;
                        BasicTypes:='                 ';
                        IF device_tsap_st.s<>W#16#0 THEN
                            EXIT;
                        END_IF;
                    END_IF;   
                END_IF;
            END_FOR;
            j:=BLKMOV(SRCBLK := REG_KEY,DSTBLK := sSTATUS_CODE);
        END_IF;
        reg:=reg+1;
    END_WHILE
END_IF;
IF ((sSTATUS_TIMER AND W#16#4) = W#16#0) THEN
    TON(IN := TON.IN ,PT := T#4S);
    TON.IN:=true;
    IF TON.Q THEN
        address:=60000;
        TON.IN:=M[address,0]; 
   
        sSTATUS_TEMP:=INT_TO_WORD(WR_USMSG(SEND := false
        ,EVENTN := W#16#A090 // The block is not licensed for this CPU. This is a status information. The bit ERROR is not set. The Modbus communication runs without a license as well.
        ,INFO1 :=  sAREA_1
        ,INFO2 :=  sAREA_2
        ));
 
        IF sSTATUS_TEMP<>W#16#0 THEN
            ERROR:=true;
            STATUS:=sSTATUS_TEMP;
            sSTATUS_FUNC:='WR_USMSG';
        END_IF;
        TON.IN:=false;
    END_IF;
    IF STATUS = W#16#0 THEN
        STATUS:=W#16#A090;
    END_IF; // The block  is not licensed for this CPU. This is a status information. The bit ERROR is not set. The Modbus communication runs without a license as well.
END_IF;
 
IF j<>0 THEN    
    ERROR:=true;
    STATUS:=W#16#A085;// An error occurred during the license handling due to an invalid write access.
END_IF;
IF NOT sANLAUF_FEHLER AND First_STATUS=W#16#0 AND sSTATUS<>W#16#0 THEN
    First_STATUS:=sSTATUS;
END_IF;
IF Number_of_finished_IDs<>0 AND Number_of_finished_IDs=Used_Number_of_IDs THEN
    FOR id_nr:=1 TO Max_Number_of_IDs BY 1 DO
        Connection[id_nr].Finished:=false;
        IF WORD_TO_DINT(Connection[id_nr].Conn.id)<>0 THEN
            ERROR:=ERROR OR Connection[id_nr].Error;
        END_IF;
        IF id_nr=Max_Number_of_IDs AND First_STATUS=W#16#0 THEN
            DONE:=true;
        END_IF;
        Connection[id_nr].Done:=false;
        Connection[id_nr].Error:=false;
        Connection[id_nr].Enable_Found:=false;
    END_FOR;
    Device:=0;
    Number_of_finished_IDs:=0;
    Cycle_running:=false;
    Last_Data_Area:=false;
    IF First_STATUS<>W#16#0 THEN
        STATUS:=First_STATUS;
        First_STATUS:=W#16#0;
    END_IF;
    IF WORD_TO_INT(device_tsap_st.s)<>0 AND Used_Number_of_PACs>WORD_TO_INT(device_tsap_st.s) OR More_PACs_Found THEN
        STATUS:=W#16#A087;
        DONE:=false;
    END_IF;
    IF STATUS<>W#16#0 AND STATUS<>W#16#A089 AND STATUS<>W#16#A090 THEN
        ERROR:=true;
    ELSE
        ERROR:=false;
    END_IF;   
END_IF;   
 
IF WORD_TO_DINT(STATUS)>=40960 AND ERROR THEN
    sSTATUS_FUNC:='MB_PACxy';
END_IF;
sSTATUS:=w#16#0;
IF TON_CONN_CNT_running THEN
    TON_CONN_CNT(IN :=TRUE,PT := sCONN_WAIT );
    IF  TON_CONN_CNT.Q THEN
        TON_CONN_CNT(IN :=false,PT := sCONN_WAIT);
        TON_CONN_CNT_running:=false
    END_IF;   
END_IF;
IF NOT TON_CONN_CNT_running AND start_Cons=sCONN_CNT THEN
    start_Cons:=0;
    Conn_cnt_full:=false;
END_IF;
Check_interrupt:=false;
 
END_FUNCTION_BLOCK



sentron pac

Block checksum îðèãèíàëüíîãî è âîññòàíîâëåííîãî áëîêà ñîâïàäàåò






Îðèãèíàëüíàÿ áèáëèîòåêà (zip, 5Mb)

Äîêóìåíòàöèÿ íà áëîê íà îôñàéòå Siemens



Íàçàä