文档库 最新最全的文档下载
当前位置:文档库 › 西门子 simenzi200应用

西门子 simenzi200应用

西门子 simenzi200应用
西门子 simenzi200应用

H.1 模拟电位器

概述

本例包含了有关SIMATIC S7-200 的模拟电位器(POT)的使用信息。电位器的位置转

换为0 至255 之间的数字值,然后,存入两个特殊存储器字节SMB28 和SMB29

中,分别对应电位器0和电位器1 的值。

需要一把小螺丝刀用以调整电位器的位置。

本应用示例介绍了使用模拟电位器调整定时器设定值的三种方案。

例图

模拟电位器

程序和注释

方案1说明了用模拟电位器对定时器设定值进行细调的方法。首先通过程序中的偏移量(本例中为20ms )对定时器进行粗调,然后再用电位器能把定时器的设定值精确地调整到满意的设置。每个定时器周期之后,执行子程序1中的指令,把POT 0的值(在SMB28中)读到AC1,除以2,再加上200ms 偏移量。返回主程序时,AC2中的定时器循环计数值加1,并拷贝到输出字节(QB0),以供显示。

在方案2中,对电位器1(POT 1)的100次扫描值在AC3中累加后并取平均,再存入VW12。如果该值低于低保护限值VW14,或高于高保护限值VW16(两者均在首次扫描时初始化),则将新值VW12拷贝到VW14、VW16和VW18中。然后再分别对VW16和VW14的值减、加3ms ,作为新限值,而VW18中的平均值被传回主程序作为定时器T34的设定值。返回主程序时,VW20中的定时器循环计数值加1,并拷贝到输出字节(QB1),以供显示。

在方案3中,把电位器0(POT 0)的值直接作为定时器T35的设定值,AC2中的定时器循环计数值加1,并拷贝到输出字节(QB0),以供显示。 本程序长度为110个字。

// 标题:模拟电位器:

// * * * * * * * * * * * * * * *主程序* * * * * * * * * * * * * * *

// 这是S7-200的一个演示程序,介绍了使用模拟电位器调整定时器设定值的三种方案。

// 方案1:对来自POT 0的值进行换算并加偏移量,以调整定时器的设定值,可以从200ms调到的1.48s。

每个定时器周期QB0加1。

// 方案2:从POT 1来的值经过滤波给定时器提供0ms到约2.55s的稳定的设定值。每个定时器周期QB1 加1。

// 方案3:把POT 0的值直接作为定时器设定值。每个定时器周期QB0加1。

// 模拟电位器POT 0和POT 1的值可以分别从SMB28和SMB29中以一个字节读出。

// 每次扫描时,POT的值会变化一点,方案1和2都能为定时器提供稳定的设定值。

// 方案1的设定值会改变1次或2次,但每个定时器周期只装载一次。

// 方案2的设定值非常稳定,每次扫描都装载。

// 方案3的设定值每次扫描都会改变。

// 主程序:

LD SM0.1 // 首次扫描时清除工作缓冲区:

MOVD+0,AC0 // AC0=0。

MOVD+0,AC3 // AC3=0。

MOVW+0,VW10 // VW10=0。

MOVW+32000,VW14 // 低限工作区复位。

MOVW+0,VW16 // 高限工作区复位。

// 方案1:

// 每次扫描时POT的值会改变一点。

// 下面的指令用来在每个定时器周期捕获一次换算后的值,并提供一个稳定的定时器设定值。

LD I0.0 // 如果输入I0.0为1状态,则选方案1。

TON T33,VW0 // POT 0的值经运算后作为T33的设定值。

CALL 1 // 调用子程序1对POT 0的值进行换算并加偏移量。

LD T33 // 若T33计时到,

INCW AC2 // 则AC2加1,即定时器循环计数。

MOVB AC2,QB0 // 把AC2的最低有效字节拷贝到输出字节QB0,以供显示。

R T33,1 // 定时器T33复位。

