首页 理论教育 如何使用参数类型POINTER

如何使用参数类型POINTER

时间:2023-06-27 理论教育 版权反馈
【摘要】:POINTER只能用于形参中的IN、OUT和INLOUT变量。图4-24 参数类型POINTER指针POINTER占6个字节,字节0和字节1中的数值用来存放数据块的编号。POINTER的实参可以采用指针形式,例如P#M50.0和P#DB2.DBX4.0。参数类型ANY和POINTER的字节数分别为10B和6B,在调用块时不能用32位的累加器1来直接传递它们。地址区的起始地址由参数类型为POINTER的输入参数StartLAddr提供。

如何使用参数类型POINTER

1.参数类型POINTER

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

978-7-111-54209-4-Chapter04-33.jpg

图4-24 参数类型POINTER

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

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

参数类型ANY和POINTER的字节数分别为10B和6B,在调用块时不能用32位的累加器1来直接传递它们。因此在块A调用块B时,CPU将ANY和POINTER的实参暂时保存在块A的临时局部数据区(V区)中。块B通过寄存器间接寻址来访问ANY和POINTER的实参。

2.FC1的程序设计

【例4-1】用FC1将同一地址区中相邻的若干个字累加。地址区的起始地址由参数类型为POINTER的输入参数StartLAddr提供。程序见随书光盘的例程“寄存器间接寻址”,FC1的局部变量如表4-5所示。

表4-5 FC1的局部变量

978-7-111-54209-4-Chapter04-34.jpg

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

978-7-111-54209-4-Chapter04-35.jpg

978-7-111-54209-4-Chapter04-36.jpg(www.xing528.com)

3.OB1的程序

生成共享数据块DB2,在DB2中生成用于保存累加和的双整数Sum,以及有5个整数元素的数组Aray。下面是OB1调用FC1的程序,分别累加DB2和M区中的5个字。如果将DB2.DBX4.0改写为指针格式P#DB2.DBX4.0,将会自动变为DB2.Aray。

978-7-111-54209-4-Chapter04-37.jpg

4.程序运行的监控

图4-25是FC1部分程序的程序状态监控图,图中累加器1(STANDARD)的显示格式为十六进制数。数据类型为POINTER的输入参数Start_Addr的实参为DB2.DBX4.0时,POINTER的第一个字(数据块编号,见图4-24)为16#0002,后4B为地址指针P#DBX4.0(16#84000020)。

V区是调用FC1的OB1的局部数据区。执行第一条LAR1指令以后,OB1的局部数据区中存放指针参数StartLAddr的6B实参的地址指针值V21.0(16#870000a8)被装入AR1(见图4-25)。

在第3条指令“L 0”处设置一个断点,程序运行到该指令处暂停。在CPU的模块信息对话框的“堆栈选项卡打开OB1的局部数据堆栈(L堆栈,见图4-26),可以看到从VB21开始存放的Start_Addr的6B实参为上述的16#000284000020。

978-7-111-54209-4-Chapter04-38.jpg

图4-25 FC1部分程序的程序状态

978-7-111-54209-4-Chapter04-39.jpg

图4-26 OB1的局部数据

执行指令“L D[AR1,P#2.0]以后,POINTER第2~5号字节的地址指针值P#DBX4.0(16#84000020)被装载到累加器1。执行第二条LAR1指令以后,地址指针值P#DBX4.0(在程序状态监控中被简记为DB4.0)被送入AR1。第一次循环执行指令“L W[AR1,P#0.0]”时,装载的是被累加的第一个数DB2.DBW4。

可以用变量表监控程序运行的结果。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