第六章 PC方软件设计
6.2 图形化设计语言
6.2.1 控件对象数据结构
如表 6-1 所示为控件对象的数据结构。其中共包含了 8 个基本字段和四个综合字 段。基本字段由一个简单的数据类型构成,各自表示一个特定的含义;综合字段由定 长的字符串构成,通过对字符串的解析可以得到的字段信息。
(1) Index:控件对象序号
表 6-1 控制对象数据结构 类型名:Icon_object
字段名称 数据类型 说明
Index Integer 控件对象序号
ControlType Integer 控件对象类型
RectX Singer 控件对象横坐标
RectY Singer 控件对象纵坐标
ConnectVisble Boolean 连接点是否可见
LineVisible Boolean 连接线是否可见
Parents Integer 父节点
Child Integer 子节点
DataDefine String*5 新变量声明
ExecSentence String*100 C 执行代码
IconPara(15) String*5 属性参数
PromptMsg String*100 提示信息
图 6-2 控件库
49
控件对象序号是标识动态生成的控件对象的唯一标识符。它在该控件对象被生成 时创建,在该控件对象被卸载之前都是不变。它和控件对象数组下标是相同的。
(2) ControlType:控件类型
控件对象类型是用来标识动态生成的控件对象的类型。在现有的平台中共有 21 个 控件对象类型。如表 6-2 所示为控件对象类型。执行控件和传感器控件仅对应一个控 件类型,控制控件和程序控件每个对象包含了两个控件类型,其中双分支控件对象包 含了三个控件类型。
(3) RectX,RectY:控件对象位置
控件对象位置是标识控件对象在图形化设计界面中相对于左上角的位置。当在 PC 屏幕上显示时要做相应的转化。初始设置根据它的父节点所在的位置作设定,下 移一个控件对象的位置。
(4) ConnectVisiable,LineVisble:连接线和连接点可见标识符
连接线和连接点是两个互斥的概念。当某控件对象连接点可见时,连接线不可见,
此时可以在此空间对象连接点处增加新的控件对象;反之当连接线可见而连接点不可 见时说明该控件对象已经连接了另外的一个控件对象,不可以再添加新的控件对象到 其连接点处。ConnectVisiable 初始化为 True,LineVisble 初始化为 Flase。
(5) Parents,Child:控件对象的父子关系
控件对象的父子关系标识了该控件对象的连接关系,其中存放的是父子控件对象
表 6-2 控件对象类型
类型号 说明 类型号 说明
1 直流电机 12 双分支开始
2 伺服电机 13 双分支真结束
3 电机调速 14 双分支结束
4 延时 15 计数循环开始
5 四则运算 16 计数循环结束
6 液晶显示 17 条件循环开始
7 红外传感器 18 条件循环结束
8 灰度传感器 19 子程序调用
9 超声波传感器 20 子程序开始
10 单分支开始 21 子程序结束
11 单分支结束
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
的 Index 值。控件对象生成时父子关系值均初始化为-1。
(6) DataDefine:数据变量定义
数据变量定义字段定义了新的数据变量。当某个数据类型中包含了新定义的变量 时,即可存放在该项内容。此项内容存放时已经将数据类型和数据变量一起放在该项 内容中了。例如定义一个整型变量 J,DataDefine 内容为”Int J;”。
(7) ExecSentence:C 执行代码
C 执行代码是指根据控件对象类型和 IconPara(15)中定义的参数来共同生成的类 C 执行代码。将图形化设计界面中主程序开始的所有控件对象连接起来就是一个完整 的类 C 代码。具体实现将在下面章节中介绍。
(8) IconPara(15):属性参数
属性参数是指每个控件对象所包含的各参数的值。每个控件对象中可包含 16 个 控制参数,每个参数可以有 5 个字节的字符串构成。通过对此属性参数的解析就可以 复原出这个控件对象的所有内容。
(9) PromptMsg:提示信息
提示信息是用于在 某个控件对象被选中时显示其包含参数信息和控件类型信息 的字符串。
6.2.2 控件对象属性的生成
控件对象属性参数存放在一个字符串数组中。由于每个控件对象所包含的参数个 数不同,各个参数的信息也各不相同,在解析时要区别处理,为此为每一个控件对象
0 1 2 3 4 5 6 7 8 9 10
j == 0 && v_hw2== 0 || k == 0
11 12 13 14 15 图 6-3 条件循环条件参数
(a)
(b)
51
都设计了一个独立的属性设置界面。如图 6-3 和 6-4 分别为条件循环条件参数和直流 电机控制参数。
图 6-3 所示的条件参数设置中使用了 10 个属性参数空间,从这个参数设置中很 容易看出属性中包含的含义。图 6-4 所示的电机控制参数设置包含了 4 路电机的控制
表 6-3 控件对象参数列表
类型号 说明 参数个数 说明
1 直流电机 8 四个电机的运行模式和速度
2 伺服电机 1 伺服电机的转动角度
3 电机调速 1 电机的 PWM 值
4 延时 1 延时时间
5 四则运算 10 操作数和操作符
6 液晶显示 8 液晶提示信息
7 红外传感器 1 红外传感器变量名称
8 灰度传感器 1 灰度红感器变量名称
9 超声波传感器 1 超声波传感器变量名称
10 单分支开始 10 条件参数
12 双分支开始 10 条件参数
15 计数循环开始 1 循环次数
17 条件循环开始 10 条件参数
19 子程序调用 1 子程序名
20 子程序开始 1 子程序名
(a)
0 1 2 3 4 5 7 8 9 10 11 12 13 14 15 0 50 1 1 2 100
6
图 6-4 直流电机控制参数 (b)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
信息:每个电机由两个参数来设置,前一个是用来表示电机运行模式,电机有三种运 转的模式,即正转(0),停止(1)和反转(2);后一个用来表示电机运转的速度,它是通 过调节控制信号的高低电平的 占空比来控制的,参数设置中的数据为低电平的 百分 比,所以该数值越小,电机转动越快。图中所示的 2,3 电机的运行模式均为 1,即为 停止模式;电机 1 为正转方式速度为 50;电机 4 为反转方式,速度为 100,即控制信 号全为低,所以电机也是停止状态。表 6-3 中给出了控件对象各自所包含的参数的个 数以及参数的说明。
6.2.3 控件对象类 C 代码的生成
控件对象的类 C 代码在软件平台中是根据属性参数的信息和控件对象类型来设置 的,它存放在ExecSentence 字段中。由控件对象的类型来决定使用哪些通用的 C 语句,
由属性参数的信息来设置动态生成的该控件对象的特定属性。以条件循环为例来介绍 一下控件对象的类 C 代码的生成。如图 6-5 所示为 C 语言条件循环的结构体,其中
包括 5 个部分:0、2、4 部分为 C 语言关键字部分,它们在所有的程序中是不变的;
1、3 部分为变化部分,它在各个不同的程序体中是不相同的。在此平台软件中将条 件循环语句分为三部分来实现,即条件循环语句开始,条件循环语句体,条件循环语 句结束。条件循环语句开始包含 0、1、2 部分,其中 0 和 2 部分为固定不变内容,可 以直接生成,1 部分需要通过属性参数来设定;条件循环语句体是第 3 部分,它是在 其他实际操作的控件对象中生成的;条件循环语句结束只包含第 4 部分,其中只有一 个“}”字符,可以直接生成。所以当动态生成一个条件循环控件对象时将产生两个 控件图标,一个为开始,另一个为结束,在开始后面的连接点可见,此时可以在其后 面插入实际的语句体;右击开始图标就会弹出属性设置窗口,在其中可以设置结构体 中第 2 部分的条件体。这样就完成了一个条件循环的设计。其他的控件对象也是按照 此方法来设计的。当要生成总的类 C 程序代码时则要将主程序开始的所有控件对象 类 C 代码根据各控件对象的父子关系连接起来,当然在此过程中为了程序的美观还 要考虑缩进问题。
0 1 2 3 4
While ( 条件体 ){ 执行语句 }
图 6-5 条件循环结构体
53
6.2.4 控件对象提示信息的生成
控件对象的提示信息是在生成 C 程序代码时同时生成的,因为它也要对属性参数 进行解析才能得到具体的参数内容。这些提示信息是在图形化界面设计时鼠标移动到 该控件对象上时作出提示的。
6.2.5 控件对象操作
以上介绍了控件对象节点内部的各个字段的设计方法,对于一个控件对象整体而 言它包括了下面一些操作:创建,移动,删除和拷贝,存储。在 PC 软件平台设计时,
将所有的控件对象存储为一个动态的控件数组。但数组中前后的元素并没有关系,它 们的连接关系由控件对象字段中的父子关系构成的双向链表来完成。由于并不是所有 节点都是连接在一起的,所以动态的控件数组中可能不止包含了一个双向链表,这些 链表的操作是相对对立的,彼此并没有影响。以下具体介绍对控件对象的操作。
(1) 创建
创建一个新的控件对象时必须先从控件库中选择一个控件类型,然后在图形化界 面中创建一个此类型的对象,因而所有的控件对象都包含在控件库中。为了使开发平 台的功能更强大,就必须不断地扩充控件库。
(2) 连接
当两个节点靠近时(移动节点为从节点,固定节点为主节点),此时就要判断是否 将两个节点连接起来。有两个条件来决定是否连接:一是是否进入连接有效区域,而 是主节点的连接点标识 ConnectVisible 是否设为可见。当两个条件都满足时将主节点 的 ConnectVisible 设为 False,LineVisble 设为 True。并将从节点设置为主节点的子节 点,二者设定父子关系。
(3) 移动
移动是指用户可以直接拖动一个单独的节点在图形化界面中移动。如果节点和其 他的节点相连的话,则将其作为一个整体一起移动。如果节点有父节点,拖动时其父 节点不移动,而其子节点和它一起移动。当拖动到相应位置并松下鼠标左键时,还要 判断是否拖动到了某个连接点的有效区域内,如果是,并且这个连接点有子节点,还 要同时移动子节点的位置。
实现方法:
① 移动节点的方法。首先根据引起移动的那个节点的原来的坐标和新的坐标,
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
计算出它在 X 轴和 Y 轴方向所移动的位移量;然后根据此位移量,移动需要移动的 所有节点。
② 普通节点和特殊节点。考虑到流程图的单链结构,为了便于处理,把单分支、
双分支、计数循环、条件循环等的开始到结束部分作为特殊节点考虑;其他节点作为
双分支、计数循环、条件循环等的开始到结束部分作为特殊节点考虑;其他节点作为