难怪“没见有谁用这个区域编程”,V区用于监控,在编程时没有使用它。
最后我们来总结一下块调用时的参数传递过程。如果输入参数为简单数据类型,例如字节、字、整数和双整数,可以通过32位(4个字节)的累加器1直接传递参数。而ANY和POINTER分别为10个和6个字节,不能用累加器1直接传递。因此将这些参数的实参(例如16#0002 8400 0000)暂时保存在OB1从V21.0开始的局部变量中。在被调用的FC1中, P##Start_Addr提供了保存参数Start_Addr的实参的地址V21.0,在FC1中用寄存器间接寻址指令“L W [AR1,P#0.0]”来读取POINTER实参的第一个字(数据块编号),用指令“L D [AR1,P#2.0]”来读取POINTER实参的2~5号字节(数据块内的变量地址P# DBX0.0)。间接寻址的操作数地址等于方括号中AR1的地址值加上逗号后面的地址偏移量。
说到这里,我们可以看到传递POINTER参数类型的思路是非常清晰的,“Previous local data”用词是准确的,只不过所用的笔墨太少,背后的复杂过程需要我们猜想和验证。
解决了这个问题后,有一些感触:
1.由于语言和思维方式的差异,老外写的用户手册有的地方很难理解,这并不奇怪。奇怪的是网上有一些高手的“用户手册万能论”。用户手册肯定不是万能的,不可能回答所有的问题,有的问题还需要我们设法去探索和发现,包括用程序来验证我们的假设。
2.这个问题的解决使我惊叹STEP 7强大的功能,如果没有断点和监控堆栈的功能,是不可能搞清楚这个问题的。还有别的PLC有这些功能吗?
文中所用的例程将在我的《S7-300/400 PLC应用技术》第3版介绍。 A
本文关键字:西门子 PLC入门,plc技术 - PLC入门