找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 862|回复: 31
收起左侧

怎么样在同样的条件下,实现两种不同的程序语句?

  [复制链接]
ID:1104510 发表于 2023-12-15 20:21 来自手机 | 显示全部楼层 |阅读模式
如题,在if()条件相同的情况下,实现两种不同的{}语句,使之实现两种不同的功能?求大神指点!
回复

使用道具 举报

ID:401564 发表于 2023-12-15 23:12 | 显示全部楼层
不知道你要求是什么?
if如果为真,那就是唯一选择执行呀!
回复

使用道具 举报

ID:1104510 发表于 2023-12-16 06:56 来自手机 | 显示全部楼层
Y_G_G 发表于 2023-12-15 23:12
不知道你要求是什么?
if如果为真,那就是唯一选择执行呀!

我做了一套自动化小设备,就是用4个接近开关控制一个小直流电机的正反转,就是在同样的一个条件下,需要实现停止跟反转这两个功能,我现在正转跟停止已经实现了,就是无法实现反转,整个流程是:反转~停止~正转~停止~反转~停止,我已经实现了前面四个动作,就差后面两个动作了,就差最后两个动作,因为第五个反转的条件跟第三个正转的条件一样,所以导致第五个反转无法实现,求指导一下,应该怎么处理,才能实现反转

回复

使用道具 举报

ID:895440 发表于 2023-12-16 09:52 | 显示全部楼层
不可能,一个条件必定对于一个动作
没有这种东西,人也做不到
回复

使用道具 举报

ID:213173 发表于 2023-12-16 11:23 | 显示全部楼层
郑效桂 发表于 2023-12-16 06:56
我做了一套自动化小设备,就是用4个接近开关控制一个小直流电机的正反转,就是在同样的一个条件下,需要 ...

相同判断条件不可能做出截然相反且都正确的结果,否则不就乱套了。必须创造可以识别的条件。既然有4个接近开关就能判断机械位置,不同的机械位置就是判断条件。比如再设置一个变量x,初始为0,正转后停止x=1,反转后停止x=2来记忆运行经历。当不知道下一步是正还是反转,x就是判断条件。
回复

使用道具 举报

ID:341045 发表于 2023-12-16 13:20 | 显示全部楼层
多加一个以前电机正反转的标志一起带进来判断.  如果不能处理, 就多弄一个标志, 碰到这条件标志取反, 由标志控制电机正反转(比如标志为0正转, 不为0反转)
回复

使用道具 举报

ID:384109 发表于 2023-12-16 13:28 | 显示全部楼层
郑效桂 发表于 2023-12-16 06:56
我做了一套自动化小设备,就是用4个接近开关控制一个小直流电机的正反转,就是在同样的一个条件下,需要 ...

增加标志吧
回复

使用道具 举报

ID:883242 发表于 2023-12-16 23:28 | 显示全部楼层
郑效桂 发表于 2023-12-16 06:56
我做了一套自动化小设备,就是用4个接近开关控制一个小直流电机的正反转,就是在同样的一个条件下,需要 ...

状态机,加个状态变量,反转~停止~正转~停止~反转~停止分别对应状态0、1、2、3、4、5……
回复

使用道具 举报

ID:1104510 发表于 2023-12-17 07:21 | 显示全部楼层
lzts88 发表于 2023-12-16 13:20
多加一个以前电机正反转的标志一起带进来判断.  如果不能处理, 就多弄一个标志, 碰到这条件标志取反, 由标 ...


//IN1 IN2 IN3 IN4分别对应4个接近开关
//COM1 对应正转继电器,
//COM2对应反转继电器,
//COM3对应警报继电器
void csh(){COM1 =1;COM2 =0;C0M3 =1;} //开机初始化,电机反转
void zz(){COM1 =0;COM2 =1;COM3 =1;}//正转
void fz(){COM1 =1;COM2 =0;COM3 =0;}//反转,并发出警报
void jb(){COM1 =1;COM2 =1;COM3 =0;}//反转到达限位,警报继续
void tz(){COM1 =1;COM2 =1;COM3 =1;}//正转或者反转到达限位后,电机停止
void main()                                  
        {
                 while(1)
                        {
                                if((IN1 ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){csh();}
                                  //开机初始化,电机反转
                                if((IN1 ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){tz();}
                                  //I电机停止
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){zz();}
                                 //电机正转
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){zz();}
                                 //电机正转
                                if((IN1 ==0)&&(IN2 ==0)&&(IN3 ==1)&&(IN4 ==1)){tz();}
                                 //电机停止
                                if((IN1 ==0)&&(IN2 ==0)&&(IN3 ==0)&&(IN4 ==1)){tz();}
                     //电机停止
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==0)&&(IN4 ==1)){fz();}
                     //电机反转
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){fz();}
                        //电机反转
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){tz();}
                                   //电机停止

                   }

                       
        }
