在调试程序的时候,我们经常会使用热复位或者冷复位,让程序重新开始运行。我们一般都是在IDE里面执行复位的,当然也可以在程序中通过变量来进行复位操作,在触摸屏上加上这个复位按钮也是极好的,可以规避一些逻辑上的问题,毕竟只要能复位掉的bug都不是bug。下面开始展示实现的步骤:

1,创建一个标准工程,必须连接到实际的控制器,仿真是不能实现的;

2,打开库管理器,在高级里面添加CmpApp、SysTypes2interfaces库;

3,添加一个掉电保持型变量列表;

  1. {attribute 'qualified_only'}

  2. VAR_GLOBAL PERSISTENT RETAIN

  3.         xAutoRestart     : BOOL;

  4.         udiCnt           : UDINT;

  5. END_VAR


4,在PLC_PRG中编写以下程序;

  1. PROGRAM PLC_PRG

  2. VAR

  3.         sAppName      : STRING := 'Application';

  4.         result        : RTS_IEC_RESULT;

  5.      

  6.         pApp          : POINTER TO CmpApp.APPLICATION;

  7.         xInit         : BOOL := TRUE;

  8.         xReset        : BOOL;

  9.         

  10.         CountTest          : DINT;

  11. END_VAR


  1. IF xInit THEN

  2.     pApp := CmpApp.AppFindApplicationByName(pszString := sAppName, pResult := ADR(result));   

  3.     PersistentVars.xAutoRestart := FALSE;

  4.         xInit := FALSE;

  5. END_IF


  6. IF xReset THEN

  7.     CmpApp.AppReset(pApp := pApp, usResetOption := CmpApp.RTS_RESET);

  8.     PersistentVars.xAutoRestart := TRUE;      

  9.         xReset := FALSE;

  10. END_IF


  11. CountTest := CountTest + 1;



5,创建一个函数命名为taskev_StopDone,返回值为DWORD;

在程序中通过变量执行复位操作

6,在函数中编写以下程序;

  1. FUNCTION taskev_StopDone : DWORD

  2. VAR_INPUT

  3.     EventPrm: CmpApp.EVTPARAM_CmpAppStop;

  4. END_VAR

  5. VAR

  6. END_VAR


  1. IF PersistentVars.xAutoRestart THEN

  2.     PersistentVars.udiCnt := PersistentVars.udiCnt + 1;

  3.     CmpApp.AppStartApplication(PLC_PRG.pApp);

  4. END_IF



7,打开任务配置页面;

在程序中通过变量执行复位操作

8,创建一个StopDone的事件然后把taskev_StopDone这个函数分配给它;
在程序中通过变量执行复位操作

在程序中通过变量执行复位操作

9,下载程序,把PLC_PRG中的xReset设置为TRUE就可以愉快地实现复位操作了。