【干货】操作手册 | 基于 Simulink 模型生成 RT-LAB 兼容的实时保护代码库
引言
随着国家“3060”双碳目标不断推进,我国正稳步快速建设新型电力系统,高比例的新能源不断接入电网。新能源,如风、光、储能,均须通过逆变器连接到电力系统。作为新能源发电的核心,结网逆变器的控制和保护策略在电网安全稳定运行中扮演着关键角色,因此对结网逆变器控制保护特性及其对电网影响的验证和测试尤为重要。
目前,对新能源场站以及高比例新能源接入的电网仿真建模没有标准化的国际化要求。传统的建模方法为使用通用控制器来模拟新能源场站;但为了进一步提高仿真控制器的精度,大部分的制造商都开始使用控制器的真实代码来开发EMT“实码”模型,这类控制器模型更为精确,也更能体现各厂家独有的参数调校能力。OPAL-RT的控制保护代码解决方案是将各逆变器厂商的控制代码通过打包加密放置于RT-LAB中运行,能够更真实具体地反映不同厂家、不同型号逆变器的真实控制特性,并且有助于研究新能源场站内、场站之间、场站和传统电力系统控制保护的相互作用及影响。
小编近期梳理了针对在RT-LAB实时仿真平台上,特别是在新一代OPAL-RT Linux操作系统上实现逆变器控制代码打包加密的方法。

▲ (下载方式在文末)
操作手册目录
1. 文档介绍
2. 软硬件需求
3. 与模型连续态模块有关的约束设置
4. 生成S-FUNCTION库
5. 代码编译(用于隐藏源代码)
6. 将生成的保护代码集成到对应的RT-LAB工程中
附录
附录1:生成适配包含调用子S-Function的S-Function文件
附录2:MobaXterm的安装和配置
01 文档介绍
本文档具体介绍了以下操作步骤:
01 基于 Simulink 模型生成和创建对 RT-LAB 兼容的 S-Function 库 (xxx_rtlabsfcn.mdl);
02 编译生成的 S-Function 库为对应仿真机操作系统的保护代码文件 (.a, .so);
03 将生成的保护代码集成到对应的 RT-LAB 工程中。

02 软硬件需求
01 基于Windows的上位机主机
02 OPAL-RT仿真机

03 MATLAB/Simulink
Simulink Coder toolbox是生成保护代码的必备工具包,并且Simulink模型中使用的任何toolbox都必须与Simulink Coder 工具包兼容。
供应商和S-Function的集成商必须使用相同版本(例如R2016b)和架构(例如64位)的MATLAB/Simulink。
*关于如何配置virtual machine,请参照: https://www.opal-rt.com/support-knowledge- base/?article=AA-01281
03 与模型连续态模块有关的约束设置
当从包含连续态模块的Simulink模型生成C代码时,其生成结果将包含在模型中配置的具体固定步长模块(基本采样时间)的运算结果。最常见的连续态模块位于Simulink/Continuous和Simulink/Discontinuities库中。

因此,为了确保成功生成并集成S-Function库,供应商和集成商必须就S-Function的采样率达成一致。如图3所示举例,Simulink模型的系统离散求解器仿真步长为30us。

04 生成S-FUNCTION库
本手册将以RT-LAB提供的ARTEMIS双馈风机并网demo:
ssn_DFIM_wind_turbine_with_crowbar.mdl 为例,将其对应的转子控制部分生成为兼容RT-LAB的S-FUNCTION库。


1)在MATLAB命令行窗口中,键入以下命令以设置默认编译器。用户可以在此选择MATLAB检测到的任意编译器。mex –setup推荐使用Visual Studio编译器,尤其是被转换的模块中还调用其他的子S-Function库。否则MATLAB会需要其调用的子S-Function源代码。这在某些知识产权保护的情况下并不可行。
*注意:mex 命令因MATLAB的不同版本而异。请参阅MathWorks的文档,以便正确配置编译器。
2)将MATLAB中的当前文件夹切换到目标Simulink模型的文件夹路径下,然后打开模型。
3)将以下随手册提供的文件,复制到Simulink模型所在的MATLAB路径文件夹中。
create_rtlabsfcn.m
rtlabsfcn.tmf
4)在Simulink中左键单击选中将要生成S_Function的子系统。然后,在MATLAB命令行窗口中,输入命令:create_rtlabsfcn
*注意:如需要生成的部分不是子系统,需要在选择所有需要生成的模块后,右键在对应的菜单栏中选择“Create Subsystem”来生成子系统。

