您现在的位置是:首页 > PLC技术 > PLC技术

S7-300/400参数类型Pointer的应用

来源:艾特贸易2017-09-21

简介1 .参数类型 Pointer 使用参数类型 Pointer (指针),可以在调用逻辑块时,将变量的地址作为实参传送给声明的形参。 Pointer 可以直接指向一个数据块中的变量,例如 P#DB2. DBX4.0 。 Poi

    1.参数类型Pointer

    使用参数类型Pointer(指针),可以在调用逻辑块时,将变量的地址作为实参传送给声明的形参。Pointer可以直接指向一个数据块中的变量,例如P#DB2. DBX4.0Pointer只能用于形参中的INOUT(不能用于FB)、IN_OUT变量。

    Pointer6个字节(见图4-26),字节0和字节1中的数值用来存放数据块的编号。如果指针不是用于数据块,DB编号为0。字节2~5与图4-25中的寄存器间接寻址的双字指针的的格式相同。

参数类型POINTER

    4-26    参数类型POINTER

   Pointer的实参可以采用指针形式,例如P#M50.0P#DB2. DBX4.0,也可以采用地址形式,例如将P#M50.0简写为M50.0,编译时STEP 7会将它自动地转换为指针格式。

   ANYPointer分别为10B6B,不能用32位的累加器1直接访问它们,因此在OB1中调用块时,CPUANYPointer的实参暂时保存在OB1的临时局部数据区中。

    2FC1的程序设计

    【例】  将同一地址区中相邻的若干个字累加。地址区的起始地址由参数类型为Pointer的输入参数Start_Addr提供。在项目“寄存器间接寻址”(见随书光盘的同名例程)中生成FC1,其局部变量如表4-5所示。

    4-5    FC1的局部变量

FC1的局部变量

    下面是FC1中的程序,第一条指令中的P##Start_AddrOB1的局部数据区中保存参数Start_Addr的实参的地址,指令中的P#表示指针,第2#号表示局部变量。

   L    P##Start_Addr    //输入的地址指针送累加器1

   LAR1    //累加器1的指针值送地址寄存器AR1

   L    0

   L    W[AR1P#0.0]    //取指针第1个字内的数据块编号(见图4-26

   =I

   JC    _001    //不是数据块(编号为0)则跳转

    T   #DB_No    //保存数据块的编号

   OPN  DB[ #DB_No]    //用间接寻址打开指针指定的数据块

   _001L    D[AR1P#2.0]    //取指针内数据区的起始地址(图4-26中的第2~5个字节)

   LAR1    //保存到AR1AR1指向要累加的数据的起始地址

   L    L#0    //32位整数0装入累加器1

   T    #Result    //累加和清零

   L    #Number    //循环次数装入累加器1的低字

   BACK T    #Sycle_C    //暂存循环计数值

   L    W[ AR1P#0.0]    //取数据

   ITD    //转换为双整数

   L    #Result    //取累加和

   +D    //累加

   T    #Result    //保存累加和

    +AR1   P#2.0    //地址值增加两个字节,指到下一个字

   L    #Sycle_C    //循环计数器值装累加器

   LOOP BACK    //若循环计数器值的内容减1后非0,跳转到标号BACK

    3OB1的程序设计

    生成共享数据块DB2,在DB2中生成用于保存累加和的双整数Sum(见图4-29),以及有5个整数元素的数组Aray。下面是OB1调用FC1的程序,分别累加DB2M区中的5个字:

   CALL FC    1

   Start_Addr  =DB2DBX4.0    //数据区起始地址

   Number    =5    //需要累加的字数

   Result    I_DB2DBD0    //保存运算结果的双整数

   CALL FC

   Start_Addr  =P#M 100    //数据区起始地址

   Number    =5    //需要累加的字数

   Result    =MD20    //保存运算结果的双整数

    4.程序状态监控

    CPU运行时打开FC1,启动程序状态监控(见图4-27),监控累加器1(STAND-ARD)AR1和间接寻址(INDIRECT)的地址值。累加器1中的数字用十六进制格式显示。

    第一次调用FC1时,执行完第一条指令后,累加器1中为16#870000a8,即2#1000 0111 0000 0000 0000 0000 1010 1000,由图4-26和表4-3可知,这是地址P#V21.0,即第一次调用FC1OB1的局部变量LB21的地址。

程序状态监控

    4-27    程序状态监控

    4条指令读取Pointer的实参的第一个字(数据块编号),判别是不是数据块。如果非零(表示是数据块)则用16位存储器间接寻址(DB[#DB_No])打开该数据块。用指令“L D[AR1P#2.0]”来读取Pointer实参的25个字节(数据区的起始地址DBX4.0)。将该地址送入AR1后,AR1指向DB2. DBX4.0,监控区中的AR1列显示DB4.0FC1中标号BACK下面的第2条“L  W[AR1P#0.0]”指令取出的是DB2.DBW4的值。

    为了验证V区是调用FC1OB1的局部数据区,在FC1的第2条指令处设置一个断点。执行完第2条指令后,CPU进入HOLD(保持)模式。

    此时打开CPU模块信息对话框的“堆栈”选项卡,选中B堆栈中的OB1,点击“L堆栈”按钮,打开OB1的局部数据堆栈对话框(见图4-28)。此时可以看到指针常数P#DB2. DBX4.0的值16#0002 8400 0020存放在从OB1的局部数据字节LB21开始的6个字节中。

L堆栈中的局部变量

    4-28    L堆栈中的局部变量

DB2中的数据与运算结果

    4-29    DB2中的数据与运算结果

变量表中的数据与运算结果

    4-30    变量表中的数据与运算结果

    5.程序运行的监控

    生成和打开名为“VAT累加”的变量表,在变量表中生成6个变量。图4-29和图4-30给出了两次调用FC1被累加的5个字和累加的结果(双整数)。