在Matlab中仿真好的程序可以直接导入到PLC中,省去我们重新编程的时间,本文就通过一个简单的PID控制的例子来演示这一过程。

1 Matlab中的操作

  在Matlab(2019b版本)中点击Simulink图标就能看到Simulink的启动页面,在搜索框中输入PID即可找到软件自带的例子,如下图所示。我们就以此为例进行讲解。

  这个例子比较简单,只有一个PID控制器和一个二阶阻尼系统作为被控对象,如下图左。我们可以添加一个Scope示波器来查看控制效果,如下图右,可见被控系统的输出实现了对阶跃参考信号的跟踪。

 

 

  


  为了将仿真好的PID控制器导入到PLC中,下面我们对其进行配置。首先配置系统的仿真参数,打开系统参数配置页面(按Ctrl+E打开Configuration Parameters),在Solver selection项中将仿真类型Type改为Fixed-step。然后打开PID控制器模块的参数配置页面,将Time-domain改为离散时间,如下图所示。你也可以根据自己的经验修改PID的比例微分等增益,也可以选择是否对微分项进行滤波并设置滤波系数,在其它选项卡中还可以设置输出限幅、抗积分饱和等选项。

  配置好以后,我们回到仿真页面,在Controller模块上右键,选择PLC Code—>Enable “Treat as atomic unit”,把“Treat as atomic unit”勾选上,如下图所示。


  再次在模块上右键选择PLC Code—>Options,选择你的PLC平台,这里我使用的是Codesys,我的Codesys版本是V3.5 SP13 Patch 1,因此我选择相应的选项,而且在IDE path中输入Codesys的安装位置,输出文件夹也可以设置(我就用默认的了C:\Program Files\Polyspace\R2019b\bin\plcsrc)。

  然后还是在Controller模块上右键选择PLC Code—>Generate code for subsystem,成功生成代码后会跳出以下页面。

打开输出文件夹可以看到生成的文件有三个,其中st文件和xml文件是我们感兴趣的。st文件中是PID控制程序的代码,我们可以用记事本打开看看里面的内容。除去繁琐的注释,真正的算法代码很简单,就是计算比例项、积分项、微分项,然后三项相加得到最终的控制量Control。我们还能看到程序中对微分项采取了一阶低通滤波,这样可以去除高频噪声。还可以看到整个PID控制程序是作为一个Function Block程序块的形式存在,这方便了我们在正式项目中调用它。

2 Codesys中的操作

 xml文件可以导入到Codesys中。xml是一种标准的存储格式,各大主流PLC厂家都支持这种格式。打开Codesys的IDE编程环境,然后新建一个“Standard Project”工程。在“工程”菜单中选择导入xml文件,如下图所示。

 在POU栏中可以找到导入后的程序,从此以后你就可以在实际工程项目中调用这个PID函数块了,它的名字是默认的Controller,输入是误差量Error,类型是LREAL,输出是控制量Control。

3 导出程序的正确性验证

  也许你会怀疑,导出的程序是否与我们在仿真中的效果一样呢?Matlab更牛逼的是还支持将自己仿真的数据与Codesys中运行的数据进行对比从而验证导出程序的正确性,操作的步骤如下。在PLC Code—>Options选项页中将Generate testbench for subsystem勾选上,如下图。

  再次导入到Codesys中后,我们会发现多了一个TestBench程序块,它里面带着仿真数据,如下图所示。注意,在TestBench的函数定义区中有这样一行代码ABS(out_Control - cycle_Control) > (1.0E-5 * ABS(cycle_Control)),显然这是在比较out_Control和cycle_Control两个值的差别,前者是Codesys中调用函数块计算得到的控制量,后者是Matlab在仿真过程中保存下来的控制量。如果二者误差小于一定阈值(程序中是0.00001× \times×扫描周期)则说明导出的程序块与仿真程序是一致的。下面第二幅图就是实际运行的结果,testVerify判断二者之差是否小于阈值,图中它为True,这说明导出的程序与仿真是一样的。由于TestBench是个程序块(FB),所以我们要先实例化,然后调用即可。