// 方案2:

LD I0.1 // 如果输入I0.1为1状态,则选方案2。

CALL 2 // 调用子程序2,对POT 1的值进行滤波运算后存入VW18。

TON T34,VW18 // VW18的值作为T34的设定值。

LD T34 // 若T34计时到,

INCW VW20 // 则VW20加1,即定时器循环计数。

MOVB VB21,QB1 // 把VW20最低有效字节(VB21)拷贝到输出字节QB1,以供显示。R T34,1 // 定时器T34复位

// 方案3:

LD I0.2 // 如果输入I0.2为1状态,

AN I0.0 // 且方案1不在运行(I0.0=0),则选方案3。

MOVW 0,AC1 // 清除累加器1(AC1)

MOVB SMB28,AC1 // 送POT 0的值到AC1。

TON T35,AC1 // POT 0的值作为T35的设定值。

LD T35 // 若T35计时到,

INCW AC2 // 则AC2加1,即定时器循环计数。

MOVB AC2,QB0 // 把AC2最低有效字节拷贝到输出字节QB0,以供显示。

R T35,1 // 定时器T35复位。

MEND // 主程序结束

// 方案1的子程序

SBR 1 // 子程序1。

// 换算POT 0的值并加上偏移量后存在VW0中,再返回主程序。

LD T33 // 每个定时器周期检查POT 0的变化。

MOVW 0,AC1 // 清除累加器1(AC1)。

MOVB SMB28,AC1 // 送POT 0的值给AC1。

DIV 2,AC1 // AC1除2,即把POT 0的输入范围从0~255换算成0~127。

+1 20,AC1 // 加200ms偏移量。

MOVW AC1,VW0 // 把AC1值拷贝到VW0,以便能让程序员读取。

RET // 子程序1结束。

// 方案2的子程序

SBR 2 // 子程序2。

// 对POT 1值采样100次,然后求平均值。

INCW VW10 // 扫描计数器加1。

MOVB SMB29,AC0 // 送POT 1的值到AC0。

+1 AC0,AC3 // 再加到以前的总和中(即累加POT1的值,共累加100次)。

LDW VW10,100 // 100次扫描之后。

DIV 100,AC3 // 求平均值。

MOVW AC3,VW12 // 存平均值。

MOVW 0,VW10 // 扫描计数器复位。

MOVD 0,AC3 // 工作内存复位。

AW<= VW12,VW14 // 检查新的平均值是否在保护区之外。

OW>= VW12,VW16 //

FILL VW12,VW14,3 // 把新的平均值存入VW14,VW16,VW18。

-1 +3,VW14 // 设置新的低保护限。

+1 +3,VW16 // 设置新的高保护限。

RET // POT 1的滤波值存在VW18中,返回主程序

H.2 怎样使用高速计数器

概述

本例叙述SIMATIC S7-200的高速计数器(HSC)的一种组态功能。对来自传感性(如编码

器)信号的处理,高速计数器可采用多种不同的组态功能。

本例用脉冲输出(PLS)来为HSC产生高速计数信号,PLS可以产生脉冲串和脉宽调制信

号,例如用来控制伺服电机。既然利用脉冲输出,必须选用CPU 224DC/DC/DC。

下面这个例子,展示了用HSC和脉冲输出构成一个简单的反馈回路,怎样编制一个程序来

实现反馈功能。

例图

224

高速计数器输入

程序框图

程序和注释

本例描述了S7-200 DC/DC/DC 的高速计数器(HSC)的功能。HSC 计数速度比PLC 扫描时间快得多,采用集成在CPU 224中的20K 硬件计数器进行计数。总的来说,每个高速计数器需要10个字节内存用来存控制位、当前值、设定值、状态位。 本程序长度为91个字。

// 主程序:

// 在主程序中,首先将输出Q0.0置,0,因为这是脉冲输出功能的需要。再初始化高速计 // 数器HSC0,然后调用子程序0和1。

