实验内容:1,用ST语言做一个简单的脉冲发生器,根据输入的脉宽(周期)、ON持续时间、及脉冲数量,输出脉冲信号。2,主程序使用LAD/FBD方式,调用上述FB块,实现两路(多路)脉冲信号输出。3,使用模拟运行方式,对上述程序进行模拟运行。
FB块逻辑流程大致描述如下:
FB块变量表:
FB块语句:
; (*复位错误标志*)
RST(1,bErr );
; (*命令OFF*)
IF NOT bExecute THEN
;;
RST(1,bBusy);
RST(1,bPulse);
RST(1,bExLast );
RST(1,bDone );
diTm := 0;
diNoComp:=0;
RETURN;
;
END_IF;
; (*输入错误判别 出错 *)
IF (diRise> diCycle) OR (diCycle<=0) OR (diRise >H7FFFFFFF/10) OR ( diCycle >H7FFFFFFF/10) THEN
;;
RST(1,bBusy);
RST(1,bPulse);
RST(1,bDone );
diTm := 0;
diNoComp:=0;
SET(1,bErr );
RETURN;
;
END_IF;
; (*命令ON*)
; (*命令上升沿*)
IF NOT bExLast THEN
;;
SET(1,bBusy);
;
END_IF;
;
SET(1,bExLast );
; (*发送完成 *)
IF(diN>0) AND (diNoComp=diN) THEN
;;
SET(1,bDone );
diTm := 0;
RETURN;
;
ELSE
;;
RST(1,bDone );
;
END_IF;
;
IF bBusy THEN
;; (*发脉冲执行 *)
IF diTm=0 THEN
;; ;
diTm := 1- INT_TO_DINT(iScanTime);
;;
END_IF;
;;
diTm := diTm +INT_TO_DINT(iScanTime);
;; (* 累计时间翻转*)
IF (diTm<0) THEN
;; ;
diTm:=diCycle*10+1;
;;
END_IF;
;; (*脉冲信号输出 *)
IF diTm<=diRise*10 THEN
;;;
SET(1,bPulse);
;;
ELSE
;;;
RST(1,bPulse);
;;
END_IF;
;;
IF diTm>diCycle*10 THEN
;;;
diTm :=diTm - diCycle*10;
IF diN>0 THEN
;;;
diNoComp :=diNoComp + 1;
;;;
END_IF;
;;
END_IF;
;
END_IF;
>>>>
main程序调用FB:
模拟运行测试:
本实验中,模拟PWM信号发生器的波形不能等同于PLC系统的PLS脉冲输出,只能用在一些粗略的脉冲应用中,如信号灯闪烁,电磁阀和继电器的开关控制等一些不需要精确脉冲信号控制的场合。
(完)
如有错漏,敬待指点! |