timer.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. /*************************************************************************
  2. * 版权所有:
  3. * 文件版本: V1.00
  4. * 文件名称: timer.c时间继电器 实现
  5. * 生成日期: 2008年7月20日
  6. * 作 者:
  7. * 功 能:
  8. * 更新信息:
  9. * 更新日志1:
  10. * 日期:
  11. * 修改者:
  12. * 修改内容:
  13. * 修改原因:
  14. * 更新日志2:
  15. **************************************************************************/
  16. #include "head.h"
  17. /**************************************************************************
  18. 函数名称:InitTR
  19. 函数版本:1.00
  20. 作者:
  21. 创建日期:2005.4.21
  22. 函数功能说明:初始化时间继电器:设置动作和返回定值,清延时计数器,置为未启动状态
  23. 输入参数:TIMERELAY *pTimeRelay时间继电器对象
  24. DWORD dTripThreshold 时间继电器延时动作时间定值
  25. DWORD dRetThreshold 时间继电器延时返回时间定值
  26. 其他输入:
  27. 输出参数:
  28. 返回值:
  29. 函数扇入清单:
  30. ***************************************************************************/
  31. void InitTR(TIMERELAY *pTimeRelay, DWORD dTripThreshold, DWORD dRetThreshold)
  32. {
  33. pTimeRelay->dTripThreshold = dTripThreshold;
  34. pTimeRelay->dRetThreshold = dRetThreshold;
  35. pTimeRelay->boolTrip = false;
  36. pTimeRelay->boolStart = false;
  37. pTimeRelay->dTimer = 0;
  38. pTimeRelay->dTimerRetTimer = 0;
  39. pTimeRelay->dTRTThreshold = 0;
  40. }
  41. /**************************************************************************
  42. 函数名称:InitTR_Time
  43. 函数版本:1.00
  44. 作者:
  45. 创建日期:2005.4.21
  46. 函数功能说明:初始化时间继电器:设置动作和返回定值
  47. 输入参数:TIMERELAY *pTimeRelay时间继电器对象
  48. DWORD dTripThreshold 时间继电器延时动作时间定值
  49. DWORD dRetThreshold 时间继电器延时返回时间定值
  50. 其他输入:
  51. 输出参数:
  52. 返回值:
  53. 函数扇入清单:
  54. ***************************************************************************/
  55. void InitTR_Time(TIMERELAY *pTimeRelay, DWORD dTripThreshold, DWORD dRetThreshold)
  56. {
  57. pTimeRelay->dTripThreshold = dTripThreshold;
  58. pTimeRelay->dRetThreshold = dRetThreshold;
  59. }
  60. /**************************************************************************
  61. 函数名称:InitTR_Time_Flag
  62. 函数版本:1.00
  63. 作者:
  64. 创建日期:2005.4.21
  65. 函数功能说明:初始化时间继电器:设置动作和返回定值
  66. 输入参数:TIMERELAY *pTimeRelay时间继电器对象
  67. DWORD dTripThreshold 时间继电器延时动作时间定值
  68. DWORD dRetThreshold 时间继电器延时返回时间定值
  69. 其他输入:
  70. 输出参数:
  71. 返回值:
  72. 函数扇入清单:
  73. ***************************************************************************/
  74. void InitTR_Time_Flag(TIMERELAY *pTimeRelay)
  75. {
  76. pTimeRelay->boolTrip = true;
  77. pTimeRelay->boolStart = true;
  78. }
  79. /**************************************************************************
  80. 函数名称:SetTR_TRTT
  81. 函数版本:1.00
  82. 作者:
  83. 创建日期:2005.4.21
  84. 函数功能说明:设置时间继电器延时中返回时间
  85. 输入参数:TIMERELAY *pTimeRelay时间继电器对象
  86. DWORD dTRTT 返回时间
  87. 其他输入:
  88. 输出参数:
  89. 返回值:
  90. 函数扇入清单:
  91. ***************************************************************************/
  92. void SetTR_TRTT(TIMERELAY *pTimeRelay, DWORD dTRTT)
  93. {
  94. pTimeRelay->dTRTThreshold = dTRTT;
  95. }
  96. /**************************************************************************
  97. 函数名称:PreSetTime
  98. 函数版本:1.00
  99. 作者:
  100. 创建日期:2005.4.21
  101. 函数功能说明:预置时间继电器计数时间并启动本对象
  102. 输入参数:TIMERELAY *pTimeRelay时间继电器对象
  103. DWORD dPreTime 计数时间
  104. 其他输入:
  105. 输出参数:
  106. 返回值:
  107. 函数扇入清单:
  108. ***************************************************************************/
  109. void PreSetTime(TIMERELAY *pTimeRelay, DWORD dPreTime)
  110. {
  111. pTimeRelay->dTimer = dPreTime;
  112. pTimeRelay->boolStart = true;
  113. }
  114. /**************************************************************************
  115. 函数名称:ResetTR
  116. 函数版本:1.00
  117. 作者:
  118. 创建日期:2005.4.21
  119. 函数功能说明:复位时间继电器:清延时计数器,置为未启动状态
  120. 输入参数:TIMERELAY *pTimeRelay时间继电器对象
  121. 其他输入:
  122. 输出参数:
  123. 返回值:
  124. 函数扇入清单:
  125. ***************************************************************************/
  126. void ResetTR(TIMERELAY *pTimeRelay)
  127. {
  128. pTimeRelay->boolTrip = false;
  129. pTimeRelay->boolStart = false;
  130. pTimeRelay->dTimer = 0;
  131. pTimeRelay->dTimerRetTimer = 0;
  132. }
  133. /**************************************************************************
  134. 函数名称:RunTR
  135. 函数版本:1.00
  136. 作者:
  137. 创建日期:2005.4.21
  138. 函数功能说明:运行时间继电器:清延时计数器,置为未启动状态
  139. 输入参数:TIMERELAY *pTimeRelay时间继电器对象
  140. bool boolInput时间继电器对象输入状态 非0 启动 0返回
  141. DWORD dTime 两次运行该时间对象的时间间隔时间(采样点数)
  142. 其他输入:
  143. 输出参数:
  144. 返回值:
  145. 函数扇入清单:
  146. ***************************************************************************/
  147. void RunTR(TIMERELAY *pTimeRelay, bool boolInput, DWORD dTime)
  148. {
  149. if (!pTimeRelay->boolTrip) // 时间继电器延时后输出没动作
  150. {
  151. if (boolInput) // 输入启动状态
  152. {
  153. if (pTimeRelay->boolStart) // 时间继电器启动
  154. {
  155. pTimeRelay->dTimer += dTime;
  156. }
  157. else
  158. {
  159. pTimeRelay->boolStart = true;
  160. pTimeRelay->dTimer = dTime;
  161. }
  162. if (pTimeRelay->dTimer >= pTimeRelay->dTripThreshold) // 启动延时到
  163. {
  164. pTimeRelay->boolTrip = true; // 动作输出
  165. pTimeRelay->dTimer = 0;
  166. }
  167. pTimeRelay->dTimerRetTimer = 0; // 返回延时计数
  168. }
  169. else // 输入返回状态
  170. {
  171. pTimeRelay->dTimerRetTimer += dTime;
  172. if (pTimeRelay->dTimerRetTimer >= pTimeRelay->dTRTThreshold) // 启动返回延时到
  173. {
  174. pTimeRelay->dTimer = 0; // 启动延时计数
  175. pTimeRelay->boolStart = false; // 清启动
  176. }
  177. }
  178. }
  179. else // 时间继电器延时后输出动作
  180. {
  181. if (!boolInput)
  182. {
  183. if (pTimeRelay->boolStart)
  184. {
  185. pTimeRelay->dTimer += dTime;
  186. }
  187. else
  188. {
  189. pTimeRelay->boolStart = true;
  190. }
  191. if (pTimeRelay->dTimer >= pTimeRelay->dRetThreshold) // 动作返回延时到
  192. {
  193. pTimeRelay->boolTrip = false;
  194. pTimeRelay->dTimer = 0;
  195. }
  196. pTimeRelay->dTimerRetTimer = 0;
  197. }
  198. else
  199. {
  200. pTimeRelay->dTimerRetTimer += dTime;
  201. if (pTimeRelay->dTimerRetTimer >= pTimeRelay->dTRTThreshold)
  202. {
  203. pTimeRelay->dTimer = 0;
  204. pTimeRelay->boolStart = false;
  205. }
  206. }
  207. }
  208. }
  209. void RunTR2(TIMERELAY *pTimeRelay, bool boolInput, DWORD dTime)
  210. {
  211. if (!pTimeRelay->boolTrip) // 时间继电器延时后输出没动作
  212. {
  213. if (boolInput) // 输入启动状态
  214. {
  215. if (pTimeRelay->boolStart) // 时间继电器启动
  216. {
  217. pTimeRelay->dTimer += dTime;
  218. }
  219. else
  220. {
  221. pTimeRelay->boolStart = true;
  222. pTimeRelay->dTimer = dTime;
  223. }
  224. if (pTimeRelay->dTimer >= pTimeRelay->dTripThreshold) // 启动延时到
  225. {
  226. pTimeRelay->boolTrip = true; // 动作输出
  227. pTimeRelay->dTimer = 0;
  228. }
  229. pTimeRelay->dTimerRetTimer = 0; // 返回延时计数
  230. }
  231. else // 输入返回状态
  232. {
  233. pTimeRelay->dTimerRetTimer += dTime;
  234. pTimeRelay->dTimer += dTime; //
  235. if (pTimeRelay->dTimerRetTimer >= pTimeRelay->dTRTThreshold) // 启动返回延时到
  236. {
  237. pTimeRelay->dTimer = 0; // 启动延时计数
  238. pTimeRelay->boolStart = false; // 清启动
  239. }
  240. }
  241. }
  242. else // 时间继电器延时后输出动作
  243. {
  244. if (!boolInput)
  245. {
  246. if (pTimeRelay->boolStart)
  247. {
  248. pTimeRelay->dTimer += dTime;
  249. }
  250. else
  251. {
  252. pTimeRelay->boolStart = true;
  253. }
  254. if (pTimeRelay->dTimer >= pTimeRelay->dRetThreshold) // 动作返回延时到
  255. {
  256. pTimeRelay->boolTrip = false;
  257. pTimeRelay->dTimer = 0;
  258. }
  259. pTimeRelay->dTimerRetTimer = 0;
  260. }
  261. else
  262. {
  263. pTimeRelay->dTimerRetTimer += dTime;
  264. pTimeRelay->dTimer += dTime; //
  265. if (pTimeRelay->dTimerRetTimer >= pTimeRelay->dTRTThreshold)
  266. {
  267. pTimeRelay->dTimer = 0;
  268. pTimeRelay->boolStart = false;
  269. }
  270. }
  271. }
  272. }
  273. // 时间修正,大于50ms&&小于2s -> 为了满足保护动作时间需要减去10ms
  274. void CorrectTR(TIMERELAY *pTimeRelay)
  275. {
  276. if (pTimeRelay->dTripThreshold > T_10ms * 4 && pTimeRelay->dTripThreshold < T_1s * 2)
  277. pTimeRelay->dTripThreshold -= T_10ms;
  278. }
  279. ///////////////////////file end//////////////////////////////////////////////////////////////////////////////
  280. // #endif // __TIMER_C