// HSC0起动后具有下列特性:可更新CV 和PV 值,正向计数。 // 当脉冲输出数达到SMD72中规定的个数后,程序就终止。

// 主程序 LD SM0.1 // 首次扫描标志(SM0.1=1)。 R Q0.0,1 // 脉冲输出Q0.0复位(Q0.0=0)。 MOVB 16#F8,SMB37 // 装载HSC0的控制位: // 激活HSC0,可更新CV ,可更新PV , // 可改变方向,正向计数。 // HSC 指令用这些控制位来组态HSC 。

MOVD 0,SMD38 // HSC0当前值(CV )为0。 MOVD 1000,SMD42 // HSC0的第一次设定值(PV )为1000。 …………. INT1

INT0

INT2

………….

………….

1000

1500

1000

HDEF 0,0 // HSC0定为模式0。

CALL 0 // 调用子程序0。

CALL 1 // 调用子程序1。

MEND // 主程序结束。

// * * * * * * * * * * * * * * * * * * * *

// 子程序0:

// 子程序0初始化,并激活脉冲输出(PLS)。

// 在特殊存储字节SMB67中定义脉冲输出特性:脉冲串(PT0),时基,可更新数值,激活PLS。// SMW68定义脉冲周期,其值为时基的倍数。

// 最后,在SMD72中指定需要产生的脉冲数。(SMD72)为内存双字,即4个字节)。

// 子程序0

SBR 0 // 子程序0

MOVB 16#8D,SMB67 // 装载脉冲输出(PLS0)的控制位:PT0,时基1ms,可更新,激活。MOVW 1,SMW68 // 脉冲周期1ms。

MOVD 30000,SMD72 // 产生30000个脉冲。

PLS 0 // 起动脉冲输出(PLS 0),从输出端Q0.0输出脉冲。

RET // 子程序0结束。

// * * * * * * * * * * * * * * * * * * * *

// 子程序1:

// 子程序1起动HSC0,并把中断程序0分配给中断事件12(HSC 0的当前值CV等于设定值PV)。

// 只要脉冲计数值(当前值CV)达到设定值(PV),该事件就会发生。

// 最后,允许中断。

// 子程序1

SBR 0 // 子程序1。

ATCH 0,12 // 把中断程序0分配给中断事件12(HSC 0的CV=PV)。

ENI // 允许中断。

HSC 0 // 按主程序中对HSC 0的初始组态特性,起动HSC0。

RET // 子程序1结束。

// * * * * * * * * * * * * * * * * * * * *

// 中断程序0:

// 当HSC 0的计数脉冲达到第一,设定值1000时,调用中断程序0。

// 输出端Q0.1置位(Q0.1=1)。

// 为HSC 0设置新的设定值1500(第二设定值)

// 用中断程序1取代中断程序0,分配给中断事件12(HSC 0的CV=PV)。

// 中断程序0

INT 0 // 中断程序0。

S Q0. 1,1 // 输出端Q0.1置位(Q0.1=1)。

MOVB 16#A0,SMB37 // 重置HSC 0的控制位,仅更新设定值(PV)。

MOVD 1500,SMD42 // HSC 0的下一个设定值为1500(第二设定值)。

ATCH 1,12 // 用中断程序1取代中断程序0,分配给中断事件12。

HSC 0 // 起动HSC 0,,为其装载新的设定值。

RETI // 中断程序0结束。

// * * * * * * * * * * * * * * * * * * * *

// 中断程序1:

// 当HSC 0的计数脉冲达到第二设定值1500时,调用中断程序1。

// 输出端Q0.2置位(Q0.2=1)。

// HSC 0改成减计数,并置新的设定值1000(第三设定值)。

// 用中断程序2取代中断程序1,分配给中断事件12(HSC 0的CV=PV)。

// 中断程序1:

INT 1 // 中断程序1。

S Q0. 2,1 // 输出端Q0.2置位(Q0.2=1)。

