case 多个条件

威纶HMI宏指令选择语句大致分为两类分别是

    if 语句         

    Case 语句    

01

if 语句

if语句用来判断给定条件是否满足,根据判断结果决定是否执行某个操作。

然而if语句在这里大致可以分为3种形式:

1、单一形式的if语句       

2、if……else形式语句    

3、if语句的多重判断形式

单一形式的if语句 

1if number > 5 then2    TRACE('Result == true')3end if

其流程图如下:如果number > 5 的条件成立那么打印预定的字符然后语句结束,如果条件不成立那么什么也不做。

➋ if……else形式语句

1if number > 10 then2    varA =  varB   varC3else4    varA =  varB - varC5end if

流程图解释: number > 10 为true时执行varA =  varB   varC 然后结束,当其比较结果为false时执行 varA =  varB - varC 之后结束

➋ if语句的多重判断形式

举一个经典的例子:将一个学生的数学成绩归类为Class A(90<=成绩<=100)、Class B(80<=成绩<90)、Class C(70<=成绩<80)、Class D(60<=成绩<70)、Class E(成绩<60)。

 1macro_command main() 2short score 3GetData(score, 'Local_HMI', LW, 100, 1)//来自HMI的成绩数据入口 4if score 0 or score > 100 then   5    TRACE('input Error')//如果输入负数or成绩大于100则警告并终止 6else if score > 0 and score 60 then 7    TRACE('Class E %d',score) 8else if score >= 60 and score 70 then 9    TRACE('Class D %d',score)10else if score >= 70 and score 80 then11    TRACE('Class C %d',score)12else if score >= 80 and score 90 then    13    TRACE('Class B %d',score)14else if score >= 90 and score <= 100 then15    TRACE('Class A %d',score)16end if    17end macro_command

if语句多重判断形式允许扩充多个条件的判断,语法结构逻辑紧凑,层层递进抽丝剥茧,就像剥洋葱

模型如下:

上面成绩分级的代码流程图如下

跑一个仿真

02

Case语句

虽然多重if语句可以替代Case语句,但是在某些时候使用Case语句使代码具有更好的可读性,避免了使用过多的if-else语句让人眼花缭乱。


继续使用刚才成绩分级的的要求用Case选择语句来实现:

1macro_command main() 2short score 3GetData(score, 'Local_HMI', LW, 100, 1)//获取分值 4if score <= 100 and score >= 0 then//验证输入分值是否在0~100之间 5    select case score / 10 //比如成绩是63分 63/10 = 6.3;由于变量是整型会舍弃小数那么对应的语句就是 Case 6 语句块 6    case 0 7    case 1 8    case 2 9    case 310    case 411    case 512        TRACE('Class E')13    break14    case 615        TRACE('Class D')16    break17    case 718        TRACE('Class C')19    break20    case 821        TRACE('Class B')22    break23    case 924        TRACE('Class A')25    break26    case else//Case ELSE 如果没有与上述条件相匹配的则执行该语句块27        TRACE('Class A')28    end select30else31    TRACE('input Error ')//输入错误警告32end if33end macro_command

模拟视频

在Case语句中有一些关键词

select case ;Case语句的开始部分

case 0~case 9;是预设条件 score 的值与条件相等时执行对应的语句块

case else;score的内容与之前的预设条件无匹配项则执行case else的语句

break ;如果语句块n的后面有break,那么执行完语句块n就会跳转到end select,结束case判断。如果语句块后没有break 那么语句会一直往下执行,直到遇到break或者end select然后退出Case语句。(上面示例代码中Case 0 ~ Case4是没有break语句的,所以会挨个执行直到碰到Case 5 的break才会跳出Case语句)

end select;Case语句的结束标识

Case语句流程图如下:

03

Case语句的嵌套形式

既然if语句可以嵌套,那么Case是否可以使用嵌套形式?答案是当然可以。这种用法估计很少有人使用或者少为人知,但是 我们一定要知道

Case的嵌套与if的嵌套非常相似,下来用一个简单的例子演示。

示例中有3种产品,每种产品分为A;B;C;D;4个级别(类)通过case嵌套来查询价格。

 1macro_command main() 2short Product_ID 3char class[1] //StringGet必须使用字符数组变量 其目标数据是来获取输入的字符串,如果数组元素只有一个就只会获取第一个字符,刚好满足设计需求 4GetData(Product_ID, 'Local_HMI', LW, 201, 1)//获取产品ID 5StringGet(class[0], 'Local_HMI', LW, 300, 1)//以字符形式获取产品等级  6 7select case Product_ID 8case 1 9    TRACE('case 1')10    select case class[0]11    case 'A'12        TRACE('Product_%d class %c price = %d',Product_ID,class[0],Product_ID*class[0] 10)13        break14    case 'B'15        TRACE('Product_%d class %c price = %d',Product_ID,class[0],Product_ID*class[0] 30)16        break17    case 'C'18        TRACE('Product_%d class %c price = %d',Product_ID,class[0],Product_ID*class[0] 50)19        break20    case 'D'21        TRACE('Product_%d class %c price = %d',Product_ID,class[0],Product_ID*class[0] 70)22        break23    case else//ELSE24    TRACE('not found 1')25    end select26break2728case 229    TRACE('case 2')30    select case class[0]31        case 'A'32        TRACE('Product_%d class %c price = %d',Product_ID,class[0],Product_ID*class[0] 20)33        break34    case 'B'35        TRACE('Product_%d class %c price = %d',Product_ID,class[0],Product_ID*class[0] 40)36        break37    case 'C'38        TRACE('Product_%d class %c price = %d',Product_ID,class[0],Product_ID*class[0] 60)39        break40    case 'D'41        TRACE('Product_%d class %c price = %d',Product_ID,class[0],Product_ID*class[0] 80)42        break43    case else//ELSE44    TRACE('not found 2')45    end select46break4748case 349    TRACE('case 3')50    select case class[0]51    case 'A'52        TRACE('Product_%d class %c price = %d',Product_ID,class[0],Product_ID*class[0] 11)53        break54    case 'B'55        TRACE('Product_%d class %c price = %d',Product_ID,class[0],Product_ID*class[0] 33)56        break57    case 'C'58        TRACE('Product_%d class %c price = %d',Product_ID,class[0],Product_ID*class[0] 55)59        break60    case 'D'61        TRACE('Product_%d class %c price = %d',Product_ID,class[0],Product_ID*class[0] 77)62        break63    case else//ELSE64    TRACE('not found 3')65    end select66break67case else//ELSE68    TRACE('not found Product_ID')69end select70end macro_command

演示视频

从这个例子中可以看到case语句的预设条件也可以使用字符,对于HMI这种人机交互工具来说字符有时候比数字更具象一些,能够使用字符来替代数字是因为ASCII码本身就是整数,见字符码表(A=65;B=66;C=67;D=68)

参考文献(C Primer Plus 第六版 ; C 语言程序设计)

---End---

历史文章:

威纶触摸屏宏指令之TRACE函数

威纶触摸屏宏指令[环境 数据类型 运算符 Diagnoser]

威纶触摸屏画面切换实例

维纶触摸屏趋势图功能实例

ControlLogix  User-Defined结构体嵌套

ControlLogix系统内存优化解析

Vim指令训练程序

关于TFA/A1灌装机Gas Sensor

ControlLogix控制器ControlNet网络规划

(0)

相关推荐