打印
[程序源码]

真正的单片机程序框架------->小巧的软件定时器....O(∩_∩)O

[复制链接]
楼主: misra
手机看帖
扫描二维码
随时随地手机跟帖
61
也写过定时器,计数器,都是参照AB的plc的样式写的
#ifndef __PLC__H__
#include "plc.h"
#define __PLC__H__
#endif
TIME_RELAY T[16];
COUNTER C[16];
DI_FILTER DI[16];
void init_time_relay(TIME_RELAY *time_relay)
{
      time_relay->coil=0;
      time_relay->contact=0;
      time_relay->acc=0;
      time_relay->set=100;
}

void scan_time_relay(TIME_RELAY *time_relay)
{
    if(time_relay->coil)
    {
        time_relay->acc++;
        if(time_relay->acc>time_relay->set) time_relay->contact=1;
    }
    else
    {
          time_relay->acc=0;
          time_relay->contact=0;
    }
}

void init_counter(COUNTER *cu)
{
    cu->coil=0;
    cu->coil_old=1;
    cu->contact=0;
    cu->acc=0;
    cu->set=0;
}

void scan_counter(COUNTER *cu)
{
    //上升沿   
    if(cu->coil==1 && cu->coil_old==0) cu->acc++;
    //下降沿
    //if(cu->coil==0 && cu->coil_old==1) cu->acc++;
    cu->coil_old=cu->coil;
    if(cu->acc>cu->set) cu->contact=1;
}

void init_digital_input(DI_FILTER *di)
{
    di->in=0;
    di->out=0;
    di->high_acc=0;
    di->low_acc=0;
    di->out_old=0;
    di->confirm_time=10;
}

void scan_digital_input(DI_FILTER *di)
{
    if(di->in)
    {
        di->high_acc++;
        if(di->high_acc>di->confirm_time) di->out=1;
        di->low_acc=0;
    }
    else
    {
        di->low_acc++;
        if(di->low_acc>di->confirm_time) di->out=0;
        di->high_acc=0;
    }
    di->rise=(di->out_old==0 && di->out==1);
    di->fall=(di->out_old==1 && di->out==0);
    di->out_old=di->out;
   
}

void init_plc(void)
{
    unsigned char j=0;
    for(j=0;j<16;j++) {
        init_time_relay(&T[j]);
        init_counter(&C[j]);
        init_digital_input(&DI[j]);
    }
}

void scan_plc(void)
{
    unsigned char j=0;
    for(j=0;j<16;j++) {
        scan_time_relay(&T[j]);
        scan_counter(&C[j]);
        scan_digital_input(&DI[j]);
    }
}
定时器,一个线圈,一个定时器设置,一个定时器累加器,一个触点
计时器,一个线圈,一个计数器设置,一个计数器累加器,一个触点
数字输入,一个输入,滤波输出,上升沿,下降沿输出。

使用特权

评论回复
62
叶春勇| | 2021-3-23 11:33 | 只看该作者
这个是头文件,数据结构
typedef struct{
    unsigned char coil:1;
    unsigned char contact:1;
    unsigned int acc;
    unsigned int set;
}TIME_RELAY;

typedef struct{
    unsigned char coil:1;
    unsigned char coil_old:1;
    unsigned char contact:1;
    unsigned char overflow:1;
    unsigned int acc;
    unsigned int set;   
}COUNTER;

typedef struct {
    unsigned char in:1;
    unsigned char out:1;
    unsigned char out_old:1;
    unsigned char rise:1;
    unsigned char fall:1;
    unsigned char high_acc:8;        
    unsigned char low_acc:8;
    unsigned char confirm_time;
}DI_FILTER;

void init_time_relay(TIME_RELAY *time_relay);
void scan_time_relay(TIME_RELAY *time_relay);
void init_counter(COUNTER *cu);
void scan_counter(COUNTER *cu);
void init_digital_input(DI_FILTER *di);
void scan_digital_input(DI_FILTER *di);
void init_plc(void);
void scan_plc(void);
unsigned char is_fall(unsigned char new,unsigned char *old);
unsigned char is_rise(unsigned char new,unsigned char *old);

使用特权

评论回复
63
yushikong| | 2021-3-23 14:33 | 只看该作者
现实中一个delay打天下的人不在少数,另外很多芯片很难嵌入rtos,比如很多51以及大量的低内存芯片,这种写法基本是最优解。

使用特权

评论回复
64
misra|  楼主 | 2021-3-23 20:00 | 只看该作者
本帖最后由 misra 于 2021-3-23 20:04 编辑
叶春勇 发表于 2021-3-23 11:33
这个是头文件,数据结构

