S7-300/400的V存储器区在间接寻址中的应用在STEP 7的帮助中搜索“V区”,在参数类型ANY和POINTER的帮助中有个存储区编码表,其中就有V区,其代码为16#87,对V区的描述为“先前的本地数据”。
块调用时的参数类型如果是ANY和POINTER(分别为10个和6个字节),不能用累加器1直接传递。因此将这些参数的实参(例如16#0002 8400 0000)暂时保存在OB1的局部变量中。
FC1将地址区中相邻的若干个字累加,地址区的起始地址由参数类型为POINTER的输入参数Start_Addr提供。在OB1中调用FC1:
CALL FC 1
Start_Addr :=P#DB2.DBX0.0 //数据区起始地址
Number :=5 //需要累加的字数
Result :=DB2.DBD10 //保存运算结果的双整数
下图是运行时监控FC1的结果,累加器1(STANDARD)中的数据显示格式为十六进制。前两条指令将参数Start_Addr输入的地址值P#Start_Addr送给AR1。

参数类型POINTER由6个字节组成,0号和1号字节是DB块的编号,不是数据块内的地址时为0。2~5号字节的格式与寄存器间接寻址的格式相同。
V区实际上是调用FC1的OB1的临时局部数据,在FC1的第2条指令处设置一个断点。执行完第2条指令后,CPU进入HOLD模式,此时打开CPU模块信息对话框的“堆栈”选项卡,选中B堆栈中的OB1,点击“L堆栈”按钮,打开L堆栈对话框,可以看到OB1从LB21开始的局部数据为16#0002 8400 0000,即OB1调用FC1的POINTER格式的6个字节的实参P#DB2.DBX0.0。前两个字节是DB2的编号,后4个字节是地址指针值P#DBX0.0的代码。
正确地理解V区的意义和操作系统保存ANY和POINTER指针的机制,可以帮助我们阅读和理解有关的程序。