发表于: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时,重新调用子程序,继续循环。这个程序我不明白的就是为什么子程序中为什么没有对买宽数进行赋值?
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时,重新调用子程序,继续循环。这个程序我不明白的就是为什么子程序中为什么没有对买宽数进行赋值?