基于LabVIEW和C#的泥泵输送管道监测系统设计

2020-03-10 02:15,,,
机械与电子 2020年2期
关键词:字符串下位数组

,,,

(1.河海大学机电工程学院,江苏 常州213022;2.疏浚技术教育部工程研究中心,江苏 常州 213022;3.江苏省水利机械制造有限公司,江苏,扬州,225001)

0 引言

绞吸挖泥船进行疏浚作业时,泥浆输送管道内泥浆压力、流速和浓度影响着管道寿命和淤积状态,进而影响挖泥船的工作效率,因此管道内各参数的监测对绞吸挖泥船正常工作至关重要,更是挖泥船实现自动化控制的基础。传统的监测系统,例如基于组态软件、或单片机、或LabVIEW的监测系统,都在单输入单输出的传统PID控制中取得了较好的效果[1-3]。但由于水下地形和土质的变化较大,使得管道内流态的波动也很大,故需要引入自适应能力更强、鲁棒性更好的强化学习控制算法[4]。

本文搭建监测系统,为强化学习控制算法提供研究平台。为便于强化学习算法建立训练探索模块,监测系统必须提供准确的状态数据;为实时显示数据,监测系统必须有实时性要求。目前,主要有C++,python,C#和MATLAB可以实现强化学习算法。C#编程灵活,LabVIEW在数据采集有强大的优势,结合两者优点,搭建基于LabVIEW和C#的监测系统。

1 泥浆管道输送监测系统

1.1 监测系统的总体设计

该监测系统采用的实验平台是泥泵自主调速试验台。泥泵自主调速试验台主要由22 kW泥泵机组、传感测量系统、循环管路装置和驱动装置组成。疏浚泥泵自主调速实验平台如图1所示。

图1 实验平台

本系统采用上下位机(upper and lower computers)结构,下位机LabVIEW对采集到的数据进行量程转化,并将其打包成数组,以JSON格式发送给上位机。上位机C#对采集的数据进行存储、显示。本监测系统框架如图2所示。

图2 实验平台监控系统框架

下位机编写LabVIEW RT程序,在和上位机通信时采用TCP协议,以保证从采集数据到上位机接收、显示数据整个过程的实时性。针对通信时数据交换格式保持统一的问题,选择C#和LabVIEW均支持的JSON数据格式。考虑到软件界面的多样性和丰富性,上位机采用文本框、仪表盘和曲线图的方式来显示数据。

1.2 下位机程序设计

下位机包含2个功能模块:数据处理模块和通信模块。实时数据采集模块和通信模块分别采用1 MHz和1 kHz时钟cRIO-9035内部定时源,采集模块和通信模块优先级都设置为100,确保下位机既可以实时采集数据,又及时将数据发送给上位机[5]。下位机结构如图3所示。

图3 下位机结构

a.数据处理模块。采集模块主要有2个功能:读取NI板卡采集到的传感器信号;对电流、电压值进行量程转化,并封装成数组。LabVIEW提供的“读取变量函数”以数组方式访问NI板卡的I/O通道,并返回一个数组,如图3所示。因此,在RT程序的设计中,可以通过数组索引的方式,来读取指定通道中所有I/O值。用拟合好的传感器线性函数把电流、电压值转化为压力、流速等监测数据[6]。由于 LabVIEW进行TCP通信时,不支持传输簇类型的数据,因此,利用“创建数组”函数,将出口压力、进口压力、电机转矩和电机转速等监测数据封装成1个一维数组。

b.通信模块。通信模块将采集模块处理得到的一维数组转化为JSON字符串,并通Socket发送给上位机。在进行Socket传输数据时,必须要保证数据格式统一。本系统选择最为常用的JSON格式。

JSON格式是一种轻量级的数据交换格式,任何数据类型都可以过JSON来表示。故利用"平化至JSON" 函数,返回一个编码格式为UTF-8的JSON字符串。

鉴于该监测系统对传输数据的准确性和实时性有一定的要求,故而采用面向连接的Socket。面向连接的Socket操作使用TCP协议。本系统采用stream Sockets类型,下位机把字符串写入字节流中,上位机从字节流中读取字符串,从而实现通信[7]。

下位机通信过程如下:下位机建立套接字,并侦听连接请求;上位机发送连接请求给下位机后,下位机会相应地发送确认连接的请求给上位机,并且建立连接;当通信结束后,断开连接。

1.3 上位机程序设计

上位机C#程序主要分为3部分:Socket通信部分、数据显示部分和存储与导出部分。Socket通信部分主要保证数据实时、可靠、安全地在网络中进行传输。数据显示部分主要实现文本框、仪表盘实时显示数据、曲线实时绘制功能。存储与导出部分主要实现以Excel作为模板进行数据存储功能。上位机对应结构如图4所示。

