s7200典型程序例子.docx
《s7200典型程序例子.docx》由会员分享,可在线阅读,更多相关《s7200典型程序例子.docx(99页珍藏版)》请在冰豆网上搜索。
s7200典型程序例子
S7-200应用示例
本章概述
节
内容
页
H.1
模拟电位器
H–2
H.2
怎样使用高速计数器
H–6
H.3
自由通信口模式的简单应用
H–10
H.4
处理脉宽调制
H–13
H.5
可逆电动机起动器电路――适用于改变三相交流感应电动机旋转方向
H–16
H.6
步执行顺序(事件鼓定时器)
H–19
H.7
S7-200用自由通信口模式和并行打印机连接
H–23
H.8
通过自由通信口模式接受条形码阅读器的信息
H–27
H.9
集成脉冲输出通过步进电机进行定位控制
H–31
H.10
SIMATICS7-221通过自由通信口模式控制贺氏(Hayes)调制解调器
H–37
H.11
几台SIMATICS7-200PLC使用自由通信口模式连接在一个远程I/O网络上
H–43
H.12
S7-224与SIMOVERT电机驱动器之间的自由通信口通信接口
H-54
H.13
用S7-200CPU224DC/DC/DC进行定位控制,并具有位置监视和位置校正
H-64
H.14
用S7-200实现PID控制
H-80
H.15
模拟量输入的处理
H-92
H.16
S7-200与PC之间的连接:
从Windows应用程序中读数据
H-98
H.1模拟电位器
概述
本例包含了有关SIMATICS7-200的模拟电位器(POT)的使用信息。
电位器的位置转换为0至255之间的数字值,然后,存入两个特殊存储器字节SMB28和SMB29中,分别对应电位器0和电位器1的值。
需要一把小螺丝刀用以调整电位器的位置。
本应用示例介绍了使用模拟电位器调整定时器设定值的三种方案。
例图
模拟电位器
程序框图
10.0
程序和注释
方案1说明了用模拟电位器对定时器设定值进行细调的方法。
首先通过程序中的偏移量(本例中为20ms)对定时器进行粗调,然后再用电位器能把定时器的设定值精确地调整到满意的设置。
每个定时器周期之后,执行子程序1中的指令,把POT0的值(在SMB28中)读到AC1,除以2,再加上200ms偏移量。
返回主程序时,AC2中的定时器循环计数值加1,并拷贝到输出字节(QB0),以供显示。
在方案2中,对电位器1(POT1)的100次扫描值在AC3中累加后并取平均,再存入VW12。
如果该值低于低保护限值VW14,或高于高保护限值VW16(两者均在首次扫描时初始化),则将新值VW12拷贝到VW14、VW16和VW18中。
然后再分别对VW16和VW14的值减、加3ms,作为新限值,而VW18中的平均值被传回主程序作为定时器T34的设定值。
返回主程序时,VW20中的定时器循环计数值加1,并拷贝到输出字节(QB1),以供显示。
在方案3中,把电位器0(POT0)的值直接作为定时器T35的设定值,AC2中的定时器循环计数值加1,并拷贝到输出字节(QB0),以供显示。
本程序长度为110个字。
//标题:
模拟电位器:
//***************主程序***************
//这是S7-200的一个演示程序,介绍了使用模拟电位器调整定时器设定值的三种方案。
//方案1:
对来自POT0的值进行换算并加偏移量,以调整定时器的设定值,可以从200ms调到的1.48s。
每个定时器周期QB0加1。
//方案2:
从POT1来的值经过滤波给定时器提供0ms到约2.55s的稳定的设定值。
每个定时器周期QB1
加1。
//方案3:
把POT0的值直接作为定时器设定值。
每个定时器周期QB0加1。
//模拟电位器POT0和POT1的值可以分别从SMB28和SMB29中以一个字节读出。
//每次扫描时,POT的值会变化一点,方案1和2都能为定时器提供稳定的设定值。
//方案1的设定值会改变1次或2次,但每个定时器周期只装载一次。
//方案2的设定值非常稳定,每次扫描都装载。
//方案3的设定值每次扫描都会改变。
//主程序:
LDSM0.1//首次扫描时清除工作缓冲区:
MOVD+0,AC0//AC0=0。
MOVD+0,AC3//AC3=0。
MOVW+0,VW10//VW10=0。
MOVW+32000,VW14//低限工作区复位。
MOVW+0,VW16//高限工作区复位。
//方案1:
//每次扫描时POT的值会改变一点。
//下面的指令用来在每个定时器周期捕获一次换算后的值,并提供一个稳定的定时器设定值。
LDI0.0//如果输入I0.0为1状态,则选方案1。
TONT33,VW0//POT0的值经运算后作为T33的设定值。
CALL1//调用子程序1对POT0的值进行换算并加偏移量。
LDT33//若T33计时到,
INCWAC2//则AC2加1,即定时器循环计数。
MOVBAC2,QB0//把AC2的最低有效字节拷贝到输出字节QB0,以供显示。
RT33,1//定时器T33复位。
//方案2:
LDI0.1//如果输入I0.1为1状态,则选方案2。
CALL2//调用子程序2,对POT1的值进行滤波运算后存入VW18。
TONT34,VW18//VW18的值作为T34的设定值。
LDT34//若T34计时到,
INCWVW20//则VW20加1,即定时器循环计数。
MOVBVB21,QB1//把VW20最低有效字节(VB21)拷贝到输出字节QB1,以供显示。
RT34,1//定时器T34复位
//方案3:
LDI0.2//如果输入I0.2为1状态,
ANI0.0//且方案1不在运行(I0.0=0),则选方案3。
MOVW0,AC1//清除累加器1(AC1)
MOVBSMB28,AC1//送POT0的值到AC1。
TONT35,AC1//POT0的值作为T35的设定值。
LDT35//若T35计时到,
INCWAC2//则AC2加1,即定时器循环计数。
MOVBAC2,QB0//把AC2最低有效字节拷贝到输出字节QB0,以供显示。
RT35,1//定时器T35复位。
MEND//主程序结束
//方案1的子程序
SBR1//子程序1。
//换算POT0的值并加上偏移量后存在VW0中,再返回主程序。
LDT33//每个定时器周期检查POT0的变化。
MOVW0,AC1//清除累加器1(AC1)。
MOVBSMB28,AC1//送POT0的值给AC1。
DIV2,AC1//AC1除2,即把POT0的输入范围从0~255换算成0~127。
+120,AC1//加200ms偏移量。
MOVWAC1,VW0//把AC1值拷贝到VW0,以便能让程序员读取。
RET//子程序1结束。
//方案2的子程序
SBR2//子程序2。
//对POT1值采样100次,然后求平均值。
INCWVW10//扫描计数器加1。
MOVBSMB29,AC0//送POT1的值到AC0。
+1AC0,AC3//再加到以前的总和中(即累加POT1的值,共累加100次)。
LDWVW10,100//100次扫描之后。
DIV100,AC3//求平均值。
MOVWAC3,VW12//存平均值。
MOVW0,VW10//扫描计数器复位。
MOVD0,AC3//工作内存复位。
AW<=VW12,VW14//检查新的平均值是否在保护区之外。
OW>=VW12,VW16//
FILLVW12,VW14,3//把新的平均值存入VW14,VW16,VW18。
-1+3,VW14//设置新的低保护限。
+1+3,VW16//设置新的高保护限。
RET//POT1的滤波值存在VW18中,返回主程序
H.2怎样使用高速计数器
概述
本例叙述SIMATICS7-200的高速计数器(HSC)的一种组态功能。
对来自传感性(如编码器)信号的处理,高速计数器可采用多种不同的组态功能。
本例用脉冲输出(PLS)来为HSC产生高速计数信号,PLS可以产生脉冲串和脉宽调制信号,例如用来控制伺服电机。
既然利用脉冲输出,必须选用CPU224DC/DC/DC。
下面这个例子,展示了用HSC和脉冲输出构成一个简单的反馈回路,怎样编制一个程序来实现反馈功能。
例图
程序框图
程序和注释
本例描述了S7-200DC/DC/DC的高速计数器(HSC)的功能。
HSC计数速度比PLC扫描时间快得多,采用集成在CPU224中的20K硬件计数器进行计数。
总的来说,每个高速计数器需要10个字节内存用来存控制位、当前值、设定值、状态位。
本程序长度为91个字。
//主程序:
//在主程序中,首先将输出Q0.0置,0,因为这是脉冲输出功能的需要。
再初始化高速计
//数器HSC0,然后调用子程序0和1。
//HSC0起动后具有下列特性:
可更新CV和PV值,正向计数。
//当脉冲输出数达到SMD72中规定的个数后,程序就终止。
//主程序
LDSM0.1//首次扫描标志(SM0.1=1)。
RQ0.0,1//脉冲输出Q0.0复位(Q0.0=0)。
MOVB16#F8,SMB37//装载HSC0的控制位:
//激活HSC0,可更新CV,可更新PV,
//可改变方向,正向计数。
//HSC指令用这些控制位来组态HSC。
MOVD0,SMD38//HSC0当前值(CV)为0。
MOVD1000,SMD42//HSC0的第一次设定值(PV)为1000。
HDEF0,0//HSC0定为模式0。
CALL0//调用子程序0。
CALL1//调用子程序1。
MEND//主程序结束。
//********************
//子程序0:
//子程序0初始化,并激活脉冲输出(PLS)。
//在特殊存储字节SMB67中定义脉冲输出特性:
脉冲串(PT0),时基,可更新数值,激活PLS。
//SMW68定义脉冲周期,其值为时基的倍数。
//最后,在SMD72中指定需要产生的脉冲数。
(SMD72)为内存双字,即4个字节)。
//子程序0
SBR0//子程序0
MOVB16#8D,SMB67//装载脉冲输出(PLS0)的控制位:
PT0,时基1ms,可更新,激活。
MOVW1,SMW68//脉冲周期1ms。
MOVD30000,SMD72//产生30000个脉冲。
PLS0//起动脉冲输出(PLS0),从输出端Q0.0输出脉冲。
RET//子程序0结束。
//********************
//子程序1:
//子程序1起动HSC0,并把中断程序0分配给中断事件12(HSC0的当前值CV等于设定值PV)。
//只要脉冲计数值(当前值CV)达到设定值(PV),该事件就会发生。
//最后,允许中断。
//子程序1
SBR0//子程序1。
ATCH0,12//把中断程序0分配给中断事件12(HSC0的CV=PV)。
ENI//允许中断。
HSC0//按主程序中对HSC0的初始组态特性,起动HSC0。
RET//子程序1结束。
//********************
//中断程序0:
//当HSC0的计数脉冲达到第一,设定值1000时,调用中断程序0。
//输出端Q0.1置位(Q0.1=1)。
//为HSC0设置新的设定值1500(第二设定值)
//用中断程序1取代中断程序0,分配给中断事件12(HSC0的CV=PV)。
//中断程序0
INT0//中断程序0。
SQ0.1,1//输出端Q0.1置位(Q0.1=1)。
MOVB16#A0,SMB37//重置HSC0的控制位,仅更新设定值(PV)。
MOVD1500,SMD42//HSC0的下一个设定值为1500(第二设定值)。
ATCH1,12//用中断程序1取代中断程序0,分配给中断事件12。
HSC0//起动HSC0,,为其装载新的设定值。
RETI//中断程序0结束。
//********************
//中断程序1:
//当HSC0的计数脉冲达到第二设定值1500时,调用中断程序1。
//输出端Q0.2置位(Q0.2=1)。
//HSC0改成减计数,并置新的设定值1000(第三设定值)。
//用中断程序2取代中断程序1,分配给中断事件12(HSC0的CV=PV)。
//中断程序1:
INT1//中断程序1。
SQ0.2,1//输出端Q0.2置位(Q0.2=1)。
MOVB16#B0,SMB37//重置HSC0的控制位,更新设定值,并改成减计数(反向计数)。
MOVD1000,SMD42//HSC0的下一个设定值为1000(第三设定值)。
ATCH2,12//用中断程序2取代中断程序1,分配给中断事件12。
HSC0//起动HSC0,,为其装载新的设定值和方向。
RETI//中断程序1结束。
//********************
//中断程序2:
//当HSC0的计数脉冲达到第三设定值1000时,调用中断程序2。
//输出端Q0.1和Q0.2复位(Q0.1=0,Q0.2=0)。
//HSC0的计数方向重新改为正向(增计数),并将当前计数值置为0,而设定值PV保持不变(1000)。
//重新把中断程序0分配给中断事件12,程序再次起动HSC0运行。
//当脉冲数达到SMD72中规定的个数后,程序就终止。
//中断程序2:
INT2//中断程序2。
RQ0.1,2//输出端Q0.1和Q0.2复位(Q0.1=0,Q0.2=0)。
MOVB16#D8,SMB37//重置HSC0的控制位,更新CV,改为正向计数(增计数)。
MOVD0,SMD38//HSC0的当前值复位(CV=0)。
ATCH0,12//把中断程序0分配给中断事件12。
HSC0//重新起动HSC0。
RETI//中断程序2结束。
H.3自由通信口模式的简单应用
概述
自由通信口模式(FreeportMode)的通信协议可自由定义,通信所需要的信息存放在特殊存储字节SMB30中,用户须作如下说明:
●奇偶校验
●每个字符的位数
●波特率
自由通信口模式可以接收和发送数据。
本例用一个仿真的打印机程序来描述数据发送,再用一个条形码阅读器程序来说明数据接收。
例图
打印
机程序框图
打印机程序和注解
此程序描述向打印机发送数据。
为了简化此例,窗口下的终端程序可代替打印机作为接收器边接。
打印机或终端的组态特性为9600波特,无奇偶校验,每字符8位。
本程序长度为13个字。
//正确设置自由通信口模式对此应用很重要。
//所需信息装载在特殊存储字节SMB30中。
//这些输入数据可从操作手册中查询。
//发送命令XMT包含了发送信息缓冲区的起始地址,该地址单元中只包含了发送信息的长度(以字节
为单位)。
LDSM0.1//第一次扫描(SM0.1=1)。
MOVB+9,SMB30//自由通信口模式;9600波特,无奇偶校验,每字符8位。
MOVB+1,VB100//信息长度为1个ASCII字符。
MOVB16#41,VB101//A字符长度为1个字节,A=41H(十六进制)。
LDI0.1//输入I0.1起动发送。
EU//识别脉冲上升沿。
XMTVB100,0//发送。
MEND//主程序结束。
条形码阅读器程序框图
条形码阅读器程序和注解
该程序描述数据接收,条形码阅读器通过接口把读到的数据用自由通信口模式发给SIMATICS7-200。
为简化此例,窗口下的终端程序可代替条形码阅读器作为发送器连接。
本程序长度为15个字。
//************主程序********
//正确设置自由通信口模式对此应用很重要。
//所需信息装载在特殊存储字节SMB30中。
//这些输入数据可从操作手册中查询。
//接收数据借助于中断实现,当数据进入自由编程接口,接收中断事件(8)。
//就被触发了。
//在此应用中,将中断程序0(INT0)赋予接收中断事件(8)。
LDSM0.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比较。
SQ0.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。
例图
程序框图
程序和注解
特殊存储字节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个字。
//************主程序********
LDSM0.1//在第一个扫描周期SM0.1=1。
CALL0//调用子程序0来起动PWM,即初始化PWM。
LDW>=SMW70,VW0//如果脉宽大于等于(周期一脉宽),
RM0.0,1//则将辅助内存标记位M0.0置0。
LDW=SMW70,0//如果脉宽为零,
CALL0//则调用子程序0来重新开始一个完整的PWM。
LDI0.0//如果输入I0.0=1。
AM0.0//且辅助内存标记位M0.0=1(脉宽增加),
ATCH1,0//则把INT1赋给事件0(输入I0.0的正向上升沿)。
LDI0.0//如果输入I0.0=1。
ANM0.0//且辅助内存标记位M0.0=0(脉宽减少),
ATCH2,0//则把INT2赋给事件0(输入I0.0的正向上升沿)。
MEND//主程序结束。
//********主程序0********
SBR0//初始化脉宽调制
SM0.0,1//将增加脉宽的辅助内存标记位M0.0置1。
MOVB16#CB,SMB67//设定输出端Q0.0的PTO/PWM控制字节
//SM67.0:
=1允许接受新的周期。
//SM67.1:
=1允许接受新的脉宽。
//SM67.3:
=1时间基数为1ms(若为0,则时间基数为1s)。
//SM67.6:
=1选择PWM模式(若为0,则PT0模式)。
//SM67.7:
=1允许高速输出功能。
MOVW500,SMW70//指定初始脉宽(500ms)。
MOVW5000,SMW68//周期为5s。
ENI//允许全部中断。
PLS0//对PTO/PWM生成器编程的指令。
MOVWSMW68,VW0//将周期置入数据字VW0。
-1500,VW0//将(周期-脉宽)的值置入数据字VW0。
RET//子程序0结束并返回主程序。
//********中断服务程序1********
INT1//增加脉宽。
+1500,SMW70//脉宽增加500ms。
PLS0//对PTO/PWM生成器编程的指令。
DTCH0//将中断与事件0断开。
RETI//中断服务程序1结束