西门子s7300各种存储区的作用区别

作者:老电工时间:2017-04-22 12:54:56

西门子s7300各种存储区的作用区别

有关西门子s7300各种存储区的作用区别,在西门子plc 37-300中的各种存储区的用途是什么,s7-300 plc存储区的用法问题,一起来了解下。

西门子s7-300 plc各种区的作用:

P区,作用为指针,经常用于程序中间接寻址。

I区,作用为外部输入,即模块上的输入点

Q区,作用为外部输出,即模块上的输出点

M区,作用为程序中间变量(全局变量)

DB区,作用为程序中DB块中存储的变量

L区,作用为某一个功能块中的内部变量(非全局变量)

V区,作为变量存储器,相当于内辅助继电器

问题1,s7-300 plc L区的用法的问题(s7 300存储区的问题)

在ob1组织块的不同网络里多次给L21.0 L21.1 赋值如:1段是A db68.dbx0.0 = L21.0 2段A db2.dbx180.1 =L21.0
问,像L21.0等L区位在同一块不同段络里可以多次赋值吗,及L区的用法?

答案:可以的,L区的数据是不能保持到下一个扫描周期的,所以使用L区时先赋值后使用是没有问题的。你的程序和直接判断db中的一个位是一样的。

问题2:西门子plc s7-300/400 p区指的是哪个区?

诊断信息:
event1of10:eventid16#2943
i/oaccesserror,writing
parea,double-wordaccess,accessaddress:0
requestedob:i/oaccesserrorob(ob122)
priorityclass:1
externalerror,incomingevent

补充:
按你的方法查了pqd0pid0可是我程序中没有用呢?还有别的可能吗?

图片说明:

西门子s7300各种存储区

西门子s7300各种存储区

答案:
1、p区指的是哪个区?

是外设i/o存储区。不经过过程映像区输入表直接访问输入模块,即不受扫描周期的约束。该区不能以位(bit)为单位访问外设i/o存储区,只能以字节、字或双字为单位进行访问。

该区多用于模拟量的输入信号。

2、如何查找?

一般程序中的用pib,pqb,piw,pqw,pid,pqd表示的过程通道的变量。
i/oaccesserror,writing

parea,double-wordaccess,accessaddress:0

检查程序中的pqd0地址所对应的硬件是否存在,或该地址在硬件组态中是否定义。

3、如何查找pqd0地址所在的程序?

应用step7的交叉索引功能。

打开交叉索引,点击‘filter’(工具栏上的小漏斗和笔的图标)打开,勾选‘per.inputs’和‘periph.outp’项,即可显示piw,pow。至于iw,同理勾选‘inputs’即可。

问题3:怎么知道PLC中的M存储区域范围?

PLC中,模块确定后,I,Q的区域能确定,但如何知道PLC中的M存储区域范围?有什么规定吗?

答案:

在PLC中M存储区(也称位存储区,又称内部存储器标志位(M)存储器区),它属于系统存储区。在你选定具体的CPU型号后,可以查看CPU的技术规格,其中就有位存储器(位存储器/字节)的大小,如6ES7 315-2AG10-0AB0的M存储器最大字节为2048个,所以M存储区的范围为MB0--MB2047,M存储器虽然名为“位存储器区”,表示按位存取,但是也可以按字节、字或双字存取,如MW0(由MB0和MB1两个字节组成),而MD0(由MB0、MB1、MB2、MB3四个字节组成)。
M存储器与PLC外部对象没有任何关系,其功能类似于继电器控制电路中的中间继电器,注要用来存储程序运算过程中的临时结果,可为编程提供无数量限制的触点,可以被驱动但不能直接驱动任何负载。

附1,西门子S7-300PLC的V存储区的探索与发现

西门子S7-300PLC有V存储区吗?听到这个问题,绝大多数人都会笑起来,V存储区不就是S7-200的变量存储区吗?S7-300哪里有什么V区?有没有搞错?最近有个网友在网上询问这个问题:“我的疑问也是这个V区,被一堆人鄙视的说是200的吧。另外我有个疑问没见有谁用这个区域编程,麻烦有类似的例子给露露脸啊”,显出了几分急切和无奈。

我也曾经被这个问题困扰过,下面向大家介绍我寻找答案的过程。

