0%

方法一:使用两个定时器,优点是可以分别控制灯亮和灯灭的时间。但缺点是使用定时器多。
两定时器实现闪烁电路
方法二:使用一个定时器,但要使用比较指令进行比较,也可控制灯亮灭时间。
单定时器使用比较指令

子程序调用

1、子程序调用指令:CALL。例如CALL P0
2、子程序返回指令:SRET。
3、子程序用指针:Pn。
4、主程序结束指令:FEND。

如果X0= “ON”,则执行调用指令,跳转到标记为P10的子程序步。在这里,执行子程序后,通过执行SRET指令后,返回到原来的主程序步,接着继续执行后续的主程序。

在后述的 FEND 指令后对标记编程。
在子程序内可以允许有 9 次调用指令,整体而言可做10 层嵌套。

调用子程序时,主程序所属的OUT、PLS、PLF、定时器等均保持。

子程序返回时,子程序所属的OUT、PLS、PLF、定时器等均保持。

子程序中不要写脉冲、计数、定时等一个扫描周期内无法完成的指令。

CALL 指令和子程序指针 P 必须要配合使用,否则会报错“不存在的标号类型”。
子程序

中断

  1. 允许中断[EI]
  2. 禁止中断[DI]
  3. 中断返回[IRET]
  4. 中断子程序用指针:In
  5. 主程序结束指令:FEND

XC系列PLC中断功能分两种:一、外部中断:二、定时中断。

外部中断(IO中断):输入端子X 可以作为外部中断的输入用,每一输入端对应于一个外部中断,输入的上升沿或者下降沿都可触发中断,中断子程序写在主程序之后(FEND 命令之后)。当产生中断后,主程序立即止执行,转而执行相应的中断子程序,等中断子程序执行完成后,再立即返回继续执行主程序。

定时中断:在主程序的执行周期很长的情况下,如果要处理特定的程序;或者在顺控扫描中,需要每隔一段时间执行特定的程序时,定时中断功能非常适用。它可以不受可编程控制器的扫描周期的影响,每隔Nms执行定时中断子程序。
中断
在中断子程序里,只能写简单的置位、复位、传送、运算等可以在一个扫描周期内执行的指令,其他如发脉冲、定时(精确定时除外)、通讯等需要持续执行的指令均不支持。

助记符功能
CMP数据比较
ZCP数据区间比较
MOV传送
BMOV数据块传送
PMOV数据块传送
FMOV多点重复传送
EMOV浮点数传送
FWRTFlashROM 的写入
MSET批次置位
ZRST批次复位
SWAP高低字节交换
XCH两个数据交换

16位和32位传送指令(MOV,DMOV)

16位传送指令:MOV
32位传送指令:DMOV
将指定软元件中的数据照原样传送到另一个软元件中。

MOV K10 D10:将K10传送到D10,就是把十进制的10赋值给D10。
将K10传送到D10
运算结果以32位输出的应用指令(MUL等)、32位数值或32位软元件的高速计数器当前值等数据的传送,必须使用DMOV指令。
DMOV D0 D10 :将D1和D0中的数据传送到D11和D10中。
将D1和D0中的数据传送到D11和D10中

数据块传送(BMOV)

将指定的软元件的数据照原样传送到其他软元件中。
BMOV D5 D10 K3
将D5开始的三个字,即D5,D6,D7批量传送到D10开始的三个字,即D10,D11,D12
将D5开始的三个字,即D5,D6,D7批量传送到D10开始的三个字,即D10,D11,D12。
注意:使用BMOV指令不要产生数据重叠。

数据块传送(PMOV)

本指令比BOMV效率更高。
PMOV和BMOV使用方法一样。
PMOV D5 D10 K3
PMOV指令的使用

16位多点重复传送和32位多点重复传送(FMOV,DFMOV)

16位多点重复传送(FMOV)

FMOV K0 D0 K10:将K0传送至D0~D9,同一数据多点传送指令。
FMOV指令的使用

