技术论坛

 用X_PUT读取多个CPU数据的例程,对理解间接寻址及地址积存器有较大的帮助!

返回主题列表
作者 主题
Zane
版主

经验值:85171
发帖数:21052
精华帖:399
楼主    2004-04-12 10:15:35
主题:用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
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。