MOVB 16#B0,SMB37 // 重置HSC 0的控制位,更新设定值,并改成减计数(反向计数)。MOVD 1000,SMD42 // HSC 0的下一个设定值为1000(第三设定值)。

ATCH 2,12 // 用中断程序2取代中断程序1,分配给中断事件12。

HSC 0 // 起动HSC 0,,为其装载新的设定值和方向。

RETI // 中断程序1结束。

// * * * * * * * * * * * * * * * * * * * *

// 中断程序2:

// 当HSC 0的计数脉冲达到第三设定值1000时,调用中断程序2。

// 输出端Q0.1和Q0.2复位(Q0.1=0,Q0.2=0)。

// HSC 0的计数方向重新改为正向(增计数),并将当前计数值置为0,而设定值PV保持不变(1000)。// 重新把中断程序0分配给中断事件12,程序再次起动HSC 0运行。

// 当脉冲数达到SMD72中规定的个数后,程序就终止。

// 中断程序2:

INT 2 // 中断程序2。

R Q0. 1,2 // 输出端Q0.1和Q0.2复位(Q0.1=0,Q0.2=0)。

MOVB 16#D8,SMB37 // 重置HSC 0的控制位,更新CV,改为正向计数(增计数)。

MOVD 0,SMD38 // HSC 0的当前值复位(CV=0)。

ATCH 0,12 // 把中断程序0分配给中断事件12。

HSC 0 // 重新起动HSC 0。

RETI // 中断程序2结束。

H.3 自由通信口模式的简单应用

概述

自由通信口模式(Freeport Mode)的通信协议可自由定义,通信所需要的信息存放在特殊存

储字节SMB30中,用户须作如下说明:

●奇偶校验

●每个字符的位数

●波特率

自由通信口模式可以接收和发送数据。本例用一个仿真的打印机程序来描述数据发送,再

用一个条形码阅读器程序来说明数据接收。

例图

打印

机程序框图

条形码解码器

条形码阅读器

适配器

通信口

接收

发送

转换器

打印机接口

CPU 222

打印机程序和注解

此程序描述向打印机发送数据。为了简化此例,窗口下的终端程序可代替打印机作为接收

器边接。打印机或终端的组态特性为9600波特,无奇偶校验,每字符8位。

本程序长度为13个字。

// 正确设置自由通信口模式对此应用很重要。

// 所需信息装载在特殊存储字节SMB30中。

// 这些输入数据可从操作手册中查询。

// 发送命令XMT包含了发送信息缓冲区的起始地址,该地址单元中只包含了发送信息的长度(以字节为单位)。

LD SM0.1 // 第一次扫描(SM0.1=1)。

MOVB +9,SMB30 // 自由通信口模式;9600波特,无奇偶校验,每字符8位。

MOVB +1,VB100 // 信息长度为1个ASCII字符。

MOVB 16#41,VB101 // A字符长度为1个字节,A=41H(十六进制)。

LD I0.1 // 输入I0.1起动发送。

EU // 识别脉冲上升沿。

XMT VB100,0 // 发送。

MEND // 主程序结束。

条形码阅读器程序框图

起动主程序起动中断程序0

设置

自由通信口模式输入信号=A吗

激活接收中断

置输出Q0.1为1

结束主程序

结束中断程序0否

条形码阅读器程序和注解

该程序描述数据接收,条形码阅读器通过接口把读到的数据用自由通信口模式发给

SIMATIC S7-200。为简化此例,窗口下的终端程序可代替条形码阅读器作为发送器连

接。

本程序长度为15个字。

// * * * * * * * * * * * * 主程序* * * * * * * *

// 正确设置自由通信口模式对此应用很重要。

// 所需信息装载在特殊存储字节SMB30中。

// 这些输入数据可从操作手册中查询。

// 接收数据借助于中断实现,当数据进入自由编程接口,接收中断事件(8)。

// 就被触发了。

