硬汉嵌入式论坛

 找回密码
 立即注册
查看: 765|回复: 2
收起左侧

[有问必答] C语言处理方法提高_由uint16_t转换Bit判断

[复制链接]

12

主题

22

回帖

58

积分

初级会员

积分
58
发表于 2023-3-21 21:21:58 | 显示全部楼层 |阅读模式
目的:
1,接收到来自MODBUS主站数据uint16_t,提取一个uint16_t里面位状态。比如:1,2,4,8,16,32,64...互相不影响。
      将这些位状态,作为开关信号来处理。进行逻辑组合判断。
2,如果像这样的位处理多起来了,导致代码很繁琐。

INT8U Bit_Judge(INT16U BitData,INT16U AndValue)
{
  INT8U ReturnValue;
         switch (AndValue){
                 case 0x1:
                         if(BitData & AndValue )
                         { ReturnValue=0x01;}
                         else
                         { ReturnValue=0x00;}
                 break;
                 case 0x2:
                         if(BitData & AndValue )
                         { ReturnValue=0x01;}
                         else
                         { ReturnValue=0x00;}
                         break;
                 case 0x4:
                         if(BitData & AndValue )
                         { ReturnValue=0x01;}
                         else
                         { ReturnValue=0x00;}
                         break;
                 case 0x8:
                         if(BitData & AndValue )
                         { ReturnValue=0x01;}
                         else
                         { ReturnValue=0x00;}
                         break;
                        case 0x10:
                         if(BitData & AndValue )
                         { ReturnValue=0x01;}
                         else
                         { ReturnValue=0x00;}
                         break;
                        case 0x20:
                         if(BitData & AndValue )
                         { ReturnValue=0x01;}
                         else
                         { ReturnValue=0x00;}
                         break;
                        case 0x40:
                         if(BitData & AndValue )
                         { ReturnValue=0x01;}
                         else
                         { ReturnValue=0x00;}
                         break;
                         case 0x80:
                         if(BitData & AndValue )
                         { ReturnValue=0x01;}
                         else
                         { ReturnValue=0x00;}
                         break;
                         case 0x100:
                         if(BitData & AndValue )
                         { ReturnValue=0x01;}
                         else
                         { ReturnValue=0x00;}
                         break;
                        case 0x200:
                         if(BitData & AndValue )
                         { ReturnValue=0x01;}
                         else
                         { ReturnValue=0x00;}
                         break;
                        case 0x400:
                         if(BitData & AndValue )
                         { ReturnValue=0x01;}
                         else
                         { ReturnValue=0x00;}
                         break;
                         case 0x800:
                         if(BitData & AndValue )
                         { ReturnValue=0x01;}
                         else
                         { ReturnValue=0x00;}
                         break;
                          case 0x1000:
                         if(BitData & AndValue )
                         { ReturnValue=0x01;}
                         else
                         { ReturnValue=0x00;}
                         break;
                          case 0x2000:
                         if(BitData & AndValue )
                         { ReturnValue=0x01;}
                         else
                         { ReturnValue=0x00;}
                         break;
                          case 0x4000:
                         if(BitData & AndValue )
                         { ReturnValue=0x01;}
                         else
                         { ReturnValue=0x00;}
                         break;
                          case 0x8000:
                         if(BitData & AndValue )
                         { ReturnValue=0x01;}
                         else
                         { ReturnValue=0x00;}
                         break;
                 }
         return ReturnValue;
}
-----------------------------------------------------------------------------------------------------------------------------------------



         FromPLC_Word1_Bit_AnalysisStruct.bit0=Bit_Judge(pModbus_Data[15],0x1);/*抽真空许可*/
         FromPLC_Word1_Bit_AnalysisStruct.bit1=Bit_Judge(pModbus_Data[15],0x2);/*抽真空指令*/
         FromPLC_Word1_Bit_AnalysisStruct.bit2=Bit_Judge(pModbus_Data[15],0x4);/*主阀门Open*/
         FromPLC_Word1_Bit_AnalysisStruct.bit3=Bit_Judge(pModbus_Data[15],0x8);/*主阀门Close*/
         FromPLC_Word1_Bit_AnalysisStruct.bit4=Bit_Judge(pModbus_Data[15],0x10);/*Vent许可*/
         FromPLC_Word1_Bit_AnalysisStruct.bit5=Bit_Judge(pModbus_Data[15],0x20);/*Vent指令*/
         FromPLC_Word1_Bit_AnalysisStruct.bit6=Bit_Judge(pModbus_Data[15],0x40);/*再生许可*/
         FromPLC_Word1_Bit_AnalysisStruct.bit7=Bit_Judge(pModbus_Data[15],0x80);/*再生指令*/
         FromPLC_Word1_Bit_AnalysisStruct.bit8=Bit_Judge(pModbus_Data[15],0x100);/*干泵运行中抽真空可*/
         FromPLC_Word1_Bit_AnalysisStruct.bit9=Bit_Judge(pModbus_Data[15],0x200);/*手动模式*/
         FromPLC_Word1_Bit_AnalysisStruct.bit10=Bit_Judge(pModbus_Data[15],0x400);/*自动模式*/
         FromPLC_Word1_Bit_AnalysisStruct.bit11=Bit_Judge(pModbus_Data[15],0x800);/*紧急停止*/
         FromPLC_Word1_Bit_AnalysisStruct.bit12=Bit_Judge(pModbus_Data[15],0x1000);/*粗抽阀门Open*/
         FromPLC_Word1_Bit_AnalysisStruct.bit13=Bit_Judge(pModbus_Data[15],0x2000);/*粗抽阀门Close*/
         FromPLC_Word1_Bit_AnalysisStruct.bit14=Bit_Judge(pModbus_Data[15],0x4000);/*排气阀门Open*/
         FromPLC_Word1_Bit_AnalysisStruct.bit15=Bit_Judge(pModbus_Data[15],0x8000);/*排气阀门Close*/



回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106769
QQ
发表于 2023-3-22 09:28:44 | 显示全部楼层
Modbus主从机数据量较大时,解析可以做成map映射表的形式,方便修改
https://www.armbbs.cn/forum.php? ... 6190&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

12

主题

22

回帖

58

积分

初级会员

积分
58
 楼主| 发表于 2023-3-22 12:30:36 | 显示全部楼层
eric2013 发表于 2023-3-22 09:28
Modbus主从机数据量较大时,解析可以做成map映射表的形式,方便修改
https://www.armbbs.cn/forum.php?mod ...

谢谢啦,我理解一下哈。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-5 10:44 , Processed in 0.160326 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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