这是我写的代码,应该怎么添加标志呢
回复

使用道具 举报

ID:1104510 发表于 2023-12-17 07:22 | 显示全部楼层
wulin 发表于 2023-12-16 11:23
相同判断条件不可能做出截然相反且都正确的结果,否则不就乱套了。必须创造可以识别的条件。既然有4个接 ...

//IN1 IN2 IN3 IN4分别对应4个接近开关
//COM1 对应正转继电器,
//COM2对应反转继电器,
//COM3对应警报继电器
void csh(){COM1 =1;COM2 =0;C0M3 =1;} //开机初始化,电机反转
void zz(){COM1 =0;COM2 =1;COM3 =1;}//正转
void fz(){COM1 =1;COM2 =0;COM3 =0;}//反转,并发出警报
void jb(){COM1 =1;COM2 =1;COM3 =0;}//反转到达限位,警报继续
void tz(){COM1 =1;COM2 =1;COM3 =1;}//正转或者反转到达限位后,电机停止
void main()                                  
        {
                 while(1)
                        {
                                if((IN1 ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){csh();}
                                  //开机初始化,电机反转
                                if((IN1 ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){tz();}
                                  //I电机停止
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){zz();}
                                 //电机正转
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){zz();}
                                 //电机正转
                                if((IN1 ==0)&&(IN2 ==0)&&(IN3 ==1)&&(IN4 ==1)){tz();}
                                 //电机停止
                                if((IN1 ==0)&&(IN2 ==0)&&(IN3 ==0)&&(IN4 ==1)){tz();}
                     //电机停止
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==0)&&(IN4 ==1)){fz();}
                     //电机反转
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){fz();}
                        //电机反转
                                if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){tz();}
                                   //电机停止

                   }

                       
        }
这是我写的代码,应该怎么添加条件呢
回复

使用道具 举报

ID:161164 发表于 2023-12-17 14:38 | 显示全部楼层
  1. uchar Step = 0;
  2. void main()
  3. {
  4.         while(1)
  5.         {
  6.                 switch(Step)
  7.                 {
  8.                         case 0:
  9.                                 if((IN1 ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1))
  10.                                 {
  11.                                         csh();
  12.                                         Step++;
  13.                                 }
  14.                                 break;
  15.                         //开机初始化,电机反转
  16.                         case 1:
  17.                                 if((IN1 ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0))
  18.                                 {
  19.                                         tz();
  20.                                         Step++;
  21.                                 }
  22.                                 break;
  23.                         //I电机停止
  24.                         case 2:
  25.                                 if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0))
  26.                                 {
  27.                                         zz();
  28.                                         Step++;
  29.                                 }
  30.                                 break;
  31.                         //电机正转
  32.                         case 3:
  33.                                 if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1))
  34.                                 {
  35.                                         zz();
  36.                                         Step++;
  37.                                 }
  38.                                 break;
  39.                         //电机正转
  40.                         case 4:
  41.                                 if((IN1 ==0)&&(IN2 ==0)&&(IN3 ==1)&&(IN4 ==1))
  42.                                 {
  43.                                         tz();
  44.                                         Step++;
  45.                                 }
  46.                                 break;
  47.                         //电机停止
  48.                         case 5:
  49.                                 if((IN1 ==0)&&(IN2 ==0)&&(IN3 ==0)&&(IN4 ==1))
  50.                                 {
  51.                                         tz();
  52.                                         Step++;
  53.                                 }
  54.                                 break;
  55.                         //电机停止
  56.                         case 6:
  57.                                 if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==0)&&(IN4 ==1))
  58.                                 {
  59.                                         fz();
  60.                                         Step++;
  61.                                 }
  62.                                 break;
  63.                         //电机反转
  64.                         case 7:
  65.                                 if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1))
  66.                                 {
  67.                                         fz();
  68.                                         Step++;
  69.                                 }
  70.                                 break;
  71.                         //电机反转
  72.                         case 8:
  73.                                 if((IN1 ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0))
  74.                                 {
  75.                                         tz();
  76.                                         Step=0;
  77.                                 }
  78.                                 break;
  79.                                 //电机停止
  80.                 }
  81.         }
  82. }
复制代码
回复

使用道具 举报

ID:1056324 发表于 2023-12-17 18:14 | 显示全部楼层
郑效桂 发表于 2023-12-17 07:22
//IN1 IN2 IN3 IN4分别对应4个接近开关
//COM1 对应正转继电器,
//COM2对应反转继电器,