// 在此应用中,将中断程序0(INT0)赋予接收中断事件(8)。

LD SM0.1 // 第一次扫描标志(SM0.1=1)。

MOVB +9,SMB30 // 自由通信口模式:9600波特,无奇偶校验,每字符8位。

ATCH +0,8 // 指定接收中断事件8调用中断程序0。

ENI // 允许中断。

MEND // 结束主程序。

// * * * * * * * * 中断程序0 * * * * * * * *

// 在中断程序0,把存放在特殊存储字节SMB2中的接收字符和大写字母A作比较。

// 如果符合,则置输出位Q0.1为1。

INT // 接收中断程序0。

LDB =SMB2,16#41 // 字节SMB2中的接收字符和A比较。

S Q0.1,1 // 若字符为A,则置Q0.1为1。

RETI // 返回主程序。

H.4 处理脉宽调制

概述

在S7-200系列中输出端Q0.0和Q0.1能够输出方波信号,而且方波信号的周期和脉宽均能独

立调节,其中脉宽指的是在一个周期内,输出信号处于高电平的时间长度。

下面这个例子说明了脉宽调制(PWM)是如何工作的。输出端Q0.0输出方波信号,其脉

宽每周期递增0.5秒,周期固定为5秒,并且脉宽的初始值为0.5秒。当脉宽达到设定的最大

值4.5秒时,脉宽改为每周期递减0.5秒,直到脉宽为零为止。以上过程周而复始。

在这个例子中必须把输出端Q0.0与输入端I0.0连接,这样程序才能控制PWM。

例图

脉冲输出

脉宽调制信号

高速计数器输入同期脉宽

224

224

程序框图

程序和注解

特殊存储字节SMB67用来初始化输出端Q0.0的PWM 。这个控制字内含PWM 允许位,修改周期和脉宽的允许位,以及时间基数选择位等,由子程序0来调整这个控制字节。通过ENI 指令,使所有的中断成为全局允许,然后通过PLS0指令,使系统接受各设定值,并初始化“PTO/PWM 发生器”,从而在输出端Q0.0输出脉宽调制(PWM )信号。

另外,周期5秒是通过将数值5000置入特殊存储字SMW68来实现的,初始脉宽0.5秒则通过将500写入特殊存储字SMW70来实现的。

这个初始化过程是在程序的第一个扫描周期通过执行子程序0来实现,第一个扫描周期标志是SM0.1=1。当一个PWM 循环结束,即当前脉宽为0秒时,将再一次初始化PWM 。 辅助内存标记M0.0用来表明脉宽是增加,还是减少,初始化时将这个标记设为增加。输出端Q0.0与输入端I0.0相连,这样输出信号也可送到输入端I0.0。当第一个方波脉冲输出时,利用ATCH 指令,把中断程序1(INT1)赋给中断事件0(I0.0的上升沿)。

每个周期中断程序1将当前脉宽增加0.5秒,然后利用DTCH 指令分离中断INT1,使这个中断再次被屏蔽。如果在下次增加时,脉宽大于或等于周期,则将辅助内存标记位M0.0再次置0。这样就把中断程序2赋予事件0,并且脉宽也将每次递减0.5秒。当脉宽值减为零时,将再次执行,初始化程序(子程序0)。 本程序长度为63个字。 主程序 开始

SBR0 开始

主程序 结束

SBR0 结束

INT1 开始 INT2 开始

INT1 结束

INT2 结束

在第一次扫描: 调开子程序0 初始化PWM

设定PWM 的控制 字,周期5秒,脉 宽初值0.5秒

脉宽增吗?

否 是

中断2被赋予

“I0.0的上升沿” 事件 中断1被赋予

“I0.0的上升沿” 事件

脉宽增加0.5秒 断开事件与中断

脉宽减少0.5秒 断开事件与中断

// * * * * * * * * * * * * 主程序* * * * * * * *

LD SM0.1 // 在第一个扫描周期SM0.1=1。