5)确保所选子系统在命令行窗口的反馈正确显示,输入Y,然后按Enter键执行。

6)在上步操作执行完成后,一个新的Simulink窗口会自动弹出,对应的是生成的目标S-Function模块。

7)确保在第5)步脚本执行结束时在MATLAB命令窗口中看到以下消息。

8)上述步骤成功完成后,目标Simulink模型文件夹下会生成对应的 rtlabsfcn_package 和 sfcn_rtw 文件夹。如图10所示:

9)将目标Simulink模型另存为不同名的Simulink模型以用于库集成验证。
然后将步骤6)中生成的S-Function库模块复制到新建的simulink模型中,随即替换掉之前选中的子系统,并确保新的集成模型能离线运行。

05 代码编译(用于隐藏源代码)
在成功生成了S-Function库模块后,供应商需要对其进行编译以保护知识产权。编译的具体步骤会因仿真机操作系统的不同而略有区别。本手册提供的相关生成文档均是针对OPAL-RT Linux(x64-based)仿真机系统。
*注意:在本节中,Rotor_Control 是本手册例子中对应S-Function库的名称。用户需要替换自己的库名称以及相关文件夹路径到后续代码中。
为了使用OPAL-RT实时仿真机系统来编译保护代码,用户必须能够通过上位机主机访问OPAL-RT仿真机的Linux操作系统。或者按照此KB介绍的步骤,在上位机主机配置虚拟机,来模拟OPAL-RT实时仿真机的Linux操作系统:
https://www.opal-rt.com/support-knowledge-base/?article=AA-01281
1) 参考附录2安装和配置MobaXterm。如果用户更熟悉其他SSH/SFTP客户端,也可以使用其他客户端来远程访问OPAL-RT实时仿真机的操作系统。
2)将文件夹 Rotor_Control_sfcn_rtw 通过MobaXterm拖到仿真机的系统路径下。

3) 在MobaXterm终端中,输入以下命令:
cd home/root/Rotor_Control_sfcn_rtw
chmod 777 Rotor_Control.sh
./Rotor_Control.sh

*注意:用户需将上述代码适配为其对应的文件夹路径与对应的.sh文件名。
4) 确保在MobaXterm脚本执行结束时看到以下消息,这样保护代码文件就成功生成了。

5) 使用MobaXterm进入/home/root/Rotor_Control_sfcn_rtw 文件夹,找到对应的Rotor_Control_sf_linux_x86.a 的文件(如果在之前的步骤显示成功生成,但是未看到.a文件,可以点击窗口上方的刷新按钮来刷新文件夹显示的文件)。通过MobaXterm将其拖放到Windows上位机上的Rotor_Control_rtlabsfcn_package 文件夹中。

*注意:
“xxxx_sfcn_rtw”文件夹包含了目标子系统生成的所有源代码文件。此文件夹仅供生成保护代码使用。出于知识产权保护的目的,该文件夹的内容是禁止分享给第三方客户的。
“xxxx_rtlabsfcn_package”文件夹包含了生成的S-Function库模型(.mdl 或 .slx),必备的header .h文件与后续生成的保护代码文件 (.a, .so)。该文件夹是需要搭配集成模型在RT-LAB中使用的,故可以安全分享给第三方客户。
06 将生成的保护代码集成到对应的RT-LAB工程中在Simulink Library Browser中,搜索OpConfiguration模块。随即将其添加到生成的S-Function库模块旁。

I.OpConfiguration 配置
双击OpConfiguration模块,按以下步骤配置OpConfiguration模块。
Model Callback
输入addpath('.\Rotor_Control_rtlabsfcn_package');

