机器视觉 HDevelop语言基础-流程控制语句

Posted 沧海一笑-dj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器视觉 HDevelop语言基础-流程控制语句相关的知识,希望对你有一定的参考价值。

00. 目录

01. 概述

本节介绍的运算符是有条件地或重复地执行一组代码块。 通常,这些操作符是成对出现的:一个操作符标记块的开始,而另一个标记块的结束。 中间的代码行被称为控制流结构的主体。

当你输入一个控制流操作符来启动一个block时,HDevelop也会默认添加相应的关闭操作符来保持程序代码的平衡。 此外,光标放置在控制流操作符之间。 这对于输入新的代码块很好。 如果要将控制流操作符添加到现有代码中,您也可以单独添加操作符。 但是请记住,单个控制流运算符被视为无效代码,直到它的对应结束运算符也被输入。

在下面, 是一个计算结果为整数或布尔值的表达式。 如果表达式的计算结果为 0(零),则条件为假。 否则条件为真。 HDevelop 提供了以下操作符来控制程序流程。

02. if

此控制流结构有条件地执行代码块。 运算符 if 将条件作为其输入参数。 如果条件为真,则执行对应的代码段。 否则,在操作符 endif 之后继续执行。

if (<condition>)
...
endif

03. if-else

if (<condition>)
代码段1
...
else
代码段2
...
endif

如果条件为真就执行代码段1,否则执行代码段2。

04. elseif

if (<condition1>)
...
elseif (<condition2>)
...
endif

等价于

if (<condition1>)
...
else
    if (<condition2>)
    ...
    endif
endif

如果条件1为真就执行代码段1,否则条件2为真执行代码段2.

05. while

这是一个循环控制流结构。 只要条件为真,就会执行循环体。 为了进入循环,条件首先必须为真。 可以分别使用运算符 continue 和 break 重新启动和终止循环(见下文)。

while (<condition>)
...
endwhile

06. until

除了在循环结束时测试条件之外,此循环类似于 while 循环。 因此,repeat … until 循环的主体至少执行一次。 同样与 while 循环相反,如果条件为假,则循环重复,即,直到它最终为真。

repeat
...
until (<condition>)

07. for

for 循环由开始值和结束值以及确定循环步骤数的增量值 step 控制。 这些值也可以是表达式,在进入循环之前立即计算它们。 表达式可以是整数类型或实数类型。 如果所有输入值都是整数类型,则循环变量也将是整数类型。 在所有其他情况下,循环变量将是实数类型。

请注意,for 循环在程序窗口中的显示与在算子窗口中输入的不同。 您在孙子窗口中输入的 for(start,end,step,index)在程序窗口中显示为:

for <index> := <start> to <end> by <step>
...
endfor

程序示例

Thus, after executing the following lines,
for i := 1 to 5 by 1
j := i
endfor
i is set to 6 and j is set to 5, while in
    
    
for i := 5 to 1 by -1
j := i
endfor
i is set to 0, and j is set to 1.

可以分别通过操作符 continue 和 break 重新启动和终止循环。

请注意,在旧版本的 HDevelop(HALCON 11 之前)中,开始和终止值的表达式在进入循环时只计算一次。 出现在这些表达式中的变量的修改对循环的终止没有影响。 这同样适用于循环索引的修改。 它也对终止没有影响。 每次执行 for 运算符时,都会将循环值分配给正确的值。 有关详细信息,请参阅算子参考手册。

如果 for 循环太早离开(例如,如果您按停止并设置 PC)并再次进入循环,则将计算表达式,就像第一次进入循环一样。

在下面的例子中,从 0 到 6π 的正弦被计算并打印到图形窗口中(文件名:sine.hdev):

* Compute the sine from 0 to 3*PI and print to the graphical window
* 
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowID)
dev_set_part (0, 0, 511, 511)
old_x := 0
old_y := 0
dev_set_color ('red')
for x := 1 to 511 by 4
    y := sin(x / 511.0 * 2 * 3.1416 * 3) * 255
    disp_line (WindowID, old_y + 256, old_x, y + 256, x)
    old_x := x
    old_y := y