CALL 0 // 调用子程序0来起动PWM,即初始化PWM。LDW>= SMW70,VW0 // 如果脉宽大于等于(周期一脉宽),

R M0.0,1 // 则将辅助内存标记位M0.0置0。

LDW= SMW70,0 // 如果脉宽为零,

CALL 0 // 则调用子程序0来重新开始一个完整的PWM。LD I0.0 // 如果输入I0.0=1。

A M0.0 // 且辅助内存标记位M0.0=1(脉宽增加),ATCH 1,0 // 则把INT1赋给事件0(输入I0.0的正向上升沿)。LD I0.0 // 如果输入I0.0=1。

AN M0.0 // 且辅助内存标记位M0.0=0(脉宽减少),ATCH 2,0 // 则把INT2赋给事件0(输入I0.0的正向上升沿)。MEND // 主程序结束。

// * * * * * * * * 主程序0 * * * * * * * *

SBR 0 // 初始化脉宽调制

S M0.0,1 // 将增加脉宽的辅助内存标记位M0.0置1。MOVB 16#CB,SMB67 // 设定输出端Q0.0的PTO/PWM控制字节

// SM67.0:=1 ?允许接受新的周期。

// SM67.1:=1 ?允许接受新的脉宽。

// SM67.3:=1 ?时间基数为1ms(若为0,则时间基数为1μs)。

// SM67.6:=1 ?选择PWM模式(若为0,则PT0模式)。

// SM67.7:=1 ?允许高速输出功能。

MOVW 500,SMW70 // 指定初始脉宽(500ms)。

MOVW 5000,SMW68 // 周期为5s。

ENI // 允许全部中断。

PLS0 // 对PTO/PWM生成器编程的指令。

MOVW SMW68,VW0 // 将周期置入数据字VW0。

-1 500,VW0 // 将(周期-脉宽)的值置入数据字VW0。

RET // 子程序0结束并返回主程序。

// * * * * * * * * 中断服务程序1 * * * * * * * *

INT 1 // 增加脉宽。

+1 500,SMW70 // 脉宽增加500ms。

PLS 0 // 对PTO/PWM生成器编程的指令。

DTCH 0 // 将中断与事件0断开。

RETI // 中断服务程序1结束,并返回主程序。

// * * * * * * * * 中断服务程序2 * * * * * * * *

INT 2 // 减少脉宽。

-1 500,SMW70 // 脉宽减少500ms。

PLS 0 // 对PTO/PWM生成器编程的指令。

DTCH 0 // 将中断与事件0断开。

RETI // 中断服务程序2结束,并返回主程序。

H.5

可逆电动机起动器电路――适用于改变三相交流感应电动机旋转方向

概述

这个示例程序用于控制可双向运转的三相感应电动机。

当与输入点I0.0相连的左转点动开关(Le )闭合时,电动机逆时针方向旋转,当与输入点I0.1相连的右转点动开关(Ri )闭合时,电动机顺时针方向旋转。但这要有一个前题,即与输入点I0.3相连的电动机电路断路器和与输入点I0.2相连的停机开关(OFF )都没有动作。只有按下停机开关,并等待5秒钟之后,才可以改变电动机的旋转方向。这样做是为了让电动机有足够的时间刹车停转,然后再反向起动,如果需要电动机反转的话。如果与I0.0和I0.1相连的点动开关同时按下,电动机停转,并且不起动。

例图

程序框图

点动开关I0.0 点动开关I0.1 停机开关I0.2

停机 逆时针 方向旋转

顺时针 方向旋转

电动机电压

电动机电路 断路器

三相交流 感应电动机

电动机起 动器顺时针 方向旋转

电动机起动器 逆时针方向旋转

CPU 221

程序和注释

在程序起始部分,程序检查是否必须激活互锁电路。互锁电路防止电动机误起动,或者按

错误方向起动。只有当所有点动开关都没有动作(位于起始状态),或者等待时间溢出