图4 上位机结构

由于上位机程序同时执行通信、显示与存储任务,为提高对用户的响应速度[8],以便几乎同时完成,可采用多线程技术。Socket通信单独作为一个子线程。DataModel子线程是中间桥梁,负责将传输给上位机的数据提供给显示控件,以及提供Excel存储所需的数据。ChartModel子线程每隔10 s对数据进行筛选,并给对应图表赋值。

1.3.1 Socket通信

上位机Socket通信创建步骤:在上位机建立Socket,并确保端口号和IP地址与下位机相同;向下位机发送连接请求,经下位机确认后,建立连接,交换数据。

为实现下位机和上位机的Socket通信,仍需做以下2方面工作。

a.异步通信的实现。上下位机通信时,通信子线程调用BeginReceive函数实现异步通讯,同时采用事件驱动方式调度回调函数实现数据实时接收等功能[9-10]。选择异步通信的好处就在于提高了程序的整体响应能力,避免出现用户界面卡顿。

b.反序列化的实现。在上位机接收到数据后,需将字符串反序列化为float类型数组。具体反序列化的过程是:在上位机中,将将压力、流速等监测数据组成的JSON字符串,利用C#中的分割字符串函数Split,将JSON字符串变成字符串数组。最后利用foreach语句遍历将字符串数组,将其转化成float类型数组[11]。

1.3.2 数据显示

当上位机将Socket通信得到的压力、流速等参数解析完成后,便实时地将这些参数显示在文本框、仪表盘和曲线图中。数据显示过程中需要不断的更新界面,更新界面很耗时,需要将访问该控件的线程设置在Socket通信子线程,但显示数据的控件是在主线程中创建的,线程会发生冲突,程序会出现异常。为解决上述问题,调用C#中的BeginInvoke函数。该函数可以在子线程修改主线程创建的对象的属性,将更新的数据返回主线程,最终显示在文本框和仪表盘上。部分界面更新程序如表1所示。曲线图需要选择10 s内的数据进行显示,故而曲线图的程序编写相对特殊。在图表子线程中构建图表的模型,将图表中原数据清空,并获取当前数据前10 s的时间,根据选择的时间去Datemodel子线程调用相应数据,最后将图表子线程中的数据绑定到图表中显示。

表1 部分界面更新程序

1.3.3 数据存储与导出

数据存储程序设计时主要考虑到2个方面的内容:需要操作方便,灵活地保存监测到的各项参数;当界面开始工作后,能够根据需要手动保存相应时间段内的数据。

目前,C#中导成Excel文件的方式最常用的有3种:OLEDB方式、COM组件方式和NPOI库。鉴于NPOI组件可以很好地支持对Excel文件的读写操作,不仅不依赖office环境,同时开发效率也很高[12]。本项目选择NPOI库导出Excel文件。

2 监控系统测试

为检验监测系统的准确性和实时性,测试电机300转时该系统的通信过程。进行测试前,需要额外在下位机编写控制程序。首先,鉴于开关量输出和模拟量输出模块的通道分别是32和16,故而设置32位和16位数组,并分别初始化。该实验台只控制1个变频器,利用"写入变量函数"把电机启停和转速信号写入输出模块。下位机控制程序如图5所示。

图5 下位机控制程序

经测试,基于C#和LabVIEW的监测系统可以实时显示管道内的压力、流速和浓度等重要参数。C#和LabVIEW正常通信,响应速度快。用户界面正常更新,无卡顿现象。从Excel表格中看出,数据存储成功并且没有遗漏。运行时该系统的上位机监测软件界面如图6所示。

图6 监测软件界面

3 结束语

该监测系统采用C#设计上位机程序,LabVIEW设计下位机程序,利用TCP协议进行上下位机通信,保证了实时性要求。编程过程中,采用多线程技术解决了响应速度慢的问题,利用C#中的BeginInvoke等函数解决了界面更新等问题,实现了数据的显示、存储与更新。以上的工作,为后续的强化学习控制算法的引入做好铺垫,对泥浆管道的研究有参考意义。

猜你喜欢
字符串下位数组
JAVA稀疏矩阵算法
基于文本挖掘的语词典研究
JAVA玩转数学之二维数组排序
发射机房监控系统之下位机
一种起落架下位锁机构的设计
更高效用好 Excel的数组公式
SQL server 2008中的常见的字符串处理函数
围观党“下位”,吐槽帝“登基”
最简单的排序算法(续)
寻找勾股数组的历程