变量定义:
FUNCTION_BLOCK "myFrequency"
VAR_INPUT
frequency : Real; // 输入频率:Hz
pulsePauseRatio : Real := 1.0; // 脉冲占空比
END_VAR
VAR_OUTPUT
clock : Bool; // 脉冲输出地址
countdown : Time; //倒计时
END_VAR
VAR
instTofTimePulse : TOF_TIME; // ON时间
instTofTimePause : TOF_TIME; // OFF时间
statFrequency : Real; // -
statTimePeriod : Time; // -
statTimePulse : Time; // -
statTimePause : Time; // -
statPulsePauseRatio : Real; // -
END_VAR
VAR_TEMP
tempPulseRate : Real; // -
tempPauseRate : Real; // -
END_VAR
VAR CONSTANT
"NULL" : Real := 0.0; // -
MS_IN_SEC : Real := 1000.0;
END_VAR
IF (#frequency <= #NULL) OR (#pulsePauseRatio <= #NULL) // 初始化
THEN
#clock := FALSE;
#countdown := t#0s;
ELSE
// 分配频率和占空比
IF #statFrequency <> #frequency OR #statPulsePauseRatio <> #pulsePauseRatio THEN
RESET_TIMER(TIMER := #instTofTimePause);
RESET_TIMER(TIMER := #instTofTimePulse);
#tempPulseRate := #pulsePauseRatio / (#pulsePauseRatio + 1); // 计算ON百分比
#tempPauseRate := 1.0 - #tempPulseRate; // 计算OFF百分比
#statTimePeriod := UDINT_TO_TIME(REAL_TO_UDINT((#MS_IN_SEC / #frequency))); // 计算周期时间
#statTimePulse := UDINT_TO_TIME(REAL_TO_UDINT((#MS_IN_SEC * #tempPulseRate / #frequency))); // 计算ON时间
#statTimePause := UDINT_TO_TIME(REAL_TO_UDINT((#MS_IN_SEC * #tempPauseRate / #frequency))); // 计算OFF时间
#statFrequency := #frequency;
#statPulsePauseRatio := #pulsePauseRatio;
END_IF;
// TOF_off 过期 >> 重新开启
#instTofTimePulse(IN := NOT #instTofTimePause.Q,
PT := #statTimePulse);
#countdown := #statTimePulse - #instTofTimePulse.ET;
#instTofTimePause(IN := #instTofTimePulse.Q,
PT := #statTimePause);
IF #countdown = t#0s THEN
#countdown := #statTimePause - #instTofTimePause.ET;
END_IF;
#clock := #instTofTimePulse.Q; // 分配输出
END_IF;
P.S
在电子技术中,脉冲信号是一个按一定电压幅度,一定时间间隔连续发出。
脉冲信号之间的时间间隔称为周期;而将在单位时间(如1秒)内所产生的脉冲个数称为频率。
频率是描述周期性循环信号(包括脉冲信号)在单位时间内所出现的脉冲数量多少的计量名称;频率的标准计量单位是Hz(赫)。电脑中的系统时钟就是一个典型的频率相当精确和稳定的脉冲信号发生器。频率在数学表达式中用“f”表示,其相应的单位有:Hz(赫)、kHz(千赫)、MHz(兆赫)、GHz(吉赫)。其1GHz=1000MHz,1MHz=1000kHz,1kHz=1000Hz。计算脉冲信号周期的时间单位及相应的换算关系是:s(秒)、ms(毫秒)、μs(微秒)、ns(纳秒),其中:1s=1000ms,1ms=1000μs,1μs=1000ns。