32位多点重复传送(DFMOV)

DFMOV D0 D10 K3:将D0、D1中的内容传送到D10、D11;D12、D13;D14、D15。
DFMOV指令的使用

浮点数传送(EMOV)

EMOV K3.14 D0:将3.14传送到D0、D1中
EMOV指令的使用
EMOV D0 D10:将D0、D1传送到D10、D11
EMOV指令的使用
常数K、H被指定为源数据时,自动转换为2进制浮点数。
K500自动二进制浮点化。

FlashROM写入(FWRT)

单字的写入
FWRT D0 FD0:将D0里面的值写入到FD0中
双字的写入
DFWRT D0 FD0:将D0里的数据写入到FD0、FD1
多字的写入
FWRT D0 FD0 K3:将D0D2里的值写入到FD0FD2

批次置位(MSET)、批次复位(ZRST)

将指定范围的位软元件进行置位或复位操作。
MSET M10 M120:整体置位元件M10M120
ZRST M500 M559:整体复位位元件M500
M559
ZRST D0 D100:整体复位字元件D0~D100

高低字节交换(SWAP)

将指定寄存器的高8位字节和低8位字节进行交换。
SWAP D10 将D10这个16位寄存器的高8位和低8位交换。
上例中如果将条件X0改为常开或常闭线圈触发,当输入X0为ON时,每个扫描周期都执行一次该指令,所以建议用上升沿或下降沿触发。

交换指令(XCH)

将两个软元件中的数据相互交换。
16位指令
XCH D10 D11:把D10的数据放到D11,D11的数据放到D10
32位指令
DXCH D10 D20:把D10、D11中的数据和D20、D21中的双字数据交换。

助记符指令功能
LD=开始(S1)=(S2)时导通
LD>开始(S1)>(S2)时导通
LD<开始(S1)<(S2)时导通
LD<>开始(S1)≠(S2)时导通
LD>=开始(S1)≥(S2)时导通
LD<=开始(S1)≤(S2)时导通

注意:
当源数据的最高位(16位指令:b15,32位:b31)为1时,将该数值作为负数进行比较。
32位计数器的比较,必须以32位指令来进行。若指定16位指令时,会导致程序出错或运算错误。
比较指令。想比较32位数据,把LD改为DLD即可。
使用的指令:LD= K3 C0
当C0的计数达到3时,Y0被置位。
当C0的计数达到3时,Y0被置位。

PLC数据存储单位

PLC数据存储单位有:位、字节、字等。位是最小的存储单位,每个位存储一个1位的二进制数据。
位:只能存储0或1状态。
字节:一个字节有8个位。
字:一个字有两个字节。
双字:一个双字有两个字。

寄存器

数据寄存器是用于存储数据的软元件,包括16位(最高位为符号位)、32位(由两个数据寄存器组合,最高位为符号位)两种类型。

16位数据寄存器

一个16位的数据寄存器,其处理的数值范围为K-32,768~K+32,767。

32位数据寄存器

由两个地址相邻的16位数据寄存器组成的32位数据(高字在后,低字在前)
处理的数值范围为K-2,147,483,648~K2,147,483,647。
建议低位采用偶数软元件编号。

位软元件组合寄存器

一般用,16位(由连续的16个位元件组合而成)。
支持组合成字的软元件由X、Y、M、S、T、C。
格式:在软元件前加D,如DM10,表示从M10-M25组成的16位数。

数据寄存器的数据存储范围

位:0-1
字节:无符号:0~255。有符号:-128~127。
字:无符号:0~65535。有符号:-32768~32767。
双字:无符号:0~4294967295,有符号:-2147483648~2147483647。

使用数据寄存器处理数据

