第4章 S7-200 PLC指令系统
在本章中,读者将学习到PLC编程的指令系统。对于基本指令系统,不论是S7-200,还是S7-300/400,以至于其他品牌的PLC都有着相通之处。通过本章的学习,可以了解S7-200系统PLC所使用的STEP 7编程语言中的基础部分,建立起PLC编程的基本概念,并在学习的过程中逐渐掌握PLC的基本编程技巧。
本章要点:
● S7-200编程概念与规则
● S7-200基本指令
● S7-200运算指令
● S7-200程序控制指令
● S7-200高级指令
4.1 指令的类型
S7-200使用的是STEP 7语言,它是S7-200系列PLC应用设计软件包,所支持的PLC编程语言非常丰富。该软件的标准版支持STL(指令表)、LAD(梯形图)及FBD(功能块图)3种基本编程语言,并且在STEP 7中可以相互转换。不同的编程语言可供不同知识背景的人员采用。下面简单介绍各种语言的特点。
1. STL(指令表)
STL(指令表)是类似于计算机汇编语言的一种文本编程语言,由多条语句组成一个程序段。指令表可供习惯汇编语言的用户使用,在运行时间和要求的存储空间方面最优。STL编辑器按照文本语言的形式显示程序。STL编辑器允许用户输入指令助记符来创建用户的控制程序。指令表也允许用户创建用LAD和FBD编辑器无法创建的程序。这是因为用户在使用S7-200的本族语言进行编程,而在图形编辑器中,为了正确地画出图形,必须遵守一些规则。如图4-1所示,这种编程方式与文本方式或汇编语言的编程方式十分相像,所以在设计通信、数学运算等高级应用程序时建议使用指令表。指令表编程具有以下特点。
图4-1 指令表编程示例
● STL最适合有经验的程序员。
● STL有时让用户能够解决用LAD或者FBD不容易解决的问题。
● 当使用STL编辑器时,只能使用西门子公司特有SIMATIC指令集。
虽然用户可以用STL编辑器查看或者编辑用LAD或者FBD编辑器编写的程序,但是反之不一定成立,即LAD或者FBD编辑器不一定总能显示所有利用STL编辑器编写的程序。
2. LAD(梯形图)
LAD(梯形图)是一种图形语言,比较形象直观,容易掌握,用得最多,堪称用户第一编程语言。梯形图与继电器控制电路图的表达方式极为相似,适合熟悉继电器控制电路的用户使用,特别适用于数字量逻辑控制。此种PLC编程语言是使用最多的PLC编程语言。梯形图由触点、线圈和用方框表示的指令构成。触点代表逻辑输入条件。线圈代表逻辑运算结果,常用来控制指示灯、开关和内部的标志位等。指令框用来表示定时器、计数器或数学运算等附加指令。在程序中,最左边是主信号流,信号流总是从左向右流动的,梯形图编程示例如图4-2所示。因此种语言与继电器电路很相似,具有直观易懂的特点,很容易被熟悉继电器控制的电气人员所掌握,特别适合数字量逻辑控制,不适合编写大型控制程序。梯形图编程具有以下特点。
图4-2 梯形图编程示例
● 梯形图逻辑易于初学者使用。
● 图形表示法易于理解而且全世界通用。
● LAD编辑器能够使用SIMATIC和IEC1131-3指令集。
● 可以使用STL编辑器显示所有用SIMATIC LAD编辑器编写的程序
3. FBD(功能块图)
FBD(功能块图)使用类似于布尔代数的图形逻辑符号来表示控制逻辑,即以图形方式显示程序及一些复杂的功能。功能块图用类似于与门、或门的框图来表示逻辑运算关系,方框的左侧为逻辑运算的输入变量,右侧为输出变量,输入、输出端的小圆圈表示“非”运算,方框用“导线”连在一起,信号自左向右。FBD非常类似由通用逻辑门图形组成的逻辑电路,示例如图4-3所示。功能块图具有以下特点。
图4-3 FBD示例
● 图形逻辑门的表示形式有利于程序流的跟踪。
● FBD编辑器能够使用SIMATIC和IEC1131-3指令集。
● 可以使用STL编辑器显示所有用SIMATIC FBD编辑器编写的程序。
● FBD比较适合有数字电路基础的编程人员使用。
在图4-3中,逻辑“1”通过FBD元素称为能流。能流的原始输入和最终的输出可以直接分配给操作数。程序逻辑由这些盒指令之间的连接决定。也就是说,一条指令(例如AND盒)的输出可以允许用来激活另一条指令(在图中是定时器T33),这种方法可以建立设计者所需要的复杂控制逻辑。这样的连接概念是S7-200编程系统所特有的,这种梯形图连接方法可以将复杂的逻辑问题化简,并且可以简化梯形图,节省中间继电器。
4.2 S7-200编程概念与规则
S7-200编程的概念就是利用S7-200 PLC系统实现周而复始地执行应用程序,控制一个任务的过程。设计人员可以利用STEP7-Micro/WIN软件创建一个用户程序,将设计并编译好的程序下载到S7-200硬件当中去执行。本节将着重介绍用户在初次编写PLC用户程序时所需要注意的内容与规则。用户程序是通过我们将在第5章中介绍的STEP7-Micro/WIN软件来开发的,它是西门子公司专门针对S7-200系列PLC开发的一套用于PLC用户程序开发的软件。
1. S7-200 PLC程序的组成
要想进行S7-200系列PLC用户程序的开发,首先要了解用户程序的组成。用户程序也可以被叫作应用程序,应用程序主要由主程序、子程序和中断服务程序组成。
(1) 主程序
主程序是程序的主体,它包含有控制应用的指令。在S7-200执行指令时将按顺序执行主程序中的语句。在主程序中的这些指令每个扫描周期执行一次,在下一个扫描周期后将再一次执行主程序中的语句,主程序也可以被叫作OB1。
(2) 子程序
子程序是应用程序中的可选组件。只有被主程序、中断服务程序或者其他子程序调用时,子程序才会被执行。当设计者希望重复执行某项功能时,子程序是非常有用的。与其在主程序中的不同位置多次使用相同的程序代码,不如将这段程序逻辑写在子程序中,然后在主程序中需要的地方调用它。同样,PLC系统在希望重复执行某个函数时,也可使用子程序。与其在希望使用函数的主程序中的各处重复编写函数的逻辑程序,不如在子程序中编写一次函数逻辑程序,然后根据主程序中的需要多次调用子例行程序。调用子程序有如下优点。
● 使用子程序可减少整个程序的大小。
●使用子程序可缩短扫描时间,因为已经将代码移出主程序。无论代码执行与否, S7-200都将在每个扫描周期内对代码进行计算,但只有在调用子例行程序时才对子程序中的代码进行计算,并且 S7-200在不调用子例行程序的扫描期间,将不执行子程序中的程序代码。
● 用子程序创建的程序代码是可传递的。用户可以在一个子程序中完成一个独立的功能,然后将它复制到另一个应用程序中而无需做重复工作。
(3) 中断服务程序
中断服务程序是应用程序中的可选组件。当特定的中断事件发生时,中断服务程序执行。用户可以为一个预先定义好的中断事件设计一个中断服务程序。当特定的事件发生时, S7-200会执行中断服务程序。中断服务程序不会被主程序调用。只有当中断服务程序与一个中断事件相关联,且在该中断事件发生时,S7-200才会执行中断服务程序。比如说,如果系统在某一时刻突然出现过热报警,系统将会自动调用某种保护中断程序来中止当前执行的程序,进而转入保护程序,直到过热报警解除为止。
值得注意的是,无论是以上介绍的哪种程序或者程序块,它们都是由可执行代码和注释组成的。可执行代码由主程序和若干子程序或者中断服务程序组成。可执行代码被编译并下载到S7-200中,而程序注释不会被下载。用户可以使用组织组件(主程序、子程序和中断服务程序)来结构化PLC应用控制程序。一个完整的应用程序示例如图4-4所示。在此应用程序中分别用梯形图和指令表来书写程序,并且包括了为说明这些程序而添加的注释语句。
图4-4 完整应用程序示例
2. 编程规则
对于不同的PLC系统,在进行编程之前必须对所要实施的编程对像及规划有一个良好的认识,就好比在比赛之前要非常清楚比赛的规则一样。
(1) 指令集的定义与区别
当今世界上使用的PLC系统千差万别,不同国家及不同技术流派的PLC厂家生产的PLC工作原理虽然是相似的,但是对于编程语言却有着很大的不同,也就是说大部分PLC产品提供相似的基本指令,但是不同厂商的PLC产品在它们的表示和操作上常常有小的差别。近年来,国际电工委员会(IEC)推出了一个有关PLC编程各个方面的全球标准。这个标准鼓励不同的PLC厂商向用户提供与IEC指令集的表示和操作一致的指令。
在使用S7-200编程语言时,提供了两种指令集用于完成各种自动化任务。一种是符合IEC指令集的IEC1131-3标准,另一种是SIMATIC指令集,此种指令集是是专门为S7-200设计的,并不适用于其他型号及厂家的PLC产品。
下面简单介绍SIMATIC指令集和IEC1131-3指令集之间的一些主要区别。
IEC1131-3指令集是不同PLC厂商的指令标准。SIMATIC指令集中的一些指令并不是IEC1131-3规范中的标准指令。如果使用这些非标准指令,程序就不再严格地与IEC1131-3兼容。
一些IEC指令可以接受多种数据格式,这个概念通常指多重功能。例如,数学指令盒中不区分ADD_I(整数加法)和ADD_R(实数加法),而是在加法指令中检查被加数的格式,并自动选择正确的CPU指令。这样可以节省宝贵的程序设计时间。
当使用IEC1131-3指令时,自动检查指令参数并选择合适的数据格式。数据格式检查不需要用户介入。例如,如果给一个位操作指令输入一个整数值,就会出现一个错误。这样,可以有助于减少编程的语法错误。
初学者在使用SIMATIC或IEC指令集进行PLC编程时,应注意考虑以下问题。
● 在系统执行指令时,由于SIMATIC指令是专门为S7-200系统所设计的,所以通常执行时间最短,而一些IEC指令的执行时间较长。
● 为了统一编程格式,一些IEC指令与SIMATIC指令操作数是不相同的,例如定时器指令、计数器指令、乘法指令和除法指令等。
● S7-200所使用的SIMATIC指令集可以适用于三种程序编程类型(LAD、STL、FBD),并且可以得到较高的执行效率,但只能在LAD和FBD编辑器中使用IEC指令,也就是说STL语言并不适用于IEC指令。
● 对于不同品牌的 PLC,IEC 指令的操作是标准的,因而创建 IEC 程序的知识与PLC操作平台无关。
● 因为IEC标准中定义的指令少于SIMATIC指令集,因而可以用SIMATIC指令完成更多功能。
● IEC1131-3规定变量必须使用类型声明,而且支持系统数据类型检查。
(2) 编程惯例
在使用STEP7-Micro/WIN开发软件进行编程时,根据西门子公司对于PLC编程所设计的规则惯例,需要注意以下问题。
● 在符号名前加井号“#”(#Var1)表示该符号为局部变量。
● 在IEC指令中百分号“%”表示直接地址。
● 操作数符号“?.?”或“????”表示需要一个操作数组态。
以上所说明的问题,初学者也许在短时间内由于没有编程经验并不会完全理解,但是在以后的编程中将逐渐熟悉相应的规则。
另外,梯形图LAD程序被分为程序段。一个程序段是按照顺序安排的以一个完整电路的形式连接在一起的触点、线圈和盒,不能短路或者开路,也不能有能流倒流的现象存在。STEP7-Micro/WIN允许为LAD程序中的每一个程序段加注释。FBD编程使用程序段的概念对程序进行分段和注释。STL程序不用分段,但是用户可以用关键词NETWORK将程序分段。
在STEP7-Micro/WIN的LAD编辑器中,用户可以使用F4、F6和F9快捷键来快速输入触点、盒和线圈指令。需要注意的是:
● 符号“------>>”表示开路或者需要能流连接。
● 符号“”表示指令输出能流,可以级联或串联。
● 符号“>>”表示用户可以使用能流。
在FBD编辑器中,同样可以使用F4、F6和F9来快速输入AND、OR和盒指令。FBD编辑器使用下列惯例。
在使能操作数上的符号“------>>”表示能流或者操作数指示器,它也可用于表示开路或者需要能流连接;符号“”表示指令输出能流,可以级联或串联;符号“<<”和“>>”表示可以使用数值或能流。在FBD中独有的反向圈,它可以将操作数或者能流的负逻辑或者反向输入表示为在输入端加一个小圆圈“o”,如图4-5所示。图4-5中Q0.0等于I0.0的非和I0.1与的结果。反向圈仅用于能够作为参数或能流的布尔信号。
图4-5 FBD使用规则示例
另外,在FBD编辑器中,用在FBD指令输入端加一条垂直线的方法来表示布尔操作数的立即输入,如图4-5所示。立即输入直接从物理输入点上读取数据。立即操作数只能用物理输入点。没有输入或者输出的盒:一个盒没有输入意味着这条指令与能流无关。
3. S7-200中的出错处理
在使用S7-200编程语言进行编程时,不可避免地会出现各错误,但是不同的错误是具有不同的错误等级的。S7-200将错误分为非致命错误和致命错误。
(1) 非致命错误
非致命错误是指用户程序结构问题、用户程序指令执行问题和扩展I/O模块问题。可以用STEP7-Micro/WIN来得到所产生错误的错误代码。非致命错误有三个基本的分类。
● 程序编译错误
当下载程序时,S7-200会编译程序。如果S7-200发现程序违反了编译规则,会停止下载并产生一个错误代码。(对于已经下载到S7-200中的程序将仍然在永久存储区中存在,并不会丢失。)可以在修正错误后再次下载程序。对于编译规则错误的列表,请参考《S7-200系统手册》的“附录C”。
当S7-200系统发生非致命错误时,S7-200并不切换到停止模式,也就是说PLC并不停止运行。它仅仅把事件记录到SM存储器中并继续执行应用程序。但是如果用户希望在发生非致命错误时,将CPU切换到STOP模式,可以通过编程实现。下列例子程序用于监视两个非致命错误标志位。当两个标志中任意一个置位,S7-200将切换到STOP模式,如图4-6所示,其中“(STOP)”就是切换到停止模式的指令,而SM5.0和SM4.3是出现某种非致命错误时的特殊标志位信号,一旦出现错误,它们将被置1。
图4-6 非致使错误的处理
● I/O错误
PLC程序启动时,S7-200从每个模块读取I/O配置。正常运行过程中,S7-200周期性地检测每个模块的状态与启动时得到的配置相比较。如果S7-200检测到差别,它会将模块错误寄存器中的配置错误标志位置位。除非此模块的组态再次和启动时获得的组态相匹配,否则S7-200不会从此模块中读输入数据或者写输出数据到此模块。
模块的启动信息存储在特殊存储器(SM)标志位中。应用程序可以监视这些标志位。关于I/O错误报告的SM标志的更多信息,请参见S7-200系统手册的附录B。例如,SM5.0是全局I/O错误位,当扩展模块上存在一个错误条件时,它将保持置位。
● 程序执行错误
在程序执行过程中有可能产生错误。这类错误有可能来自使用了不正确的指令或者在过程中产生了非法数据。例如:一个编译正确的间接寻址指针,在程序执行过程中,可能会改为指向一个非法地址。这是一个实时程序问题的例子。当实时程序问题发生时,SM4.3会在CPU处于RUN模式期间置位。(实时程序问题的列表参见《S7-200系统手册》的附录C。)程序执行错误信息存储在特殊寄存器(SM)标志位中。应用程序可以监视这些标志位。对于用于报告程序执行错误的SM位的更多信息,请参考《S7-200系统手册》的附录B。
(2) 致命错误
致命错误会导致S7-200停止程序执行。按照致命错误的严重程度,S7-200使其部分或全部功能无法执行。处理致命错误的目的是把CPU引向安全状态,CPU可以对存在的错误条件作出响应。当检测到一个致命错误时,S7-200将切换到STOP模式,打开SF/DIAG (RED)和STOPLED,忽略输出表,并关闭输出。除非致命错误条件被修正,否则S7-200将保持这种状态不变。一旦消除了致命错误条件,必须重新启动CPU。可以用以下方法重新启动CPU。
● 重新启动电源。
● 将模式开关由RUN或者TERM变为STOP。
● 在STEP7-Micro/WIN命令菜单中选择PLC>Power>UpReset,可以强制CPU启动并清除所有致命错误。
重启CPU会清除致命错误,并执行上电诊断测试来确认已改正错误。如果发现其他致命错误,CPU会重新点亮错误LED指示灯,表示仍存在错误。否则CPU会开始正常工作。有些错误可能会使CPU无法进行通信。这种情况下用户是无法看到来自CPU的错误代码的。这种错误表示硬件故障,CPU模块需要修理,而修改程序或清除CPU内存是无法清除这些错误的。
(3) 查看错误
可以通过选择STEP7-Micro/WIN软件菜单中的“PLC”|“Information”菜单命令,来查看因错误而产生的错误代码,如图4-7所示。
图4-7 错误显示
图4-7给出了PLC信息对话框,其中包括错误代码和错误描述。
LastFatal区显示S7-200发生的前一致命错误代码。如果RAM区是掉电保持的,这个数据也会保持。当S7-200全清或者RAM区掉电保持失败时,该区也被清除。
总之,TotalFatal区是前一次CPU清除所有存储区后产生致命错误的次数。如果RAM区是掉电保持的,这个次数也会保持。当S7-200全清或者RAM区掉电保持失败时,该区也被清除。《S7-200系统手册》的附录C列出了S7-200的错误代码,而《S7-200系统手册》附录B描述了可以用于监视错误的特殊存储区(SM)位。
4.3 S7-200基本指令
基本功能指令主要是处理与PLC进行逻辑运算功能相关的操作与编程的。通过基本功能指令的使用可以增加PLC系统指令的灵活性。
1. 逻辑与指令WAND
逻辑与指令可以对不同的数据进行与操作,它的操作对象可以是位、字节及双字类型。以位逻辑与为例,其指令的格式如图4-8中第一个指令符号所示。
图4-8 逻辑与指令
在指令中,EN为使能端。当EN前的逻辑条件满足时,即EN被置位时,与指令才能进行逻辑与运算。IN1和IN2是进行逻辑运算的两个数的输入端。OUT是逻辑运算结果输出端。逻辑指令的使用是对两个输入进行与的操作,并将结果输出到OUT端。逻辑操作的结果影响到特殊存储器位:SM1.0为0,即运算结果为0,则SM1.0置位。
2. 逻辑或指令WOR
逻辑或指令的使用方法与逻辑与指令是相同的,同样可以对位、字节及双字进行操作,其指令符号如图4-8中第二个图形符号所示,只是实现的逻辑功能不同。其中EN为使能端,即当EN前的逻辑条件满足时,才能进行逻辑或运算。IN1和IN2是进行逻辑或运算的两个数的输入端。OUT是逻辑运算结果输出端。逻辑指令的使用是对两个输入进行的操作,并将结果输出到OUT端。逻辑操作的结果影响到特殊存储器位:SM1.0为0,即运算结果为0,则SM1.0置位。
3. 逻辑异或指令WXOR
逻辑异或指令的操作要求与以上介绍的两种指令是一样的,但是其逻辑功能是不同的。其指令符号如图4-8中第三个图形符号所示,它可以使用不同类型的数据格式作为操作数,如位、字、双字等。其中EN为使能端,即当EN前的逻辑条件满足时,才能进行逻辑异或运算。IN1和IN2是进行逻辑异或的数据,不论什么类型的数据,需要二者的数据类型是相同的,即数据中的每一位进行异或操作,进行异或后的结果通过OUT进行输出。综合与逻辑、或逻辑和异或逻辑,其示例如图4-9所示。
图4-9 功能指令示例
当I0.4触点接通时,WAND_W指令将累加器AC1、AC0中的两个数按字进行与运算,并将结果输出到ACO。WOR_W指令将累加器AC1中的数据和变量存储器WV100中的数据按字进行或运算,并将结果输出到VW100中。WXOR_W指令将累加器AC1和AC0中的两个数按字进行异或运算,并将结果输出到AC0。运算过程如图4-10所示。
图4-10 逻辑控制功能指令示例
4. 逻辑取反指令INV
指令对输入字节IN执行求补操作,并将结果载入内存位置OUT。其可用的数据类型为位、字和双字格式。其指令符号如图4-11所示。
图4-11 逻辑取反指令
示例如图4-12所示,当输出信号I4.0为1时,可以进行取反操作。取反的操作对象数据是AC0中的内容,经过取反操作后可以将取反后的数据存到AC0中去,其操作过程如图4-13所示。
图4-12 取反指令符号
图4-13 取反指令执行过程
5. 复位(R)和置位(S)指令
复位(R)和置位(S)指令用来设置或者复位指定的点数(N)的输出。这两条指令的功用是将从指定的地址(位)开始,设置或者复位N个点,即将相应点对应的寄存器中的内容置1,复位时置0。用户可以设置和复位1至255个点。如果“复位”指令指定一个定时器位(T)或计数器位(C),指令复原定时器或计数器位,并清除定时器或计数器的当前值,其指令符号如图4-14所示。
图4-14 置位复位指令
(1) 只有在前面使用过相应逻辑指令,使其状态为“1”(能流通过线圈)时,才会执行复位指令。如果能流通过线圈,将把单元的指定地址复位为“0”。如果在此之前此位或者线圈没有能流通过,此指令将不起作用,此指令所涉及到的所有指定地址的状态将保持不变。此命令对于计数器及计时器的输出也具有同样的复位功能,将在下面的内容中进行介绍。使用示例如图4-15所示。
图4-15 复位与线圈示例
以上梯形图中的示例说明在满足下列条件之一时,将把输出端Q4.0的信号状态复位为“0”:
● 输入端I0.0和I0.1的信号状态为“1”时;
或输入端I0.2的信号状态为“0”时。
● 满足下列条件时才会复位定时器T1的信号状态:
输入端I0.3的信号状态为“1”时。
● 满足下列条件时才会复位计数器C1的信号状态:
输入端I0.4的信号状态为“1”时。
(2) 置位指令与复位指令正好相反,它的作用是将所对应地址中的输出内容置为1,如果先前结果是1,将不受影响;如果是0,最终结果将被置为1。示例如图4-16所示。
图4-16 置位示例
满足下列条件之一时,输出端Q4.0的信号状态将是“1”:
● 输入端I0.0和I0.1的信号状态为“1”时;
或输入端I0.2的信号状态为“0”时。
6. 复原主双稳态触发器RS
复原主双稳态触发器(RS)是一种复原主要位的锁存器。如果设置(S)和复原(R)信号均为真实,则输出(OUT)为虚假。可以通过R、S的真值关系来说明R、S和OUT的逻辑关系。
复原主双稳态触发器(RS)的指令格式如图4-17所示。
图4-17 RS双稳态触发器
下面通过实例说明RS触发器的使用方法,其梯形图如图4-18所示。如果输入端I0.0的信号状态为“1”,I0.1的信号状态为“0”,则置位存储器位M0.0,输出Q4.0将是“0”。否则,如果输入端I0.0的信号状态为“0”,I0.1的信号状态为“1”,则复位存储器位M0.0,输出Q4.0将是“1”。如果两个信号状态均为“0”,则不会发生任何变化。如果两个信号状态均为“1”,将因顺序关系执行置位指令;置位M0.0,Q4.0将是“1”。
图4-18 复原主双稳态触发器(RS)
7. 逻辑堆栈指令
逻辑堆栈指令主要用于指令表(STL)编程。使用梯形图(LAD)、功能块图(FBD)编程时,梯形图(LAD)、功能块图(FBD)编辑器会自动插入相关的指令处理堆栈操作。
逻辑堆栈指令主要应对复杂的逻辑关系编程。逻辑堆栈指令有:栈装载与(ALD)、栈装载或(OLD)、逻辑进栈(LPS)、逻辑出栈(LPP)、逻辑读取(LRD)、装入堆栈(LDS),其指令图形符号如图4-19所示。
图4-19 逻辑堆栈指令
其中,栈装载与(ALD)和栈装载或(OLD)指令主要用于两个或者两个以上的触点组成的串联或并联编程,编程指令无操作数,属于压入/弹出堆栈的指令;逻辑进栈(LPS)、逻辑出栈(LPP)和逻辑读取(LRD)指令用于一个触点同时控制一个或者两个以上输出的编程,指令无操作数。
下面具体介绍各指令的功能。
(1) 栈装载与(ALD)指令
栈装载与(ALD)指令采用逻辑AND(与)操作,将堆栈中的第一级和第二级中的数值组合,并将结果载入堆栈顶部。执行ALD后,堆栈深度减1,并将堆栈中的第三级至第九级的值依次向上弹一级,操作过程如图4-20所示。其中堆栈顶=IV0 AND IV1, X为不确定的随机值。
图4-20 栈装载与(ALD)指令操作示例
(2) 栈装载或(OLD)指令
栈装载或(OLD)指令采用逻辑OR(或)操作,将堆栈第一级和第二级中的数值组合,并将结果载入堆栈顶部。执行OLD后,堆栈深度减1,并将堆栈中的各级内容依次上弹一级,操作过程如图4-21所示。其中堆栈顶=IV0 OR IV1,X为不确定的随机值。
图4-21 栈装载或(OLD)指令操作示例
(3) 逻辑进栈(LPS)指令
逻辑进栈(LPS)指令复制堆栈中的顶值并使该数值进栈。堆栈底值被推出栈并丢失。操作过程如图4-22所示。
图4-22 逻辑进栈(LPS)指令操作示例
(4) 逻辑出栈(LPP)指令
逻辑出栈(LPP)指令将堆栈中的一个数值出栈。第二个堆栈数值成为堆栈新顶值。其余各级栈值依次上弹一级,堆栈第二级的值成为新的栈顶值。栈底被不确定数X所填充,其操作过程如图4-23所示。
图4-23 逻辑出栈(LPP)指令操作示例
需要注意的是,合理地使用LPS和LPP指令可以简化某些程序,但是LPS和LPP必须配对使用。即在执行进栈指令后,必须在程序的某一段使用出栈指令与之相对应,不然系统会报错。
(5) 逻辑读取(LRD)指令
逻辑读取(LRD)指令将第二个堆栈数值复制至堆栈顶部。不执行进栈或出栈,但旧堆栈顶值被复制破坏。其操作过程如图4-24所示。
图4-24 逻辑读取(LRD)指令操作示例
(6) 载入堆栈(LDS n)指令
载入堆栈(LDS)指令复制堆栈中的堆栈位n,并将该数值置于堆栈顶部。堆栈底值被推出栈并丢失。其操作过程如图4-25所示。
图4-25 载入堆栈(LDS 4)指令操作示例
(7) 堆栈逻辑运算实例
● 堆栈逻辑运算实例1
实例1主要使用的是ALD和OLD指令,它的作用是完成一个既有与也有或的复杂梯形图的表达,其梯形图如图4-26所示。
图4-26 堆栈逻辑运算实例1
以上梯形图的指令表及注释如下(STL语言进行注释)。
LD I0.0 //将I0.0压入堆栈为栈顶,堆栈内数值状态如图4-27(a)所示。 LD I0.1 //将I0.1压入堆栈为栈顶,堆栈内数值状态如图4-27(b)所示。 LD I2.0 //将I2.0压入堆栈为栈顶,堆栈内数值状态如图4-27(c)所示。 A I2.1 //将栈顶的I2.0和I2.1进行与操作,并将结果放入栈顶,堆栈内数值状态如图4-27(d)所示。 OLD //将上一步操作的结果(即I2.1和I2.0与的结果)与栈的第二位(I0.1)进行或操作,并将结果存放在栈顶,堆栈内数值状态如图4-27(e)所示。 ALD //将栈顶值与这时栈的第二位(I0.0进行与操作) ,堆栈内数值状态如图4-27(f)所示。 = Q5.0 //输出Q5.0
● 堆栈逻辑运算实例2
图4-27 堆栈逻辑运算实例1堆栈状态图
堆栈逻辑运算实例2主要使用LPS、LRD、LPP等指令。它们的作用是完成一个既有与也有或的更为复杂梯形图的表达,其梯形图如图4-28所示。
图4-28 堆栈逻辑运算实例2
以上梯形图的指令表及注释如下(STL语言进行注释)。
LD I0.0 //将I0.0压入堆栈为栈顶,堆栈内数值状态如图4-29(a)所示。 LPS //复制栈顶的值I0.0,堆栈内数值状态如图4-29(b)所示。 LD I0.5 //将I0.5压入堆栈为栈顶,堆栈内数值状态如图4-29(c)所示。 O I0.6 //将栈顶的I0.5和I0.6进行或操作,并将结果放入栈顶A,堆栈内数值状态如图4-29(d)所示。 ALD //将栈顶值A与这时栈的第二位(I0.0)进行与操作得到B ,堆栈内数值状态如图4-29(e)所示。 = Q7.0 //用此时的栈顶输出Q7.0 LRD //执行读栈操作,将此时堆栈中的第二位数值(即I0.0)复制到栈顶,堆栈内数值状态如图4-29(f)所示。 LD I2.1 //将I2.1压入堆栈为栈顶,堆栈内数值状态如图4-29(g)所示。 O I1.3 //将栈顶的I2.1和I1.3进行或操作,并将结果放入栈顶C,堆栈内数值状态如图4-29(h)所示。 ALD //将栈顶值C与这时栈的第二位(I0.0)进行与操作得到D ,堆栈内数值状态如图4-29(i)所示。 = Q6.0 //用此时的栈顶输出Q6.0 LPP //指令逻辑弹出栈操作,将栈顶的D弹出,将栈第二位数据I0.0作为栈顶,数值状态如图4-29(j)所示。 A I1.0 //将栈顶的I0.0和I1.0进行与操作,并将结果放入栈顶,堆栈内数值状态如图4-29(k)所示。 = Q3.0 //用此时的栈顶输出Q3.0
4.4 运算指令
S7-200的数学运算主要用来完成各种不同类型的数据的数学运算,数学运算包括了常见的加、减、乘、除、自加、自减,及常用的数学函数指令等。
图4-29 堆栈逻辑运算实例2堆栈状态图
1. 加(ADD)减(SUB)法指令
加减法指令是最常用的数学运算指令,可以完成两个数据的加减运算。本指令所支持的数据格式主要有整数型、双整数型和实数型。
(1) 指令介绍
加法和减法指令将IN1和IN2相加或相减,并将结果置于OUT中。输入和输出数据类型可能不同,但必须是相同的类型。例如,两个16位变量可以相加或相减,但结果必须置入一个16位变量中;两个32位变量相加或相减的结果必须置入一个32位变量中。即在梯形图表示中:IN1 + IN2 = OUT,IN1-IN2=OUT。对于加减法的指令,根据不同的数据类型,可以有不同的指令格式,具体格式见表4-6所示。
表4-6 回路表格式
(2) 指令实例
使用一个简单的实例来说明以上指令的使用方法,其梯形图如图4-30所示。
图4-30 加减法指令实例
当I0.0被置位后,将执行加法或减法指令,如果AC1为40,AC0为50,则AC0=90。
2. 乘(MUL)除(DIV)指令
乘法指令将IN1和IN2相乘,并将结果置入由OUT指定的变量中。除法指令用IN1除以IN2,并将结果置入由OUT指定的变量中。本指令所支持的数据格式主要有整数型、双整数型和实数型。
(1) 指令介绍
使用乘法和除法指令时,其输入和输出数据类型可能不同,但对于IN1和IN2必须是相同的类型。例如,两个16位变量的积必须置入一个16位变量中;两个32位变量的积必须置入一个32位变量中。在梯形图中,IN1*IN2=OUT IN1 / IN2 = OUT。对于乘除法的指令,根据不同的数据类型,可以有不同的指令格式,具体格式见表4-2所示。在乘除法中,由于会涉及到被除数为0的情况,所以SM1.3特殊标志位用来标识除数是否为0,如果为0的话,SM1.3将被置位为1。除此之外,设置ENO = 0的错误条件还有当计算结果溢出时SM1.1被置位为1。其他与乘除相关并且在特定条件下也会被置位的标志位有:
表4-2 乘除运算指令格式
(续表)
(续表)
SM1.0 零结果
SM1.1 溢出
SM1.2 负结果
(2) 指令实例
乘除法指令的使用也较为简单,只要了解乘除的数据类型即可熟练掌握。下面通过简单实例说明其使用方法。实例梯形图如图4-31所示。
图4-31 乘除法指令实例
在本实例中,对于MUL乘法指令使16位数据AC1和VW102中的数据相乘,结果存放到32位数据VD100中去;对于DIV指令,使16位数据VW202作为被除数,16位数据VW10作为除数,其结果为32位数据存放到VD200中去。
3. 自增(INC)自减(DEC)指令
自增自减指令主要是为了在PLC控制系统中实现对产品的计数、时间控制、过程控制自动控制功能,是S7-200 PLC系统中简单但是非常重要的指令。
(1) 指令介绍
自增和自减指令对IN执行加1或减1运算,并将结果存入OUT,并且自增和自减指令是不带运算符号的。根据不同的数据类型S7-200的自增自减指令也有不同的指令格式,如表4-3所示。
表4-3 自增减运算指令格式
(续表)
(2) 指令实例
自增自减指令实例的梯形图如图4-32所示。
图4-32 自增自减指令示例
在此示例中,一旦I4.0为1,AC0中数据将会自动增1,而VD100中的数据将会自动减1,结果仍然存放在VD100中。
4. 数学函数指令
数学函数指令是指除了加减乘除这四则运算外的其他运算形式,如开方、自然对数、正弦、余弦、正切等。
表4-4 数学函数指令格式
4.5 顺序控制指令
所谓顺序控制是指生产过程在遵循工艺流程的要求的前提下,按事先安排的顺序自动地进行控制。对于复杂的控制系统,由于内部联锁关系比较复杂,通常需要使用子程序、循环指令、中断指令、顺序控制继电器、定时器、计数器指令等来完成一个复杂的程序。本节将介绍与顺序控制相关的一系列指令的用法与示例。
1. 有条件结束(END)指令
有条件结束(END)根据前一个逻辑条件终止主用户程序,其图形符号如图4-33所示。
图4-33 有条件结束指令
用户可以在主程序中使用“条件结束”指令,但不能在子程序或中断例行程序中使用此命令。其示例如果4-34所示。当I0.0为1时,将结束用户程序。
图4-34 有条件结束指令使用示例
2. 停止(STOP)
停止(STOP)指令能够引起CPU工作方式的变化,从运行(RUN)方式转变为停止(STOP)方式,立即终止程序的执行。如果STOP在中断程序中执行,那么该中断程序立即中止,并且忽略所有挂起的中断,继续扫描主程序的剩余部分。在本次扫描的最后,完成CPU从RUN到STOP模式的转换,其示例及指令符号如图4-35所示。
图4-35 停止指令的使用
3. 跳转(JMP)及标签(LBL)指令
跳转(JMP)及标签(LBL)指令是成对使用的指令,其指令符号如图4-36所示。
图4-36 跳转(JMP)及标签(LBL)指令
通过跳转至标签指令可以对程序中的指定标签(n)执行分支操作,即可以使程序转到同一程序的具体标号处。跳转接受时,堆栈顶值始终为逻辑1。标签(LBL)指令标记跳转目的地(n)的位置。用户可以在主程序、子程序或中断例行程序中使用“跳转”指令。“跳转”及其对应的“标签”指令必须始终位于相同的代码段中(主程序、子程序或中断例行程序)。不能从主程序跳转至子程序或中断例行程序中的标签,与此相似,此指令也不能从子程序或中断例行程序跳转至该子程序或中断例行程序之外的标签,示例如图4-37所示。当SM0.2为1时,程序将跳转至标签4号处执行。
图4-37 跳转及标签指令示例
4. FOR指令和NEXT指令
FOR指令和NEXT指令也是成对使用的一对指令,通过指令的执行可以完成类似于C语言中循环指令的功能,其指令符号如图4-38所示。
图4-38 FOR、NEXT指令循环
(1) 指令介绍
FOR指令用来标示循环的开始,NEXT用来标记循环的结束,并置栈顶指令为“1”。FOR和NEXT指令间的部分称为循环体。使用这对指令必须指定索引值或当前循环计数(INDX)、起始值(INIT)和结束值(FINAL)。NEXT指令标记FOR循环结束,并将堆栈顶值设为1。使用FOR/NEXT指令描述为指定计数重复的循环。每条FOR指令要求一个NEXT指令。用户可以复原FOR/NEXT循环(在FOR/NEXT循环中放置一个FOR/NEXT循环),深度可达8层嵌套。例如,假定INIT值等于1,FINAL值等于10,FOR与NEXT之间的指令被执行10次,INDX值递增:1、2、3……10。如果起始值大于结束值,则不执行循环。每次执行FOR和NEXT之间的指令后,INDX值递增,并将结果与结束值比较。如果INDX大于结束值,循环则终止。
(2) 指令使用实例
下面通过一个两层的嵌套实例说明FOR/NEXT指令的使用方法,梯形图如图4-39所示。
图4-39 FOR/NEXT指令使用实例
5. 子程序SBR
在使用S7-200进行编程时,子程序可以将程序进行分块。在用户的主程序中可以随意地调用事先编好的子程序。当主程序调用子程序并执行时,子程序执行全部指令直至结束。然后,系统将控制返回至调用子程序网络中的主程序。
(1) 子程序指令介绍
子程序的主要作用在于将大块程序进行分段和分块,使其成为较小的、更易管理的块。在程序中调试和维护时,可以利用这项优势,通过使用较小的程序块,对这些区域和整个程序简单地进行调试和排除故障。只在需要时才调用程序块,因为所有的程序块可能无须执行每次扫描,所以使用子程序进行编程可以更有效地使用PLC的硬件系统,提高运行效率。
最后,如果子程序仅引用参数和局部内存,则可移动子程序。为了移动子程序,应避免使用任何全局变量/符号(I、Q、M、SM、AI、AQ、V、T、C、S、AC内存中的绝对地址)。如果子程序并没有调用参数(IN、OUT或IN_OUT)或仅在L内存中使用局部变量,就可以导出子程序并将其导入另一个项目,子程序的指令符号如图4-40所示。
图4-40 子程序指令符号
当子程序被调用时,整个逻辑堆栈被保存,堆栈顶端被设为1,所有其他堆栈位置被设为0,控制被传送至调用子程序。当该子程序完成时,堆栈恢复为在调用点时保留的数值,控制返回调用例行程序。子程序和调用例行程序共用累加器。由于子程序的使用,对累加器不执行保存或恢复操作。
如果在程序中使用子程序,必须经过:建立子程序、在子程序局部变量表中定义参数(如果有的话)、从主程序或另一个子程序里调用子程序三个步骤。
建立子程序是通过编程软件来实现的,可用STEP7-MicroWIN编程软件的“编程”菜单中的“插入”命令来生成一个新的子程序。新生成的子程序的默认名称是SBR_n,编号n从零开始按递增顺序生成,也可以改变子程序的名字,使用用户更熟悉的程序名。子程序在编程软件中的使用方法将在第5章中有详细介绍。产生新的子程序后,可以供给主程序使用,并且在子程序的最后系统将自动返回指令CREaT,并不需要用户手动编写。也就是说子程序是用户建立的主程序结构之外建立的一个程序,可以通过图4-40所示的指令进行调用(其中子程序的名称即为:SBR_N)。
(2) 子程序的参数
在子程序的调用过程中可以进行参数的传递,参数在子程序的局部变量表中进行定义(见图4-41所示),参数由地址、参数名称(最多8个字符)、变量类型和数据类型描述。子程序最多可以传递16个参数。带参数的子程序调用命令,如图4-42所示。
图4-41 STEP7-Micro/WIN32局部变量表
图4-42 带参数调用子程序示例
如果需要增加参数条目,将光标放在用户希望增加的类型的变量类型域上(IN、IN_OUT或OUT)。单击鼠标右键,获得选项菜单。选择“插入”命令,然后选择“下一行”选项。在当前条目的下方会显示所选类型的另一个参数条目,如图4-43所示。
图4-43 为子程序添加新参数
子程序中使用的参数都属于局部变量。局部变量表中的变量类型区定义的变量有:传入子程序参数(IN),传入/传出子程序参数(IN/OUT)、传出子程序参数(OUT)、临时变量(TEMP)4种类型,关于子程序中的各个参数类型的说明如下。
IN:参数被交接至子程序。如果参数是直接地址(例如VB10),在指定位置的数值被交接至子程序。如果参数是间接地址,(例如*AC1),位于指向位置的数值被交接至子程序。如果参数是数据常数(16#1234)或地址(&VB100),常数或地址数值被交接至子程序。
IN_OUT:位于指定参数位置的数值被交接至子程序,来自子程序的结果数值被返回至相同的位置。输入/输出参数不允许使用常数(例如16#1234)和地址(例如&VB100)。
OUT:来自子程序的结果数值被返回至指定的参数位置。常数(例如16#1234)和地址(例如&VB100)不允许用作输出。
TEMP:未用作交接参数的任何本地内存不得用于子程序中的临时存储。
在子程序中使用参数,需要注意以下几个问题。
首先,常数参数必须声明其数据类型,例如,把值为111234的无符号双字作为参数传递时,必须用DW#111234来指明其数据类型。如果缺少常数参数转换这一描述,常数可能会被当作不同类型使用。第二,输入或者输出参数没有自动数据类型转换功能。例如,局部变量表中声明一个参数为实型,而在调用时使用一个双字,则子程序中的值就是双字。最后,参数在调用时必须按照一定的次序排列,显示输入参数,然后是输入输出参数,最后是输出参数和暂时变量。
6. 顺序控制继电器指令(SCR)
在运用PLC进行顺序控制中常采用顺序控制指令,顺序控制指令可以将程序功能流程图转换成梯形图程序,功能流程图是设计梯形图程序的基础。首先用程序流程图来描述程序的设计思想,然后再用指令编写出符合程序设计思想的程序。使用功能流程图可以描述程序的顺序执行、循环、条件分支和程序的合并等功能流程概念。
(1) 功能流程图
功能流程图是按照顺序控制的思想,根据工艺过程,将程序的执行分成各个程序步。通常用顺序控制继电器的位S0.0~S31.7代表程序的状态步。每一步由进入条件、程序处理、转换条件和程序结束等四部分组成。图4-44为一个三步循环步进的功能流程图,图中的每个方框代表一个状态步,1、2、3分别代表程序3步状态。程序执行到某步时,该步状态位置1,其余为0。步进条件又称为转换条件。状态步之间用有向连线连接,表示状态步转移的方向;有向连线上没有箭头标注时,方向为自上而下,自左而右。有向连线上的短线表示状态步的转换条件(步进条件)。
图4-44 循环步进功能示意图
(2) 顺序控制指令介绍
在S7-200中的顺序控制指令有3条,描述了程序的顺序控制步进状态,指令格式如图4-45所示。
图4-45 顺序控制符号图
● 顺序步开始指令 (LSCR)
LSCR为步开始指令,该程序步执行。步开始指令,为步开始的标志。该步的状态元件的位被置1时,执行该步。
● 顺序步结束指令(SCRE)
SCRE为顺序步结束指令。顺序步的处理程序在LSCR和SCRE之间。步结束指令,为步结束的标志。
● 顺序步转移指令(SCRT)
SCRT为步转移指令。使能输入有效时,将本顺序步的顺序控制继电器位清零,下一步顺序控制继电器位被置1。步转移指令,使能有效时,关断本步,进入下一步。该指令由转换条件的接点启动,n为下一步的顺序控制状态元件。
(3) 程序示例
本例将使用顺序控制结构,编写出实现红、绿灯循环显示的程序(要求循环间隔时间为1 s)。
根据控制要求首先画出红绿灯顺序显示的功能流程如图4-46所示。
图4-46 红、绿灯功能流程图
启动条件为按钮I0.0,步进条件为时间,状态步的动作为点红灯,熄绿灯,同时启动定时器,步进条件满足时,关断本步,进入下一步。梯形图程序如图4-47所示。
图4-47 功能图流程示例梯形图
当I0.0输入有效时,启动S0.0,执行程序的第一步,输出Q0.0置1(点亮红灯),Q0.1置0(熄灭绿灯),同时启动定时器T37,经过1 s,步进转移指令使得S0.1置1,S0.0置0,程序进入第二步,输出点Q0.1置1(点亮绿灯),输出点Q0.0置0(熄灭红灯),同时启动定时器T38,经过1 s,步进转移指令使得S0.0置1,S0.1置0,程序进入第一步执行。如此周而复始,循环工作。
7. 定时器指令
S7-200指令集提供以下三种不同类型的定时器。
● 接通延时定时器(TON):用于单间隔计时。
● 掉电保护性接通延时定时器(TONR):用于累计一定数量的定时间隔。
● 断开延时定时器(TOF):用于延长时间以超过关闭时间(或假条件),例如电机关闭后使电机冷却。
定时器的计时是以PLC内容的时钟脉冲来计时的,定时器的定时分辨率,即时基有三种:1 ms、10 ms、100 ms。使用不同的定时器号,可以得到不同的定时器时基,即时基只对应特定的定时器分辨率,如表4-5所示。
表4-5 定时器号和分辨率
定时器的总数有256个,可以使用的定时器号范围为0~255。每个定时器的变量有两个。一个是存放当前时间值的16位有符号整数,它存放在当前值寄存器中。另外一个变量是定时器位,当前时间大于等于设定时间值时,该位将被置为1。
(1) 接通延时定时器(TON)
接通延时定时器(TON)在PLC系统中的功能是用来模拟通电延时型物理时间继电器的。此定时器有两个输入端IN和PT,其图形符号如图4-48所示。
图4-48 接通延时定时器符号
当允许输入端IN接通时,定时器开始计时。当前值开始以时基的整数倍进行计时,一旦当前值(Txxx)中所存放的时间值大于或等于预设时间(PT)时,定时器位被接通。这里所说的设定时间是指时基的整数倍,也就是说预设时间等于PT值乘以时基。如果我们使用计时器需要计时5 s的时间,可以采用37号定时器来计时,它的时基是100 ms,由于5 s=100 ms×50,所以这时PT的值应该是50。
当定时位被接通后,定时器并不会停止计时,而是在当前值达到预设值后,定时器仍继续计时,一直达到最大值3276.7时,才停止计时。无论在计时过程中,还是在计时后,一旦启用输入端IN被关闭,延时定时器的当前值将被清除。
以梯形图为例说明通电延时型定时器的使用方法,梯形图如图4-49所示。
图4-49 接通延时型定时器示例
在此例中,定时器采用37号定时器,它的时基经查表4-5可知是100 ms,在PT端输入设定值是10,也就是说此定时器的设定时间=100 ms×10=1 s。一旦I0.0接通后,定时器开始计时,在1 s钟后T37将被置位,Q0.0将会输出,时序图如图4-50所示。
图4-50 时序图
在时序中可看出,当I0.0有了第一个上升脉冲后,定时器开始计时,但是由于I0.0持继的时间不够长,所以定时器位还没有被打开就由于I0.0的断开而被清零了。在下一个I0.0的上升沿来临后,定时器重新开始定时,达到所设定的时间1 s后,定时器位被打开,Q0.0有输出。定时器并不会停止工作,而是会一直计时直到I0.0由高电平转换成低电平,定时器位不能接通输出,进而Q0.0被关断。在I0.0的第三个上升沿脉冲来临后,定时器又重新工作,并且在达到1 s后再次打开定时器位,带动Q0.0输出。而后定时器的当前值一直计时到达到其所能定时的最大值3276.7 s,此时定时值不再增长,一值保留为3276.7 s。
利用定时器可以得到不同形状的脉冲。下面通过一个实例说明在实际工程设计中如何使用接通延时型定时器来得到矩形波脉冲,其PLC程序梯形图如图4-51所示。
图4-51 产生矩形波梯形图
在此例中将会用到下面将会学习的比较指令,读者可以查阅4.5节。在此例中,使用的定时器为T33,查表4-5可知,它的时基是10 ms。并且计时值为100,也就说计时最大时间为10 ms×100=1 s。常闭触点M0.0的使用是使PLC在一上电时就立即触发定时器,使其开始计时。第二条指令中,使用了比较指令,比较的对象是定时器T33的当前值和40,即当定时器的当前值寄存器中的数值大于等于40时,Q0.0将会有输出。此时的计时值为40×10 ms=0.4 s。在第三条指令中,如果定时器达到其设定时间1 s时,将对触点M0.0置位,在下一个周期开始时,PLC将执行第一条指令,此时M0.0由于已经被置位为1,所以其常闭触点将被打开,定时器计时清零,进而关断T33的输出Q0.0。这样就会形成一个周期为1 s,点空比为2:3的矩形波,其时序图如图4-52所示。
图4-52 矩形波时序图
(2) 掉电保护型接通延时定时器(TONR)
掉电保护型接通延时定时器(TONR)与接通延时定时器的主要区别在于对当前值的保存上。此定时器可以在输入端使能信号消失后保存已经累计的当前值,而不是像接通延时定时器那样,一旦定时器启动输入端IN信号消失后,指令自动将当前值清零。即体现其掉电保护的特征,其指令信号如图4-53所示。
图4-53 掉电保护型接通延时定时器符号
掉电保护型接通延时定时器的工作原理如下:在输入端IN为“打开”状态时,定时器开始计时。一旦当前值(Txxx)大于或等于预设时间(PT)时,计时位被置位为1。一旦输入端为“0”,即为“关闭”状态时,定时器将保持保护型延迟定时器当前定时值。一旦输入端IN再次有信号输入时,定时器将恢复计时功能,但是此时定时器的计时并不是从零开始的,而是从上一次保留在当前值寄存器中的计时值开始继续计时的,一旦达到所设定的计时值,相应的计时位将被置位为1。在计时的过程中可以使用“复位”指令(R)清除保护型延迟定时器的当前值。同样的,当定时器达到预设值后,定时器继续计时,达到其最大值32767时,停止计时。关于掉电保护型接通延时定时器的时基可以查看表4-5。
下面举例说明掉电保护型接通延时定时器的使用方法,示例梯形图如图4-54所示。
图4-54 掉电保护型接通延时定时器示例
此例主要由三条指令组成,第一条指令使用的是掉电保护型接通延时定时器T1,其时基为10 ms,其设定值为100。第二条指令是使用T1的定时器位,用来控制Q0.0的输出。当I0.1为1时,将使T1复位,时序图如图4-55所示。
图4-55 掉电保护型接通延时定时器时序图
当I0.0有一个上升沿来临时,掉电保护型接通延时定时器开始计时。在经过60个计时时基后,I0.0由高电平转换成低电平,此时的计时值并不会像通电延时定时器那样会被清零,而是被保存在掉电保护型接通延时定时器的当前值寄存器中等待I0.0的下一个上升沿的来临,T1并不会被置位输出。在I0.0的下一个上升沿来临时,掉电保护型接通延时定时器T1将继续计时,经过40个计时时基后,当前值达到PT设定值100,此时累计定时100个时基,总共定时1 s,此时Q0.0将被输出置位。Q0.0后定时器将会继续计时,一直到I0.1的上升沿出现,定时器T1被复位,这时T1定时器的当前值被清零,定时位被复位为零,输出Q0.0被复位为零。
(3) 断开延时定时器(TOF)
断开延时定时器用来模拟断电延时型物理时间继电器功能。当输入端IN被置位接通时,其定时器位立即接通为1。当输出端IN由高电平向低电平转换时,即IN检测到脉冲的负跳变时,将立即启动定时器的定时功能,当前值开始累加,在达到设定值PT时,定时器将定时器位复位为“0”。如果输入端IN关闭的时间短于预设数值,即定时器还未达到设定时间时,IN又检测到了高电平,则定时器位仍保持在“1”的打开状态。直到再次检测到IN从高电平到低电平的负跳变才重新计时,其符号如图4-56所示。
图4-56 断开延时定时器指令符号
下面通过具体实例说明断开延时定时器的使用方法,其梯形图如图4-57所示。
图4-57 断开延时定时器示例梯形图
当I0.0接通时,定时器T33将会立即置位其定时位T33,进而使得T33为1。当定时器的输入端IN检测到I0.0的下降沿时,定时器T33开始以10 ms的时基进行定时。当T33当前值达到设定值100时,T33被复位为“0”,关断输出。如果指令检测到I0.0的负跳变后计时不超过100个时基,即如图4-58所示,只是计时了80个脉冲,I0.0又变成了高电平,则定时器T33将重新定时。
图4-58 断开延时定时器示例时序图
定时器的使用既有区别也有联系,所以在使用定时器时需要注意以下事项以保证在编程过程中不出错进而达到编程目的。
● 不能把一个定时器号同时用作断开延时定时器(TOF)和接通延时定时器(TON),否则相当于同一定时器既作为模拟断电延时型的物理时间继电器使用又作为通电延时型的物理继电器使用。
● 使用复位(R)指令对定时器复位,执行复位执令时,定时器位断开,定时器值清零。
● 掉电保护型接通延时定时器(TONR)只能通过复位指令进行复位操作。
断开延时定时器(TOF)复位后,如果需要再启动,需要在允许输入端有一个负跳变的输入信号来启动定时器。
(4) 时基对定时器的影响
不同的定时器的时基是不同的,不同的时基在使用过程中会有不同的使用方法。使用不同定时器的时基可以使定时器的使用更加灵活与方便,但是如果不能理解时基的工作原理及使用注意事项,就有可能在程序设计过程中陷入困境。
正如前面已经介绍过的,S7-200使用的定时器时基主要有以下几种,现详细介绍如下。
● 1 ms时基
1 ms定时器记录自现用1 ms定时器启用以来1 ms定时器间隔的数目。执行定时器指令即开始计时;但是,1 ms定时器每1 ms更新一次(定时器位及定时器当前值),不与扫描循环同步。换言之,在超过1 ms的扫描过程中,定时器位和定时器当前值将多次更新。下面以实例说明时基的使用注意事项,实例梯形图如图4-59所示。
图4-59 1 ms时基使用实例
在此例中,如果使用T32作为定时器的触发信号,使用1 ms定时器时,每次在执行正常关闭触点T32之后和执行正常打开触点T32之前更新定时器当前值时,Q0.0即打开进行一次扫描。而这种机会是比较小的,也许这样可能永远也不会启动定时器。
定时器指令用于打开和复原定时器,如果是TONR定时器,则用于关闭定时器。因为可在1 ms内的任意时刻启动定时器,预设值必须设为比最小要求定时器间隔大一个时间间隔。例如,使用1 ms定时器时,为了保证时间间隔至少为56 ms,则预设时间值应设为57。
● 10 ms时基
10 ms定时器记录自现用10 ms定时器启用以来10 ms定时器间隔的数目。执行定时器指令即开始计时;但是,在每次扫描循环的开始更新10 ms定时器,其方法是以当前值加上积累的10 ms间隔的数目(自前一次扫描开始算起)。换言之,在整个扫描过程中,定时器当前值及定时器位保持不变。
通过图4-60所示的梯形图可以说明时基为10 ms的PLC定时器指令的使用方法。
图4-60 10 ms时基使用实例
在使用10 ms定时器时,图4-60(a)将从不打开Q0.0,因为从扫描顶端至执行定时器指令均会打开定时器位T33,即一旦执行了,定时器T33的常开触点将会变成常闭,常闭触点会变成常开触点。这样定时器的当前值及定时器位均被设为零,进而使得执行正常打开触点T33时,T33及Q0.0均被关闭。
另外,因为可在10 ms内的任意时刻开始定时器,预设值必须设为比最小要求定时器间隔大一个时间间隔。例如,使用10 ms定时器时,为了保证时间间隔至少为140 ms,则预设时间值应设为15。
● 100 ms时基
100 ms定时器记录自现用100 ms定时器上一次更新以来100 ms定时器间隔的数目。这种定时器的更新方法是在执行定时器指令时以当前值加上积累的100 ms间隔的数目(自前一次扫描开始算起)。
只有在执行定时器指令时才对100 ms定时器的当前值进行更新。因此,如果启用了100 ms定时器但并未对各扫描循环执行定时器指令,则仍不能更新定时器当前值并将丧失时间。同样,如果在单个扫描循环内多次执行100 ms定时器指令,将向定时器的当前值多次增加100 ms间隔数,赢得时间。只有在每次扫描循环仅仅执行一次定时器指令时,才应该使用100 ms定时器,因为可在100 ms内的任意时刻启动定时器,预设值必须设为比最小要求定时器间隔大一个时间间隔。例如,使用100 ms定时器时,为了保证时间间隔至少为2100 ms,则预设时间值应设为22。
8. 计数器指令
S7-200的计数器是对外部的或由程序产生的脉冲进行计数。计数器是累计其计数输入端的计数脉冲由低到高的次数。S7-200有三种类型的计数器:增计数器、减计数器和增/减计数器。计数器共有256个,计数器的范围是C(0~255),计数器的相关变量有两个,一个是由16位有符号数存放的当前值;一个是一位单独的计数位,当计数器中值大于或者等于设定值时,此位为1。
(1) 增计数器指令CTU
当增计数器的计数器输入端(CU)有一个计数脉冲的上升沿时,CU向上计数。当输入CU从关闭向打开转换时,增计数指令从当前值向上计数。增计数器的当前值(Cxxx)大于或等于预设值(PV)时,计数器位(Cxxx)打开。计数器中的复位输入端(R)有效时,计数器被复位,当前值被清零,计数器位为“0”。另外,当计数器的当前值达到最大值(32767)时,计数器停止计数。增计数器的范围为从Cxxx=C0至C255。并且在STL中,CTU复位输入是堆栈顶值,向上计数输入是装载在第二个堆栈位置的值。因为每个计数器有一个当前值,而且号码相同的增计数器、减计数器、增/减计数器访问相同的当前值,所以在使用过程当中不可以将相同的计数器号码设置给一个以上计数器,否则系统将会提示出错。增计数器的图形符号如图4-61所示。
图4-61 增计数器符号
(2) 减计数器CTD
减计数器与增计数器的使用方法是类似的,所不同的是当输入端CD有信号时,减计数器指令从当前值向下计数。经过一段时间的计数后,当前值Cxxx等于零时,计数器位(Cxxx)打开。载入输入(LD)打开时,计数器复原计数器位(Cxxx)并用预设值(PV)代替当前值,也就是说减计数器是没有复位功能的,在装入新的预设值时,即相当于被复位。当前值达到零时,向下计数器停止计数,计数器位Cxxx打开。减计数器的使用范围是:从Cxxx=C0至C255。并且在STL中,CTD载入输入是堆栈顶值,而向下计数输入是装载在第二个堆栈位置的数值。同样,因为每个计数器有一个当前值,而且号码相同的增计数器、减计数器、增/减计数器访问相同的当前值,所以在使用过程当中不可以将相同的计数器号码设置给一个以上计数器,否则系统将会提示出错。减计数器的图形符号如图4-62所示。
图4-62 减计数器符号
下面通过一个梯形图实例说明减计数器是如何使用的,梯形图如图4-63所示。
图4-63 减计数器使用示例梯形图
当I0.0和I0.1有信号后时,计数器输入预设值3,并且向下计数,计数器C1当前值从3计数至0,这时C1减计数器将打开进而接通Q0.0。本例的时序图如图4-64所示。
图4-64 减计数器应用时序图
(3) 增/减计数CTUD
增/减计数指令既可以进行增计数也可以进行减计数,较前两种计数器使用起来稍微复杂,其指令符号如图4-65所示。
图4-65 增/减计数器指令符号
指令中的Cxxx代号是用来标示计数器的号码的,与其他计数器一样可以从C0到C255。对于布尔类型的输入端CU和CD,它们是计数器类型的选择端。这两个输入端的作用是,可以选择此计数器作为增计数器还是减计数器(CD)来使用。如果CU为1,计数器将进行增计数;如果CD为1,计数器将作为减计数器来使用。使用类型的选择主要是靠这两个输入端的脉冲形式来区别的:每次CU从关闭向打开转换时,增/减计数器指令开始增计数,每次CD从关闭向打开转换时,计数器向下计数。Cxx用来存储计数器的当前值时,它的数据类型可以是一个有符号的16整数,最大值为32767。
当此计数器作为增计数器使用时,在计数的过程当中,指令将检查当前值Cxx是否大于或等于预设值PV,如果大于,计数器位Cxx将打开。否则,计数器位关闭。计数器每次执行计数器指令时,将预设值PV与当前值进行比较,当前值如果达到最大值(32767),计数器将在CU的下一个上升沿到来后使当前值反转为最小值(-32768)。同理,在计数器当前值达到最小值(-32768)时,计数器将在CU的下一个上升沿将当前计数时反转为最大值(32767)。当“复位”(R)输入打开或执行“复位”指令时,计数器被复位。而对于当计数器作为减计数时使用时,需要计数类型选择输入端为1,其他的使用方法与普通减计数是相同的,只是计数器被置位的条件是需要当前值大于或者等于PV值,而不是需要将当前值减为零。在这里不再重复说明。
下面举例说明增/减计数器的使用方法,其梯形图如图4-66所示。计数器的类型由I0.0 (增计数)和I0.1(减计数)来确定。其中I0.2作为复位信号。无论是增计数还是减计数,它们的计数终值都为4。根据如图4-67所示的时序图可知,当I0.0有一个上升沿后,计数器将作为增计数器使用,并且在当前值C48=4时,布尔型的计数器值C48变为1,进而打开输出Q0.0。当I0.1有了一个上升沿后,此计数器作为减计数器使用,当前值从5开始递减,当当前值递减为3时,计数器将不再置位C48,C48为“0”,不输出,所以Q0.0为“0”。接着I0.0又出现上升沿,计数器将再次作为增计数器使用,接着进行增计数,当当前值为4时,再次打开输出O0.0。而后,复位端R出现复位信号后,计数器将被清零,并关闭输出Q0.0。
图4-66 增/减计数器示例梯形图
图4-67 示例时序图
4.6 S7-200高级指令
在本节中,读者将学习到PLC编程的高级指令系统。它们是指令系统中应用于复杂控制的指令。本章介绍的功能指令包括:比较指令、PID指令、高速计数器指令等。高级指令的使用较之基本指令系统,功能更为强大,操作更为复杂。
1. 比较指令
比较指令是对两个地址中的数据进行比较,如果比较结果为真,则功能的指令输出为“1”。以“等于”指令为例,其图形符号如图4-68所示。图示指令为“等于”比较指令,其他指令的形式是相同的,只是指令中的比较符号不同而已。
图4-68 比较指令符号示例
比较指令是将两个操作数按规定的条件作比较,条件成立时,触点就闭合。比较指令由于不同的比较形式而产生不同类型的比较指令,如果假设需要对IN1和IN2进行比较的话,其比较可能有以下几种不同的形式。
= = :IN1等于IN2
<>:IN1不等于IN2
>:IN1大于IN2
<:IN1小于IN2
>=:IN1大于等于IN2
<=:IN1小于等于IN2
根据不同的比较形式,可以有不同的比较命令。而根据不同的比较数据,可以分为字节比较、整数比较、实数比较和双字整数比较四种形式。
(1) 字节比较。字节比较用于比较两个字节型整数值INl和IN2的大小,字节比较是无符号的。比较式可以是LDB、AB或OB后直接加比较运算符构成。如:LDB=、AB<>、OB>=等。
整数INl和IN2的寻址范围:VB、IB、QB、MB、SB、SMB、LB、*VD、*AC、*LD和常数。
STL指令格式例如:LDB=VBl0,VBl2。
(2) 整数比较。整数比较用于比较两个一字长整数值INl和IN2的大小,整数比较是有符号的(整数范围为16#8000和16#7FFF之间)。比较式可以是LDW、AW或OW后直接加比较运算符构成。如:LDW=、AW<>。OW>=等。
整数INl和IN2的寻址范围:VW、IW、QW、MW、SW、SMW、LW、AIW、T、C、AC、*VD、*AC、*LD和常数。
STL指令格式例如:LDW=VWl0,VWl2。
(3) 双字整数比较。双字整数比较用于比较两个双字长整数值INl和IN2的大小,双字整数比较是有符号的(双字整数范围为16#80000000和16#7FFFFFFF之间)。比较式可以是LDD、AD或OD后直接加比较运算符构成。如:LDD=、AD<>、OD>=等。
双字整数INl和IN2的寻址范围:VD、ID、QD、MD、SD、SMD、LD、HC、AC、*VD、*AC、*LD和常数。
STL指令格式例如:LDD=VDl0,VDl2
(4) 实数比较。实数比较用于比较两个双字长实数值INl和IN2的大小,实数比较是有符号的(负实数范围为-1.175495E-38和-3.402823E+38,正实数范围为+1.175495E-38和+3.402823E+38)。比较式可以是LDR、AR或OR后直接加比较运算符构成。如:LDR=、AR<>、OR>=等。
实数INl和IN2的寻址范围:VD、ID、QD、MD、SD、SMD、LD、AC、*VD、*AC、*LD和常数。
STL指令格式例如:LDR=VDl0,VDl2。
S7-200在使用比较指令时遇到非法间接地址(任何比较指令)或者是遇到非法实数(在使用“实数比较”指令时)将会报严重错误,会使S7-200立即停止执行程序。为了防止出现此类条件,用户必需在执行使用此类数值的比较指令之前,以适当的方式初始化指针和包含实数的数值。无论使能位状态如何,“比较”指令均会执行。
(5) 比较指令使用实例
比较指令在PLC系统中主要是用来比较数据的大小,一般常常用来判断物体的重量、产品的数目、开关的次数等以数据作为控制参照的控制系统当中,其示例梯形图如图4-69所示。在此例中使用了位比较、双字比较及实数比较指令。表示指令上端数据(VW0、-150000000和VD6)IN1和下端数据(+10000、VD2和5.001E-006)IN2它们的比较关系分别是大于、小于和大于。即一旦相应比较关系满足相应Q0.2、Q0.3和Q0.4会被置位输出。
图4-69 比较指令示例梯形图
2. 移位寄存器指令
移位寄存器指令可以用来进行顺序控制、物流及数据流控制等。移位寄存器指令(SHRB)的图形符号如图4-70所示。
图4-70 移位寄存器指令符号
移位寄存器指令(SHRB)将输入数据DATA数值移入移位寄存器,并进行移位操作。移位寄存器由N和S_BIT决定。N指定移位寄存器的长度和移位方向,如果N为正数表示是正向移位,如果N为负数则表示是负向移位。S_BIT指定移位寄存器的最低位。SHRB指令移出的每个位被放置在溢出内存位(SM1.1)中。该指令由最低位(S_BIT)和由长度(N)指定的位数定义。
在使用移位寄存器位时,当允许输入端(EN)有效时,在每个扫描周期使移位寄存器各位移动一位。由允许输入端(EN)的每个上升沿时序对DATA端进行采样一次,把输入端DATA的数值移入移位寄存器,正向移位时,输入数据从移位寄存器的最低有效位移入,从最高有效位移出。移位寄存器指令在使用过程中会使用到溢出存储器位(SM1.1)。如果在移位的过程当中出现了数据溢出现象,此位将用来放置溢出的数据位。N为字节型数据类型,移位寄存器的最大长度为64位。操作数DATA、S_BIT为BOOL型数据类型。
用户可以使用以下公式,使用移位寄存器指令的最低有效位(S_BIT)和移位长度(N)来计算“移位寄存器”最高位地址(MSB.b):
MSB.b = [(S_BIT字节)+([N]-1+(S_BIT位))/8] . [被8除的余数]
例如:如果S_BIT是V33.4和N是14,以下计算显示MSB.b是V35.1。
MSB.b = V33 + ([14]-1+4)/8
= V33 + 17/8
= V33 + 2 ,余数为1
= V35.1
在“移位减”(用长度(N)的负值表示)中,输入数据(DATA)移入移位寄存器的最高位中,并移出最低位(S_BIT)。移出的数据被放置在溢出内存位(SM1.1)中。
在“移位加”(用长度(N)的正值表示)中,输入数据(DATA)移入移位寄存器的最高位中(由S_BIT指定),并移出移位寄存器的最高位。移出的数据被放置在溢出内存位(SM1.1)中。
移位寄存器的最大长度为64位(无论正负)。N为负值和正值位移状况如图4-71所示。
图4-71 移位示例
在图4-71(a)中,移位寄存器的长为14,输入数据移入移位寄存器的最高位V35.1中,并移出最低位V33.4(S_BIT)。移出的数据1被放置在溢出内存位(SM1.1)中。
在图4-71(b)中,移位寄存器的长为14,输入数据(DATA)移入移位寄存器的最高位V33.4中(由S_BIT指定),并移出移位寄存器的最高位。移出的数据1被放置在溢出内存位(SM1.1)中。
下面通过一个具体实例说明移位寄存器指令的使用方法,梯形图如图4-72所示。
图4-72 移位寄存器指令示例梯形图
当I0.0高电平来临时,将对EN产生一个正向跳变进而启动移位指令。移位指令的数据输入端DATA通过I0.3提供BOOL型数据,最低为V100.0,移位寄存器的长度为4,即移动寄存器的最高位为V100.3。由于N=4是正数,所以在第一次跳变时,将I0.3的信号“1”移入移位寄存器的最低位V100.0,此时V100.0~V100.3为1011,SM1.1为0;第二次移位时,将I0.3的信号“0”移入V100.0,此时V100.0~V100.3为0110,SM1.1为1,其时序图及移位寄存器状态如图4-73所示。
图4-73 时序图及移位寄存器状态图
3. 表功能指令
S7-200编程的思想同样是在软件工程编程的思想的指导进行的,其中表的提示就是软件工程中数据结构的一种形式。它是可以用来存放数据的表格,由多个WORD字型的存储器组成。对于初学者来说理解表的概念与使用方法并不容易,在以后的工程实践当中会逐渐了解并学会如何使用表功能指令。
(1) 填表(ATT)指令介绍
填表指令是表格的初始化操作,用来对表格的初始值进行输入操作。
填表(ATT)指令向表格(TBL)中加入字值(DATA)。表格中的第一个数值是表格的最大长度(TL)。第二个数值是条目计数(EC),指定表格中的条目数。新数据被增加至表格中的最后一个条目之后。每次向表格中增加新数据后,条目计数加1。表格最多可包含100个条目,不包括指定最大条目数和实际条目数的参数,其指令格式如图4-74所示下面通过一个实例说明填表指令的使用方法,实例的梯形图如图4-75所示。
图4-74 填表指令
图4-75 填表指令实例
第一条指令将常数6写入到VW200中。第二条指令,当I0.0被置位时,将执行填表指令。最大的填表数为6,将VW100中的数据作为第一次填表的数据,并将其填写在表的末尾,其操作过程如图4-76所示。错误!
图4-76 填表实例操作过程
(2) 查表(TBL)指令
查表指令是当表被建立后,可以查找表中满足特定条件的数据。查表(TBL)指令在表格(TBL)中搜索与某些标准相符的数据。“表格查找”指令搜索表,从INDX指定的表格条目开始,寻找与CMD定义的搜索标准相匹配的数据数值(PTN)。命令参数(CMD)被指定一个1至4的数值,分别代表 =、<>、<, and >。如果找到匹配条目,则INDX指向表格中的匹配条目。欲查找下一个匹配条目,再次激活“表格查找”指令之前必须在INDX上加1。如果未找到匹配条目,INDX的数值等于条目计数。一个表格最多可有100个条目,数据项目(搜索区域)从0排号至最大值99。查表指令符号如图4-77所示。
图4-77 查表指令符号
已知已经建立的表如图4-78所示,需要在以VW202为起始地址的此表中查找16进制数据3130。可以通过如图4-79的指令进行数据的查找。
图4-79 已知表
图4-79 查表实例梯形图
当I2.1为1时,执行查表指令。由梯形图可知,表的起始地址是VW202,需要查找的数据是16#3130,将查找到的数据的位置代号信息存放在AC1中,数据查找的条件是“和16#3130相等的数据”即命令参数为1。通过图4-78可知,被查找的数据的位置为cd2,所有AC1中的数据为2。
(3) 先入先出(FIFO)指令
先入先出指令是读取已经建立表中数据的一种方法。类似于数据结构中的队列数据结构。先入先出(FIFO)指令通过移除表格(TBL)中的第一个条目,并将数值移至DATA指定位置的方法,移动表格中的最早(或第一个)条目。表格中的所有其他条目均向上移动一个位置。每次执行指令时,表格中的条目数减1。其指令符号如图4-80所示。
图4-80 先入先出指令
已知已经建立的表如图4-81(a)所示,其首地址为VW200。需要在此表中进行先入先出操作。其梯形图如图4-82所示。
图4-82 先入先出指令实例梯形图
图4-81 先入先出指令操作实例
当I4.1为1时,将以VW200为开头地址的表中的第一个数据移出到VW400中去,操作过程如图4-81所示。
(4) 后入先出(LIFO)指令
后入先出(LIFO)指令的操作同样是一种读取表中数据的方法,其访问形式与数据结构中的堆栈非常类似。
后入先出(LIFO)指令将表格中的最新(或最后)一个条目移至输出内存地址,方法是移除表格(TBL)中的最后一个条目,并将数值移至DATA指定的位置。每次执行指令时,表格中的条目数减1。其指令符号如图4-83所示。
图4-83 先入先出指令
后入先出指令的使用方法与先入先出指令是相同的,只是数据的移出是表中最先填入的数据。已经建立的表如图4-84(a)所示。
图4-84 后入先出指令操作实例
后入先出指令实例梯形图如图4-85所示。当I4.1为1时,将以VW200为开头地址的表中的最后填入表中的一个数据移出到VW300中去,操作过程如图4-84所示。
图4-85 后入先出指令实例梯形图
4. PID回路指令
S7-200 CPU提供PID环路指令(比例、积分、微分环路),可以执行PID计算。所以S7-200可以完成使用PID算法进行控制的相关工业控制领域。S7-200 CPU最多可以支持8个PID控制回路,即可以同时使用8个PID指令功能块。
(1) S7-200 PLC PID算法介绍
关于S7-200 PLC PID算法的介绍,请参阅本书11.1节。
(2) S7-200 PID指令
PID回路指令运用回路指令表中的输入信息和组态信息进行PID运算,编程极其简单。其指令格式如图4-86所示。
图4-86 PID指令符号
此指令有两个操作数:TBL和LOOP。
● 参数TBL
参数TBL是回路表的起始地址,操作数使用的是VB区域;回路表包括9个参数,用来控制和监视PID运算。这些参数是分别是过程变量当前值PVn,过程变量前值PVn-1,给定值SPn,输出值Mn,增益KC,采样时间 TS,积分时间 TI,微分时间 TD和积分项前值MX。36个字节的回路表格式如表4-6所示。
环路表存储用于控制和监控环路运算的参数,包括程序变量、设置点、输出、增益、样本时间、整数时间(重设)、导出时间(速率)以及整数和(偏差)的当前值及先前值。
若要以一定的采样频率进行PID计算,采样时间必须输入到回路表中去,而且PID指令必须编入定时发生的中断程序中去,或者在一程序中由定时器控制PID指令的执行频率。
● 参数LOOP
LOOP是回路号,可以是0~7的整数,进行PID运算的前提条件是逻辑堆栈栈顶的值必须为1。在程序中最多可以使用8条PID指令,支持8个PID回路。如果两条或多条PID指令使用相同的环路号码(即使它们的表格地址不同),PID计算会互相干扰,结果难以预料。
总之,PID环路指令根据表格(TBL)中的输入和配置信息对引用LOOP执行PID环路计算。提供PID环路指令(成比例、整数、导出环路)进行PID计算。
(3) S7-200PID参数自整定功能
S7-200PLC已经支持PID自整定功能,在5章将要介绍的STEP 7-Micro/WIN中也添加了PID整定控制面板。这就大大增强了S7-200PLC的功能,并且使这一功能的使用变得更加容易。向导可以为闭路控制程序定义PID算法。在STEP 7-Micro/WIN软件中选择“工具”|“指令向导”将弹出如图4-87所示的指令向导窗口。并从指令向导窗口选择PID即可进行PID控制整定操作。
图4-87 PID自整定向导
设计者可以使用操作员面板中的用户程序或者PID整定控制面板来启动自整定功能。在同一时间,不仅仅只有一个PID回路可以进行自整定,如果需要的话,所有8个PID回路可以同时进行自整定。PID自整定算法推荐增益值、积分时间值和微分时间值。也可以为调节回路选择快速响应、中速响应、慢速响应或者极慢速响应等调节类型。
用PID整定控制面板,可以启动自整定过程,取消自整定过程和在图表中监视结果。控制面板会显示所有可能发生的错误和警告信息。它也允许将自整定后得到的增益值、积分时间值和微分时间值应用到实际控制中去。
5. 网络通信指令
S7-200系列PLC具有很强的网络通信能力,它可以通过内部集成的通信口以多种方式与现场设备进行相连,组成不同的通信网络,完成现场控制任务。其中以串行通信最为常见。CPU的串口指令可以由用户程序控制,这种操作模式称为自由模式。在S7-200与计算机或其他设备采用自由口协议进行通信时,可以利用收发送指令、接收指令实现实数的传送。在自由模式下,通信协议完全由用户程序控制,可以实现与多种外设的通信。
(1) 发送(XMT)和接收(RCV)指令介绍
传送(XMT)指令在自由端口模式中使用,通过通信端口传送数据。接收(RCV)指令开始或终止“接收信息”服务。必须指定一个开始条件和一个结束条件,“接收”方才能操作。通过指定端口(PORT)接收的信息存储在数据缓冲区(TBL)中。数据缓冲区中的第一个条目指定接收的字节数目。发送和接收指令最多都可以使用255个字节。其指令符号如图4-88所示。
图4-88 发送和接收指令
(2) 指令实例
只有在S7-200位于RUN(运行)模式时才能使用自由端口通信。在SMB30(端口0)或SMB130(端口1)的协议选择域中设置一个0、1数值,启用自由端口模式。位于自由端口模式时,无法与编程设备通信。
在进行自由端口通信之前必须对通信的波特率、奇偶校验和数据位等信息进行设置,而设置是通过对特殊寄存器SMB30和SMB130来控制的。通过对其写入不同的数值,可以进行不同的通信设置。这一点同单片机中状态字的读写是非常类似的。其中SMB30控制端口0的自由端口通信;SMB130控制端口1的自由端口通信。可以从SMB30和SMB130读取或向SMB30和SMB130写入。通过对状态字的读写不仅可以配置各自的通信端口,进行自由端口操作,还提供自由端口或系统协议支持选择。状态字的形式如表4-7所示。
表4-7 自由端口状态字
本实例将把VB200字节中的后5个字符通过端口0发送给打印机。其梯形图如图4-89所示。
图4-89 发送数据实例梯形图
第一条指令中对端口0进行初始化,并写入端口0所对应的SMB30的状态字。其相应的波特率为9600,数据位为8位并且没有奇偶校验,其状态字格式如图4-90所示。
图4-90 状态字SMB30格式
第二条指令将VB200中的数据写入到端口0中,完成数据传送。
使用RCV指令接收的数据是存放到接收缓冲区中,缓冲区的格式如图4-91所示。错误!
图4-91 RCV缓冲区格式
值得注意的是,在使用RCV完成数据接收任务后,系统会产生一个中断(端口0对应中断23,端口1对应中断24),使用这两个中断可以为下一步的操作提供启动依据。使用RCV指令进行数据的接收时,可以选择信息的开始和结束条件。对于端口0和1,信息开始和结束的字符分别由特殊寄存器SM88(SM188)和SM89(SM189)确定,而SM94 (SM194),则负责控制接收字符的最大长度在1到255之间。
下面的梯形图将从端口0中接收一字符串存放到以VB300为开始的RCV缓冲区中,并且以回车(字符为0A)为结束字符。梯形图如图4-92所示。
图4-92 接收数据实例梯形图
梯形图中前三个数据移动指令分别是对端口1进行初始化(格式同接收实例);设置信息的结束字符为回车(0A);以及设置缓冲区的最大字符数为100。最后一条RCV是接收指令。
6. 高速计数指令
在4.4节中所介绍计数器指令的计数速度受扫描周期的影响,对比CPU扫描频率高的脉冲输入,就不能满足控制要求了。高速计数器HSC用来累计比PLC扫描频率高得多的脉冲输入,利用产生的中断事件完成预定的操作。通常高速计数器被用做对具有高速计数器功能的增量旋转编码器进行脉冲计数。在工业现场中通常可以和显示屏一并使用以显示被控对象的运动速度、位置等信息。
(1) 高速计数功能介绍
S7-200系列PLC设计了高速计数功能(HSC),其计数自动进行,不受扫描周期影响,最高计数频率取决于CPU的类型,CPU22x系列最高计数频率为30 kHz。速计数器在程序中使用时的地址编号用HC n来表示(在非正式程序中有时用HSn),HC(HSC)表示编程元件名称为高速计数器,n为编号。对于不同的高速计数器需要使用不同的PLC输入点为其进行信号高速输入,即每个高速计数器对它所支持的时钟、方向控制、复位和启动都有专用的输入点,通过中断控制完成预定的操作。每个计数器所支持的时钟、方向控制、复位和启动都有专用的输入点,是不能随意改动的。对于两相计数器,两个时钟可以同时以最大速率工作;对正交模式,可以以单倍(1X)或4倍(4X)最大计数速率工作。也就是说所有高速计数器完全独立互不干扰。每个高速计数器专用输入点如表4-8所示。
表4-8 高速计数器专用的输入点
(2) 指令介绍
不同型号的PLC主机,所支持的高速计数器的数量是不同的。CPU 221和CPU 222支持4台高速计数器 (HSC0、HSC3、HSC4、HSC5),CPU 221和CPU 222不支持HSC1和HSC2。CPU 224、CPU224XP、CPU 226支持6台高速计数器 (HSC0至HSC5)。高速计数器指令有两条:高速计数器定义指令HDEF和高速计数器指令HSC,其指令如图4-93和图4-94所示。
图4-93 高速计数器定义指令HDEF符号
图4-94 高速计数器指令HSC符号
(3) 高速计数器定义(HDEF)指令
本指令用来指定高速计数器(HSC x)的工作模式。指令参数“HSC”用来定义高速计数器号。指令参数“MODE”用来说明计数器的工作模式。工作模式的选择即选择了高速计数器的输入脉冲、计数方向、复位和启动功能。每个高速计数器只能用一条“高速计数器定义”指令。
高速计数器有12种工作模式,模式0~模式2采用单路脉冲输入的内部方向控制加/减计数;模式3~模式5采用单路脉冲输入的外部方向控制加/减计数;模式6~模式8采用两路脉冲输入的加/减计数;模式9~模式11采用两路脉冲输入的双相正交计数。
每个高速计数器有多种不同的工作模式。HSC0和HSC4有模式0、1、3、4、6、7、8、9、10;HSC1和HSC2有模式0、1、2、3、4、5、6、7、8、9、10、11;HSC3和HSC5只有模式0。
高速计数器的工作模式和输入端子数有关,其专业的输入特性如表4-9所示。
表4-9 高速计数器的工作模式
(4) 高速计数器使用(HSC)指令
通过使用此指令可以使高速计数器根据HDEF指令所指定的工作模式和高速计数器控制位的状态控制高速计数器进行高速计数。参数N指定高速计数器的编号。
所以,定义了计数器和工作模式之后,还要设置高速计数器的有关控制字节。每个高速计数器均有一个控制字节,它决定了计数器的计数允许或禁用,方向控制(仅限模式830、1和2)或对所有其他模式的初始化计数方向,装入当前值和预置值。控制字节每个控制位的说明如表4-10所示。
表4-1 加减运算指令格式
表4-10 高速计数器控制字说明
与使用高速计数器指令相关的还有状态字节,它为每台提供状态内存位的高速计数器提供状态字节,状态内存位表示当前计数方向以及当前值是否大于或等于预设值。表4-11定义每台高速计数器的状态位。
表4-11 高速计数器状态字节说明
在使用高速计数器指令时需要注意以下几个问题。
● 每个高速计数器都有一个32位当前值和一个32位预置值,当前值和预设值
● 均为带符号的整数值。要设置高速计数器的新当前值和新预置值,必须设置控制字节(表4-11),令其第五位和第六位为1,允许更新预置值和当前值,新当前值和新预置值写入特殊内部标志位存储区。然后执行HSC指令,将新数值传输到高速计数器。
● 执行HDEF指令之前,必须将高速计数器控制字节的位设置成需要的状态,否则将采用默认设置。默认设置为:复位和启动输入高电平有效,正交计数速率选择4×模式。执行HDEF指令后,就不能再改变计数器的设置,除非CPU进入停止模式。
● 执行HSC指令时,CPU检查控制字节和有关的当前值和预置值。
在执行高速计数指令时,同一个输入端不能用于两种不同的功能。但是高速计数器当前模式未使用的输入端均可用于其他用途,如作为中断输入端或作为数字量输入端。每个高速计数器的3种中断的优先级由高到低,各个高速计数器引起的中断事件如表4-12所示。通过查询此表可以得到与高速计数器相关的中断说明,进而开发其他程序。
表4-12 高速计数器中断说明
(4) 高速计数器使用步骤
要使用高速计数器指令首先需要对高速计数器进行初始化。高速计数器的使用步骤如下。
用首次扫描时接通一个扫描周期的特殊内部存储器SM0.1去调用一个子程序,完成初始化操作。因为采用了子程序,在随后的扫描中,不必再调用这个子程序,以减少扫描时间,使程序结构更好。
在初始化的子程序中,根据希望的控制设置控制字(SMB37、SMB47、SMB57、SMB137、SMB147、SMB157),如设置SMB47=16#F8,则为:允许计数,写入新当前值,写入新预置值,更新计数方向为加计数;若为正交计数设为4×,复位和启动设置为高电平有效。
执行HDEF指令,设置HSC的编号(0~5),设置工作模式(0~11)。如HSC的编号设置为1,工作模式输入设置为11,则为既有复位又有启动的正交计数工作模式。
用新的当前值写入32位当前值寄存器(SMD38,SMD48,SMD58,SMD138,SMD148, SMD158)。如写入0,则清除当前值,用指令MOVD 0,SMD48实现。
用新的预置值写入32位预置值寄存器(SMD42,SMD52,SMD62,SMD142,SMD152, SMD162)。如执行指令MOVD 1000,SMD52,则设置预置值为1000。若写入预置值为16#00,则高速计数器处于不工作状态。
为了捕捉当前值等于预置值的事件,将条件CV=PV中断事件(中断号13)与一个中断程序相联系。
为了捕捉计数方向的改变,将方向改变的中断事件(中断号14)与一个中断程序相联系。
为了捕捉外部复位,将外部复位中断事件(中断号15)与一个中断程序相联系。
执行全局中断允许指令(ENI)允许HSC中断。
执行HSC指令使S7-200对高速计数器进行编程。
结束子程序。
高速计数器的使用基本上都会遵循下面的模式。
● 主程序
在使用高速计数器之前都会有一个对计数器进行初始化的准备过程,可以使用一个子程序来完成这项工作,其梯形图如图4-95所示,用首次扫描时接通一个扫描周期的特殊内部存储器SM0.1去调用一个子程序,完成初始化操作。
图4-95 主程序
● 初始化的子程序
在用来初始化高速计数器的子程序(如图4-96所示),定义HSC1的工作模式为模式11(两路脉冲输入的双相正交计数,具有复位和启动输入功能),设置SMB47=16#F8(允许计数,更新当前值,更新预置值,更新计数方向为加计数,若为正交计数设为4×,复位和启动设置为高电平有效)。HSC1的当前值SMD48清零,预置值SMD52=50,当前值=预设值,产生中断(中断中断号13),中断事件13连接中断程序INT_0。
图4-96 子程序
在如图4-97所示的中断程序中,将HSC1的当前值清0,并向控制制字SMB47写入一个新值(预置值不变,计数方向不变,HSC1允许计数),最后再次执行HSC1指令。
图4-97 中断程序
7. 高速脉冲输出指令
高速脉冲输出指令可以使PLC某些输出端产生高速脉冲,用来驱动负载实现精确控制,其典型应用是对步进电机的控制。
(1) 高速脉冲输出功能介绍
S7-200提供高速脉冲功能,即通过特定的输出口进行高频率的脉冲输出以满足工业现场的某些特殊要求。
S7-200有两台高速脉冲生成器,用以建立高速脉冲链或脉冲宽度调节波形。它们分别是PTO脉冲发生器和PWM脉冲发生器。PTO脉冲发生器提供矩形波(50%工作循环)输出或指定的脉冲数和指定的循环时间。脉冲宽度调制(PWM)发生器提供带变量工作循环的固定循环时间输出。它们共用输出寄存器Q0.1和Q0.0。PTO或PWM功能在Q0.0或Q0.1位置现用时,PTO/PWM生成器控制输出,并禁止输出点的正常使用。输出波形不受输出寄存器的影响,即失去了通用的输出功能。PTO/PWM生成器没有被使用时,输出控制转交给输出寄存器,可以完成其他普通输出功能。
在启用PTO或PWM操作之前,将用于Q0.0和Q0.1的进程图像寄存器设为0。所有的控制位、循环时间、脉冲宽度和脉冲计数值的默认值均为0。PTO/PWM输出必须至少有10%的额定负载,才能完成从关闭至打开以及从打开至关闭的顺利转换。
PTO为指定的脉冲数和指定的循环时间提供矩形波(50%工作循环)输出,主要用在对步进电机的控制上,其波型如图4-98所示。
图4-98 PTO矩形波
PTO可提供单脉冲链或多脉冲链(使用脉冲轮廓)。指定脉冲数和循环时间(以µs或ms递增)。PTO脉冲的循环时间范围从10 µs至65535 µs或从2 ms至65535 ms。脉冲计数范围从1至4294967295次脉冲。
PTO功能允许脉冲链链接或管线作业。即当现用脉冲链完成时,新的脉冲链输出立即开始。这样就保证了随后的输出脉冲链的连续性。PTO高速脉冲串输出可以采用中断的方式通知下一个脉冲链进行输出,其与PTO输出有关的中断事件有两个,如表4-13所示。
表4-13 PTO相关中断
管线作业的方式有两种,分别是单段管线作业或多段管线作业。
● 单段管线作业
在单段管线作业中,在编程时需要负责更新下一个脉冲链的SM位置。初始PTO段一旦开始,程序必须按照对第二个波形的要求立即修改SM位置,并再次执行PLS指令。第二个脉冲链特征被保留在管线中,直至第一个脉冲链完成。管线中每次只能存储一个条目。第一个脉冲链一旦完成,第二个波形输出即开始,管线可用于新的脉冲链规格。可以重复此一步骤,设置下一个脉冲链的特征。
● 多段管线作业
在多段管线作业中,S7-200从V内存中的轮廓表自动读取每个脉冲链段的特征。该模式中的SM位置是轮廓表的控制字节、状态字节和起始V内存偏移量(SMW168或SMW178)。时基可以为µs或ms,该选项适用于轮廓表中的所有循环时间数值,但在轮廓运行时不得变更。然后可由执行PLS指令开始多段操作。每段输入的长度均为8个字节,由一个16位循环时间数值、一个16位循环时间Δ数值和一个32位脉冲计数值组成。
PWM脉冲发生器提供带变量工作循环的固定循环时间输出。可以µs或ms为时基指定循环时间和脉冲宽度,可用在波型输出有一定占空比要求的控制场合,其波型如图4-99所示。
图4-99 PWM脉冲波型
如图4-99所示,设置脉冲宽度等于循环时间(这使工作循环为100%)使输出连续运行。设置脉冲宽度等于0(这使工作循环为0%)会关闭输出,PWM输出的循环时间的范围从10 µs至65535 µs,或从2 ms至65535 ms。脉冲宽度时间范围从0 µs至65535 µs或从0 ms至65535 ms。
有两种不同的方法可改变PWM波形的特征:同步更新和异步更新。
● 同步更新
如果不要求更改时基,即可以执行同步更新。执行同步更新时,波形特征的变化发生在循环边缘,提供顺利转换。
● 异步更新.
此为常见的PWM操作,脉冲宽度不同,但循环时间保持不变。因此,不要求时基改变。但是,如果要求改变PTO/PWM生成器的时基,则应使用异步更新。异步更新使PTO/PWM生成器被立即禁用,与PWM波形异步。这样可能造成控制设备状态暂时不稳。由于此一原因,建议使用同步PWM更新。选择可用于所有预计循环时间数值的时基。
(2) PTO和PWM的相关寄存器
脉冲输出都有一个状态字节,程序运行时根据运行状况自动调节状态字节的每个高速位置位,可以通过程序来读相关位的状态,用以作为判断条件实现相应操作。控制字每个高速脉冲输出都对应一个控制字节,通过对控制字节中指定位的编程,可以根据操作要求设置字节中各控制位,如脉冲输出允许、PTO/PWM模式选择、单段/多段选择、更新方式、时间基准、允许更新等。各寄存器分配如表4-14至表4-16所示。
表4-14 PTO和PWM状态寄存器
表4-15 PTO和PWM控制寄存器
表4-16 PTO和PWM其他寄存器
表4-16 PLS指令控制字参照表
由于PLS指令的控制字的结构较为复杂,通常在使用控制字的时候以参照表的形式对控制寄存器进行写入,选择所需要的控制形式即可方便地查询所需要的控制字,进而达到控制快速完成PLS指令初始化的目的,其参照表如表4-16所示。
(3) 指令介绍
脉冲输出(PLS)指令被用于控制在高速输入(Q0.0和Q0.1)中提供的“脉冲链输出”(PTO)和“脉冲宽度调制”(PWM)功能,即PTO提供矩形波,PWM提供连续性变量工作循环输出,其指令格式如图4-100所示。
图4-100 高速脉冲输出指令
指令中的“x”可以是0或者是1,用来表达使用Q0.0还是Q0.1来进行输出。
(4) 指令实例
本实例使用PTO脉冲发生器,使用多段脉冲输出。首先要确定脉冲发生器及工作模式,设置控制字节及写入周期值、周期增量值和脉冲数。然后装入脉冲轮廓的首地址,设置中断事件并全局开中断,最后执行PLS指令。
步进电机在转动过程中,要求从A点加速到B点后恒速运行,又从C点开始减速到D点,完成这一过程时用指示灯显示。电机的转动受Q0.0脉冲控制,A点和D点的脉冲频率为2 kHz,B点和C点的频率为10 kHz,加速过程的脉冲数为400个,恒速转动的脉冲数为4000个,减速过程脉冲数为200个,控制过程如图4-101所示。
图4-101 步进电机控制过程
从图4-102所示的步进电机控制过程可以看出,这是一个需要三段脉冲轮廓的控制流程:加速、匀速及减速过程。可以通过设置Q0.0所对应的SMW168为此脉冲轮廓来设置V变量的起始值,本例设置为VW400,即从VW400开始对脉冲轮廓的各项设置进行控制。S7-200的多段PTO操作的脉冲轮廓表格式见表4-17。
表4-17 多段PTO操作的脉冲轮廓表格式
图4-102 主程序
首先调用子程序来完成对高速计数器的初始化,调用子程序的主程序梯形图如图4-102所示。
首次扫描时,将寄存器Q0.1置位为0,并调用子程序0来完成对高速计数器的初始化工作。
子程序可以分成两个子程序SBR_0和SBR_1。其中SBR_0的作用是对控制寄存器进行写入,来完成初始化的一部分具体工作,并在此子程序中嵌套调用子程序SBR_1;而SBR_1的作用是完成多段PTO脉轮廓的设置,其梯形图如图4-103至图4-106所示。
图4-103 高速计数器初始化子程序SBR_0
图4-106 脉冲轮廓第3段设置
图4-104 脉冲轮廓第1段设置
图4-105 脉冲轮廓第2段设置
最后,一旦完成所有脉冲的输出,将激活中断19,在中断程序中完成指示灯的点亮,如图4-107所示。
图4-107 亮灯指示灯中断服务程序梯形图
8. 时钟指令
时钟指令的功能是用来完成对时间的读取和设定,时间包括了年、月、日、时、分、秒和星期。它们分别存放在以T为起始字节地址的8个字节缓冲区中,其存放格式如表4-18所示。
表4-18 时间缓冲区格式
如果长时间断电或内存丢失后,当日时间时钟会被初始化为以下日期和时间:
日期: 90年1月1日
时间: 00:00:00
星期几: 星期日
时钟指令分为读时钟指令和写时钟指令,其符号如图4-108所示。
图4-108 时钟指令符号
其中读取实时时钟(TODR)指令从硬件时钟读取当前时间和日期,并将其载入以地址T起始的8个字节的时间缓冲器。设置实时时钟(TODW)指令将当前时间和日期写入用T指定的在8个字节的时间缓冲器开始的硬件时钟。
4.7 课后习题
1. 填空题
(1) 数据块传送指令输出地址OUT的最大范围是________。
(2) 移动字节立即读取(IBR )指令与普通读取指令的区别在于________。
(3) 逻辑堆栈指令包括有:________、________、________、________、________和________。
(4) 栈装载与(ALD)指令的作用是________。
(5) 数学运算指令包括________、________、________、________及________指令等。
(6) 自增自减指令主要是为了在PLC控制系统中实现________、________、________、________等功能。
(7) 循环移位将移位数据存储单元的首尾相连,同时又与溢出标志________连接。
(8)________指令可以将32位的双字整数转换成同样是32位的实数。
(9) 系统中出现某些急需处理的异常情况或特殊请求,这时系统将执行________。
(10) 西门子公司CPU规定中断优先级由高到低依次是:________,________,________。
2. 选择题
(1) 不属于常用的中断指令的是: 。
A. 附加中断(ENI)指令
B. 禁用中断(DISI)指令
C. 附加中断(ATCH)指令
D. 中断分离(DTCH)指令
(2) 在中断服务程序执行时不禁止使用以下指令:________
A. DISI、ENI、CALL
B. HDEF、FOR/NEXT
C. LSCR、SCRE、
D. SCRT、STOP
(3) 查表(TBL)指令中的命令参数(CMD)为2时,代表的条件为:________
A. =
B. <
C. >
D. <
(4) 移动字节立即读取(IBR )、写入 (IBW)指令的操作数据类型为:________
A. 位
B. 字节
C. 字
D. 双字
(5) 执行OLD指令后,堆栈深度减1,并将堆栈中的各级内容依次上弹一级,其中堆栈顶=:________
A. IV0 OR IV1
B. IV0 AND IV1
C. IV0 +IV1
D. IV0 -R IV1
(6) 右移指令将由变量IN指定的数值向右移动由N指定的位置,结果置入由OUT指定的变量中。向右移位时,每个位补:
A. 0
B. 1
C. X
D. *
3. 上机题
(1) 编写程序完成数据采集任务,要求每100 ms采集一个数。
(2) 用一个按钮开关实现红、黄、绿三种颜色灯循环显示程序,要求循环间隔时间为0.5 s。
(3) 利用定时中断功能编制一个程序,实现如下功能:当I0.0接通时,Q0.0亮1 s,灭1 s,如此循环反复直至I0.0关断时,Q0.0变为OFF。