如何将实际PID调试进行传递函数处理仿真调试

在一个复杂系统中,需要进行PID调试,以达到系统稳定状态。
但是每次调试都需要在设备上进行。
能否有方法测出系统传递函数,将调试迁移到电脑上进行仿真进行?
具体系统为:
请求角度→电机执行输出扭矩→达到目标角度。
整个都能测数据,但是测得的数据是当前PID参数的数据,若以当前数据作为 data base,那么传递函数是基于当前PID参数的。
该怎么处理,得到系统本身的传递函数,然后进行PID调试?

使用博图PLC S7-1200/1500来仿真PID(含被控对象传递函数)
可以借鉴下
https://blog.csdn.net/dlwlrma_516/article/details/107002444

在将PID调试迁移到电脑上进行仿真之前,需要获取系统的传递函数。由于你已经可以测量到系统的输入和输出数据,可以尝试使用系统辨识(System Identification)的方法来获得系统的传递函数模型。

系统辨识是从实际的输入-输出数据中推导出系统的数学模型的过程。以下是一种可能的方法:

  1. 收集输入-输出数据:在设备上运行系统,并通过测量记录输入角度、输出扭矩和目标角度等数据。确保你拥有足够的数据来代表系统的各种操作状态和动态响应。

  2. 数据预处理:对收集到的数据进行预处理,包括去除噪音、滤波和对齐数据等操作,以确保数据的准确性和一致性。

  3. 确定系统的结构:根据你对系统的了解,尝试确定适当的传递函数结构。PID控制器通常采用一阶或二阶传递函数模型。

  4. 辨识参数:使用系统辨识工具或编程库,如MATLAB中的System Identification Toolbox、Python中的scikit-learn或TensorFlow等,将预处理后的数据输入模型,并通过参数辨识算法来估计传递函数的参数。

  5. 验证模型:将估计得到的传递函数应用于仿真或实际测试数据,并与实际数据进行对比。评估模型的拟合程度和准确性。

  6. 进行仿真调试:将估计得到的传递函数应用于仿真环境中,并进行PID调试。在仿真中可以进行快速的试错和参数调整,以寻找最佳的PID参数配置。

需要注意的是,由于仿真环境和实际系统之间可能存在差异,仿真调试得到的PID参数可能需要在实际设备上进行微调和验证。此外,如果系统的动态性质在不同操作条件下变化较大,可能需要进行多点辨识以获取更全面的模型。

通过系统辨识获得的传递函数模型,结合仿真环境进行PID调试,可以提高调试效率并减少对实际设备的依赖。

可以使用仿真工具来测试系统的传递函数,以便在电脑上进行PID调试。以下是一些工具和方法:

  1. 使用MATLAB或Simulink进行建模和仿真:可以使用MATLAB或Simulink建立系统的数学模型,并使用Simulink中的PID控制器进行仿真。这将允许您测试系统的传递函数,并在电脑上进行PID调试。

  2. 使用Python编写PID控制器:可以使用Python编写PID控制器,并使用PID控制器模拟器来测试系统的传递函数。您可以使用第三方库如PyTorch Lightning或TensorFlow的tf.keras.models.Sequential模块来构建和训练PID控制器。

  3. 使用专业的仿真工具:有许多专业的仿真工具可用于测试系统的传递函数,如NS2、MATLAB Simulink、ModelSim等。这些工具通常具有高度的可定制性和灵活性,可以满足您的需求。

  1. 确定系统的数学模型:首先需要通过理论分析和实验数据,建立系统的数学模型,得到系统的传递函数。

  2. 进行仿真:使用Matlab等仿真软件,将系统的传递函数输入仿真模型进行仿真,以模拟系统的实际运行情况。可以通过调整PID参数来观察系统的响应情况,以达到优化系统稳定状态的目的。

  3. 优化PID参数:根据仿真结果,调整PID参数,逐步优化系统的稳定性和性能。可以使用自适应控制算法等方法,自动调整PID参数。

  4. 验证和调整:最后将优化后的PID参数应用到实际系统中进行验证和调整,以进一步优化系统性能。

以下答案由GPT-4.5Plus大模型(语音)与博主A努力中.......共同编写:

要解决您的问题,主要可以采取以下几个步骤:

  1. 收集足够的输入输出数据
    要得到系统的传递函数,首先需要收集系统在不同输入下的输出响应数据。数据量越多越好,才能反映系统的全面动态特性。
  2. 识别系统模型
    有多种方法可以识别模型,如频域分析识别二阶模型,时域拟合识别高阶模型等。对数据进行分析,确定系统的阶数和参数,得到系统的状态空间模型或传递函数模型。
  3. 调整模型以消除PID控制器影响
    如果数据是在PID控制下收集,模型会融合PID控制器的参数。需要对模型进行修正,消除PID控制器的影响,得到更接近系统本身的模型。可以在识别过程中忽略PID部分,或对识别结果进行修正。
  4. 基于模型进行PID Simulation仿真调优
    有了系统模型后,可以在Simulink等仿真软件中构建模型,代入不同的PID参数进行仿真。观察系统响应,不断调整PID参数,在仿真中得到一组较优的PID值。
  5. 下载到实际系统验证
    将仿真中得到的PID值下载到实际系统,观察系统响应,判断控制效果。如果不理想,继续收集数据,重新执行上述步骤,进一步优化。
    这是一个迭代优化的过程,只有经过多轮验证与调整,才能得到一组使系统达到最佳控制效果的参数。如果在实现中遇到问题,可以向我咨询:
  6. 数据收集与分析方面,选择何种方法识别模型?
  7. 如何消除PID控制器影响,得到更加接近真实系统的模型?
  8. 在仿真调优中,如何评判PID参数的优劣与系统的控制效果?
  9. 验证时系统响应不理想的原因有哪些,如何继续优化?

我可以为您在理论和实现上提供进一步的指导与建议,帮助您完成PID参数的优化与调试,使控制系统达到稳定的状态。

可以参考下

%增量式PID
clc % 清屏
clear all; % 删除workplace变量
close all; % 关掉显示图形窗口
 
ts=0.001; %采样时间
xk=zeros(2,1);
e_1=0;
u_1=0;%初始值
 
%%
for k=1:1:1000
    time(k)=k*ts;%时间轴,画图用
    
    yd(k)=0.5*sin(1*2*pi*k*ts);%控制目标(理想位置)
    
    %PID参数
    kp=20;
    ki=0;
    kd=0.5;
    
    para=u_1;
    tSpan=[0 ts];
    %常微分方程的数值求解,[t,y,te,ye,ie] = ode45(odefun,tspan,y0,options)
    [tt,xx]=ode45('PID_ode45_plant',tSpan,xk,[],para);
    xk=xx(length(xx),:);%xk为求解值
    y(k)=xk(1); 
    
    e(k)=yd(k)-y(k);
    de(k)=(e(k)-e_1)/ts;
    u(k)=kp*e(k)+kd*de(k); 
    
    %避免PID值饱和,限制输出
    if u(k)>10
        u(k)=10;
    end
    if u(k)<-10
        u(k)=-10;
    end
    u_1=u(k);
    e_1=e(k);  
end
    
figure(1);
plot(time,yd,'r',time,y,'k:','linewidth',2);
xlabel('时间(s)'); ylabel('yd,y');
grid on
title('仿真结果');
legend('实际信号','仿真结果');
 
figure(2);%误差
plot(time,yd-y,'r','linewidth',2);
xlabel('时间(s)');ylabel('误差');
grid on
title('误差');
 

回答:

对于该问题,可以通过系统辨识来获得系统的传递函数,并通过传递函数进行仿真调试。具体步骤为:

  1. 收集测量数据:收集系统在不同的输入下所产生的响应,包括角度偏差、执行输出扭矩和实际角度。注意,测得的数据要尽量覆盖整个工作范围,以便更准确地建立系统模型。

  2. 建立系统模型:通过对收集到的数据进行处理,可以得到系统的传递函数。可以使用MATLAB中的System Identification Toolbox等模块进行系统辨识,得到系统的模型。

  3. 仿真调试:使用得到的系统模型,在MATLAB中进行仿真调试。可以使用Simulink等工具,进行PID参数的调试,以达到系统稳定状态。

具体代码实现如下:

  1. 收集测量数据:

假设收集到的数据为x,y,z,其中x为请求角度,y为电机执行输出扭矩,z为实际角度。

  1. 建立系统模型:

使用MATLAB中的System Identification Toolbox进行系统辨识,得到系统的模型,如下代码:

data = iddata(z,y,0.01); sys = tfest(data,3)

其中,z和y为测量所得数据,0.01表示采样时间间隔,3表示建立的传递函数阶数。

  1. 仿真调试:

使用得到的系统模型,在MATLAB中进行仿真调试,采用Simulink进行PID参数的调试,以达到系统稳定状态。具体代码如下:

sys_phi = sys; Kp = 0.3; Ki = 0.01; Kd = 0.1; sim('simulink_model'); plot(simout);

其中,sys_phi为建立的系统传递函数,Kp、Ki、Kd为PID控制器的系数,sim(‘simulink_model’)为进行仿真模拟,plot(simout)为绘制仿真结果曲线。

总代码如下:

data = iddata(z,y,0.01); sys = tfest(data,3);

sys_phi = sys; Kp = 0.3; Ki = 0.01; Kd = 0.1; sim('simulink_model'); plot(simout);