夏志强,胡文山,刘国平,周 洪,雷忠诚
(1.武汉大学电气与自动化学院,武汉 430072;2.南方科技大学电子与电气工程系,广东深圳 518055)
实验教学是高校培养高质量人才的重要组成部分[1-2]。传统的线下实验存在实验场地有限、器材成本高、实验室开放时间短等问题[3-5],很难充分利用实验资源,从而影响实验教学效果。互联网技术的发展,为实验教学带来了解决方案,集网络技术、通信技术和多媒体技术于一体的远程在线实验室可以克服线下实验室的诸多问题,真正实现实验资源的充分利用和共享[6-7]。
国内外科研机构研发了众多虚拟仿真实验室[8-10]和远程控制实验室[11-13]。大多数远程控制实验室需要第三方软件或系统(如Matlab、LabVIEW 等)的支持。Rubio等[14]设计的SLD(Sistema de Laboratorios a Distancia)允许用户运行Matlab/Simulink算法文件,或借助本地计算机上的Matlab 软件修改算法。张治等[15]设计了基于RaspberryPi 的飞控系统半实物仿真平台,实现了基于Matlab/Simulink 软件设计的飞控仿真模型在硬件平台上的实时运行。对于武汉大学设计的网络化控制系统实验室(NCSLab)[16],前端浏览器为用户提供自主算法设计服务,服务器端则通过远程调用Matlab软件的方式完成仿真或算法编译。
借助第三方软件搭建远程控制实验室可以降低实验室开发的难度,但存在依赖性强、灵活性差、效率低以及数据和隐私泄露问题。针对以上问题,在已有的NCSLab前端与实验设备的基础上,本文设计了一款面向远程实验室仿真与算法生成的一体化软件M2PLink(mathematics to practice link),可根据用户自主设计的Web 端控制框图进行仿真实验或编译生成可执行性算法。
NCSLab诞生于2006 年,是为自动化专业教学而研发的在线实验室,用户可以随时随地通过浏览器访问并远程控制实验。
基于B/S(browser/server)架构,NCSLab已形成了如图1 所示的以前端浏览器、中央服务器集群、实验服务器和实验设备为主体的4 层结构。
图1 NCSLab的4层架构
浏览器层主要提供算法设计和监控组态服务;中央服务器集群包括Nginx代理服务器、仿真/编译服务器、超文本预处理器(PHP)、文件管理服务器以及MySQL服务器;实验服务器层由多台管理实验设备的实验服务器和FFmpeg 服务器组成;实验设备层包含20类虚拟实验设备与6 类实体实验设备(实验设备参数包括电动机转速、电动机角度、伺服位置、气浮高度、风扇转速和水箱液位高度)。
作为混合类在线实验室,NCSLab不仅支持仿真实验,还支持涵盖在线算法设计、远程配置、远程监控和实时控制功能的远程控制实验,其设计思路如图2所示。
图2 NCSLab设计思路
在浏览器端为用户提供自主算法设计界面(见图2 中的自主算法设计界面),界面包含模块库、操作栏和设计区三部分。使用时以拖拽的形式将模块从模块库拖入设计区并连线,完成算法框图的设计;点击模块和配置参数按钮进行参数的设置,再点击开始仿真或开始编译按钮,前端将框图算法以json 形式发送至后端。
仿真/编译服务器在接收到前端的请求后生成对应的M文件并远程调用Matlab软件,生成仿真结果或可执行算法文件,过程如图2 中现系统实现部分所示。
进行仿真实验时,用户可以在前端浏览器界面查看仿真结果;进行远程控制实验时,用户通过实验服务器将可执行算法下载至树莓派控制器并开始远程实验,包含虚拟设备控制实验与实体设备控制实验2 种。
此外,进行远程控制实验时用户可在浏览器端借助丰富的监控组态界面进行远程配置、远程监视与实时控制操作,包括多种输入组件(数字输入、滑动输入)、多种输出组件(曲线图、数字显示、三维模型和摄像头)及操作按钮。
NCSLab设计思路中,自主算法设计功能是整个系统的重要组成部分,允许学生以模块化的形式设计所学的各种控制算法,如比例-积分-微分(PID)控制、串级控制等,帮助学生加深对算法的理解,但在后端实现过程中需要远程调用第三方软件Matlab。为了防范可能存在的禁用和数据泄露风险,同时提高系统效率,对自主算法设计功能的后端实现进行新构思,即自主设计一款适配于NCSLab前端与硬件的仿真和算法生成一体化软件,接收前端框图算法的json 信息并生成仿真与编译的可执行文件,过程如图2 中新系统构思部分所示。
新系统相较于现系统,只要修改自主算法设计功能的后端实现,其余部分均无须改动,包括前后端数据传递的形式。本节中在介绍后端输入的基础上,对M2PLink进行设计。
后端的输入为框图算法的json 信息,图3 展示了框图算法与json 信息的对应关系。生成的json 信息中包含了用户名称、算法名称、解算器参数、模块信息和模块间的连线信息。
图3 框图算法与json信息对应关系
基于框图算法的json 信息对M2PLink 进行设计,整体架构可分为4 层,即解析层、处理层、输出层和封装层,如图4 所示。
图4 M2PLink架构
(1)解析层。在接收到浏览器传递的框图算法信息后系统开始解析,即根据其中的模块信息与连线信息创建出对应的实例,为遍历输出链、检测代数环和生成代码做准备。
(2)处理层。中间处理操作包括解算器设置、输出链建立和代数环检测。设置解算器是为了在生成代码时写入对应的解算算法,建立正确的输出链是保证框图算法运行结果准确的前提,代数环检测则可以有效避免算法进入死锁状态。
(3)输出层。主要负责代码生成,生成的代码包括仿真/编译主程序、解算器代码、算法功能代码以及其他文件(视仿真或编译条件而定)。
(4)封装层。仿真主要封装核心代码、步长控制代码和结果存储代码,编译则需要封装核心代码、通信代码、定时器代码与硬件接口代码,保障远程控制实验的正常进行。最后,系统进行编译操作,生成可执行性文件。
控制框图算法中,除了较容易实现的四则运算与逻辑运算外,还包含了一类特殊的模块(积分、传递函数和状态空间),这类模块的输入与输出存在微分关系,求解此类模块的输出等同于求解微分方程,因此可以根据不同的微分方程求解算法设计多种求解器,下面介绍常用的四阶龙格-库塔法。
四阶龙格-库塔法在每个时间步长内执行以下计算:
式中:yi为当前时间步长的解值;yi+1为下一个时间步长的解值;k1、k2、k3和k4为4 个中间值。k1、k2、k3、k4的计算式为:
式中:ti为当前时刻;h为步长;f(t,y)表示常微分方程的右侧,即导数。
根据前端浏览器传递的json 信息及解算器设计思路可为模块设计统一的模板(Block类)。
每个模块含有类型、模块名、模块id、模块所处位置(用于判断模块是否在子系统中)、若干输入端口、若干输出端口、若干状态等基本信息。每个模块的特性是通过继承Block 类并覆写部分方法实现的,各方法的功能如表1 所示。
表1 Block类中各方法的作用
不同于其他模块,在进行实验设备(电动机、风扇等)模块设计时需要区分仿真模型与实体模型。仿真模型是通过机理建模或系统辨识得到的,一般为传递函数,而实体模型中包含了硬件接口。
图5 展示了电动机模块的仿真与实体模型。仿真模型包含了限幅模块、传递函数模块与延时模块,而在实体模型中,通过串口通信的方式发送控制信号和接收编码器测得的电动机转速信号。
图5 电动机的仿真与实体模型
2.5.1 输出链建立
控制框图的输出顺序一般考虑以下几个方面:
(1)直联馈通模块的输出与输入有关,因此输出链中与直联馈通模块输入端口相连的模块要先于直联馈通模块出现。
(2)多输入模块需要等所有的输入更新完后再计算输出。
(3)子系统使得模块处于不同层级,一般而言,子系统中模块的计算优先级高于子系统之后的所有模块。
鉴于多层级遍历流程较为复杂,首先采用虚化子系统的方式将多层级系统转换为单层级系统。图6 展示了一个2 层系统转换为单层系统的过程。前端浏览器将算法信息发送至M2PLink 后,在解析连线信息前对子系统的连线信息进行修改,即用①、③号连线分别替代原系统中的②、④号连线,同时忽略模块所处的位置信息。这种方式实现了对子系统模块的虚化,将子系统中的模块置于了第1 层系统。
图6 子系统处理
建立单层级系统输出链遍历流程,遍历遵循以下规则:
(1)从“起始”模块沿输入连线进行遍历,首次遍历的“起始”模块为示波器类模块,非首次遍历的“起始”模块为本轮遍历之前发现的非直联模块。
(2)遍历过程若发现多输入模块则按多输入模块的输入端口号依次遍历。
(3)遍历的停止条件为发现“终止”模块,包括信号源类模块、非直联模块和本次遍历前“已遍历”的模块。
(4)遍历到“终止”模块后,系统会从“终止”模块起沿遍历链方向添加模块至输出链。多输入模块需在所有输入端口支链添加完再添加。
图7 展示了上述输出链建立思路。由于算法中只存在传递函数这一个非直联模块,该算法只需进行2次遍历。
图7 输出链建立思路
1 次遍历以示波器为“起始”模块,并沿输入连线进行,直至遇到第1 个双输入乘积模块。接着,系统先沿乘积模块的1 号端口遍历至正弦波模块,再沿乘积模块的2 号端口遍历至传递函数模块(非直联)。最后,从“终止”模块起沿遍历路径添加模块至输出链,得到1次遍历的模块输出顺序,如图7数字1~8所示。
2 次遍历以传递函数模块为“起始”模块,并沿输入连线遍历至双输入求和模块。接着,系统先沿求和模块的1 号端口遍历至常数模块,再沿求和模块的2号端口遍历至“已遍历”的除法模块。最后,从“终止”模块起沿遍历路径添加模块至输出链(其中除法模块和传递函数模块在1 次遍历中已添加,本次不添加),得到2 次遍历的模块输出顺序,如图7 数字9~12所示。
2.5.2 代数环检测
代数环检测是与输出链遍历同时进行的,在每次遍历过程中系统会记录本轮遍历到的所有模块,当已遍历的模块再次出现时,则说明算法中存在代数环。
编译代码与仿真代码生成流程相同,需要生成基于控制框图信息的算法功能代码和其他静态代码(不会因框图信息变化而改变)两部分,不同之处在于两者生成的实验设备实例与静态代码文件,图8(a)展示了编译代码的生成过程,图8(b)展示了仿真与编译代码生成时的区别。
图8 代码生成
算法功能代码主要包括各种数据结构的定义、算法的初始化方法、输出方法、微分方法、状态更新方法等。各方法均由各模块生成的代码拼接而成,以输出方法生成为例,基于建立的输出链,系统会按顺序调用每个模块的输出代码并写入模块功能代码的输出方法中,最终生成整个算法的输出方法,供解算器调用。
存放于静态文件库中的文件主要包括仿真/编译主程序、解算器代码等,在生成代码时只需将其拷贝进用户文件夹。此外,仿真的主程序与实物控制的主程序存在差别,仿真的最终任务是获取示波器的输入数据并传输给浏览器进行绘图,而在实物控制中需要调用通信代码实现前端浏览器与树莓派间的动态交互。动态交互的实现方式如图9 所示。浏览器与实验服务器间采用超文本传输协议(HTTP)进行通信,而实验服务器与树莓派间使用的是传输控制协议(TCP),交互的2 种方式为状态监测与参数调试。
图9 浏览器与树莓派间的动态交互
(1)状态监测。将算法下载至树莓派,用户在前端浏览器进行信号或参数选择后,实验服务器便会给树莓派发送一条信号选择消息,请求树莓派将信号或参数信息上传至前端浏览器界面;树莓派在接到该消息后,便将对应的信号或参数的最新数据打包,并通过实验执行模块放入实时数据池。最后,这些实验数据通过WebSocket实时发送给前端组态。
(2)参数调试。用户在前端浏览器进行参数修改后,调试指令将由前端浏览器界面提交给实验服务器,数据交换模块再将参数名称和数值打包为参数设置指令并通过实验执行模块发送给树莓派控制单元,最后树莓派响应该指令,完成控制参数修改。
将M2PLink 部署在NCSLab 上,为了验证其计算的准确性、算法生成功能及对系统效率提高的积极作用,本节中将进行仿真实验、实体实验和效率测试实验,并介绍其在教学上的应用。
在NCSLab平台搭建仿真框图(见图10),并分别使用M2PLink和Matlab 软件进行仿真实验。验证输出链建立流程、子系统实现和四阶龙格-库塔法编程的正确性。实验中解算器使用的是四阶龙格-库塔法,仿真步长为0.2 s,得到前2.0 s示波器输出结果,如表2所示。比较2 份实验数据,误差不大于10-12,可认为2 份实验数据相同。因此,输出链遍历过程、子系统设计和四阶龙格-库塔法编程均得到实现。
表2 仿真实验示波器输出结果
图10 用于测试的仿真框图算法
单容水箱液位控制系统是自动化实验教学中的一种常见实验装置,主要由水箱、执行器、传感器和控制器组成。系统以水箱为被控对象,水泵为执行器,进行实验时改变水箱液位的设定值,控制器通过调节水泵的供水量从而实现对液位的控制。
为了验证系统的算法生成功能,在前端浏览器搭建水箱液位串级控制算法并使用M2PLink 生成可执行算法文件,之后进行实体实验,如图11 所示。串级控制算法中主、副控制器均采用比例-积分(PI)控制,主控制参数为液位高度,副控制参数为水泵的进水速度。监控组态界面显示了液位稳定于100 mL 后将设定值增加到120 mL的控制效果,实验结果符合预期,验证了M2PLink的编译功能。
图11 水箱液位串级控制算法与监控组态画面
新系统中,M2PLink 服务器与原系统的Matlab 服务器配置一致,如表3 所示。分别使用2 个服务器对水箱液位串级控制算法进行仿真与编译操作,两者所耗时间如表4 所示。由于基于M2PLink的NCSLab 系统比基于Matlab 的NCSLab 系统少了远程调用操作,新系统的效率远高于原系统。水箱液位串级控制算法与监控组态画面如图11 所示。
表3 服务器参数数据
表4 仿真/编译时间
目前,M2PLink服务器已经部署于网络化控制系统实验室中并用于自动化专业实验教学。在2023 年春季,武汉大学电气与自动化学院的82 名自动化专业学生使用新系统进行了电动机转速PID 控制、控制系统稳定性分析和二阶系统的瞬态响应与稳定性3 个实验,学生们对M2PLink服务器反响强烈。相较于使用Matlab服务器的方式,新系统生成仿真结果与算法的效率得到了大幅提升,减少了等待时间。
设计了一款面向远程实验室仿真与算法生成的一体化软件(M2PLink),处理了代码生成中的模块化设计、输出链建立、解算器设计等问题,并通过仿真实验、实体实验和效率测试实验验证了M2PLink 计算的精确性、编译功能的完整性及对提升系统效率的积极作用。本软件的开发,旨在替代NCSLab 中的Matlab/Simulink以实现实验室平台的自主可控,目前实现了仿真、算法生成等功能。