S7200最经典应用资料.docx
《S7200最经典应用资料.docx》由会员分享,可在线阅读,更多相关《S7200最经典应用资料.docx(86页珍藏版)》请在冰豆网上搜索。
S7200最经典应用资料
本章概述
节
内 容
页
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
SIMATIC S7-221通过自由通信口模式控制贺氏(Hayes)调制解调器
H–37
H.11
几台SIMATIC S7-200 PLC使用自由通信口模式连接在一个远程I/O网络上
H–43
H.12
S7-224与SIMOVERT电机驱动器之间的自由通信口通信接口
H-54
H.13
用S7-200 CPU 224 DC/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模拟电位器
概述
本例包含了有关 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的值会改变一点。
// 下面的指令用来在每个定时器周期捕获一次换算后的值,并提供一个稳定的定时器设定值。
LDI0.0 // 如果输入I0.0为1状态,则选方案1。
TONT33,VW0 // POT 0的值经运算后作为T33的设定值。
CALL1 // 调用子程序1对POT 0的值进行换算并加偏移量。
LDT33 // 若T33计时到,
INCWAC2 // 则AC2加1,即定时器循环计数。
MOVBAC2,QB0 // 把AC2的最低有效字节拷贝到输出字节QB0,以供显示。
RT33,1 // 定时器T33复位。
// 方案2:
LDI0.1 // 如果输入I0.1为1状态,则选方案2。
CALL2 // 调用子程序2,对POT 1的值进行滤波运算后存入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 // 送POT 0的值到AC1。
TONT35,AC1 // POT 0的值作为T35的设定值。
LDT35 // 若T35计时到,
INCWAC2 // 则AC2加1,即定时器循环计数。
MOVBAC2,QB0 // 把AC2最低有效字节拷贝到输出字节QB0,以供显示。
RT35,1 // 定时器T35复位。
MEND // 主程序结束
// 方案1的子程序
SBR1 // 子程序1。
// 换算POT 0的值并加上偏移量后存在VW0中,再返回主程序。
LDT33 // 每个定时器周期检查POT 0的变化。
MOVW0,AC1 // 清除累加器1(AC1)。
MOVBSMB28,AC1 // 送POT 0的值给AC1。
DIV2,AC1 // AC1除2,即把POT 0的输入范围从0~255换算成0~127。
+120,AC1 // 加200ms偏移量。
MOVWAC1,VW0 // 把AC1值拷贝到VW0,以便能让程序员读取。
RET // 子程序1结束。
// 方案2的子程序
SBR2 // 子程序2。
// 对POT 1值采样100次,然后求平均值。
INCWVW10 // 扫描计数器加1。
MOVBSMB29,AC0 // 送POT 1的值到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 // POT 1的滤波值存在VW18中,返回主程序
H.2怎样使用高速计数器
概述
本例叙述SIMATIC S7-200的高速计数器(HSC)的一种组态功能。
对来自传感性(如编码器)信号的处理,高速计数器可采用多种不同的组态功能。
本例用脉冲输出(PLS)来为HSC产生高速计数信号,PLS可以产生脉冲串和脉宽调制信号,例如用来控制伺服电机。
既然利用脉冲输出,必须选用CPU 224DC/DC/DC。
下面这个例子,展示了用HSC和脉冲输出构成一个简单的反馈回路,怎样编制一个程序来实现反馈功能。
例图
程序框图
程序和注释
本例描述了S7-200 DC/DC/DC的高速计数器(HSC)的功能。
HSC计数速度比PLC扫描时间快得多,采用集成在CPU 224中的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 // 起动脉冲输出(PLS 0),从输出端Q0.0输出脉冲。
RET // 子程序0结束。
// * * * * * * * * * * * * * * * * * * * *
// 子程序1:
// 子程序1起动HSC0,并把中断程序0分配给中断事件12(HSC 0的当前值CV等于设定值PV)。
// 只要脉冲计数值(当前值CV)达到设定值(PV),该事件就会发生。
// 最后,允许中断。
// 子程序1
SBR0 // 子程序1。
ATCH0,12 // 把中断程序0分配给中断事件12(HSC 0的CV=PV)。
ENI // 允许中断。
HSC0 // 按主程序中对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
INT0 // 中断程序0。
SQ0. 1,1 // 输出端Q0.1置位(Q0.1=1)。
MOVB16#A0,SMB37 // 重置HSC 0的控制位,仅更新设定值(PV)。
MOVD1500,SMD42 // HSC 0的下一个设定值为1500(第二设定值)。
ATCH1,12 // 用中断程序1取代中断程序0,分配给中断事件12。
HSC0 // 起动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:
INT1 // 中断程序1。
SQ0. 2,1 // 输出端Q0.2置位(Q0.2=1)。
MOVB16#B0,SMB37 // 重置HSC 0的控制位,更新设定值,并改成减计数(反向计数)。
MOVD1000,SMD42 // HSC 0的下一个设定值为1000(第三设定值)。
ATCH2,12 // 用中断程序2取代中断程序1,分配给中断事件12。
HSC0 // 起动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:
INT2 // 中断程序2。
RQ0. 1,2 // 输出端Q0.1和Q0.2复位(Q0.1=0,Q0.2=0)。
MOVB16#D8,SMB37 // 重置HSC 0的控制位,更新CV,改为正向计数(增计数)。
MOVD0,SMD38 // HSC 0的当前值复位(CV=0)。
ATCH0,12 // 把中断程序0分配给中断事件12。
HSC0 // 重新起动HSC 0。
RETI // 中断程序2结束。
H.3自由通信口模式的简单应用
概述
自由通信口模式(Freeport Mode)的通信协议可自由定义,通信所需要的信息存放在特殊存储字节SMB30中,用户须作如下说明:
l 奇偶校验
l 每个字符的位数
l 波特率
自由通信口模式可以接收和发送数据。
本例用一个仿真的打印机程序来描述数据发送,再用一个条形码阅读器程序来说明数据接收。
例图
打印
机程序框图
打印机程序和注解
此程序描述向打印机发送数据。
为了简化此例,窗口下的终端程序可代替打印机作为接收器边接。
打印机或终端的组态特性为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 // 主程序结束。
条形码阅读器程序框图
条形码阅读器程序和注解
该程序描述数据接收,条形码阅读器通过接口把读到的数据用自由通信口模式发给SIMATIC S7-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,则时间基数为1ms)。
// 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 * * * * * * * *
I