Source
在下图对应的栏目中输入对应的S-Function库模块源文件名称,以确保模型编译中忽略该部分,从而使用生成的保护代码。Rotor_Control_sf.c

Library
在下图对应的栏目中,输入对应的保护代码文件名称。
Rotor_Control_sf_linux_x86.a

File transfer
在下图对应的栏目中,输入保护代码在对应package文件夹中的完整路径与文件格式:Rotor_Control_rtlabsfcn_package\Rotor_Control_sf_linux_x86.a=Binary|

▲ 图20
Compilation
留空即可。
Target platform
请勾选如下图所示复选框。

*注意:在OpConfiguration模块配置好后,需确保模型能够正常的离线运行。
II.在RT-LAB中运行集成保护代码的模型
1) 在RT-LAB中新建一个工程, 导入集成保护代码的模型,确保对应的 Rotor_Control_rtlabsfcn_package 文件夹也在RT-LAB工程的路径内。

2) 通过RT-LAB打开模型,确保模型能离线运行。
3) 如下图所示,在RT-LAB 中选中Files选项卡。点击Add,进入RT-LAB工程下的package文件夹并选择添加Rotor_Control_sf_linux.x86.a 文件和所有.h header文件。

4) 添加完闭后,Files面板应如下图所示。

5) 在RT-LAB中编译,下载并执行模型。观察集成保护代码的模型是否有正确的输出。

▲ 图25
附录
附录1:生成适配包含调用子S-Function的S-Function文件
为了调用子S-Function库,必须对现有rtlabsfcn.tmf文件以及Matlab工作区的文件进行一些修改。
1.1 编辑RTLABSFCN.TMF文件
1.1.1 打开文件: rtlabsfcn.tmf:

1.1.2 在164行, 在'MY_INCLUDES='之后,使用以下格式添加调用的子S-Functions的文件路径。

1.1.3 在第186行,在'My_Includes='之后,使用以下格式添加子 sfunction_sfcn_rtw 文件夹的名称。

1.2 重新配置MATLAB工作空间
必须在工作区的顶层包含对应主和子sfunctions的.mexw32/.mexw64文件。

1.3 制作兼容的 .MK 文件
此手册提供的文件中包括make文件:‘sub_sfunction_example.mk’。该文件用于举例生成兼容子S-Fcuntion的.mk文件。
在此文件中,必须将所有带有“yoursfunction”的文本替换为sfunction名称。有6处需要编辑,它们分别位于以下几行:
行: [1, 52, 54, 61, 69, 161, 165, 188].
或者,您也可以在文本编辑器中使用“查找并替换”功能。
*注意:将此文件的名称更改为:sfunctioname.mk,并将其移动到sfcn_rtw文件夹中,替换旧的.mk文件。

1.4 构建 RTLABSFCN_PACKAGE文件夹
1.4.1 创建一个名为 ‘YourSfunctionName_rtlabsfcn_package’的新文件夹。
1.4.2 将以下文件从sfcn_rtw文件夹移到您的sfunction中。请注意,本例中的sfunction的名称为ATM_US_1962x。

1.4.3 复制对应的sfunction的.mdl并添加扩展名rtlabsfcn。


1.4.4 创建一个名为yoursfunction_sfcn_rtw的文件夹,并在其中放置第1.3节中制作的make文件。

1.5 在完成附录章节的操作之后,按照手册正文第5节完成后续sfunction功能的创建。
附录2:MobaXterm的安装和配置
MobaXterm可以把S-Function的源文件传输到仿真机上并执行命令。该程序是免费的。我们将使用其SSH和SFTP客户端功能。
2.1 安装MOBAXTERM
下载MobaXterm: http://mobaxterm.mobatek.net/download.html.
启动安装程序并完成安装向导。

2.2 配置 MOBAXTERM
2.2.1 打开 MobaXterm

2.2.2 点击Session 以创建新会话。

2.2.3 配置新会话:

2.2.4 当会话配置完成时,会话自动启动。

