170 likes | 314 Views
分类. 指令编 号 FNC. 指令助 记符. 指令格式、操作数 (可用软元件). 指令名称及功能简介. D 命令. P 命令. 程序流向控制指令. 程 序 流 程. 00. CJ. S .( P0~P63 ). 条件跳转;程序跳转到 [S·]P 指针指定处, P63 为 END 步序,不需指定. O. 01. CALL. S .( P0~P62 ). 调用子程序;程序调用 [S·]P 指针 指定的子程序,嵌套 5 层以下. O. 02. SRET. 子程序返回;从子程序返回主程序. 03. IRET. 断返回主程序. 04.
E N D
分类 指令编 号FNC 指令助 记符 指令格式、操作数 (可用软元件) 指令名称及功能简介 D命令 P命令 程序流向控制指令 程 序 流 程 00 CJ S.(P0~P63) 条件跳转;程序跳转到[S·]P指针指定处,P63为END步序,不需指定 O 01 CALL S.(P0~P62) 调用子程序;程序调用[S·]P指针 指定的子程序,嵌套5层以下 O 02 SRET 子程序返回;从子程序返回主程序 03 IRET 断返回主程序 04 EI 中断允许 05 DI 中断禁止 06 FEND 主程序结束 07 WDT 监视定时器; O 08 FOR S.(K、H、KnX、KnY、 KnM、KnS、T、C、D、V、Z) 循环开始;重复执行开始,嵌套5层 09 NEXT 循环结束;重复执行结束 FX2系列可编程控制器有10条程序流向控制类指令。程序流向控制指令(FNC00~FNC09)分别是CJ(条件跳转)、CALL(子程序调用)、SRET(子程序返回)、IRET(中断返回)、EI、DI(中断允许与中断禁止)、FEND(主程序结束)、WDT(监控定时器刷新)和FOR、NEXT(循环开始和循环结束)。其主要功能如表4.2.1。下面详细介绍几个主要的指令。 表7.2.1 程序流向控制类指令表
指令名称 助记符 指令代码位数 操作数 程序步 D(•) 条件跳转 CJ CJ(P) FNC00 (16) P0~P63 P63即END CJ和CJ(P) 3步 标号P 1步 条件跳转指令 一、跳转指令说明 该指令的助记符、指令代码、操作数、程序步见表7.2.2 表7.2.2 条件跳转指令要素 CJ和CJ(P)指令用于跳过顺序程序中的某一部分,这样可以减少扫描时间并使用权“双线圈操作”成为可能。 在下面的例子中,当X0为ON时程序从第1步跳到标号P8的下一步。如果X0为OFF,跳转不执行,程序按原顺序向下执行。跳转时,被跳过的那部分的指令不执行。 二、跳转程序中元器件在跳转执行中的工作状态
表7.2.3给出了图7.2.1中跳转发生前后输入器件变化对执行结果的影响。从表中可以看出:表7.2.3给出了图7.2.1中跳转发生前后输入器件变化对执行结果的影响。从表中可以看出: (1)处于被跳转程序段中的继电器、辅助继 电器、状态继电器由于该程序段不再执行,即使梯形图中涉及的工作条件发生变化,它们的工作状态将保持跳转发生前的状态不变。 (2)被跳过程序段中的继电器及计数器器,无论其是否具有掉电保持功能,由于相关程序停止执行,它们的现实值寄存器被锁定,跳转发生后其计数、计时值保持不变,在跳转终止,程序继续执行时,计时计数器将继续计时。另外,计时、计数器的复位指令具有优先权,即使复位指令位于被跳过的程序段中,执行条件满足时,复位工作也将执行。 图7.2.1
表7.2.3 跳转对状态元件的影响 元件 跳转前触点状态 跳转后触点状态 跳转后线圈状态 Y、M、S X1、X2、X3 OFF X1、X2、X3 ON Y1、M1、S1 OFF X1、X2、X3 ON X1、X2、X3 OFF Y1、M1、S1 ON 10ms,100ms定时器 X4 OFF X4 ON 定时器不动作 X4 ON X4 OFF 定时器停止,X0 OFF后继续计时 1ms定时器 X5 OFF,X6 OFF X6 ON 定时器不动作 X5 OFF,X6 ON X6 OFF 定时器停止,X0 OFF后继续计时 计数器 X7 OFF,X10 OFF X10 ON 计数器不动作 X7 OFF,X10 ON X10 OFF 计数器停止,X0 OFF后继续计数 功能指令 X11 OFF X11 ON 除FNC52~FNC59之外的其他功能指令不执行 X11 ON X11 OFF
注意: (1)由于跳转指令具有选择程序段的功能。在同一程序且位于因跳转而不会被同时执行程序段中的同一线圈不被视为双线圈。;例如本例的Y1,其操作由X0的ON/OFF状态决定,即X0=OFF时,Y1由X1驱动;X0=ON时,Y1由X12驱动。同一线圈一个在跳转程序之内,一个在跳转程序之外是不允许。 (2)可以有多条跳转指令使用同一标号。在程序中两条跳转指令使用相同的指针号时(图7.2.2)执行情况如下: (a)如果X20为ON,第一条跳转指令生效,从这一步跳到标号P9。如果X20为OFF,而X21为ON, 则第二条跳转指令生效,程序从这里开始跳到标号P9处。 (b)一个标号只能出现一次,如出现多于一次,则会出错。 图7.2.2
(3)标号一般设在相关的跳转指令之后,也可以出现在跳转指令之前,但要注意从程序执行顺序来看,如果由于标号在前造成该程序的执行时间超过了警戒时钟设定值,则程序就会出错。(3)标号一般设在相关的跳转指令之后,也可以出现在跳转指令之前,但要注意从程序执行顺序来看,如果由于标号在前造成该程序的执行时间超过了警戒时钟设定值,则程序就会出错。 (4)使用CJ(P)指令时,跳转只执行一个扫描周期,但如用辅助继电器M8000作为跳转指令的工作条件,跳转就成为无条件跳转。 (5)跳转可用来执行程序初始化工作。在程序中,使用“CJ”指令仅在执行条件由OFF变ON后执行一个扫描周期。用这种方法,“CJ P”和标号P之间设置输出的程序执行完后,在以后的扫描周期中就被跳过。 (6)跳转与主控区的关系。 ①对跳过整个主控区(MC~MCR)的跳转不受限制。 ②从主控区外跳到主控区内时,跳转独立于主控操作,CJ P*执行时,不论主控触点工作条件状态如何,均作ON处理。 ③在主控区内跳转时,如主控触点工作条件状态为OFF,跳转不可能执行。 ④从主控区内跳到主控区外时,主控触点工作条件状态为OFF时,跳转不可能执行;主控触点工作条件状态为ON时,跳转条件满足可以跳转,这时MCR被忽略,但不会出错。 ⑤从一个主控区内跳到另一个主控区内时,当第一个主控触点工作条件状态为ON时,可以跳转。执行跳转时不论第二个主控触点工作条件状态的实际状态如何,均看做ON。MCR N0被忽略。 (7)在编写跳转程序的指令表时,标号需占一行。
子程序调用与返回指令 指令名称 助记符 指令代码位数 操作数 程序步 D(•) 子程序调用 CALL CALL(P) FNC01 (16) P0~P62 嵌套5级 3步 标号P 1步 子程序返回 SRET FNC02 无 1步 该指令的助记符、指令代码、操作数、程序步见表7.2.4 表7.2.4 子程序指令要素 子程序是为一些特定的控制目的编制的相对独立的程序。为了区别于主程序,规定在程序编排时,将主程序排在前边,子程序排在后边,并以主程序结束指令FEND(FNC06)将这两部分分隔开。
子程序指令在梯形图中使用的情况如图4.2.3所示。图中,子程序调用指令CALL安排在主程序段中,X0是子程序执行的条件,当X0为ON时,CALL指令使程序跳到标号P10处,子程序被执行,在SRET指令执行后程序返回。子程序P10安排在主程序结束指令FEND之后,标号P10和子程序返回指令SRET间的程序构成了P10子程序的内容。当主程序带有多个子程序时,子程序可依次列在主程序结束指令之后。并以不同的标号相区别。标号应写在FEND之后(FEND 指令在4.2.4中解释)。 标号范围从P0~P62,但同一标号不能出现多于1次;CJ指令中用过的标号不能重复再用。但不同的CALL指令可调用同一标号的子程序。 CALL(P)仅在执行条件由OFF变ON 时执行一次。在执行子程序时,如果CALL 另一个子程序,则程序跳到子程序2,在SRET(2)指令执行后,程序返回到子程序1中的CALL指令的下一步。在SRET(1)指令执行后再返回主程序。 注意:(1)在子程序中可再CALL子程序,形成子程序嵌套,总数可有5级嵌套。 (2)在子程序和中断子程序中使用的定时器范围为:T192~T199T 和 T246~T249。
中断指令 指令名称 助记符 指令代码位数 操作数 程序步 D(•) 中断返回指令 IRET FNC03 无 1步 允许中断指令 EI FNC04 无 1步 禁止中断指令 DI FNC05 无 1步 中断指令的助记符、指令代码、操作数、程序步见表7.2.5 表7.2.5 中断指令要素 中断是计算机所特有的一种工作方式。指主程序的执行过程中,中断主程序的执行去执行中断子程序。和前边所谈到过的子程序一样,中断子程序也是为某些特定的控制功能而设定的。和普通子程序的不同点是,这些特定的控制功能都有一个共同的特点,即要求响应时间小于机器的扫描周期。因而,中断子程序都不能由程序内安排的条件引出。能引起中断的信号叫中断源,FX2系列可编程序控制器有二类中断源,也叫二类中断,即外部中断和定时器中断。为了区别不同的中断及在程序中标明中断子程序的人口,规定了中断标号。FX2系列可编程控制器的中断编号方法如图7.1.5和图7.1.6所示。
外部中断信号从输入端子送人,可用于机外突发随机事件引起的中断。定时中断是机内中断,使用定时器引出,多用于周期性工作场合。由于中断的控制是脱离于程序的扫描执行机制的,多个突发事件出现时处理也必须有个秩序,这就是中断优先权。FX2系列PLC一共可安排9个中断,其优先权依中断号的大小决定,号数小的中断优先权高。由于外部中断号整体上高于定时器中断。即外部中断的优先权较高。外部中断信号从输入端子送人,可用于机外突发随机事件引起的中断。定时中断是机内中断,使用定时器引出,多用于周期性工作场合。由于中断的控制是脱离于程序的扫描执行机制的,多个突发事件出现时处理也必须有个秩序,这就是中断优先权。FX2系列PLC一共可安排9个中断,其优先权依中断号的大小决定,号数小的中断优先权高。由于外部中断号整体上高于定时器中断。即外部中断的优先权较高。 由于中断子程序是为一些特定的随机事件而设计的。在主程序的执行过程中,就有可能结合不同的程序段中PLC所要完成工作的性质决定能否响应中断。对可以响应中断的程序段用允许中断指令EI及不允许中断指令DI指令标示出来。如在程序的任何地方都可以响应中断,称为全程中断。另外,如果机器安排的中断比较多,而这些中断又不一定需同时响应时,还可以通过特殊辅助继电器M8050~M8058实现中断的选择。这些特殊辅助继电器和9个中断的对应关系为M8050~M8058与中断0~8一一对应。机器规定,当这些辅助继电器通过控制信号被置1时,其对应的中断被封锁。 PC通常在禁止中断状态。指令EI与DI之间的程序段为允许中断区间。当程序处理到允许中断区间时,X0或X1为ON 态,则转而处理相应的中断子程序(1)或(2)。每个子程序处理到IRET指令时返回原断点。当相应的特殊辅助继电器置1时,中断子程序不能执行。例如当M805△置1时,相应的中断子程序I△**不执行。在一个中断程序执行中时,其它中断禁止。但是,在中断程序中编入EI和DI指令可实现2级中断嵌套。在子程序或中断子程序中可用定时器为T192~T199和T246~T249。
注意: (1)一个中断指针(I***)占一步,最多可设置9个中断点。 (2)指定中断指针的顺序参阅图7.1.5和图7.1.6。 (3)其中2个中断点可产生多层中断。 (4)中断信号的脉宽必须超过200μs。 (5)多个中断信号顺序产生时,最先产生的中断信号有优先权。若2个或2个以上的中断信号同时产生时,中断指针号较低的有优先权。 (6)如果中断信号产生于禁止中断区间(DI到EI范围),这中断信号被存贮,并在EI指令之后被执行(除非相应的M805△为ON )。 中断指令的梯形图表示如图7.2.4所示。从图中可以看出,中断程序作为一种子程序安排在主程序结束指令之后。主程序带有多个中断子程序时,中断标号和距其最近的一处中断返回指令构成一个中断子程序。 图7.2.4
指令名称 助记符 指令代码位数 操作数 程序步 D(•) 主程序结束 FEND FNC06 无 1步 主程序结束指令 主程序结束指令的助记符、指令代码、操作数、程序步见表7.2.6 表7.2.6 主程序结束指令要素 FEND 指令表示主程序结束。执行到FEND指令时机器进行输出处理 ,输入处理,警戒时钏刷新,完成以后返回到第0步。 子程序应写在FEND之后,即CALL,CALL(P)指令对应的标号应写在EFND指令之后。CALL,CALL(P)指令的子程序必须以SRET指令作结束。 同理,中断服务子程序也要写在FEND之后,中断子程序必须以IRET指令作结束。 若FEND指令在CALL或CALL(P)指令执行之后,SRET指令执行之前出现,则被认为是错误的。另一个类似的错误是使FEND指令处于FOR—NEXT循环之中。 子程序及中断程序必须写在FEND指令与END 指令之间。
指令名称 助记符 指令代码位数 操作数 程序步 D(•) 警戒时钟 WDT FNC07 无 1步 警戒时钟指令 警戒时钟指令的助记符、指令代码、操作数、程序步见表7.2.7 表7.2.7警戒时钟指令要素 WDT 指令刷新顺序程序的警戒时钟。如果扫描周期时间(从0步到END或FEND 指令)超过100ms,PC将停止运行。在这种情况下,应将WDT指令插到合适的程序步中刷新警戒时钟,以使顺序程序得以继续执行直到END。 例如,将一个扫描时间为120ms的程序分为2个60ms的程序。在这两个程序之间插入WDT指令。 如果希望每次扫描周期时间超过100ms,可用MOV指令(FNC12)改写特殊数据寄存器D8000的值如下 WDT指令还可用于下列目的: (1)当与CJ指令对应的标号的步序低于CJ指令步序号时,在标号后编入WDT指令。 (2)可编入FOR—NEXT循环之中。
循环指令 指令名称 助记符 指令代码位数 操作数 程序步 S(•) 循环开始指令 FOR FNC08 (16) K、H、KnX、KnY、KnM、KnS、T、C、D、V、Z 3步(嵌套5层) 循环结束指令 NEXT FNC09 无 1步 循环指令的助记符、指令代码、操作数、程序步见表7.2.8 表7.2.8 循环指令要素 循环指令由FOR及NEXT二条指令构成,这二条指令总是成对出现的。在梯形图中相距最近的FOR指令和NEXT指令是一对。其次是距离稍远一些的,再是距离更远一点的。每一对FOR指令和NEXT指令间包括了一定的程序。这就是所谓程序执行过程中需依一定的次数进行循环的部分。循环的次数由FOR指令后的K值给出。循环嵌套程序的执行总是从核心层开始的。 循环指令用于某种操作需反复进行的场合。如对某一取样数据做一定次数的加权运算,控制输出口依一定的规律做反复的输出动作,或利用反复的加减运算完成一定量的增加或减少,或利用反复的乘除运算完成一定量的数据移位。循环程序可以使程序简明扼要,增加了编程的方便,提高了程序的功能。
在FOR—NEXT间的程序重复执行“n”次(由操作元件指定)后再执行NEXT指令的程序。循环次数范围:1~32767;如循环次数设置为-32767~0之间时,循环次数作1处理,FOR—NEXT循环一次。循环指令最多允许5级嵌套.在FOR—NEXT间的程序重复执行“n”次(由操作元件指定)后再执行NEXT指令的程序。循环次数范围:1~32767;如循环次数设置为-32767~0之间时,循环次数作1处理,FOR—NEXT循环一次。循环指令最多允许5级嵌套. 注意:下述情况下会出错: (1)NEXT指令在FOR指令之前。 (2)只有FOR而没有NEXT指令与之对应。 (3)NEXT指令编在FEND或END 指令之后。 (4)NEXT指令的数目与FOR指令数目不符合。
程序流向控制指令与程序结构 程序是由一条条的指令组成的,一些指令的集合总是完成一定的功能。在控制要求复杂,程序也变庞大时,这些表达一定功能的指令块又需合理地组织起来,这就是程序的结构。 程序结构至少在以下几个方面具有重要的意义。 ①方便于程序的编写。编程序和写文章类似,合适的文章结构有利于作者思想的表达,选取了合适的文章结构后写作会得心应手。好的程序结构也有利于体现控制要求,能给程序设计带来方便。 ②有利于读者阅读程序。好的程序结构体现了程序编者清晰的思路,读者在阅读时容易理解,易于和作者产生共鸣。读程序的人往往是做维修或调试的人,这对程序的正常运行有利。 ③好的程序结构有利于程序的运行。可以减少程序的冲突,使程序的可靠性增加。 ④好的程序结构有利于减少程序的实际运行时间,使PLC的运行更加有效。 常见的程序结构类型有以下几种。 1.简单结构 这是小程序的常用结构,也叫作线性结构。指令平铺直述地写下来,执行时也是平铺直述地运行下去。程序中也会分一些段,如交通灯程序,放在程序最前边的是灯的总开关程序段,中间是时间点形成程序段,最后是灯输出控制程序段。简单结构的特点是每个扫描周期中每一条指令都要被扫描。 2.有跳越及循环的简单结构 由控制要求出发,程序需要有选择地执行时要用到跳转指令。前边已有这样的例子。如自动、手动程序段的选择,初始化程序段和工作程序段的选择。这时在某个扫描周期中就不一定全部指令被扫描了,而是有选择的,被跳过的指令不被扫描。循环可以看做是相反方向的选择,当多次执行某段程序时,其他程序就相当于被跳过。
3.组织模块式结构 虽然有跨越及反复、有跳越及循环的简单程序从程序结构来说仍旧是纵向结构。而组织模块式结构的程序则存在并列结构。组织模块式程序可分为组织块、功能块、数据块。组织块专门解决程序流程问题,常作为主程序。功能块则独立地解决局部的,单一的功能,相当于一个个的子程序。数据块则是程序所需的各种数据的集合。在这里,多个功能块和多个数据块相对组织块来说是并列的程序块。前边讨论过的子程序指令及中断程序指令常用来编制组织模块式结构的程序。 组织模块式程序结构为编程提供了清晰的思路。各程序块的功能不同,编程时就可以集中精力解决局部问题。组织块主要解决程序的人口控制,子程序完成单一的功能,程序的编制无疑得到了简化。当然,作为组织块中的主程序和作为功能块的子程序,也还是简单结构的程序。不过并不是简单结构的程序就可以简单地堆积而不要考虑指令排列的次序,PLC的串行工作方式使得程序的执行顺序和执行结果有十分密切的联系,这在任何时候的编程中都是重要的。 和先进编程思想相关的另一种程序结构是结构化编程结构。它特别适合具有许多同类控制对象的庞大控制系统,这些同类控制对象具有相同的控制方式及不同的控制参数。编程时先针对某种控制对象编出通用的控制方式程序,在程序的不同程序段中调用这些控制方式程序时再赋予所需的参数值。结构化编程有利于多人协作的程序组织,有利于程序的调试。