system: [SYSTEM]

user: 3. 软件开发 该软件基于谷歌图形化开源引擎Blockly进行开发 [ 6 ] ，对工具箱中的块进行定制和赋予其内涵和外观，利用其工作区存放块并解释块成所需的Robobasic代码。Blockly本身就是以Web的方式进行设计，加上Web应用本身方便易用，无需安装，节省计算机内存空间等特点，所以该软件也是以Web的形式开发，将Blockly引擎嵌入到脚本中，将其toolbox和workspace显示在网页的区域中实现块的拖放和解释，Blockly起到该软件图形化编程的核心部分。最后将做好的网页打包成web应用，即为.exe可执行的应用程序，不需要安装直接点开运行。 3.1. 积木块的定制 积木块分为：输入/输出、控制、数学、文本、变量、逻辑、通信、存储、执行器、显示器、声音等模块，为满足编程需要定制的积木块名称、外观、功能如表1所示。 Table 1 Customized building block tabl 模块组 名称 小模块外观 功能 模块组 名称 小模块外观 功能 输入/ 输出 输出输入端口置高或置低 变量 声明变量并赋值 发送数字信号到端口 声明变量 从端口读取数字信号值 给变量赋值 将AD端口的模拟信号转换为数字信号再输入 声明常量并赋值 发送信号到以字节为单元的端口 逻辑 作为条件语句的判断条件 从字节输入单元读取信号 串口 逻辑运算表达式，用来返回值 发送脉冲信号到输出端口 通信 通过ETX端口发送RS232信号 读入输出端口的当前值 通过ERX端口接收RS232信号 反转输出端口 信号 存储 写数据到内存 控制 程序初始化 读取内部存储内容 暂停程序执行 写数据到外部EEPROM 等待直到程序 完成 从外部EEPROM读取数据 延迟一定时间再执行程序 执行器 设置单个舵机转动 条件判断语句 设定舵机组 循环语句 设置舵机转动速度 跳转到指定位置 设置舵机转动方向 调用子程序 设置机器人零点 从子程序返回 开启舵机 数字标记子程序或程序的位置 关闭舵机 数字标记子程序 对舵机的管脚输出脉冲宽度控制 文本标记子程序或程序的位置 输出PWM信号 (频率可变化) 文本标记子程序 读取舵机当前位置 数学 输入数字 读取舵机的当前位置并保持当前姿势 算数运算 设置转动位置或者舵机的位置 位运算 POS行标记 关系运算 设置转动位置或者舵机的位置 位操作 显示器 初始化LCD 产生随机数 擦除LCD模块中的 字符 表1. 所定制积木块表 由于图形画编程仍要符合编程语言语法和逻辑结构的要求，每个块之间的联系都有其相应的约束条件，因此每个块都要设定其固定的属性。根据块所属功能不同，属性也不相同，需要设定块的外观，块的下拉菜单设计，块与块之间的连接方式，块中文本数据类型的判断，块返回值参数的数据类型和块接收其它块传递输入参数的数据类型判断。块的总体设计以细化的方式进行，块功能的细化使块的灵活度很高，自由组合的方式更多，实现更简单。其积木块构成如图3所示。 图3. 积木块构成图 块外观设计：块的形状取决于块之间的连接方式，连接方式分别为上连接、下连接、左连接、右连接和嵌入，块会对应有连接凹凸口。块的颜色通过color参数设定，不同的颜色值对应不同颜色。 下拉菜单设计：下拉菜单则通过将控制板功能引脚或逻辑值给录入到数组中存放，方便用户对引脚选择使用。 块属性设计：第一个参数可以为true或false，设定是否允许连接；第二个参数为数据类型(number、string、null)，默认为空。 this.setPreviousStatement(true， null)；允许块上连接 this.setNextStatement(true)；允许块下连接 this.setInputsInline(true， null)；允许块嵌入 this.setOutput(true， null)；允许块左连接 this.setIntput(true， null)；允许块右连接 this.setTooltip(文本提示内容)；当鼠标放在块上时，则会显示文本提示内容 如初始化块需要接收其它功能块的嵌入连接，但该模块根据basic语言规定需要放在程序首部，因此不需要与上一模块连接，可以与下一模块连接。If语句则需要在上下连接的同时还需要右连接和嵌入，右连接为输入if语句判断条件，嵌入为输入满足条件时执行的内容。 块的设计都是基于block对象进行配置，采用树结构对各属性进行存放，当拖动块时，会触发相应的事件(event)执行相应的功能。 3.2. 编程软件的文件结构 软件中模块和各对象使用DOM结构(文档对象模型)来存储，其文件框架及其之间的关系如图4所示。文件根目录下*.XML文件定义图形块基本信息，如类别、名称、ID等，ID则是用于每个块的唯一标识；blocks文件夹下*.js文件定义每个图形块样式，如颜色、文字、图标等；generator文件夹下*.js文件定义图形块转Robobasic代码；HTML文件设计界面，构建框架；event.js是对界面操作时触发所执行的事件；msg文件里脚本图形块的语言；core文件是核心库文件；media文件夹存放所需图片。 图4. 教育机器人编程设计软件文件结构图 图形块的定义实例如下： //对块的内涵进行定义，存放在blocks/js文件中 Blockly.Blocks['inout_highlow'] = { init: function() { this.setColour(20); this.appendDummyInput() .appendField(new Blockly.FieldDropdown([[Blockly.MIXLY_HIGH， 1]， [Blockly.MIXLY_LOW， 0]])， 'BOOL') this.setOutput(true， Boolean); this.setTooltip(Blockly.MIXLY_TOOLTIP_INOUT_HIGHLOW); } }; //定义图形块转出的Robobasic代码(输出为高即为‘1’)存放在generator/js文件中 Blockly.Arduino.inout_highlow = function () { //Boolean values HIGH and LOW. var code = (this.getFieldValue('BOOL') == '1') ? '1' : '0'; return [code， Blockly.Arduino.ORDER_ATOMIC]; }; 3.3. 功能设计实现 机器人编程设计软件的主要功能为图形化和源代码程序 [ 7 ] 的编写、界面切换及缩放、程序编译和在线编译下载调试。其功能实现过程如图5所示。 图5. 教育机器人编程功能实现图 从模块组中取出模块搭建图形块程序，完成后保存的文件有两种类型，一种是图形块程序*.xml，一种是Basic语言程序*.bas。这样可以在编程界面中再次打开图形块程序进行编辑，也可以在RoboBasic MF 2.80中打开*. bas，利用此应用软件进行编译并下载到机器人控制器运行，从而驱动机器人完成各种动作。 1) 程序编写：用户既可以通过图形化代码编写，也可以直接通过文本编写(编写后图形化代码不会变)； 2) 界面缩放：用户可以随意控制界面缩放，也方便平板用户使用； 3) 图形块导入导出：用户可以把代码导出成模块，从而方便使用其它用户导入使用，也可作为自己的程序文件储存； 4) 程序编译：软件搭配了Robobasic编译软件，可直接调用打开，打开保存的代码进行编译，并且它对机器人的调控有着强大的功能； 5) 编程语言：图形块文本标注直观清晰，不需要认识英文单词，不会使用键盘就能操作。使用不同颜色的示意图代表不同类型的功能块，方便用户归类区分使用；复合功能块中提供默认选项，减少用户的拖动次数；由浅到深，循序渐进渗透程序设计知识点，给用户增加了趣味性和前后连贯性。