| 作者 | 主题 |
|---|---|
|
Zane 版主
经验值:85171 发帖数:21052 精华帖:399 |
楼主
主题:用X_PUT读取多个CPU数据的例程,对理解间接寻址及地址积存器有较大的帮助!
FUNCTION_BLOCK "CPU_ComFB"
TITLE = AUTHOR : Zane FAMILY : NAME : CPUComFB VERSION : 1.0 VAR_INPUT Source_Data : ANY ; //数据源地址指针 END_VAR VAR Com_REQ : BOOL := TRUE; Com_Busy : BOOL ; Com_Busy_FN : BOOL ; Com_Busy_FN_Flg : BOOL ; Com_Busy_1 : BOOL ; Com_Busy_2 : BOOL ; Com_ID : WORD ; Com_RETV : INT ; Mov_RETV : INT ; Fill_RETV : INT ; CPU_No : INT ; Buff_Length : INT := 32; Pointer_Addr_No : DWORD ; Init_Val : DWORD ; Rcv_Buffer : ARRAY [0 .. 31 ] OF BYTE ; Com_Nodes_Tbl : STRUCT Total_Nodes : INT := 4; //Nodes of comm. 1<=N<=8,default=4 ID_1 : WORD := W#16#4; ID_2 : WORD := W#16#6; ID_3 : WORD := W#16#8; ID_4 : WORD := W#16#A; ID_5 : WORD := W#16#4; ID_6 : WORD := W#16#4; ID_7 : WORD := W#16#4; ID_8 : WORD := W#16#4; END_STRUCT ; Com_Data : STRUCT DEVICE_1 : ARRAY [0 .. 31 ] OF BYTE ; DEVICE_2 : ARRAY [0 .. 31 ] OF BYTE ; DEVICE_3 : ARRAY [0 .. 31 ] OF BYTE ; DEVICE_4 : ARRAY [0 .. 31 ] OF BYTE ; DEVICE_5 : ARRAY [0 .. 31 ] OF BYTE ; DEVICE_6 : ARRAY [0 .. 31 ] OF BYTE ; DEVICE_7 : ARRAY [0 .. 31 ] OF BYTE ; DEVICE_8 : ARRAY [0 .. 31 ] OF BYTE ; END_STRUCT ; END_VAR VAR_TEMP SD_Pointer : ANY ; RD_Pointer : ANY ; Pointer_Buf1 : DWORD ; Pointer_Buf2 : DWORD ; END_VAR BEGIN NETWORK TITLE = A #Com_Busy; JC M002; CALL "FILL" ( BVAL := #Init_Val, RET_VAL := #Fill_RETV, BLK := #Rcv_Buffer); LAR1 P##Com_Nodes_Tbl; L #CPU_No; L 2; *I ; SLW 3; +AR1 ; L DIW [AR1,P#2.0]; T #Com_ID; M002: TAR1 #Pointer_Buf1; TAR2 #Pointer_Buf2; LAR1 P##Source_Data; LAR2 P##SD_Pointer; L DIW [AR1,P#0.0]; T LW [AR2,P#0.0]; L DIW [AR1,P#2.0]; T LW [AR2,P#2.0]; T #Buff_Length; L DIW [AR1,P#4.0]; T LW [AR2,P#4.0]; L DID [AR1,P#6.0]; T LD [AR2,P#6.0]; LAR1 #Pointer_Buf1; LAR2 #Pointer_Buf2; CALL "X_GET" ( REQ := #Com_REQ, CONT := FALSE, DEST_ID := #Com_ID, VAR_ADDR := #SD_Pointer, RET_VAL := #Com_RETV, BUSY := #Com_Busy, RD := #Rcv_Buffer); A #Com_Busy; FN #Com_Busy_FN; = #Com_Busy_FN_Flg; A #Com_Busy_FN_Flg; JCN M001; L #CPU_No; L #Buff_Length; *I ; SLW 3; L P##Com_Data; +D ; T #Pointer_Addr_No; LAR1 P##RD_Pointer; L W#16#1002; T LW [AR1,P#0.0]; L #Buff_Length; T LW [AR1,P#2.0]; L DINO; T LW [AR1,P#4.0]; L #Pointer_Addr_No; T LD [AR1,P#6.0]; CALL "BLKMOV" ( SRCBLK := #Rcv_Buffer, RET_VAL := #Mov_RETV, DSTBLK := #RD_Pointer); L #CPU_No; L 1; +I ; T #CPU_No; L #Com_Nodes_Tbl.Total_Nodes; >=I ; JCN M001; L 0; T #CPU_No; M001: NOP 0; END_FUNCTION_BLOCK
Zane
注册自动化系统工程师
Always save before download
|