时,互锁才清除,即M2.0被置成逻辑0。

如果电动机断路器(输入点I0.3)没有动作,停机点动开关(输入点I0.2)也没有动作

(这两个触点都是常闭触点):并且状态位M1.1没有被设置成顺时针旋转标志,则使能

位M2.1被置为逻辑1。电动机才有可能逆时针旋转。代表逆时针旋转的状态位是M1.0。用

类似方法可得到顺时针方向旋转的起动条件。

当点动起动开关(Ie和Ri)这一动作,并且互锁位和状态位都没有被设置成相反的旋转方

向时,电动机起动。即相关的输出位和状态位被置位,状态位的作用是使输出能够自保。

电动机逆时针方向旋转起动器由输出点Q0.0控制。电动机顺时针方向旋转起动器由输出点

Q0.1控制。

除此外,另有一组信号灯指示电动机当前的运行状态;逆时针方向旋转指示灯(Le)与输

出点Q0.4相连;顺时针方向旋转指示灯(Ri)与输出点Q0.3相连;关电机指示灯(OFF)

与输出点Q0.2相连。

当电动机被停机时,“ED”的下降沿将辅助存储位M2.3置为1,进入停机模式。当M2.3

被置位时,限制电动机再次起动的定时器开始计时,该定时器的预置时间是5秒(500×

10ms),经过5秒钟后,内部存储器位M2.3被复位。在这段强制等待时间内与输出点Q0.5

相连的信号灯(Wait)闪烁。如果状态位都没有被置位,则点亮与输出点Q0.2相连的停机

状态指示灯(OFF)。

该程序的长度为61个字。

// 互锁:

LD I0.1 // 如果既命令电动机右转(Ri)。

A I0.0 // 又命令电动机左转(Le)。

O M2.3 // 或处于强制等待状态,则

S M2.0,1 // 设置互锁(M2.0=1)。

// 解除互锁:

LDN I0.0 // 如果既无左转命令(Le),

AN I0.1 // 也无右转命令(Ri)。

AN M2.3 // 并且等待时间溢出,则

R M2.0,1 // 解除互锁(M2.0=0)。

// 逆时针方向旋转使能

LD I0.2 // 如果无停机命令(OFF),

A I0.3 // 且电路断路器未动作

AN M1.1 // 且顺时针方向旋转状态位未置位,

= M2.1 // 则逆时针方向旋转使能位M2.1=1。

// 顺时针方向旋转使能

LD I0.2 // 如果无停机命令(OFF),

A I0.3 // 且电路断路器未动作

AN M1.0 // 且逆时针方向旋转状态位未置位,

= M2.2 // 则顺时针方向旋转使能位M2.2=1。

// 逆时针方向旋转

LD I0.0 // 如果命令电动机左转(Le)。

O M1.0 // 或逆时针方向状态位,

AN M2.0 // 且无互锁,

A M2.1 // 且逆时针方向旋转使能,则,

= M1.0 // 置逆时针方向旋转状态位M1.0=1。

= Q0.0 // 置电动机起动器输出点Q0.0=1。

= Q0.4 // 点亮逆时针方向旋转信号灯(Le)。

// 顺时针方向旋转

LD I0.1 // 如果命令电动机右转(Ri),

O M1.1 // 或顺时针方向状态位,

AN M2.0 // 且无互锁,

A M2.2 // 且顺时针方向旋转使能,则,

= M1.1 // 置顺时针方向旋转状态位M1.1=1。

= Q0.1 // 置电动机起动器输出点Q0.1=1。

= Q0.3 // 点亮顺时针方向旋转信号灯(Ri)。

// 检测边沿,关机过程

LDN M1.0 // 如果既无逆时针方向旋转状态位,

AN M1.1 // 也无顺时针方向旋转状态位,则,

= Q0.2 // 点亮关机输出信号指示灯(OFF)。

LD Q0.2 // 若关机时,