这逻辑?命令1111开机初始化,电机反转,命令1110反转到达限位后,电机停止,给命令0110电机正转,然后如果这里没有正转到初始位置,电机停止,为什么再给命令0111电机正转,
命令0011正转到达限位后,电机停止,为什么再给命令0001电机停止,后面也是,

用状态机,switch case 语句,比if简单,
if的话,反转1111~停止1110~正转0000~停止1100~反转1000~停止1010,这样不行吗
回复

使用道具 举报

ID:61140 发表于 2023-12-17 23:09 | 显示全部楼层
雷欧库珀 发表于 2023-12-16 09:52
不可能,一个条件必定对于一个动作
没有这种东西,人也做不到

可能的,现在有多核51单片机,网上查一下
回复

使用道具 举报

ID:1104510 发表于 2023-12-18 06:31 来自手机 | 显示全部楼层
白画求兮 发表于 2023-12-17 18:14
这逻辑?命令1111开机初始化,电机反转,命令1110反转到达限位后,电机停止,给命令0110电机正转,然后如 ...

不会出现0000这个情况
回复

使用道具 举报

ID:1104510 发表于 2023-12-18 06:31 来自手机 | 显示全部楼层
白画求兮 发表于 2023-12-17 18:14
这逻辑?命令1111开机初始化,电机反转,命令1110反转到达限位后,电机停止,给命令0110电机正转,然后如 ...

3跟4不可能同时为0
回复

使用道具 举报

ID:1104510 发表于 2023-12-18 06:44 来自手机 | 显示全部楼层
白画求兮 发表于 2023-12-17 18:14
这逻辑?命令1111开机初始化,电机反转,命令1110反转到达限位后,电机停止,给命令0110电机正转,然后如 ...

楼上的switch  case语句昨天我试了,不行。状态机我还不知道怎么写
回复

使用道具 举报

ID:1104510 发表于 2023-12-18 07:10 | 显示全部楼层
白画求兮 发表于 2023-12-17 18:14
这逻辑?命令1111开机初始化,电机反转,命令1110反转到达限位后,电机停止,给命令0110电机正转,然后如 ...

4个接近开关处在同一条直线上的不同位置,3是正转的限位,4是反转的限位,他们的关系要么是01要么是10要么是11,永远不会是00
回复

使用道具 举报

ID:958310 发表于 2023-12-18 11:40 | 显示全部楼层
这都不会,,,是刚入行的吗?标记法、状态机 直接秒了
回复

使用道具 举报

ID:1104510 发表于 2023-12-18 13:34 | 显示全部楼层
bigbigcong 发表于 2023-12-18 11:40
这都不会,,,是刚入行的吗?标记法、状态机 直接秒了

对啊,就是刚学这个
回复

使用道具 举报

ID:1088099 发表于 2023-12-18 14:22 | 显示全部楼层
郑效桂 发表于 2023-12-18 07:10
4个接近开关处在同一条直线上的不同位置,3是正转的限位,4是反转的限位,他们的关系要么是01要么是10要 ...

那1和2呢,在哪个位置
回复

使用道具 举报

ID:1104510 发表于 2023-12-18 14:49 | 显示全部楼层
金玉之食 发表于 2023-12-18 14:22
那1和2呢,在哪个位置

IN1 判断气胀管是否在机器上,IN2 判断是否接触到图片中的白色物体,IN3是电机的正转限位,IN4 是电机的反转限位
5.jpg
回复

使用道具 举报

ID:104825 发表于 2023-12-18 15:06 来自手机 | 显示全部楼层
画个草图,标记出接近开关位置,描述一下工作流程,让大家更好的帮助你。
回复

使用道具 举报

ID:1104510 发表于 2023-12-18 15:46 | 显示全部楼层
s1gm 发表于 2023-12-18 15:06
画个草图,标记出接近开关位置,描述一下工作流程,让大家更好的帮助你。

如图所示:
IN1用于检测气胀管是否在机器上;
IN2用于检测白色的膜(这个膜是随着气胀管的转动而(厚度)逐渐变薄的)的侧面是否到达指定位置;
IN2是随着电机运动的,电机往哪动它就往哪动;
IN3用于电机正转限位;
IN4用于反转限位;
COM1用于电机正转;
COM2用于电机反转;
COM3用于发出警报;
当气胀管不在机器上时,反转,警报不响;(1111)
到达IN4位置时,停止;(1110)
当气胀管被放到机器上时,IN1触发,电机正转(0110)(此时IN4处于触发状态,随着电机的转动,IN4逐渐丢失信号,(0111)此时持续正转);
当IN2接触到白色膜时,IN2被触发,此时,电机停止转动;(0011)
随着膜逐渐变薄,直到IN2丢失信号,此时,电机反转,并发出警报;(0111)
当反转到IN4位置时,电机停止,警报持续;(0110)