我的shotTimer也是PLC的实现啊

来个标准Standardization: this function block is defined by IEC61131-3.
TON
The rising edge of the input operand "IN" will start the timer "TON", and it will run as long a time interval as specified by the operand "PT".

While the timer is running, the output operand "Q" will have the value "0". If the time is up, the state will change to "1" and keep this value until the operand "IN" changes to "0".

If the "PT" value changes after the timer has been started, this will have no implications until the next rising edge of the operand "IN".

The output operand "ET" contains the current timer value. If the time is up, the operand "ET" will keep its value as long as the operand "IN" has the value "1". If the state of the "IN" operand changes to "0", the value of "ET" will switch to "0".

If the input "IN" is switched on, this will switch on the output "Q" after an interval specified by the delay value.

Inputs:

IN: Start condition

PT: time Initial time value

Outputs

Q: bool binary state of the timer

ET: time current time value

Notes:

Standardization: this function block is defined by IEC61131-3.
————————————————

我的程序里面的
IN对应的是activeStatus
Q对应的是返回值timeoutFlag
PT对应的是initTick
ET对应的是offsetTick




使用特权

评论回复
65
叶春勇| | 2021-3-23 20:36 | 只看该作者
misra 发表于 2021-3-23 20:00
我的shotTimer也是PLC的实现啊

来个标准Standardization: this function block is defined by IEC61131-3 ...

你是个懂行的,我是先搞plc,后搞单片机。所以编程模式按照plc,而且硬件也是抄plc的。

使用特权

评论回复
66
叶春勇| | 2021-3-23 21:18 | 只看该作者
misra 发表于 2021-3-23 20:00
我的shotTimer也是PLC的实现啊

来个标准Standardization: this function block is defined by IEC61131-3 ...

定时器累加器还要接modbus,所以定义了acc。不用modbus,用tick相减(还要考虑溢出)节省内存。

使用特权

评论回复
67
zlutian| | 2021-3-23 23:50 | 只看该作者
misra 发表于 2021-3-12 16:58
有啊 都有啊  50楼 也有啊  都给了

楼主,代码能否在这个论坛上存,这些网址都打不开。

使用特权

评论回复
68
CM-803| | 2021-3-24 21:51 | 只看该作者
misra 发表于 2021-3-23 20:00
我的shotTimer也是PLC的实现啊

来个标准Standardization: this function block is defined by IEC61131-3 ...

画的挺好理解,开始看指针,慢慢理解

使用特权

评论回复
69
wwk1996| | 2021-3-25 04:46 | 只看该作者
不错啊,学习一下。

使用特权

评论回复
70
misra|  楼主 | 2021-3-31 22:16 | 只看该作者
点击量破万

使用特权

评论回复
71
funior| | 2021-4-1 15:54 | 只看该作者
初一看以为是青铜,仔细看原来是王者

使用特权

评论回复
72
叶春勇| | 2021-4-3 13:58 | 只看该作者

1w2了,帮顶

使用特权

评论回复
73
misra|  楼主 | 2021-4-16 20:29 | 只看该作者

使用特权

评论回复
74
90houyidai| | 2021-4-19 22:00 | 只看该作者
MARK

使用特权

评论回复
75
HXM1593| | 2021-5-8 17:28 | 只看该作者
楼主,学习了很久,想问个问题
static const ml_shotTimer_Object_Struct  MLshotTimer_Object  = {
    ml_shotTimer_start,
    ml_shotTimer_stop,
    ml_shotTimer_check,
    ml_shotTimer_offsetTick_get,
    ml_shotTimer_state_get
};
这段是算结构体常量定义,还是声明变量的,虽然是函数体名称,作为什么用那,函数我看也单独声明了

使用特权

评论回复
评论
爱情海玩偶 2021-5-8 17:53 回复TA
声明变量吧,就是把一类相关的放一起。 
76
hjl714016| | 2021-6-13 08:43 | 只看该作者
不错,比较使用,也容易理解

使用特权

评论回复
77
misra|  楼主 | 2021-8-19 19:41 | 只看该作者
hjl714016 发表于 2021-6-13 08:43
不错,比较使用,也容易理解

使用特权

评论回复
78
玥月| | 2021-8-23 08:50 | 只看该作者
这个可以学习下

使用特权

评论回复
79
misra|  楼主 | 2021-9-6 21:36 | 只看该作者
玥月 发表于 2021-8-23 08:50
这个可以学习下

使用特权

评论回复
80
ghost_z| | 2021-9-8 20:08 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则