曾经的一道面试题. 现在拿出来和大家分享一下
题目是这样的:
要求,在 S7-300 PLC 编程中, 当遇到项目中用定时器太多,不够用时,要求自定义一个定时器FC块,用 STEP7 写一个自定义 定时器,要求模拟出 TON,TOF 标准定时器的功能,不用于用FB块,因为FB块占用内存(DB),满足任何时候,任何地方,无限次重复调用。
大家不妨想想 ,有仕么好的方法??
我当时想了想 ,一时没想到好方法,时间比较急,现在有点闲工夫,试着写了一下,用PLCSIM ,Simulator 测试了一下,通过了,还没到硬件 上测试。
大概的 原理是: 基于OB35 定时中断1MS,给一个DW (双字) 变量 每个中断周期 自加1,设置单位为 1ms, 最大,2147483647 == 24天左右,也就是说连续运行24天以内是能可靠运行的。
然后 吧这个时间变量 传给 FC 参数,即可实现 TON,TOF 功能,以下是调用实例:
OB35 中 对MD8000 这个寄存器 自动加1 ,
每次暖启动时, OB100 初始化 的时候, 对MD8000 赋值为 0,
下面是调用实例:
回复内容:
对: monkeyluyi FC1200里面的程序麻烦楼主请给出 内容的回复!
FUNCTION FC1200:BOOL /ti<x>tle: cusTON // customer timer be based on timer interruption OB35 block , executeed
// timer time plus ,unit with 1ms,10ms,100ms,1s of something
// analogous to standerd TON timer function.
VAR_INPUT
bEN: BOOL; // timer enable. start runing
bR: BOOL;
iTimeunit: INT; // timer time-based unit, with 1ms,10ms,100ms,1s
based unit, with 1ms,10ms,100ms,1s ,Must to OB35 timeunit same
dwTV: DWORD; // unit is 'iTimeunit' specify.
dwOriginPV: DWORD;
END_VAR
VAR_IN_OUT
bInit:BOOL;
dwReg:DWORD;
END_VAR
VAR_OUTPUT
dwET: DWORD;
END_VAR
VAR
dnET:DINT;
END_VAR
BEGIN // code segments
IF bEN=true THEN
IF bInit=false THEN
dwReg:=dwOriginPV;
dwET:=0;
bInit:=true;
ELSE
IF DWORD_TO_DINT(dwET)<DWORD_TO_DINT(dwTV) THEN
dnET:=DWORD_TO_DINT(dwOriginPV) - DWORD_TO_DINT(dwReg);
dwET:=DINT_TO_DWORD(dnET);
IF bR=FALSE THEN
FC1200:=FALSE;
ELSE
dwET:=0;
dnET:=0;
FC1200:=FALSE;
END_IF;
ELSE
IF bR=FALSE THEN
FC1200:=TRUE;
ELSE
dwET:=0;
dnET:=0;
FC1200:=FALSE;
END_IF;
dwET:=dwET;
dnET:=dnET;
END_IF;
END_IF;
ELSE
bInit:=false;
FC1200:=FALSE;
END_IF;
END_FUNCTION