7.jpg
6.jpg
回复

使用道具 举报

ID:161164 发表于 2023-12-18 16:54 | 显示全部楼层
郑效桂 发表于 2023-12-18 15:46
如图所示:
IN1用于检测气胀管是否在机器上;
IN2用于检测白色的膜(这个膜是随着气胀管的转动而(厚度 ...

看11楼我的回复
回复

使用道具 举报

ID:1104510 发表于 2023-12-18 19:21 来自手机 | 显示全部楼层
bigbigcong 发表于 2023-12-18 11:40
这都不会,,,是刚入行的吗?标记法、状态机 直接秒了

能教教我吗
回复

使用道具 举报

ID:1104510 发表于 2023-12-18 20:54 来自手机 | 显示全部楼层
lkc8210 发表于 2023-12-18 16:54
看11楼我的回复

你的程序我试过了,没达到我的预期效果
回复

使用道具 举报

ID:1088099 发表于 2023-12-19 09:01 | 显示全部楼层
郑效桂 发表于 2023-12-18 20:54
你的程序我试过了,没达到我的预期效果

有问题,我先修改一下
回复

使用道具 举报

ID:1088099 发表于 2023-12-19 14:36 来自手机 | 显示全部楼层

//IN1 IN2 IN3 IN44
//COM1
//COM2
//COM3
void csh(){COM1 =1;COM2 =0;C0M3 =1;} //
void zz(){COM1 =0;COM2 =1;COM3 =1;}//
void fz(){COM1 =1;COM2 =0;COM3 =0;}//
void jb(){COM1 =1;COM2 =1;COM3 =0;}//λ
void tz(){COM1 =1;COM2 =1;COM3 =1;}//λ
void main()                                 
{
        int Flag=0;
  while(1){
          if(IN1 ==1){
                  if((IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){csh();} //
                  if((IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){tz();Flag=0;}  //
                }
          if(IN1 ==0){
                  if((Flag ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){zz();}         //
                  if((Flag ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){zz();}         //
                  if((IN2 ==0)&&(IN3 ==1)&&(IN4 ==1)){tz();Flag=1;}                     //
                        if((Flag ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){fz();}              //
                        if((Flag ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){tz();jb();Flag=0;}  //
                }                        
        }
}
回复

使用道具 举报

ID:1104510 发表于 2023-12-19 15:17 | 显示全部楼层
金玉之食 发表于 2023-12-19 14:36
//IN1 IN2 IN3 IN44
//COM1
//COM2

最后一步不对,最后一步应该是COM1 =1,COM2 =1,COM3 =0,现在运行出来的结果是,COM1 =0;COM2 =1;COM3 =1;
回复

使用道具 举报

ID:1088099 发表于 2023-12-19 15:27 | 显示全部楼层
郑效桂 发表于 2023-12-19 15:17
最后一步不对,最后一步应该是COM1 =1,COM2 =1,COM3 =0,现在运行出来的结果是,COM1 =0;COM2 =1;COM3 =1 ...

说一下实验现象,也有可能是又重新进入循环导致的,判断之间间隔时间短被忽略了
回复

使用道具 举报

ID:1104510 发表于 2023-12-19 15:46 | 显示全部楼层
好了     我改了一下  又加了点新功能  谢谢了
void csh(){COM1 =1;COM2 =0;COM3 =1;}
void tz(){COM1 =1;COM2 =1;COM3 =1;}
void zz(){COM1 =0;COM2 =1;COM3 =1;}
void fz(){COM1 =1;COM2 =0;COM3 =0;}
void jb(){COM1 =1;COM2 =1;COM3 =0;}
void main()                                 
    {
        int Flag=0;
          while(1)
            {
                  if(IN1 ==1)
                    {
                          if((IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){csh();} //
                          if((IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){tz();Flag=0;}  //
                    }
                  if(IN1 ==0)
                    {
                          if((Flag ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){zz();}         //
                          if((Flag ==0)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){zz();}         //
                          if((IN2 ==0)&&(IN3 ==1)&&(IN4 ==1)){tz();Flag=1;}                     //
                          if((Flag ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==1)){fz();}              //
                          if((Flag ==1)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){jb();}  //
                        if((Flag ==1)&&(IN2 ==1)&&(IN3 ==0)&&(IN4 ==0)){tz();Flag=2;}
                        if((Flag ==2)&&(IN2 ==1)&&(IN3 ==1)&&(IN4 ==0)){tz();}
                    }                        
            }
    }
现在已经达到我的预期效果了   多谢多谢

回复

使用道具 举报

ID:1104510 发表于 2023-12-19 16:02 | 显示全部楼层

这就是标记法吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表