数据存储
MOV K100 D0:向D0内写入16位的十进制数100。
向D0内写入16位的十进制数100
DMOV K1000000 D10:向D11和D10内写入32位十进制数1000000。
向D11和D10内写入32位十进制数1000000
MOV D0 D10:将D0内数据传送给D10。
将D0内数据传送给
读取定时器或计数器
MOV C10 D0:将计数器C10的计数值读取到D0中。
将计数器C10的计数值读取到D0中
作为定时器或计数器的设定值:
TMR_A T0 D0 D2:T0的定时时间与D0中的数值相等时,T0置位。D2是时基。
T0的定时时间与D0中的数值相等时,T0置位。D2是时基
CNT HC0 D4:HC0的计数值与D4中的数值相等时,HC0置位。
HC0的计数值与D4中的数值相等时,HC0置位

16位增计数器

16 位二进制增计数器,其有效设定值为 K1~K32,767(十进制常数)。设定值 K0 和 K1 具有相同的
含义,即在第一次计数开始时输出触点就动作。

使用指令:CNT C0 K10,来计数0-10之间的数字,当计数大于等于10时,C0接通。
16位增计数器
注意:切断电源,计数器数值清零。

16位减计数器

指令:CNT_D C0 K-10
16位减计数器
上面梯形图的含义就是,当C0计数器从0减到-10时,C0接通。

32位增减计数器

计数器计数模式是32 位线性增/减模式(-2,147,483,648 ~+2,147,483,647),当计数器的计数值递增达到最大值 K2,147,483,647 会变成 K-2,147,483,648,当计数器的计数值递减达到最小值K-2,147,483,648 会变成 K2,147,483,647,计数器的 ON/OFF 状态也随计数值的变化而变化。
32位增减计数器
使用32位增计数器计数到1000000:DCNT C0 K1000000

DCNT_D即为减计数器。

不累计定时器

普通定时器不设专用指令,使用TMR指令进行定时;
采用程序存储器内的常数(K)作为设定值,也可用数据寄存器(D)的内容进行间接指定。
驱动输入断开或停电,定时器复位,输出触点复位。
指令格式:TMR T0 K200 K100
普通计时器
上例计时器的计时时间就是200乘100等于20000ms,也就是20s。
当T0计时器到达设定值的时候,定时器的输出触点动作。
使用定时器T0的常开触点:LD T0

累计定时器

累计定时器有掉电记忆功能。
累计计时器
上面的例子中,计时的时间为10s,在这10s中,X0断开后,再次启动X0,之前累积的时间不会清零。
当X1为1时,HT0被复位。使用的指令是:RST HT0。

定时器应用

小灯闪烁程序
要求: X0接通,小灯Y0亮0.5S,灭0.5S闪烁,断开X0,小灯停止输出。
小灯闪烁

输出延时关断
要求:按下装料按钮X0,装料电磁阀Y0输出5S的时间,时间到自动断开输出。(装料过程中再次按装料按钮无效)
输出延时关断

常开、常闭、线圈指令

  1. 常开触点指令:LD X0
    操作对象:X、Y、M、S、T、C、Dn.m、FDn.m
  2. 常闭触点指令:LDI X1
    操作对象:X、Y、M、S、T、C、Dn.m、FDn.m
  3. 线圈指令:OUT Y0
    操作对象:Y、M、S、T、C、Dn.m、FDn.m
    常开、常闭、线圈指令

上升沿、下降沿指令

  1. 上升沿指令:LDP X0
    当PLC检测到上升沿信号时,保持一个扫描周期的高电平。
  2. 下降沿指令:LDF X1
    当PLC检测到下升沿信号时,保持一个扫描周期的高电平。
    上升沿、下降沿指令

置位、复位指令

  1. 置位指令:SET Y0
    操作对象:Y、M、S、T、C、Dn.m
  2. 复位指令:RST Y1
    操作对象:Y、M、S、T、C、Dn.m
  • 对于同一软元件,SET、RST可多次使用,顺序也可随意,但最后执行者有效。
  • 此外,定时器、计数器当前值的复位以及触点复位也可使用RST指令。
  • 使用 SET、RST 指令时,避免与 OUT 指令使用同一定义号
    置位、复位指令

