基于WinForm的设备管理系统的设计与实现
2020-11-28
(1.青岛杰瑞工控技术有限公司,山东 青岛 266061;2.中船重工(青岛)海洋装备研究院有限责任公司,山东 青岛 266520)
0 引言
随着计算机技术的发展,越来越多的计算机语言被应用到工程应用程序的设计与开发中。WinForm[1-2]是.NET 开发平台中对Windows Form 的一种称谓,Windows 窗体具有3 个重要特点。1)功能强大。Windows 窗体可用于设计窗体和可视控件,以创建丰富的基于Windows 的应用程序。2)操作方便。提供易于连接OLEDB 和ODBC 数据源的数据控件。3)使用安全。Windows 窗体充分利用公共语言运行库的安全特性。
该文充分发挥WinForm 的技术优势,综合考虑码头自动化装卸的优缺点,设计开发了一套码头装卸设备管理系统软件。利用先进的计算机技术弥补了传统人工装卸作业的缺点,提高了装卸效率,提升了作业的稳定性与准确性。
1 系统功能
码头装卸设备管理系统是监控和控制自动化码头设备及所有事件和过程的软件,因为码头装卸设备在运行过程中需要人工干预,并且用户希望能够实时了解系统的运行状态和进程,所以需要通过设备管理系统的UI 界面来实现。系统的主要功能包括制定堆场计划、装船计划、卸船计划、任务优先级调整、用户登录权限管理、堆场监控、远程操控等。这些功能的好坏用户只能通过人机交互界面来进行直观感受,后台逻辑代码的先进性、可靠性也都需要借助人机交互界面来体现,所以人机交互界面必须作为设备管理系统的重要部分进行开发。
2 系统设计
该系统将整个业务划分为界面层、业务逻辑层、数据访问层,对外数据交互采用Oracle,系统主要包括系统管理模块、设备管理模块和任务管理模块。其中系统管理模块又包括状态监控模块、系统日志模块和权限管理模块。设备管理模块用于码头装卸设备的远程管理和操作,包括AGV、场桥和岸桥模块。任务管理模块用于制定堆场内的翻/捣箱计划、移箱计划及给远洋船舶制定装船和卸船计划。该软件的开发主要是基于WinForm 已有的控件进行的,每种控件自带的大量属性和方法便于开发者直接进行设置和调用,加快了开发速度,减少了开发时间,节约了开发成本。但是控件自带的许多属性和方法在开发过程中并不会用到,而这些用不到的属性和方法也会占用一定的内存,从而拖慢了程序的运行速度,因此,需要进行系统的测试与验证。
2.1 系统管理模块
系统管理模块主要包括状态监控模块、系统日志模块和权限管理模块。
2.1.1 状态监控模块
码头状态监控模块可以实时显示堆场和码头的运行情况。该界面共有14 460 个箱位,每个箱位会根据数据库中的信息显示不同的颜色(箱位显示的颜色与箱位堆放集装箱的层数有关,最多可堆放5 层)。这种堆场显示方式可向操作人员展示大量的堆场信息,使操作人员对堆场利用情况有较为直观的认识。每个箱位在显示时都要进行数据计算,因此,该界面每次刷新都需要进行一次数据的读取操作和100 万余次的数据处理。
2.1.2 系统日志模块
系统日志模块是对码头工作流程和运行设备的主要时间节点发生的事件进行记录,这样在作业过程中发生异常时,就可以通过查询系统日志找出问题的根源,快速解决问题。另外系统日志产生的大量自动化码头工作数据,可以作为大数据分析和码头设备远程运维的重要信息支撑。
2.1.3 权限管理模块
权限管理模块就是要为不同的操作人员设置不同的操控权限,以保障码头设备的安全运行。权限管理界面主要分为超级管理员和普通管理员2 种界面。超级管理员是由具有数据库管理权限的操作员在系统初始化时设置的,普通管理员可以由超级管理员进行添加、修改和删除。超级管理员和普通管理员拥有不同的访问权限。
2.2 设备管理模块
设备管理模块主要用来接收AGV、场桥和岸桥的运行数据,包括设备的运行速度、连续工作时间、相对坐标等数据。设备管理模块可以为码头装卸设备的远程操控提供实时的数据和画面参考。
2.3 任务管理模块
任务管理模块的主要功能是读取已经制定好的作业计划,根据既定的算法以最优的结果来进行设备的调配,以此来完成工作计划。为了扩展设备管理模块的功能,该系统在其中加入手动制定作业计划模块。手动制定作业计划模块主要包括堆场计划模块、装船计划模块、卸船计划模块和任务管理模块。其中堆场计划模块用来制定堆场内的装箱、移箱和翻箱等作业计划;装/卸船计划模块用来制定船舶装/卸计划;任务管理模块可以查看已经制定好的作业计划,并可以手动修改已制定作业的执行顺序。
3 界面设计
该系统UI 界面中需要显示码头堆场地图信息,而堆场布局会随着港口技术和要求的发展不断更新变化,所以将设备管理系统软件的UI 界面开发成了可配置界面。
3.1 通过XML文件配置界面信息
为了使用户可以根据需要修改界面显示的效果,该设计采用XML[3-4]文件完成界面的参数化配置,XML 易与Windows、Linux 及其他平台的信息结合。通过加载XML 数据,就可以以XML 格式输出结果,在不同程序间传递数据。该设计中各箱区的集装箱贝位数、集装箱排位数、贝位间距、排位间距、贝位显示的字体、字号等信息,都可根据XML 文件配置。
3.2 使用集合提高临时数据存取效率
由上文可知,堆场地图界面的每次刷新都需要进行100 万余次的数据处理,如果不选取恰当的方法和技术,就会造成界面严重卡顿甚至程序异常终止。进行数据处理之前应该先将数据从数据库中读取出来,最好的处理方式是一次性读取数据库中的数据,然后存入指定的容器内再进行数据运算。不应该每次都进行数据库的读写操作,频繁地进行大量的数据库读写操作会造成数据库崩溃。
WinForm 中可选的临时存取数据的容器有很多种,考虑到数据处理时需要快速准确地取出指定的数据,所以选择DataGridView 控件和List<T>集合。DataGridView 相对于List<T>在显示数据方面更具优势,但是数据存取效率要比List<T>集合低。为了确定两者在100 万次数据存取中的耗时差距,特地进行了以下2 组测试。1)从DataGridView 中读取100 万次数据,数据种类:String,字节长度:10,计算耗时。2)从List<T>中读取100 万次数据,数据种类:String,字节长度:10,计算耗时。
测试结果显示,从DataGridView 中读取100 万次数据耗时3 865.1731 ms。从List<T>集合中读取100 万次数据耗时3 649.0187 ms。两者用时相差216.1544 ms。
结果显示两者对于100 万次的读取耗时差别并不明显,但是程序运行时不只是进行存取操作。如果在程序获取数据之前增加判断环节,就需要重新测试耗时。因此,进行了以下2 组测试。1)增加判断语句,从DataGridView 中读取100 万次数据,数据种类:String,字节长度:10,计算耗时。2)增加判断语句,从List<T>中读取100 万次数据,数据种类:String,字节长度:10,计算耗时。
测试结果显示,从DataGridView 中读取100 万次数据耗时3 934.379 ms。从List<T>集合中读取100 万次数据耗时4 493.6972 ms,两者用时相差559.3182 ms。由于DataGridView 中没有查询元素是否存在的contains 方法,而List<T>作为专门用于临时存取数据的容器,提供了查询元素的contains 方法,所以在不需要展示临时数据的情况下,应该优先选用List<T>集合。
3.3 使用多线程解决界面的假死问题
假死的程序如果是运行在后台的逻辑代码,那么给用户的感觉就是程序运行较慢,如果是UI 程序假死,给用户的感觉就是程序卡顿、技术落后,所以对于UI 界面来说,必须解决程序假死问题。该程序在解决程序假死问题时用到了多线程技术[5],给程序耗时较长的部分开辟一个新的线程去执行,以此来解决程序界面卡顿的问题。
4 结语
程序功能在设计时要充分了解用户需求,考虑程序后期的可扩展性,要善于利用既有的开发技术和开发工具。在使用WinForm 技术开发UI 界面时,为了提高临时数据的存取和查询速度,可以使用List<T>集合工具类。程序假死是UI 开发中必须重点注意的问题,测试证明多线程技术的使用可以解决UI 程序假死的问题。