endfor

执行结果
在这里插入图片描述

在这个例子中,假设窗口的大小为 512×512。 绘图总是从最近评估的点到当前点进行。

08. continue

运算符 continue 强制执行 for、while 或 repeat 循环的下一个循环。 测试循环条件,并根据测试结果执行循环。

在以下示例中,处理了一组 RGB 彩色图像。 通过使用运算符continue跳过频道编号不是 3 的图像。 另一种方法是反转条件并将处理指令放在 if 和 endif 之间。 但是当涉及包含大量代码行的非常复杂的处理时,带有 continue 的表单往往更具可读性。

i := |Images|
while (i)
Image := Images[i]
count_channels (Image, Channels)
if (Channels != 3)
continue
endif
* extensive processing of color image follows
endwhile

09. break

运算符 break 使您能够退出 for、while 和 repeat 循环。 然后程序在循环结束后的下一行继续。

运算符 break 的典型用法是在某个条件成立时立即终止 for 循环,例如,如下例所示:

Number := |Regions|
AllRegionsValid := 1
* check whether all regions have an area <= 30
for i := 1 to Number by 1
ObjectSelected := Regions[i]
area_center (ObjectSelected, Area, Row, Column)
if (Area > 30)
AllRegionsValid := 0
break ()
endif
endfor

在以下示例中,只要单击图形窗口,运算符 break 就用于终止(无限)while 循环:

while (1)
grab_image (Image, FGHandle)
dev_error_var (Error, 1)
dev_set_check ('~give_error')
get_mposition (WindowHandle, R, C, Button)
dev_error_var (Error, 0)
dev_set_check ('give_error')
if ((Error = H_MSG_TRUE) and (Button != 0))
break ()
endif
endwhile

10. switch

switch允许通过多路分支控制程序流。 分支目标用 case 语句指定,后跟一个整数常量。 根据整数控制值,程序执行跳转到匹配的 case 语句并继续到下一个 break 语句或结束的 endswitch 语句。 一个可选的默认语句可以定义为 switch 块中的最后一个跳转标签。 如果没有前面的 case 语句与控制表达式匹配,程序执行将跳转到默认标签。

...
switch (Grade)
case 1:
Result := 'excellent'
break
case 2:
Result := 'good'
break
case 3:
Result := 'acceptable'
break
case 4:
case 5:
Result := 'unacceptable'
break
default:
Result := 'undefined'
endswitch
...

11. stop

该语句暂停当前程序,程序将在执行该语句后停止执行下一条语句,直到通过键盘按下确认键后才继续执行程序。

12. exit

该语句停止程序,退出HDevelop软件。

13. return

算子return 从当前过程调用返回到调用过程。 如果在主程序中调用return,则PC跳转到程序末尾,即程序结束。

14. try-catch

这种控制流结构在 HDevelop 中启用动态异常处理。 操作符 try 和 catch 之间的程序块被监视异常,即运行时错误。 如果发生异常,有关导致异常的原因的诊断数据存储在异常元组中。 异常元组被传递给 catch 操作符,程序从那里继续执行。 运算符 catch 和 endtry 之间的程序块旨在分析异常数据并相应地对其做出反应。 如果没有异常发生,则永远不会执行该程序块。

15. throw

throw用于引发程序执行期间出现异常的情况,该语句通常与try-catch语句一起使用。

16. 附录

16.1 机器视觉博客汇总
网址:https://dengjin.blog.csdn.net/article/details/116837497

以上是关于机器视觉 HDevelop语言基础-流程控制语句的主要内容,如果未能解决你的问题,请参考以下文章

机器视觉 HDevelop语言基础-变量和表达式

机器视觉 HDevelop语言基础-错误处理

机器视觉 HDevelop语言基础-多线程

机器视觉 HDevelop语言基础-容器和保留字

机器视觉 import算子

机器视觉 for算子