您现在所在的是:

PLC论坛

回帖:7个,阅读:7513 [上一页] [1] [下一页]
913
ljn1979
文章数:14
年度积分:50
历史总积分:913
注册时间:2009/2/4
发站内信
发表于:2009/2/17 21:38:36
#0楼
主程序如下:
LD     First_Scan_On:SM0.1         // 在第一个扫描周期SM0.1=1。
CALL   SBR_0:SBR0                  // 调用子程序0来起动PWM,即初始化PWM。
LDW>=  PWM0_PW:SMW70, VW0          //如果脉宽大于等于(周期-脉宽),
R      M0.0, 1                     // 则将辅助内存标记位M0.0置0。
LDW=   PWM0_PW:SMW70, +0           // 如果脉宽为0
CALL   SBR_0:SBR0                  // 则调用子程序0来重新开始一个完整的PWM
LD     Input_I0_0:I0.0             // 如果输入 I0.0=1
A      M0.0                        //且辅助内存标记位M0.0=1(脉宽增加)
ATCH   INT_1:INT1, 0               //则把INT1赋给事件0(输入I0.0的正向上升沿)
LD     Input_I0_0:I0.0             // 如果输入 I0.0=1
AN     M0.0                        // 且辅助内存标记位M0.0=0(脉宽减少)
ATCH   INT_2:INT2, 0               //则把INT2赋给事件0(输入I0.0的正向上升沿)
子程序
LD     Always_On:SM0.0
S      M0.0, 1                     // 将增加脉宽的辅助内存标记位M0.0置1
MOVB   16#CB, PLS0_Ctrl:SMB67      // 设定输出端Q0.0的PTO/PWM控制字节
MOVW   +500, PWM0_PW:SMW70         // 指定初始脉宽(0.5 s).
MOVW   +5000, PLS0_Cycle:SMW68     // 周期为5秒
ENI                                //允许全部中断
PLS    0                           // 对PTO/PWM生成器编程的指令
MOVW   PLS0_Cycle:SMW68, VW0       //将周期置入数据字 VW0.
-I     +500, VW0                   // 将(周期-脉宽)的值置入数据字VW0
中断1程序如下
LD     Always_On:SM0.0
+I     +500, PWM0_PW:SMW70         // 脉宽增加500ms

PLS    0                           // 对PTO/PWM生成器编程的指令
DTCH   0                           //将中断与事件0断开
中断2
LD     Always_On:SM0.0
-I     +500, PWM0_PW:SMW70         //  脉宽减少500ms
PLS    0                           // 对PTO/PWM生成器编程的指令
DTCH   0                           //将中断与事件0断开
我对此实例的理解如下:首次扫描也就是PLC第一次上电后,调用子程序,对PWM进行
控制赋值,并且写入周期和脉宽,(为什么在子程序中没有写入脉宽数也就是SMD72)
允许全局中断,同时把4500写入VW0中,执行一次占空比位10%的脉冲(周期位5S),M0.0=1,然后推出子程序,在主程序中。由于输出Q0.0和I0.0连接在一起(为了试验方便)当第一次输出占空比位10%后,I0.0和M0.0都为1,所以调用中断1,将脉宽增加500后再输出一次,如此循环到脉宽为4500的时候,此时M0.0=0,所以调用中断2,将脉宽减少500,继续循环到当脉宽为0时,重新调用子程序,继续循环。这个程序我不明白的就是为什么子程序中为什么没有对买宽数进行赋值?
12704
lixiaobai
文章数:7780
年度积分:49
历史总积分:12704
注册时间:2006/4/5
发站内信
08年最佳博客奖
发表于:2009/2/18 20:15:59
#1楼
学习一下,一般我都是用向导自动生成的
说说
913
ljn1979
文章数:14
年度积分:50
历史总积分:913
注册时间:2009/2/4
发站内信
发表于:2009/2/18 21:04:01
#2楼
你能写一下吗。这个实例写的时候,除了脉冲数没有写外,另外一点就是。第一次执行子程序输出一个脉冲后。q0.0在脉冲输出完成后应该是=0,实物中把q0.0和i0.0连接在一起。退出子程序后i0.0的状态应该是0的呀。怎么能继续进行下去呢?
1693
siyuan3222
文章数:198
年度积分:50
历史总积分:1693
注册时间:2007/10/23
发站内信
发表于:2009/2/21 23:08:37
#3楼
楼上说的有道理的,你的程序看样子没问题,但是实际中呢,i0.o状态有问题
1073
huangha6599
文章数:58
年度积分:50
历史总积分:1073
注册时间:2005/6/15
发站内信
发表于:2009/2/24 16:42:55
#4楼
程序中存在的问题是当第一个I0.0的上升沿来时,不会产生中断,而只是执行了ATCH的动作,从第二个上升沿开始,产生中断。

为什么没有脉冲数(SMD72)是因为程序里的高速输出是PWM输出,在PWM输出里只要执行一下PLS,就会连续不断的发脉冲了。

为什么还要在中断程序里使用PLS那是因为更新了脉宽后,要重新PLS,要不然它会维持着之前的脉宽输出。
913
ljn1979
文章数:14
年度积分:50
历史总积分:913
注册时间:2009/2/4
发站内信
发表于:2009/2/25 9:28:08
#5楼
4楼的意思是不是第一次输出PWM脉冲的时候挡Q0.0的状态是1的时候调用一下中断,输出第一个脉冲是。此时PWM的脉冲宽度已经增加了500,第二次输出是就是1000的脉冲宽度了 。可是第一次I0.0状态为1的时候,不是就已经调用中断1了吗。中断1中右PLS指令呀?
1073
huangha6599
文章数:58
年度积分:50
历史总积分:1073
注册时间:2005/6/15
发站内信
发表于:2009/2/25 10:07:38
#6楼
第一次I0.0状态为1时,没有调用中断,只是发生ATCH动作
现在中断1里不是有PLS了么
715
plc51303030
文章数:-1
年度积分:50
历史总积分:715
注册时间:2009/2/19
发站内信
发表于:2009/2/26 17:13:46
#7楼
此楼内容不符合板块规定,不予显示! 查看原帖内容>>

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2025 Gkong.com, All Rights Reserved

78.0005