全国服务热线 15221406036

东莞西门子S7-200代理商

发布:2023-07-20 17:08,更新:2024-05-08 07:10

东莞西门子S7-200代理商

   西门子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      //保存运算结果的双整数
    图1是运行时监控FC1的结果,累加器1(STANDARD)中的数据为十六进制显示格式,AR1是地址寄存器1。终于看到了AR1中的V区地址了!


    图1中条指令的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的局部数据堆栈如图2所示。

 

由图1可知,因为指针常数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强大的功能

    对西门子S7-300/400plc程序块的加密通过STEP7软件的KNOW_HOW_PROTECT功能实现对您程序代码的加密保护。 对S7-300/400plc程序块的加密通过STEP7软件的KNOW_HOW_PROTECT功能实现对您程序代码的加密保护。

    如果您双击鼠标打开经过加密的程序块时,您只能看到该程序块的接口数据(即IN, OUT 和 IN/OUT 等类型的参数)和注释信息,而程序块中的代码及代码的注释,临时/静态变量是不能被看到的。同时您也无法对加密保护的程序块做出任何改动。

如何实现程序块保护:

1.打开程序编辑窗口LAD/FBD/STL;

2.将要进行加密保护的程序块生成转换为源代码文件(通过选择菜单  File—>Generate source 生成);

3.在LAD/FBD/STL 窗口中关闭您的程序块,并在SIMATIC Manager项目管理窗口的source文件夹中打开上一步所生成的source文件;

4.在程序块的声明部分,TITLE行下面的一行中输入” KNOW_HOW_PROTECT”;

5.存盘并编译该source文件(选择菜单FileàSave,FileàCompile);

现在就完成了您程序块的加密保护;

取消对程序块的加密保护

1.    打开程序块的Source源文件;

2.    删除文件中的KNOW_HOW_PROTECT;

3.    存盘并编译该source文件;

4.现在程序块的加密保护已经取消。

在STEP7中如何创建库并将自己写得FC块、FB块放入自己创建的库中。另外如何给自己写得FC快、FB块加密?
答:(1)在STEP7中如何创建库并将自己写得FC块、FB块放入自己创建的库中。-----
西门子STEP7内库制作 :  
在做一个项目时如一些经常使用的功能,如设备累计使用时间,使用SFC17及SFC19在step7内做报警等等。可以日常时间做一些库放在STEP7内C:\Program Files\Siemens\Step7\S7LIBS内,以后做做项目时在编辑的块内可以看见自己做的库内容,方便调用,可显著减少编程时间。具体做法:
打开SIMATIC Manager编程软件。
2点击文件内新建项目。
3给新建项目命名,将项目类型选择为库。存储位置可以不用该默认,确认设置后进入项目。
4项目中插入FB,FC块,编辑FB,FC块内部变量全部使用局域变量,不使用如M,I,Q,共享数据块或其他全局数据。如果使用全局数据可能会造成同线圈输出等问题,注意OB不能作为库使用。
5做好后保存块后即可在以后项目中使用,很方便。

(2)另外如何给自己写得FC快、FB块加密?---
如何实现程序块保护: 
1.打开程序编辑窗口LAD/FBD/STL;
2.将要进行加密保护的程序块生成转换为源代码文件(通过选择菜单  File—>Generate source 生成);
3.在LAD/FBD/STL 窗口中关闭您的程序块,并在SIMATIC Manager项目管理窗口的source文件夹中打开上一步所生成的source文件;
4.在程序块的声明部分,TITLE行下面的一行中输入” KNOW_HOW_PROTECT”;
5.存盘并编译该source文件(选择菜单File?Save,File?Compile);
6.现在就完成了程序块的加密保护;

UDT,用户自定义数据类型。
用户有时为了方便,先创建一个udt(和创建db块一样),写好自己需要的数据结构。然后在创建db块时,如果需要就可以插入你建好的udt(输入个name,类型输入udt的名字,比如udt1),如果你切换到数据视图,你就可以看到你原先创建的udt的结构了。

  缺省情况下,西门子S7-200plc CPU的通信口处于PPI从站模式,地址为2,通信速率为9.6K。

  要更改通信口的地址或通信速率,必须在系统块中的Communicaiton Ports(通信端口)选项卡中设置,然后将系统块下载到CPU中,新的设置才能起作用。 

