HDevelop语言

本章介绍了 HDevelop 语言的语法和语义,描述了控制结构(例如循环)和参数传递的语义。
注意:本章不描述 HALCON 的内部算子。若想看内部算子的描述可以参看 HALCON 的参考手册。本章节所有应用的例子也能在%HALCONEXAMPLES%\hdevelop\Manuals\Hdevelop 的路径下找到。
1.参数的基本类型
HALCON 分为两种数据:控制数据(数值或字符串)和图形数据(图像,区域,等等)。
对输入参数和输出参数之间进一步区分,可以得到四种不同的参数。在 Hdevelop 参数列表中这四
种参数总是以同样的顺序出现,以下面的方式呈现:
算子名 ( 图形输入 : 图形输出 : 控制输入 : 控制输出 )
正如你们都知道的那样,图形输入对象总是第一个传递,紧随其后的是图形输出对象。控制数据在
图形数据之后,并且输入参数在输出参数之前。
四类参数中的任何一类都可能为空。例如,算子read_image:
read_image(: Image : FileName :)
read_image算子有一个输出参数即图形对象Image,还有一个输入控制参数FileName。在算子窗口
键入算子名时会显示参数类型。调用的算子在HDevelop程序窗口中显示如下:
read_image (Image, ‘Name’)
这些参数用逗号隔开。输入控制参数可以是变量、常量或表达式。表达式先求值,然后传递给参数。
图形参数必须是变量,控制输出参数也必须是变量,因为它们要用来存储算子的求值结果。
2.控制类型和常量
在 HDevelop 中所有的非图形数据都用控制数据(数值或字符串)来表示。HDevelop 中的控制参数
可能包含算术或逻辑运算。一个控制数据项可以是下面类型中的一种:整数 integer、实数 real、字
符串 string 和布尔类型 boolean。
2.1整数integer和实数real
整数和实数这两种类型的用法和 C 语言中的语法规则一样。整数数值可以以标准十进制计数法输
入,以十六进制计数法输入时要在数值前面加前缀 0x,以八进制计数法输入时要在数值前面加前
缀 0 来输入。例如:
4711
-123
0xfeb12
073421
73.815
0.32214
.56
-17.32e-122
32E19
整数类型和实数类型的数据项在机器内部的表示方法:实数相当于 C 语言中的 double 类型(8 个字
节),整数相当于 C 语言中的 long 类型(4 或者 8 个字节)。
2.2 字符串string
字符串由在两个单引号(’)之间中的字符序列组成。字符串的最大长度被限制在 1024 个字符。转
义字符,像换行(类似于 c 语言中的符号表示),如下表(转义字符对照表)中所示(对比 C 语言)。
可以用\xnn 的格式输入任意的字符,其中 nn 表示一个两位的十六进制数。可以用\0nnn 的格式输入
任意字符,其中 nnn 表示一个三位的八进制数。如果字符串是明确的,可以用更少的位数来描述。
例如,如果字符串后面没有跟着另一个十六进制数值(0-F),换行符可以用\xa 表示。
例如:字符串 Sobel’s edge-filter 必须写为’Sobel’s edge-filter’。一个 Windows 路径可以写为
‘C:\Programs\MVTec\Halcon\images’。

描述缩写标记
换行符NL(LF)\n
水平制表符HT\t
垂直制表符VT\v
退格BS\b
回车CR\r
换页FF\f
响铃BEL\a
反斜杠\\\
单引号\ ’
十六进制任意字符\xnn
八进制任意字符\0nnn

2.3 布尔类型boolean
常量true 和 false属于布尔类型。true的值在内部用数值 1 表示,而false的值在内部用数值 0 表示。
这就意味着:表达式Val := true中Val的实际值是 1。一般而言,除了 0 以外的每一个整数值都表示
true。请注意:一些HALCON的算子将逻辑值作为输入(例如:set_system)。在这样的情况下,
HALCON算子需要像’true’ 或 'false’这样的字符串常量而不是布尔值true或false。
2.4 常量constant和元组tuple
除了上述通用类型以外,还有特殊常量(special constants)和元组类型(type tuple),这些类型针
对 HALCON 或者 HDevelop。
(1)常量 constant
使用一些常量作为算子的返回值(表示结果状态),这些常量可以和算子dev_error_var 、dev_set_
check一起用。这些常量代表一个算子的正常返回值,称之为信息。错误信息不能反馈异常的具体
内容(HDevelop内部有超过 400 个(表示错误信息的)错误数值,具体的错误信息可以从扩展的程
序员手册(Extension Package Programmer’s Manual)中查看)。算子的返回值和返回信
息如下表所示:

