曾经的一道面试题. 点击:521 | 回复:2



miy_gongkong

    
  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2013-05-02 15:47:47
楼主

曾经的一道面试题. 现在拿出来和大家分享一下

 

题目是这样的:

        要求,在 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

  • 精华:0帖
  • 求助:1帖
  • 帖子:3帖 | 138回
  • 年度积分:14
  • 历史总积分:3367
  • 注册:2011年11月23日
发表于:2013-05-03 09:10:18
1楼

FC1200里面的程序麻烦楼主请给出

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2013-05-03 11:23:24
2楼

回复内容:

对: 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 

 


热门招聘
相关主题

官方公众号

智造工程师