CPU通信口属性设置

  图1. CPU通信口属性设置

  在上图中:

  PLC地址:设定CPU通信口的地址。如果有两个通信口,它们的地址可以相同,因为不属于一个网络

  高地址:输入通信网络上设备的高地址

  波特率:设置通信速率。从下拉列表中可以选择9.6K、19.2K、187.5K

  重试次数:输入通信失败时重新尝试的次数

  地址间隙刷新因数:设置本站每隔几次获得网络令牌后,尝试在本站地址和下一个已知(活动)的主站地址的空间内寻找新加入的主站(仅在本站做主站时有效)。一般情况下使用缺省值10就比较合适

  括号中是取值范围

  注意在这里设置的通信速率为CPU的PPI/MPI通信速率,与由用户实现的自由口功能所定义的串行通信速率不同。

  西门子plc CPU的控制程序由主程序、子程序和中断程序组成。STEP 7-Micro/WIN 32在程序编辑器窗口里为每个POU(程序组织单元)提供一个独立的页。主程序总是第1页,后面是子程序或中断程序。
      因为各个程序在编辑器窗口里被分开,编译时在程序结束的地方自动加入无条件结束指令或无条件返回指令。用户程序只能使用条件结束和条件返回指令。
      1.子程序的作用
      子程序常用于需要多次反复执行相同任务的地方,只需要写一次子程序,别的程序在需要子程序的时候调用它,而无需重写该程序。子程序的调用是有条件的,未调用它时不会执行子程序中的指令,因此使用子程序可以减少扫描时间。
      使用子程序可以将程序分成容易管理的小块,使程序结构简单清晰,易于查错和维护。如果子程序中只引用参数和局部变量,可以将子程序移植到其他项目。为了移植子程序,应避免使用全局符号和变量,如I、Q、M、SM、Al、AQ、V、T、C、S、AC等存储器中的地址。
      2.子程序的创建
      可采用下列方法创建PLC子程序:在“编辑”菜单中选择“插入→子程序”;在程序编辑器视窗中按鼠标右键,从弹出菜单中选择“插入→子程序”。程序编辑器将从原来的POU显示进入新的子程序,程序编辑器底部将出现标志新的子程序的新标签,在程序编辑器窗口中可以对新的子程序编程。可以使用该子程序的局部变量表定义参数,各子程序多可以定义16个IN、OUT参数。用右键双击指令树中的子程序或中断程序的图标,在弹出的窗口中选择“重新命名”,可修改它们的名称。  近网上有个帖子讨论S7-200的局部变量区(L区)的使用问题。有人说“L区留值没有官方作保”,“官方应该明确指出L的用法”。
遇到问题我喜欢从手册和软件的帮助中找答案,在S7-200的手册中找到下面括号中的一段话,讲得非常清楚:
(CPU)“为11个实体中的每一个保留局部存储器:当从主程序开始时,为1个主程序、8个子程序嵌套级别;当从中断程序开始时,为1个中断和1个子程序嵌套级别。局部存储器有一个局部范围,在该范围内它只能供其相关的程序实体使用,其他程序实体无法访问。”
例如在主程序中调用子程序1、子程序2,在子程序1中调用子程序11,在子程序2中调用子程序21,子程序1、2属于同一嵌套级别,子程序11和子程序21属于同一嵌套级别。
各嵌套级别(即上述11个实体)之间的L区是相互独立;
同一嵌套级别的程序的L区是公用的,后调用的同一级子程序的局部数据会覆盖上一次调用的子程序的局部数据。

联系方式

  • 地址:上海松江 上海市松江区石湖荡镇塔汇路755弄29号1幢一层A区213室
  • 邮编:201600
  • 联系电话:未提供
  • 经理:聂航
  • 手机:15221406036
  • 微信:15221406036
  • QQ:3064686604
  • Email:3064686604@qq.com