首先在STEP 7的帮助中搜索“V区”,在参数类型ANY和POINTER的帮助中有个存储区编码表,其中就有V区,其代码为16#87,对V区的描述为“先前的本地数据”。这几个字像天书一样,可能很难有人能看懂。

为了确认翻译的准确性,我将STEP 7切换到英语,“先前的本地数据”的英文为“Previous local data”。local data一般翻译为“局部数据”,看来翻译没有问题。德国人的英语水平很高,德国大学图书馆的书籍和杂志大多数都是英语的,不用怀疑德语翻译为英语时失真。

V区与参数类型ANY和POINTER有关,打开STEP 7的帮助目录中的附录,选中其中的“\数据类型和参数类型\参数类型\参数类型POINTER的格式”,可以看到参数类型由6个字节组成,0号和1号字节是DB块的编号,不是数据块内的地址时为0。2~5号字节的格式与寄存器间接寻址的格式相同。下面是寄存器间接寻址的32位指针格式:

x000 0rrr 0000 0bbb bbbb bbbb bbbb bxxx

其中第0~2位(xxx,最低位为第0位)为被寻址地址中位的编号(0~7),第3~18位(16个b)为被寻址地址的字节的编号。第24~26位(rrr)为被寻址地址的区域标识号,指针的最高位x 为0时,为区域内的间接寻址,最高位x 为1时,为区域间(交叉区域)间接寻址。

参数类型ANY可以用来传递一片连续的地址区,由10个字节组成。ANY和POINTER用于在块调用时传递输入、输出参数。为了揭开V区之谜,编写了FC1,将地址区中相邻的若干个字累加。地址区的起始地址由参数类型为POINTER的输入参数Start_Addr提供。P# DB2.DBX0.0也可以改写为DB2.DBX0.0。在OB1中调用FC1:
CALL FC 1

Start_Addr :=P#DB2.DBX0.0 //数据区起始地址

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

Result :=DB2.DBD10 //保存运算结果的双整数

运行时监控FC1的结果,累加器1(STANDARD)中的数据为十六进制显示格式,AR1是地址寄存器1。终于看到了AR1中的V区地址了!

第一条指令的P#表示指针,第2个#号表示局部变量。P##Start_Addr就是调用FC1时,用输入参数Start_Addr传送给FC1的指针P#DB2.DBX0.0(16#0002 8400 0000)存放的地址。P##Start_Addr(16#8700 00a8)最低字节16#a8对应的二进制数为2#10101000,其字节部分为2#10101,即十进制数21,最高字节16#87(2#1000 0111)表示存储区为V区。

第一条指令将P##Start_Addr送给累加器1,第二条指令将累加器1中的数据传送到AR1,传送后AR1中的地址为V21.0(即16#8700 00a8)。

那么V区到底是什么呢?根据帮助中的解释“先前的本地数据”(Previous local data),猜想与局部数据堆栈有关。执行每个块时,它都有自己的临时局部数据。在OB1调用FC1时,OB1的临时局部数据被保存到局部数据堆栈,FC1则使用它自己的临时局部数据区,OB1的局部数据成为“Previous local data”(以前的局部变量)。根据上述分析,V区很有可能是调用FC1的OB1的局部数据区。

怎样才能证实这个猜想呢?最好能看到AR1中的地址为V21.0时,OB1的局部数据。好在STEP 7的监控功能可以查看块调用时保存在堆栈中的数据。为了能看到某条指令执行后OB1的局部数据,在FC1的第2条指令处设置一个断点。执行完第2条指令后,CPU进入HOLD模式,此时打开CPU模块信息对话框的“堆栈”选项卡,选中B堆栈中的OB1,点击“L堆栈”按钮,打开L堆栈对话框,OB1的局部数据堆栈。 

因为指针常数P#V21.0(16#8700 00a8)被送给AR1,监控区中的AR1列显示V21.0。此时OB1调用FC1的POINTER格式的实参P#DB2.DBX0.0(16#0002 8400 0000),存放在从OB1的局部变量LB21开始的6个字节中(见图2)。因此AR1中的P#V21.0表示指针常数P#DB2.DBX0.0的值存放在OB1的局部变量区中的地址,换句话说,V区就是调用FC1时OB1的局部数据区。

难怪“没见有谁用这个区域编程”,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有这些功能吗?

本站仅提供信息发布平台,文章仅代表作者个人观点。

猜你喜欢

首页 > plc > 西门子plc