常量信息
H_MSG_TRUE无错误;用于测试: (true)2
H_MSG_FALSE 错误;用于测试: false3
H_MSG_VOID没有返回结果4
H_MSG_FAIL算子执行失败5

(2)元组 tuple
tuple,元组,也可以近似理解为数组。
控制类型仅仅在通用的 HDevelop 元组类型中使用。一个元组可以由几种不同类型的数据项组成。
一个元组的标准表示是包含在括号([ ])在内的所有元素的列表。元组常量的语法如下图所示:
在这里插入图片描述
[]表示空元组。仅有一个元素的元组是一种特殊情况,它可以作为一个元组标记:[55]表示一个与
55 相同的常量(即可以认为[55]等同于 55)。元组示例如下:
[]
4711
0.815
‘Text’
[16]
[100.0,100.0,200.0,200.0]
[‘FileName’,‘Extension’]
[4711,0.815,‘Hugo’]
3.变量
变量的命名与其他语言的命名是一样的,通常用字母、数字和下划线(’_’)组成。变量名的最大长
度不能超过 256 个字符。一个变量的类型(图形或控制变量)取决于它在参数列表中的位置,在这
定:当一个新的标识符出现时,对应的变量也随之产生。控制变量和图形变量必须是不同的名字。
图形变量和控制变量的初始值是不确定的,直到第一次赋值,进行实例化操作才能确定。读取一个
未定义的变量会导致运行错误。
HDevelop 提供了一个预定义的变量,命名为: (下划线)。可以使用该变量来作为一个对输出值
不感兴趣的输出控制参数。请注意:不允许使用这一变量来作为 HDevelop 的特定操作符(HALCON
参考手册中的控制和开发章节)。当程序要导出为其他的编程语言时不建议使用变量

实例化的变量包含值的元组。数据项是图形对象还是控制数据取决于变量类型。元组的长度由执行
操作动态的确定。一个变量可以被赋值很多次,但一旦变量被赋值,变量就会一直保持实例化的状
态。选择菜单“执行=>重置程序执行”,变量的内容会在下一次赋值之前清除。
变量(控制数据和图形数据)第一次被粗略的赋值为不同变量类型,但数据的实际类型(例如实数、
整数、字符串等等)是未定义的,直到变量被分配一个具体的值才确定实际类型。因此,新数据项
与旧数据项的类型很有可能不同。
3.1 变量的作用域(局部或全局)
HDevelop 支持局部变量和全局变量。所有的变量默认为局部变量,也就是,它们只存在于它们的
函数中。因此,不同函数的局部变量可以以相同的名字存在,而相互之间没有干扰。与此相反,全局变量在整个程序中可以访问。全局变量必须使用算子 global 进行声明。
例如:
global tuple File
声明了一个全局控制变量 File
例如:
global object Image
声明了一个全局的图形变量 Image。
关键字 def 允许在变量定义的地方标记一个显式声明,例如,global def object Image,这只有在把
HDevelop 程序导出为一种编程语言时才有意义的。有关更多信息,请参见 global 算子的描述。
全局变量一旦被声明,它能够像局部变量一样在它被声明过的函数中被调用。如果想要在另一个函数中访问全局变量,必须在该文件中声明该全局变量(如果不声明,会产生一个局部变量)。
主函数:

  • 声明全局变量
    global tuple File
    global object Image

    File := ‘particle’
    read_image(Image, File)
    process_image()
    * 全局图形变量 Image 在函数 process_image()中被更改
    * 全局控制变量 File 在函数 process_image()中未被更改

    process_image 函数:

    *使用全局函数
    global object Image

    bin_threshold(Image, Region)
    File := ‘fuse’
    read_image(Image, File)
    return()

因为函数必须显式的声明它使用的全局变量,在程序的其他部分使用全局变量不会破坏当前的函
数。
从本质上讲,在整个的 HDevelop 程序(也就是所有载入的外部程序、主函数和所有的本地函数)
中全局变量的名字必须是唯一的,。
变量窗口提供了一个专门的标签页来列出当前已声明的所有的全局变量,如下图所示:
在这里插入图片描述
4 图形对象的操作
图形对象由 HALCON 的算子专门处理。HALCON 的算子是在图形对象元组的基础上工作的,这些算
子的结果以元组(由图形对象或控制数据元素构成)的形式返回。对于 HALCON 算子的详细描述,
请参考 HALCON 参考手册(HALCON reference manual)和“基本元组操作”( “Basic Tuple Operations”)
这一章。


版权声明:本文为qq_41681904原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。