打印
[STM32F1]

请教下 多个继电器轮流控制的编程思路?

[复制链接]
1226|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
如图,要轮流控制16个电磁阀 。打“√”表示选中, 没有“√”表示不选中受控制,可以根据要求设置。
根据水泵功率的大小,所以同时灌溉的数量是不一样的
比如,选中的是1-6#的电磁阀选中(可以是任意) 由于泵供水量只能同时供2个电磁阀工作
所以只能1-2#同时打开 达到灌溉时间后, 再进行3-4# 灌溉,以此类推
各位大侠有什么好的 c语言编程思路吗?

Q.png (18.16 KB )

Q.png
沙发
电子过客|  楼主 | 2016-3-26 08:35 | 只看该作者
自己顶一下

使用特权

评论回复
板凳
mmuuss586| | 2016-3-26 08:57 | 只看该作者
不管是多少个;
从1开始判断,那2个先选中,先打开那2个,再判断下1组;

使用特权

评论回复
地板
mohanwei| | 2016-3-26 10:00 | 只看该作者
有点意思,以前做过类似的,改一改仅供参考:
思路很简单:不停的检测,发现当前工作的阀门还没有凑够2个,就找出下一个允许工作的阀门。
typedef struct
{
        ……其它参数
        int work_s;//单次工作时间。
        int cnt_work;//在界面设置这个工作循环次数,每工作一次就减1,减到0则不再执行
        bool working;//true-正在工作
        bool select;//true-选中
       
        //临时变量:
        int time_s;//当前已工作时间,就是一个秒计数器。从0累加,加到work_s后停止工作
}ValveStruct;//定义一个阀对象/结构体
#define _VALVE_NUM 13 //13个阀
ValveStruct valve[_VALVE_NUM];
int ValveThread(void)
{
        static int cur=0;//当前阀序号(0至_VALVE_NUM-1)
        #defint _MaxWorkintNum 2 //允许2个阀同时工作
        static int working_num=0;//正在工作的阀个数(0-2)
        while(1)
        {
                if(working_num<_MaxWorkintNum)//工作阀还没凑够限制数量,则获取下一个允许运行的阀并启动它
                {
                        int next = GetNextValve(cur);//从当前指定的序号开始循环搜索列表,找到下一个允许运行的泵
                        if(next<_VALVE_NUM)//下一个阀有效
                        {
                                working_num++;//当前工作阀数量累加
                               
                                cur = next;//更新当前阀序号
                                valve[cur].cnt_work--;//工作次数减1
                                valve[cur].working = true;//状态切换为“正在工作”
                                valve[cur].time_s = 0;//秒计数器清零
                        }
                }
               
                Sleep_s(1);//休眠1秒
               
                for(int i=0;i<_VALVE_NUM;i++)
                {
                        if(valve[i].working)//正在工作
                        {
                                valve[i].working = true;//状态切换为“正在工作”
                                valve[i].time_s++;//秒计数器累加
                                if(valve[i].time_s >= valve[i].work_s)//超过用户指定的单次工作时间,则停止工作
                                {
                                        valve[i].working = false;
                                }
                        }
                }
        }
}

使用特权

评论回复
5
电子过客|  楼主 | 2016-3-26 10:16 | 只看该作者
十分感谢,整体控制要求是这样的,我先好好拜读下

2.png (189.18 KB )

2.png

使用特权

评论回复
6
电子过客|  楼主 | 2016-3-26 15:33 | 只看该作者
mohanwei 发表于 2016-3-26 10:00
有点意思,以前做过类似的,改一改仅供参考:
思路很简单:不停的检测,发现当前工作的阀门还没有凑够2个, ...

GetNextValve(cur);
这个函数您给参考下吗

使用特权

评论回复
7
mohanwei| | 2016-3-26 22:45 | 只看该作者
本帖最后由 mohanwei 于 2016-3-27 09:42 编辑
电子过客 发表于 2016-3-26 15:33
GetNextValve(cur);
这个函数您给参考下吗

int GetNextValve(int cur)//从当前指定的序号开始循环搜索列表,找到下一个允许运行的泵
{
        for(int x=0;x<_VALVE_NUM;x++)
        {
                if(        (valve[x].select)&&//选中
                        (false == valve
[x].working)&&//当前状态是停止
                        (valve
[x].cnt_work>0) )//循环次数还没用完
                {
                        return(cur);
                }
                else
                {
                        cur++;
                        if(cur>=_VALVE_NUM)//环回
                        {
                                cur = 0;
                        }
                }
        }
        return(-1);//没有找到符合条件的阀
}

使用特权

评论回复
8
aerwa| | 2016-3-27 08:51 | 只看该作者
值得学习,讨论电子技术无私的人真多。

使用特权

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

本版积分规则

54

主题

205

帖子

2

粉丝