第六章 FX2N功能指令 教学提示:FX2N系列PLC除了基本逻辑指令、步进指令外,还有200多条功能指令(也称为功能指令)。功能指令实际上是许多功能不同的子程序。与基本逻辑指令只能完成一个特定动作不同,功能指令能完成实际控制中的许多不同类型的操作 FX2N系列PLC的200多条功能指令按功能不同可分为程序流向控制指令、数据传递与比较指令、算术与逻辑运算指令、数据移位与循环指令、数据处理指令、高速处理指令、方便指令指令、外部设备通信(I/O模块、功能模块等)指令、浮点运算指令、定位运算指令、时钟运算指令、触点比较指令等十几大类。对实际控制中的具体控制对象,选择合适的功能指令可以使编程较之基本逻辑指令快捷方便
教学要求:本章让学生了解FX2N功能指令的类别、功能定义和书写方式;掌握应用功能指令的使用条件、表示的方法与步骤及 编程的规则;能针对一般的工程控制要求应用功能指令编写工程控制程序
第六章 FX2N功能指令 6.1 功能指令的表示与执行方式 6.2 程序流向控制指令 6.1.1 指令与操作数 6.1.2 指令的数据长度与执行形式 6.1.3 变址操作 6.2 程序流向控制指令 6.2.1 条件跳转指令 6.2.2 子程序调用和返回指令 6.2.3 中断指令 6.2.4 主程序结束指令 6.2.5 监视定时器指令
6.3 数据传送和比较指令 6.2.6 循环开始指令和循环结束指令 6.3.1 比较指令 6.3.2 区间比较指令 6.3.3 传送指令 6.3.4 移位传送指令 6.3.5 取反传送指令 6.3.6 块传送指令 6.3.7 多点传送指令 6.3.8 数据变换指令 6.3.9 BCD变换指令 6.3.10 BIN变换指令
6.4 算术运算和逻辑运算指令 6.5 循环与移位指令 6.4.1 加法指令 6.4.2 减法指令 6.4.3 乘法指令 6.4.4 除法指令 6.4.5 加1指令、减1指令 6.4.6 逻辑与、或和异和指令 6.4.7 求补指令 6.5 循环与移位指令 6.5.1 左、右循环指令 6.5.2 带进位的左、右循环指令 6.5.3 位组件左移、位组件右移指令 6.5.4 字元件右移、字元件左移指令
6.1 功能指令的表示与执行方式 6.1.1 指令与操作数 1.指令 2.操作数 功能框的第一部分是指令 功能框的第一段之后都为操作数部分 操作数部分依次由“源操作数”(源)、“目标操作数”(目)、和“数据个数”3部分组成 有些功能指令仅使用指令段(FNC编号),但多数情况下是将其与操作数结合在一起使用。其中: ① [S·] :源操作数,指令执行后其内容不改变。源的数量多时,以[S1]· 、[S2·]等表示。以加上“· ”符号表示使用变址方式,,默认为无“· ”,表示不能使用变址方式
(a)功能指令的梯形图;(b)X000=ON,MAEN指令的操作结果 ② [D·] :目标操作数,指令执行后将改变其内容。在目标数种多时,以 [D1·] 、 [D2·]等表示。默认为无“· ”,表示不能使用变址方式 ③ M、n:其他操作数,用来表示阐述或对源和目标操作数作出补充说明。表示常数时,K后跟的为十进制数,H后跟的为十六进制数 ④ 程序步:指令执行所需的步数。功能指令的指令段的程序步数通常为1步,但是根据各操作数是16位指令还是32位指令,会变为2步或4步。当功能指令处理32位操作数时,则在指令助记符号前加[D]表示,指令前无此符号时,表示处理16位数据 例: (a) (b) 图6.1 功能指令格式例 (a)功能指令的梯形图;(b)X000=ON,MAEN指令的操作结果
6.1.2 指令的数据长度与执行形式 1.字元件/双字元件 (1) 字元件 (2) 双字元件 一个字元件是由16位的存储单元构成,其最高位(第15位)为符号位,第0~14位为数值位 图6.2 字元件 (2) 双字元件 低位元件D10存储32位数据的低16位,高位元件D11存储32位数据的高16位
2.16位/32位指令 16位MOV指令 32位元件对数据的存放原则是:“低对低,高对高” 双字节元件中第31位为符号位,第0~30位为数值位 图6.3 双字元件 2.16位/32位指令 16位MOV指令 图6.4 16位MOV指令 当X001接通时,将十进制数10传送到16位的数据寄存器D10中去 当X001断开时,该指令被跳过不执行,源和目的内容都不变
当X001断开时,该指令被跳过不执行,源和目的内容都不变 32位MOV指令 图6.5 32位MOV指令 当X001接通时,将由D11和D10组成的32位源数据传送到由D13和D12组成的目标地址中去 当X001断开时,该指令被跳过不执行,源和目的内容都不变 3.位元件/位元件组件 只处理ON/OFF信息的软元件称为位元件,如X,Y,M,S等均为位元件 而处理数值的软元件称为字元件,如T,C,D等
【例6-1】说明K2M0表示的位元件组件含义 解: “位元件组件” 的组合方法的助记符是: Kn+最低位的位元件号 如KnX、KnY、KnM即是位元件组合,其中“K”表示后面跟的是十进制数,“n”表示4位一组的组数,16位数据用K1~K4,32位数据用K1~K8 【例6-1】说明K2M0表示的位元件组件含义 解: K2M0中的“2”表示2组4位的位元件组成组件,最低位的位元件号分别是M0和 M4。所以K2M0表示由M0~M3和M4~M7两组位元件组成一个8位数据,其中M7是最高位,M0是最低位
使用位元件组件时应注意: (1)若向K1M0~K3M0传递16位数据,则数据长度不足的高位部分不被传递,32位数据也同样 (2)在16位(或32位)运算中,对应元件的位指定是K1~K3(或K1~K7),长度不足的高位通常被视为0,因此,通常将其作为正数处理 (3)被指定的位元件的编号,没有特别的限制,一般可自由指定,但是建议在X,Y的场合最低位的编号尽可能的设定为0(X000,X010,X020…Y000,Y010,Y020…),在M,S场合理想的设定数为8的倍数,为了避免混乱,建议设定为M0,M10,M20…等
4.脉冲执行型/连续执行型指令 (1)连续执行指令型 (2)脉冲执行型指令 图6.6 连续执行指令举例 X000= ON时,指令在各扫描周期都执行 (2)脉冲执行型指令 指令总是只在X000由OFF→ON变化一次时执行一次,其它时候不执行 连续执行方式在程序执行时的每个扫描周期都会对目标组件加1,而这种情况在许多实际的控制中是不允许的。为了解决这类问题,设置了脉冲执行方式,并在这类助记符的后面加后缀符号“P”来表示此方式 (如图6.7) 图6.7 脉冲执行方式举例
6.1.3 变址操作 1.寄存器变址操作的一般规则 变址的方法是将变址寄存器V和Z这两个16位的寄存器放在各种寄存器的后面,充当操作数地址的偏移量 操作数的实际地址就是寄存器的当前值以及V和Z内容相加后的和 当源或目标寄存器用[S·]或[D·]表示时,就能进行变址操作。对32位数据进行操作时,要将V、Z组合成32位(V,Z)来使用,这时Z为低16位, V为高16位 可以用变址寄存器进行变址的软元件有X、Y、M、S、P、T、C、D、K、H、KnX、KnY、KnM、KnS
所以,第三行指令实际执行(D30)+(D40)→(D70),即D30的内容和D45的内容相加,结果送入D70中去 【例6-2】 求执行加法操作后源和目操作数的实际地址 图6.8 变址操作举例 解: 第一行指令执行25→V,第二行指令执行30→Z,所以变址寄存器的值为:V=25,Z=30。第三行指令执行(D5V)+(D15Z)→(D40Z) [S1·]为D5V:D(5+25)=D30 源操作数1的实际地址 [S2·]为D15Z:D(15+30)=D45 源操作数2的实际地址 [D·]为D40Z:D(40+30)=D70 目操作数的实际地址 所以,第三行指令实际执行(D30)+(D40)→(D70),即D30的内容和D45的内容相加,结果送入D70中去
2.16位指令操作数的变址 【例6-3】 图6.9是16位指令操作数修改的例子 将K0或K1的内容向变址寄存器V0传送 【例6-3】 图6.9是16位指令操作数修改的例子 将K0或K1的内容向变址寄存器V0传送 当X001=ON,V0=0时,(D0+0=D0),则K500的内容向D0传送 若V0=10时,(D0+10=D10),则K500的内容向D10传送 解: 图6.9 16位指令操作数的变址举例
3.32位指令操作数的变址 【例6-4】 图6.10是32位指令操作数修改的例子 【例6-4】 图6.10是32位指令操作数修改的例子 DMOV是32位的指令,因此在该指令中使用的变址寄存器也必须指定32位 在32位指令中指定了变址寄存器的Z寄存器(Z0~Z7)及与之组合的V寄存器(V0~V7) 解: 图6.10 32位指令操作数的变址举例 即使Z0中写入的数值不超过16位数值范围(0~32767),也必须用32位的指令将V,Z两方向改写,如果只写入Z侧,则在V侧留有其它数值,会使数值产生很多的运算错误
4.常数K的修改 【例6-5】图6.11是常数的修改的例子 当X005=ON,若V5=0,(K6+0=K6),将K6的内容向D10传送 解: 图6.11 常数K的修改举例
【例6-6】输入输出继电器8进制软元件的变址的例子 5.输入输出继电器八进制软元件的变址 【例6-6】输入输出继电器8进制软元件的变址的例子 用MOV指令输出Y7~Y0,通过变址修改输入,使其变换成X7~X0,X17~X10,X27~X20 这种变换是将变址值0、8、16通过(X0+0=X0)、(X0+8=X10)、X0+16=X20)的八进制的换算,然后相加软元件的编号,使输入端子发生变化 解: 图6.12 8进制软元件(编号)的变址举例
指令编号及助记符:条件跳转指令FNC00 CJ或CJ(P) 6.2 程序流向控制指令 6.2.1条件跳转指令 1.指令格式 指令编号及助记符:条件跳转指令FNC00 CJ或CJ(P) CJ指令的目标元件是指针标号,其范围是P0~P63(允许变址修改) 该指令程序步为3步,标点步为1步 作为执行序列的一部分指令,有CJ,CJP指令,可以缩短运算周期及使用双线圈 2.指令用法 条件跳转指令用于当跳转条件成立时跳过CJ或CJ(P)指令和指针标号之间的程序,从指针标号处连续执行,若条件不成立则继续顺序执行,以减少程序执行扫描时间
Y001为双线圈,X000=OFF时,不跳转,采样X001 【例6-7】说明图6.13的示例中条件跳转指令CJ的用法 解: X000“ON”,则从1步跳转到36步(标记P8的后一步) X000“OFF”时,不进行跳转,从1步向4步移动,不执行跳转指令 程序定时器T192~T199及高速计数器C235~C255如果在驱动后跳转则继续工作,输出接点也动作 Y001为双线圈,X000=OFF时,不跳转,采样X001 X000=ON时跳转至P8,P8处不跳转,采样X012
图6.13 CJ跳转指令修改举例
在发生跳转时,被跳过的那段程序中的驱动条件已经没有意义了,所以该程序段中的各种继电器和状态器、定时器等将保持跳转发生前的状态不变 3.跳转程序中软组件的状态 在发生跳转时,被跳过的那段程序中的驱动条件已经没有意义了,所以该程序段中的各种继电器和状态器、定时器等将保持跳转发生前的状态不变 4.跳转程序中标号的多次引用 标号是跳转程序的入口标识地址,在程序中只能出现一次,同一标号不能重复使用 。但是,同一标号可以多次被引用 图6.14 标号可以多次引用
5.无条件跳转指令的构造 PLC只有条件跳转指令,没有无条件跳转指令 。遇到需要无条件跳转的情况,可以用条件跳转条件来构造无条件跳转指令,最常使用的是使用M8000 (只要PLC处于RUN状态,则M8000总是接通的 ) 图6.15 无条件跳转指令指令的构造
指令的目标操作元件是指针号P0~P62(允许变址修改) CALL指令必须和FEND,SRET一起使用 6.2.2子程序调用和返回指令 1.指令格式 指令编号及助记符: 子程序调用功能指令FNC01 CALL ,CALL(P) 子程序返回功能指令 FNC02 SRET 指令的目标操作元件是指针号P0~P62(允许变址修改) 2.指令用法 (1)子程序与标号的位置 CALL指令必须和FEND,SRET一起使用 子程序标号要写在主程序结束指令FEND之后 标号P0和子程序返回指令SRET间的程序构成了P0子程序的内容
例: 当主程序带有多个子程序时,子程序要依次放在主程序结束指令FEND之后,并用不同的标号相区别 子程序标号范围为P0~P62,这些标号与条件转移中所用的标号相同,而且在条件转移中已经使用了标号,子程序也不能再用 同一标号只能使用一次,而不同的CALL指令可以多次调用同一标号的子程序 例: 图6.16 CALL指令举例
(2)子程序嵌套 图6。17 子程序嵌套举例
FX2N系列PLC有两类中断,即外部中断和内部定时器中断 定时中断是内部中断,是定时器定时时间到引起的中断 6.2.3 中断指令 1.指令格式 指令编号及助记符: 中断返回指令FNC03 IRET 中断允许指令FNC04 EI 中断禁止指令FNC05 DI 2.指令用法 FX2N系列PLC有两类中断,即外部中断和内部定时器中断 外部中断信号从输入端子送入,可用于机外突发随机事件引起的中断 定时中断是内部中断,是定时器定时时间到引起的中断
FX2N系列PLC设置有9个中断源,9个中断源可以同时向CPU发出中断请求信号,多个中断依次发生时,以先发生为优先;完全同时发生时,中断指针号较低的有优先权。另外,外中断的优先级整体上高于内中断的优先级 FX2N系列PLC有三条中断指令: ① EI中断允许指令 对可以响应中断的程序段用中断允许指令EI来开始 ② DI中断禁止指令 对不允许中断的程序段用中断指令DI来禁止 ③ 中断返回指令IRET 从中断服务子程序中返回时必须用专门的中断返回指令IRET,不能用子程序返回指令SRET 在主程序的执行过程中,可根据不同中断服务子程序中PLC要完成工作的优先级高低决定能否响应中断 程序中允许中断响应的区间应该由EI指令开始,DI指令结束 在中断子程序执行区间之外时,即使有中断请求,CPU也不会立即响应。通常情况下,在执行某个中断服务程序时,应禁止其他中断
例: 图6.18 中断指令举例
2.中断指针 (1)外中断用I指针 外中断用I指针的格式如图6.19(a)所示, 有I0~I5 共6点 外中断是外部信号引起的中断,对应的外部信号的输入口为X000~X005 (2)内中断用I指针 内中断用I指针格式如图6.19(b)所示,有I6~I8 3点 内中断是指机内定时时间到,中断主程序去执行中断子程序。定时时间由指定编号为6~8的专用定时器控制 设定时间值在10~99ms间选取,每隔设定时间就会中断一次
(a)外中断指针格式(b)内中断指针格式 图6.19 中断指针格式 (a)外中断指针格式(b)内中断指针格式
6.2.4主程序结束指令 1.指令格式 2.指令用法 指令编号及助记符:主程序结束指令FNC06 FEND 子程序应写在FEND指令和END指令之间,包括CALL,CALL(P)指令对应的标号、子程序和中断子程序 FEND指令的用法(见图6.20)应注意以下几点 : (1) CALL,CALL(P)指令的标号P用于在FEND指令后编程,必须要有IRET指令。中断指针I也在FEND指令后编程,必须要有SRET指令 (2) 使用多个FEND指令的情况下,应在最后的FEND指令与END指令之间编写子程序或中断子程序 (3)当程序中没有子程序或中断服务程序时,也可以没有FEND指令。但是程序的最后必须用END指令结尾。所以,子程序及中断服务程序必须写在FEND指令与END指令之间
图6.20 FEND指令的用法
6.2.5 监视定时器指令 1.指令格式 2.指令用法 指令编号及助记符:监视定时器指令FNC07 WDT (1)WDT用来在程序中刷新监视定时器(D8000) 通过改写存于特殊数据寄存器D8000中的内容,可改变监视定时器的检出时间。程序如图6.21所示 图6.21 WDT指令举例
(2)WDT指令还可以用于将长扫描时间的程序分割 当PLC的运行扫描周期指令执行时间超过200ms时,CPU的出错指示灯亮,同时停止工作。因此在合适的程序步中插入WDT指令,用以刷新监视定时器,以使顺序程序得以继续执行到END ,如图6.22 图6.22 WDT用于分隔程序
6.2.6 循环开始指令和循环结束指令 1.指令格式 2.指令用法 指令编号及助记符:循环开始FNC08 FOR 循环结束FNC09 NEXT 操作数的软组件:无 2.指令用法 循环指令可以反复执行某一段程序,只要将这一段程序放在FOR-NEXT之间,待执行完指定的循环次数后,才执行NEXT下一条指令。循环程序可以使程序变得简炼 FOR和NEXT指令必须成对使用,只有在FOR~NEXT指令之间的程序(利用源数据指定的次数)执行几次后,才处理NEXT指令以后的一步
循环次数在FOR后的数值指定。循环次数范围为n=1~32767时有效。如循环次数<1时,被当作1处理,FOR-NEXT循环一次 若不想执行FOR~NEXT间的程序时,利用CJ指令,使之跳转 环次数多时扫描周期会延长,可能出现监视定时器错误 NEXT指令在FOR指令之前,或无NEXT指令,或在FEND,END指令之后有NEXT指令,或FOR与NEXT的个数不一致时,会出错
已知K1X000的内容为7,数据寄存器D0Z的内容为6 【例6-8】分析图6.23的程序的循环工作过程和次数 已知K1X000的内容为7,数据寄存器D0Z的内容为6 图6.23 FOR、NEXT循环指令举例
解: 图6.23所示程序是三重循环的嵌套,按照循环程序的执行次序由内向外计算各循环次数 (1)单独一个循环[A]执行的次数 当X010为OFF时,已知K1X000的内容为7,所以[A]循环执行了7次 (2)循环B执行次数(不考虑C循环) [B]循环次数由D0Z指定,已知D0Z为6次。B循环包含了整个A循环,所以整个A循环都要被启动6次 (3)[C]的程序循环次数由K4指定为4次 在[C]的程序执行一次的过程中,则[B]的程序执行6次,所以A循环总计被执行了4×6×7=168次。然后向NEXT指令(3)以后的程序转移
6.3 数据传送和比较指令 6.3.1 比较指令 1.指令格式 指令编号及助记符:比较指令FNC10 CMP[S1·][S2·][D·] 其中: [D·]为比较结果的标志组件,指令中给出的是标志软组件的首地址(标号最小的那个) 标志位的软组件有Y、M、 S 源操作数的软组件有T、C、V、Z、D、K、H、KnX、KnY、KnM、KnS
2.指令用法 比较指令CMP是将源操作数[S1·]和源操作数[S2·]进行比较,结果送到目标操作数[D·]中,比较结果有三种情况:大于、等于和小于 CMP指令可以比较两个16位二进制数,也可以比较两个32位二进制数,在作32位操作时,使用前缀(D):(D)CMP[S1·][S2·][D·] CMP指令也可以有脉冲操作方式,使用后缀(P):(D)CMP(P) [S1·][S2·][D·],只有在驱动条件由OFF→ON时进行一次比较 标志位操作规则: 若K100>(C20),则M0被置1 若K100=(C20),则M1被置1 若K100<(C20),则M2被置1 图6.24 比较指令CMP举例
6.3.2区间比较指令 1.指令格式 指令编号及助记符:区间比较指令FNC11 ZCP[S1·][S2·] [S3·] [D·] 其中: 标志位的软组件有Y、M、S 源操作数的软组件有T、C、V、Z、D、K、H、KnX、KnY、KnM、KnS
ZCP指令是将源操作数[S3·]与[S1·]和[S2·]的内容进行比较,并比较结果送到目标操作数[D·]中 2.指令用法 ZCP指令是将源操作数[S3·]与[S1·]和[S2·]的内容进行比较,并比较结果送到目标操作数[D·]中 图6.25 区间比较指令ICP指令举例
[S1·]>[S3·],即K100>C30的当前值时,M3接通 [S1·]≤[S3·]≤[S2·],即K100≤C30的当前值≤K120时,M4接通 [S3·]> [S2·],即C30当前值>K120时,M5接通 当X000为OFF时,不执行ZCP指令,M3~M5仍保持X000=OFF之前的状态 使用比较指令CMP/ZCP时应注意: (1)使用ZCP时,[S2·]的数值不能小于[S1·] (2)所有的源数据都被看成二进制值处理
指令编号及助记符:传送指令FNC12 MOV [S·] [D·] 6.3.3 传送指令 1.指令格式 指令编号及助记符:传送指令FNC12 MOV [S·] [D·] 其中: [S·] 为源数据 [D·]为目标软组件 目标操作数为T、C、V、Z、D、KnY、KnM、KnS 源操作数的软组件有T、C、V、Z、D、K、H、KnX、KnY、KnM、KnS
传送指令是将源操作数传送到指定的目标操作数,即[S·] → [D·] 2.指令用法 传送指令是将源操作数传送到指定的目标操作数,即[S·] → [D·] 图6.26 传送指令MOV举例 当常开触点X000闭合为ON时,每扫描到MOV指令时,就把存入[S·]源数据中操作数100(K100)转换成二进制数,再传送到目标操作数D10中去 当X000为OFF时,则指令不执行,数据保持不变
指令编号及助记符:传送指令FNC13 SMOV [S·] m1 m2[D·]n 6.3.4 移位传送指令 1.指令格式 指令编号及助记符:传送指令FNC13 SMOV [S·] m1 m2[D·]n 其中: [S·]为源数据,m1为被传送的起始位,m2为传送位数 [D·]为目标软组件,n为传送的目标起始位 目标操作数可为T、C、V、Z、D、KnY、KnM、KnS 源操作数的软组件有T、C、V、Z、D、K、H、KnX、KnY、KnM、KnS n, m1, m2 的软组件有K、H
2.指令用法 移位传送指令的功能是将[S·]第m1位开始的m2个数移位到[D·]的第n位开始的m2个位置去,m1、m2和n取值均为1~4。分开的BCD码重新分配组合,一般用于多位BCD拨盘开关的数据输入 图6.27 移位传送指令SMOV举例 自动转换 103 102 101 100 D1’ D1’(四位BCD码) 103 102 101 100 D2’ D2’(四位BCD码) 自动转换 图6.28 移位说明
X000满足条件,执行SMOV指令 源操作数[S·]内的16位二进制数自动转换成4位BCD码,然后将源操作数(4位BCD码)的右起第m1位开始,向右数共m2位的数,传送到目标操作数(4位BCD码)的右起第n位开始,向右数共m2位上去,最后自动将目的操作数[D]中的四位BCD码转换成16位二进制数 图中,m1为4,m2为2,n为3,当X000闭合时,每扫描一次该梯形图,就执行SMOV移位传送操作,先将D1中的16位二进制数自动转换成4位BCD码,并从4位BCD码右起第4位开始(m1为4),向右数共2位(m2为2)(即103,102)上的数传送到D2内4位BCD码的右起第3位(n=3)开始,向右数共2位(即102,101)的位置上去,最后自动将D2中的BCD码转换成二进数 上述传送过程中,D2中的另两位即(即103,100)上的数保持不变
6.3.5 取反传送指令 1.指令格式 2.指令用法 指令编号及助记符:取反传送指令FNC14 CML[S·][D·] 其中: 目标操作数的软组件为T、C、V、Z、D、KnY、KnM、KnS 源操作数的软组件有T、C、V、Z、D、K、H、KnX、KnY、KnM、KnS 2.指令用法 CML指令的功能是将[S·]源操作数按二进制的位逐位取反并传递到指定目标软组件中,指令说明如图6.29 图6.29 取反传送指令C ML举例
指令编号及助记符:块传送指令FNC15 BMOV [S·][D·]n 6.3.6块传递指令 1.指令格式 指令编号及助记符:块传送指令FNC15 BMOV [S·][D·]n [S·]为源软组件 其中: [D·]为目标软组件 n为数据块个数 源操作数可取KnX、 KnY、KnM、KnS、T、C、D、K、H 目标操作数可取. KnY、KnM、KnS、T、C和D 数据块个数常数K、H
块传送指令的功能是将源操作数组件中n个数据组成的数据块传送到指定的目标软组件中去。如果组件号超出允许组件号的范围,数据仅传送到允许范围内 2.指令用法 块传送指令的功能是将源操作数组件中n个数据组成的数据块传送到指定的目标软组件中去。如果组件号超出允许组件号的范围,数据仅传送到允许范围内 (a) (b) 图6.30 块传送指令BMOV举例 (a)块传送指令;(b)块传送示意
如果X000断开,则不执行块传送指令,源、目数据均不变 根据K3指定数据块个数为3,则将D5~D7中的内容传送到D10~D12中去,如图6.30(b)所示 传送后D5~D7中的内容不变,而D10~D12内容相应被D5~D7内容取代 当源、目软组件的类型相同时,传送顺序自动决定 如果源、目软组件的类型不同,只要位数相同就可以正确传送 如果源、目软组件号超出允许范围,则只对符合规定的数据进行传送
指令编号及助记符:传送指令FNC16 FMOV [S·][D·]n 6.3.7 多点传送指令 1.指令格式 指令编号及助记符:传送指令FNC16 FMOV [S·][D·]n [S·]为源软组件 其中: [D·]为目软组件 n为目软组件个数 指令中给出的是目软组件的首地址。常用于对某一段数据寄存器清零或置相同的初始值 源操作数可取除V、Z以外的所有的数据类型,目标操作数可取KnY、KnM、KnS、T、C、和D,n小等于512
FMOV指令是将源操作数中的数据传送到指定目标开始的n个元件中去,这n个元件中的数据完全相同 2.指令用法 FMOV指令是将源操作数中的数据传送到指定目标开始的n个元件中去,这n个元件中的数据完全相同 图6.31 多点传送指令FMOV指令举例
指令编号及助记符:数据交换指令FNC17 XCH [D1·][D2·] 6.3.8 数据交换指令 1.指令格式 指令编号及助记符:数据交换指令FNC17 XCH [D1·][D2·] [D1·]、[D2·]为两个目标软组件 其中: 目标软组件操作数的元件可取KnY、KnM、KnS、T、C、D、V和Z 2.指令用法 数据交换指令XCH是将数据在两个指定的目标软组件之间进行交换,指令说明如图6.32,当X000为ON时,将D1和D17中的数据相互交换 图6.32 数据交换指令XCH举例
指令编号及助记符:BCD码变换指令FNC18 BCD[S·][D·] 1.指令格式 指令编号及助记符:BCD码变换指令FNC18 BCD[S·][D·] [S·]为被转换的软组件 其中: [D·]为目软组件 源操作数可取KnX、KnY、KnM、KnS、T、C、D、V和Z 目标操作数可取KnY、KnM、KnS、T、C、D、V和Z
2.指令用法 BCD交换指令是将源操作数中的二进制数转换成BCD码并传送到目标操作数中去。指令说明如图6.33。BCD码变换指令将PLC内的二进制数变换成BCD码后,再译成7段码,就能输出驱动LED显示器 图6.33 BCD指令举例
指令编号及助记符:BIN变换指令FNC19 BIN[S·][D·] 1.指令格式 指令编号及助记符:BIN变换指令FNC19 BIN[S·][D·] [S·]为被转换的软组件 其中: [D·]为目软组件 源操作数可取KnX、KnY、KnM、KnS、T、C、D、V和Z 目标操作数可取KnY、KnM、KnS、T、C、D、V和Z
2.指令用法 BIN指令将源元件中的BCD码转换成二进制数送到指定的目标元件中去。指令使用说明如图6.34。此指令作用正好与BCD变换指令相反,用于将软组件中的BCD码转换成二进制数 图6.34 BIN指令举例 四则运算(+、-、×、÷)与增量指令、减量指令等可编程控制器内的运算都用BIN码进行。因此,可编程控制器在用数字开关获取BCD码的信息时要用FNC19(BIN→BCD)转换指令
6.4 算术运算和逻辑运算指令 6.4.1 加法指令 1.指令格式 指令编号及助记符:二进制加法指令FNC20 ADD[S1·][S2·][D·] [S1·]、[S2·]为两个作为加数的源操作数 其中: [D·]为存放相加结果的目标组件 源操作数可取所有数据类型 目标操作数可取KnY、KnM、KnS、T、C、D、V和Z.
ADD指令将两个源操作数[S1]、[S2]相加,结果放到目标元件中[D]中。指令说明如图6.35 2.指令用法 ADD指令将两个源操作数[S1]、[S2]相加,结果放到目标元件中[D]中。指令说明如图6.35 图6.35 ADD指令举例之一 两个源数据进行二进制加法后传递到目标处,各数据的最高位是正(0)、负(1)的符号位,这些数据以代数形式进行加法运算,如5+(-8)=-3 ADD指令有4个标志位,M8020为0标志,M8021为借位标志位。M8022为进位标志位,M8023为浮点标志位
如果运算结果小于-32767(16位运算)或-2147483467(32位运算)则借位标志位M8021置1 如果运算结果为0,则零标志位M8020置1,运算结果超过32,767(16位运算)或2147483647(32位运算)则进位标志位M8022位置1 如果运算结果小于-32767(16位运算)或-2147483467(32位运算)则借位标志位M8021置1 在32位运算中,用到字元件时,被指定的字元件是低16位元件,而下一个字元件中即为高16位元件,源和目标可以用相同的元件中,若源和目标之中相同,而且采用连续执行的ADD,(D)ADD指令时,加法的结果在每个扫描周期都会改变。如下图6.36所示 图6.36 ADD指令之二
指令编号及助记符:减法指令FNC21 SUB [S1·] [S2·] [D·] 1.指令格式 指令编号及助记符:减法指令FNC21 SUB [S1·] [S2·] [D·] 其中: [S1·] [S2·]分别为作为被减数和减数的源软件组件 [D·]为存放相减差的目标组件 源操作数可取所有数据类型 目标操作数可取KnY、KnM、KnS、T、C、D、V和Z
SUB指令的功能是将指定的两个源软组件中的有符号数,进行二进制代数减法运算,然后将相减的结果差送入指定的目标软组件中 2.指令用法 SUB指令的功能是将指定的两个源软组件中的有符号数,进行二进制代数减法运算,然后将相减的结果差送入指定的目标软组件中 图6.37 SUB指令举例 减法指令标志区功能,32位运算元中指定方法与加法指令相同
指令编号及助记符:乘法指令FNC22 MUL [S1·] [S2·] [D·] 1.指令格式 指令编号及助记符:乘法指令FNC22 MUL [S1·] [S2·] [D·] 其中: [S1·] [S2·]分别为作为被乘数和乘数的源软件组件 [D·]为存放相乘积的目标组件的首地址 源操作数可取所有数据类型 目标操作数可取KnY、KnM、KnS、T、C、D、V和Z
2.指令用法 MUL指令的功能是将指定的[S1·]、 [S2·]两个源软组件中的数进行二进制代数乘法运算,然后将相乘结果积送入指定的目标软组件中。16位运算如图6.38,32位运算如图6.39 图6.38 MUL指令举例之一 图6.39 MUL指令举例之二
在32位运算中,若目标元件使用位软元件,只能得到低32位的结果,不能得到高32位的结果。这时应先向字元件传送一次后再进行计算,利用字元件作目标时,不可能同时监视64位数据内容,只能通过监控运算结果的高32位和低32位并利用下式计算4位数据内容。这种情况下,建议最好采用浮点运算 64位结果=(高32位数据)×232+低32位数据
指令编号及助记符:除法指令FNC23 DIV [S1·] [S2·] [D·] 6.4.4 除法指令 1.指令格式 指令编号及助记符:除法指令FNC23 DIV [S1·] [S2·] [D·] 其中: [S1·] [S2·]分别为作为被除数和除数的源软组件 [D·]为商和余数的目标组件的首地址 源操作数可取所有数据类型 目标操作数可取KnY、KnM、KnS、T、C、D、V和Z
2.指令用法 DIV指令的功能是将指定的两个源软组件中的数,进行二进制有符数除法运算,然后将相除的商和余数送入指定的目标软组件中。除法指令16位运算如图6.40,32位运算如图6.41 图6.40 DIV指令举例之一 图6.41 DIV指令举例之二
指令编号及助记符:加1指令FNC24 INC [D·] 减1指令FNC25 DEC [D·] 6.4.5加1指令、减1指令 1.指令格式 指令编号及助记符:加1指令FNC24 INC [D·] 减1指令FNC25 DEC [D·] 其中: [D·]是要加1(或要减1)的目标软组件 目操作数的软组件为KnY、KnM、KnS、T、C、D、V和Z. 2.指令用法 INC指令的功能是将指定的目软组件的内容增加1,DEC指令的功能是将指定的目软组件的内容减1。指令说明如图6.42。
在连续执行指令中,每个扫描周期都将执行运算,必须加1注意。所以一般采用输入信号的上升沿触发运算一次 图6.42 INC和DEC指令举例 16位运算时,如果+32767加1变成﹣32768,标志位不置位;32位运算时,如果+2147483647加1变成﹣2147483648,标志位不置位 在连续执行指令中,每个扫描周期都将执行运算,必须加1注意。所以一般采用输入信号的上升沿触发运算一次 16位运算时,如果﹣32768再减1,值变为+32767,标志位不置位;32位运算时,如果﹣2147483648再减1,值变为+2147483647,标志位不置位
(1)逻辑“与”指令FNC26 WAND [S1·] [S2·] [D·] 6.4.6 逻辑与、或和异和指令 1.指令格式 指令编号及助记符: (1)逻辑“与”指令FNC26 WAND [S1·] [S2·] [D·] 其中: [S1·] [S2·]为两个相“与”的源软组件 [D·]为放相“与”结果的目标组件 (2) 逻辑“或”指令FNC27 WOR [S1·] [S2·] [D·] 其中: [S1·] [S2·]为两个相“或”的源软组件 [D·]为放相“或”结果的目标组件 (3) 逻辑“异或”指令FNC28 WXOR [S1·] [S2·] [D·] 其中: [S1·] 、[S2·]为两个相“异或”的源软组件 [D·]为放相“异或”结果的目标组件
2.指令用法 (1)指令功能是将指定的两个源软组件[S1]和 [S2]中的数,进行二进制按位“与”,然后将相“与”结果送入指定的目标软组件中。WAND指令格式如图6.43所示,存放在源元件即(D10)和(D12)中的两个二进制数据,以位为单位作逻辑“与”运算,结果存放到目标元件[D],即(D14)中 图6.43 WAND指令举例
(2) WOR指令功能是将指定的两个源软组件[S1]和 [S2]中的数,进行二进制按位“或”,然后将相“或”结果送入指定的目标软组件中。指令格式如图6.44 (3) WXOR指令功能是将指定的两个源软组件[S1]和 [S2]中的数,进行二进制按位“异或”,然后将相“异或”结果送入指定的目标软组件中。指令格式如图6.45 图6.45 WXOR指令举例
指令编号及助记符:求补指令FNC29 NEG [D·] 6.4.7 求补指令 1.指令格式 指令编号及助记符:求补指令FNC29 NEG [D·] 其中: [D·]为存放求补结果的目标组件 目标操作数可取KnY、KnM、KnS、T、C、D、V和Z 2.指令用法 NEG指令功能是将指定的目标软组件 [D·]的内容中的各位先取反(0→1,1→0),然后再加1,将其结果送入原先的目标软组件中 图6.46 求补指令NEG举例
如果X000断开,则不执行这条NEG指令,源、目中的数据均保持不变 如果X000接通,则执行求补运算,即将D10中的二进制数,进行“连同符号位求反加1”,再将求补的结果将送入D10中 求补的示意如图6.47所示。假设D10中的数为十六进制的H000C,执行这条求补指令时,就要对它进行“连同符号位求反加1”,求补结果为HFFF4再存入D10中 图6.47 求补指令示意图
求补指令可以有32位操作方式,使用前缀(D) 求补同求补码是不同的 求补码的规则是:“符号位不变,数值位求反加1”,对H000C求补码结果将是H7FF4,两者的结果不一样 求补指令是绝对值不变的变号运算,求补前的H000C的真值是十进制+12,而求补后HFFF4的真值是十进制-12 求补指令可以有32位操作方式,使用前缀(D) 求补指令也可以有脉冲操作方式。使用后缀(P),只有在驱动条件由OFF→ON时进行一次求补运算 求补指令的32位脉冲操作格式为(D)OR(P) [D·]。同样, [D·]为目软组件的首地址 求补指令一般使用其脉冲执行方式,否则每个扫描周期都将执行一次求补操作
目标操作数可取KnY、KnM、KnS、T、C、D、V和Z。移动位数n为K和H指定的常数 6.5 循环与移位指令 6.5.1 左、右循环指令 1.指令格式 指令编号及助记符: (1)循环右移指令FNC30 ROR [D·]n 其中: [D·]为要移位目软组件 n为每次移动的位数 (2)循环左移指令FNC31 ROL [D·]n 其中: [D·]为要移位目软组件 n为每次移动的位数 目标操作数可取KnY、KnM、KnS、T、C、D、V和Z。移动位数n为K和H指定的常数
2.指令用法 (1)循环右移指令ROR的功能是将指定的目软组件中的二进制数按照指令中n规定的移动的位数由高位向低位移动,最后移出的那一位将进入进位标志位M8022。循环右移指令梯形图格式如图6.48所示 图6.48 ROR指令举例 执行一次ROR指令,“n”位的状态向量向右移一次,最右端的“n”位状态循环移位到最左端“n”处,特殊辅助继电器M8022表示最右端的“n”位中向右移出的最后一位的状态
假设D10中的数据为HFF00,执行这条循环右移指令的示意图如图6 假设D10中的数据为HFF00,执行这条循环右移指令的示意图如图6.49所示。由于指令中K4指示每次循环右移4位,所以最低4位被移出,并循环回补进入高4位中。所以循环右移4位D10中的内容将变为H0FF0了。最后移出的是第3位的“0”,它除了回补进入最高位外,同时进入进位标志M8022中 图6. 49 循环右移指令示意图
(2)ROL指令功能是将指定的目软组件中的二进制数按照指令规定的每次移动的位数由低位向高位移动,最后移出的那一位将进入进位标志位M8022。循环左移指令梯形图格式如图6.50所示。ROL指令的执行类似于ROR,只是移位方向相反 图650 ROL指令举例
(1)带进位的循环右移指令FNC32 RCR [D·]n 6.5.2 带进位的左、右循环指令 1.指令格式 指令编号及助记符: (1)带进位的循环右移指令FNC32 RCR [D·]n (2)带进位的循环左移指令FNC33 RCL [D·]n 其中: [D·]为要移位目软组件 n为每次移动的位数 目标操作数可取KnY、KnM、KnS、T、C、D、V和Z 移动位数n为K和H指定的常数
2.指令用法 RCR指令功能是将指定的目软组件中的二进制数按照指令规定的每次移动的位数由高位向低位移动,最低位移动到进位标志位M8022。M8022中的内容则移动到最高位 RCL指令功能是将指定的目软组件中的二进制数按照指令规定的每次移动的位数由低位向高位移动,最高位移动到进位标志位M8022。M8022中的内容则移动到最低位 这两条指令的执行基本上与ROL和ROR相同,只是在执行RCL、RCR时,标志位M8022不再表示向左或向右移出的最后一位的状态,而是作为循环移位单元中的一位处理
位组件右移指令 FNC34 SFTR [S·][D·] n1 n2 6.5.3 位组件左移、位组件右移指令 1.指令格式 指令编号及助记符: 位组件右移指令 FNC34 SFTR [S·][D·] n1 n2 位组件左移指令 FNC35 SFTL [S·][D·] n1 n2 其中: [S·]为移位的源位组件首地址 [D·]为移位的目位组件首地址 n1为目位组件个数 n2为源位组件移位个数 源操作数是Y、X、M、S 目操作数为Y、M、S n1和n2为常数K和H
2.指令用法 位右移是指源位组件的低位将从目的高位移入,目位组件向右移n2位,源位组件中的数据保持不变。位右移指令执行后,n2个源位组件中的数被传送到了目的高n2位中,目位组件中的低n2位数从其低端溢出 位左移是指源位组件的高位将从目的低位移入,目位组件向左移n2位,源位组件中的数据保持不变。位左移指令执行后,n2个源位组件中的数被传送到了目的低n2位中,目位组件中的高n2位数从其高端溢出。两条指令的示意图如图6.51和图6.52 对图6.51,如果X010断开,则不执行这条SFTR指令,源、目中的数据均保持不变。如果X010接通,则将执行位组件的右移操作,即源中的4位数据X003~X000将被传送到目位组件中的M15~M12。目位组件中的16位数据M15~M0将右移4位,M3~M0等4位数据从目的低位端移出,所以M3~M0种原来的数据将丢失,但源中X003~X000的数据保持不变
图6.51 SFTR指令举例
图6.52 SFTL指令举例
字右移指令 FNC36 WSFR(P) [S·][D·] n1 n2 6.5.4 字元件右移、字元件左移指令 1.指令格式 指令编号及助记符: 字右移指令 FNC36 WSFR(P) [S·][D·] n1 n2 字左移指令 FNC37 WSFL(P) [S·][D·] n1 n2 其中: [S·]为移位的源字元件首地址 [D·]为移位的目字元件首地址 n1为目字元件个数 n2为源字元件移位个数 源操作数可取KnX、KnY、KnM、KnS、T、C和D 目标操作数可取KnY、KnM、KnS、T、C和D n1,n2 可取K,H
2.指令用法 字元件右移和字元件左移指令以字为单位,其工作的过程与位移位相似,是将n1个字右移或左移n2个字。字元件右移和字元件左移指令的操作过程示意图见图6.53和图6.54 使用字右移和字左移指令时应注意: (1)字移位指令只有16位操作,占用9个程序步 (2)n1和n2的关系为n2≤n1≤512
图6.53 WSFR指令举例
图6.54 WSFL指令举例
小 结 本章介绍了FX2N系列PLC的功能指令。与基本逻辑指令只能完成一个特定的操作内容不同,功能指令实际上是一个个功能不同的子程序,能完成一系列的操作,使可编程控制器的功能变得更强大 FX2N系列PLC功能指令可以归纳为程序流向控制、数据传送、算术和逻辑运算、循环移位与移位、数据处理、高速处理、方便类、外部I/O、FX系列外围设备、外部设备指令、触电比较等共十一大类。引用功能指令编程时要注意功能指令的使用条件和源、目操作数的选用范围和选用方法,并注意有些功能指令在整个程序中只能使用一次