输入继电器(X)

用于接收外部的开关量信号,用X表示。

地址分配原则

在基本单元中,以八进制形式表示,例如X0-X7,X10-X17。
在扩展单元中,第一路扩展从X100开始,第二路从X200开始,以此类推。

输出继电器(Y)

用于驱动PLC外部负载的接口,用Y表示。

地址分配原则

在基本单元中,以八进制形式表示,例如Y0-Y7,Y10-Y17。
在扩展单元中,第一路扩展从Y100开始,第二路从Y200开始,以此类推。

辅助继电器(M)

PLC内部的继电器,用M表示。
注意⚠️:辅助继电器有断电保持功能。

地址分配

按照十进制分配地址,例如M0-M9,M10-M19。

状态继电器(S)

步进梯形图使用的继电器,用S表示。
按十进制分配地址。
注意:不作为工序号使用时,与辅助继电器一样,可作为普通的触点/线圈进行编程。另外,可作为信号报警器,用于外部故障。

定时器(T)

达到设定值的时候,输出触点动作。

地址分配

在基本单元中,按照十进制数分配定时器的地址,又根据时钟脉冲、累计与否将地址划分为几块区域。

时间脉冲

定时器的时钟脉冲有1ms、10ms、100ms三种规格,若选用10ms的定时器,则将对10ms的时间脉冲进行加法计算。

累计/不累计

定时器分为累计与不累计两种模式。
累计定时器,定时器线圈的驱动输入断开,仍保持当前值,等驱动输入再次导通时继续累计动作。
而不累计定时器,输入驱动断开就清零。

计数器(C)

内部计数用(一般使用或停电保持)

  • 16位计数器:增计数用,计数范围1~32,767
  • 32位计数器:增计数用,计数范围1~2,147,483,647
    这些计数器供PLC的内部信号使用,其响应速度为一个扫描周期或以上。

高速计数用(停电保持用)

32位计数器:增/减计数用,计数范围-2,147,483,648~+2,147,483,647(单相递增计数,单相增/减计数,AB相计数)分配给特定的输入点。
速计数可以进行频率80kHz以下的计数,而与可编程控制器的扫描周期无关。
地址分配:按十进制编址。

数据寄存器(D)

供存储数据用的软元件,以符号D表示。

地址分配

XC系列PLC的数据寄存器都是16位的(最高位为符号位),将两个寄存器组合可以进行32位(最高位为符号位)的数据处理。
数据寄存器以十进制编址。

注意⚠️:跟其他软元件一样,数据寄存器也有供一般使用和停电保持。

内部扩展寄存器(ED)

用于存储数据。
以十进制进行编址。

注意⚠️⚠️⚠️:该存储区出厂默认都为停电保持使用,其功能主要用于数据的存储,只适合 MOV,BMOV,FMOV 等数据传送的指令。

题目:一个偶数总能表示为两个素数之和

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
int Is_Prime_Number(int input)//计算Cal_Prime传过来的值是不是素数,是返回0,不是返回1
{
    int i;
    for (i=2; i<input; i++)
    {
        if (input%i==0)
        {
            return 1;
        }
    }
    return 0;
}
void Cal_Prime(int input)
{
    int i = 0;
    int j = 0;
    for (i=2; i<input; i++)//素数最小都是2,从2开始枚举
    {
        j = input - i;//i和j的和就是input
        int a = Is_Prime_Number(i);//看看i是不是素数
        int b = Is_Prime_Number(j);//看看j是不是素数
        if (a!=1 && b!=1)//如果都是素数
        {
            printf("%d + %d = %d",i,j,input);
            break;
        }
    }
}
int main()
{
    int input = 0;
    printf("请输入一个偶数:->");
    scanf("%d",&input);
    Cal_Prime(input);
    return 0;
}