ED // 检测下降沿,则,

S M2.3,1 // 将辅助存储器标志位(代表关机状态)置位(M2.3=1)。

LD M2.3 // 若为关机状态,则

MOVW 500,VW20 // 装载重新起动前必须等待的时间值(500×10ms=5s)。TON T33,VW20 // 起动重新起动要强制等待的定时器(T33)。

A T33 //

R M2.3,1 // 超过等待时间后,将辅助存储器标志位复位(M2.3=0)。MOVW 0,T33 // 等待定时器清0。

// 关机状态指示,等待

LD M2.3 // 辅助存储器标志位(等待)。

A SM0.5 // 指示灯以1秒闪烁。

= Q0.5 // 点亮等待信号灯(Wait)。

MEND // 主程序结束。

H.6 步执行顺序(事件鼓定时器)

概述

本程序实现了一个按事件步顺序执行的例子。每步均包含一系列的动作,一步紧跟一步,

并且只有所有前提条件均满足时,才能执行。如下所示

前提条件实际输出

第1步I0.1已被置为1 Q0.2 Q0.3

第2步间隔5秒(T37定时器)Q0.1 Q0.4

第3步间隔5秒(T38定时器)Q0.0 Q0.5

第4步I0.2已被置为1 Q0.1 Q0.3 Q0.5

第5步间隔5秒(T39定时器)Q0.3

并且I 0.3已被置为1

复位步执行顺序(I0.0已被置为1)无

例图

输出

CPU 221

输入

程序框图

(步顺序)

(复位)

(第一步)

(第二步)(第三步)(第四步)(第五步)S:置位(逻辑1)R:复位(逻辑0)

程序和注释

本示例程序由五个能连续地执行的步组成。每步实质上就是对某些输出置位和复位。在某

一步可执行以前,必须满足一些必要的前提条件。例如,已按下某一开关,或满足了要求

的等待时间。另外,还可以随时按开关I0.0来复位步执行顺序。这些前提条件与输出结果

已在程序框图中描述过了。

本程序长度为116个字。

// * * * * * * * * * * 第1 步* * * * * * * * * *

LD I0.1 // 起动条件,若输入I0.1=1,

AN I0.0 // 且未复位(I0.0=0)

AN M0.0 // 且无步执行

AN M0.1 //

AN M0.2 //

AN M0.3 //

AN M0.4 //

S M0.0,1 // 则将第1步标志位M0.0置1。

LD M0.0 // 若为第1步,则

S Q0.2,2 // 设置输出(Q0.2=1,Q0.3=1)

TON T37,50 // 设与第2步之间的时间间隔为5s(100ms×50)

// * * * * * * * * * * 第2 步* * * * * * * * * *

LD T37 // 若第1个定时器的时间间隔(5s)结束(T37=1)

A M0.0 // 且第1步已执行完(M0.0=1),则

R M0.0,1 // 将第1步标志位M0.0置0,

S M0.1,1 // 将第2步标志位M0.1置1。

LD M0.1 // 若为第2步,则

S Q0.1,1 // 设置输出,即Q0.1=1。

S Q0.4,1 // 设置输出,即Q0.4=1。

R Q0.2,2 // 将输出Q0.2和Q0.3置0。

TON T38,50 // 设与第3步之间的时间间隔为5秒(100ms×50)

// * * * * * * * * * * 第3 步* * * * * * * * * *

LD T38 // 若第2个定时器时间间隔(5s)结束(T38=1)

A M0.1 // 且第2步已执行完(M0.1=1),则

R M0.1,1 // 将第2步标志位M0.1置0,

S M0.2,1 // 将第3步标志位M0.2置1。

LD M0.2 // 若为第3步,则

S Q0.0,1 // 设置输出,即Q0.0=1

S Q0.5,1 // 设置输出,即Q0.5=1

R Q0.1,1 // 将输出Q0.1和Q0.4置0。

R Q0.4,1 //

相关文档