在书上面看到的一个很好的列子,结合个人做过的工程项目的一些经验,从新组织了一下,主要针对在s300中如果读取大量的模拟量模块采集信号就会很繁琐,下面给出一个通用程序。利用它可方便的把AO模块的数值读回并顺序存入相应的数据块。这是小弟第一次发帖,定有很多不足之处,还希望各位大神多多体谅和指导。
DATA_BLOCK "ao"
TITLE =
VERSION : 0.1
STRUCT
AO1 : REAL ; //临时占位符变量
AO11 : REAL ;
AO2 : REAL ;
AO3 : REAL ;
AO4 : REAL ;
AO5 : REAL ;
AO6 : REAL ;
AO7 : REAL ;
AO8 : REAL ;
END_STRUCT ;
BEGIN
AO1 := 0.000000e+000;
AO11 := 0.000000e+000;
AO2 := 0.000000e+000;
AO3 := 0.000000e+000;
AO4 := 0.000000e+000;
AO5 := 0.000000e+000;
AO6 := 0.000000e+000;
AO7 := 0.000000e+000;
AO8 := 0.000000e+000;
END_DATA_BLOCK
FUNCTION "read_AO" : BOOL
TITLE =
// 在s300中如果读取大量的模拟量模块采集信号就会很繁琐,下面给出一个通用程序。
//// 利用它可方便的把AO模块的数值读回并顺序存入相应的数据块。
VERSION : 0.1
VAR_INPUT
PIW_ADDR : INT ;
DB_NO : INT ;
CH_LEN : INT ;
DBW_ADDR : INT ;
END_VAR
BEGIN
NETWORK
TITLE =
//save
TAR1 LD 10;
TAR2 LD 14;
L DBNO;
T LW 18;
L DINO;
T LW 20;
//打开数据快
L #DB_NO;
T LW 0;
OPN DB [LW 0];
//初始化指针
L P#0.0;
L #PIW_ADDR;
SLD 3;
+D ;
LAR1 ;
L P#0.0;
L #DBW_ADDR;
SLD 3;
+D ;
LAR2 ;
//loop
L #CH_LEN;
a: T LW 2;
L PIW [AR1,P#0.0];
ITD ;
L L#2000;
*D ;
L L#27648;
/D ;
JOS ERR;
T DBD [AR2,P#0.0];
DTR ;
T DBD [AR2,P#0.0];
+AR1 P#2.0;
+AR2 P#4.0;
L LW 2;
LOOP a;
// 还原
LAR1 LD 10;
LAR2 LD 147;
OPN DB [LW 18];
OPN DI [LW 20];
CLR ;
= #RET_VAL;
JU NEXT;
ERR: SET ;
= #RET_VAL;
NEXT: SET ;
SAVE ;
CLR ;
END_FUNCTION
ORGANIZATION_BLOCK "CYCL_EXC"
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1
VAR_TEMP
OB1_EV_CLASS : BYTE ; //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
OB1_SCAN_1 : BYTE ; //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
OB1_PRIORITY : BYTE ; //Priority of OB Execution
OB1_OB_NUMBR : BYTE ; //1 (Organization block 1, OB1)
OB1_RESERVED_1 : BYTE ; //Reserved for system
OB1_RESERVED_2 : BYTE ; //Reserved for system
OB1_PREV_CYCLE : INT ; //Cycle time of previous OB1 scan (milliseconds)
OB1_MIN_CYCLE : INT ; //Minimum cycle time of OB1 (milliseconds)
OB1_MAX_CYCLE : INT ; //Maximum cycle time of OB1 (milliseconds)
OB1_DATE_TIME : DATE_AND_TIME ; //Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =
CALL "read_AO" (
PIW_ADDR := 256,
DB_NO := 3,
CH_LEN := 8,
DBW_ADDR := 0,
RET_VAL := M 1.0);
NOP 0;
END_ORGANIZATION_BLOCK