当前位置: 首页 > news >正文

基于S7-200 SMART实现PID控制仿真实验

关键字:Matalb;S7-200 SMART;Modbus TCP;PID控制

系列文章目录

基于S7-200 SMART实现一键启停
顺序功能图——(二)设计机组延时关机程序
基于S7-200 SMART实现Modbus TCP通信
基于S7-200 SMART实现MATLAB写入与读取PLC数据


文章目录

  • 系列文章目录
  • 前言
  • 一、MATLAB代码
    • 1.清除命令窗口、工作区、画图窗口
    • 2.参数设置
    • 3.创建modbus连接对象
    • 4.求离散传递函数
    • 5. 循环更新参数
  • 二、S7-200 SMART代码
    • 1.将double类型变量转换为real类型变量
    • 2.建立Modbus TCP服务器
    • 3.将real类型的过程变量转换为word类型的过程变量
    • 4.PID控制器
      • 4.1PID回路控制算法
      • 4.2PID向导
      • 4.3PID0_CTRL
    • 5.控制器输出处理
  • 三、仿真实验
    • 1.手动模式下的输出
    • 2.自动模式下的输出
  • 总结


前言

  基于S7-200 SMART可以通过向导实现PID控制,但是如果没有实验器材,很难观察到实际的控制效果。MATLAB作为一个强大的开发软件,支持工业上常用的通信协议,而且MATLAB也经常用作仿真实验。如果在MATLAB中模拟被控对象,并将被控对象数据与控制器数据通过Modbus TCP进行传输,就可以实现基于PLC的PID控制仿真。


一、MATLAB代码

1.清除命令窗口、工作区、画图窗口

clc;
clear;
close all;

2.参数设置

  建立电加热锅炉模型:
G ( s ) = Δ T Δ U = K T 1 s + 1 e T 2 s = 0.134 s + 0.035 e − 0.03 s (1) G\left( s \right)=\frac{\Delta T}{\Delta U}=\frac{K}{T_1s+1}e^{T_2s}=\frac{0.134}{s+0.035}e^{-0.03s} \tag{1} G(s)=ΔUΔT=T1s+1KeT2s=s+0.0350.134e0.03s(1)

tol=0.03;                                                                   % 纯滞后时间
num_c=[0.134];                                                              % 连续系统分子系数
den_c=[1,0.035];                                                            % 连续系统分母系数
Ts=1;                                                                       % 采样时间
c=0;c_1=0;                                                                  % 系统输出c=c(k)、c_1=c(k-1)
u=0;u_1=0;u_2=0;                                                            %控制器输出u=u(k)、u_1=u(k-1)、u_2=u(k-2)

3.创建modbus连接对象

mb = modbus('tcpip','192.168.2.1',502);
mb.Timeout = 20;

4.求离散传递函数

  基于采样时间 T s = 1 s T_s=1s Ts=1s,基于Z变换对连续系统进行离散化:
G ( z ) = 0.1278 z − 1 + 0.003884 z − 2 1 − 0.9656 z − 1 = n u m _ d ( 1 ) z − 1 + n u m _ d ( 2 ) z − 2 1 + d e n _ d ( 2 ) z − 2 (2) G\left( z \right)=\frac{0.1278z^{-1}+0.003884z^{-2}}{1-0.9656z^{-1}}=\frac{num\_d\left( 1 \right)z^{-1}+num\_d\left( 2 \right)z^{-2}}{1+den\_d\left( 2 \right)z^{-2}} \tag{2} G(z)=10.9656z10.1278z1+0.003884z2=1+den_d(2)z2num_d(1)z1+num_d(2)z2(2)从上式可得离散化的对象输出公式:
c ( k ) = − d e n _ d ( 2 ) c ( k − 1 ) + n u m _ d ( 1 ) u ( k − 1 ) + n u m d ( 2 ) u ( k − 2 ) ; (3) c\left( k \right)=-den\_d\left( 2 \right)c\left( k-1 \right)+num\_d\left( 1 \right)u\left( k-1 \right)+num\ _d\left( 2 \right)u\left( k-2 \right); \tag{3} c(k)=den_d(2)c(k1)+num_d(1)u(k1)+num d(2)u(k2);(3)

% continue system
sys_c=tf(num_c,den_c,'inputdelay',tol);
% discrete system
sys_d=c2d(sys_c,Ts,'zoh');
[num_d,den_d]=tfdata(sys_d,'v');

5. 循环更新参数

while true% 基于离散传递函数计算锅炉的温度c=-den_d(2)*c_1+num_d(1)*u_1+num_d(2)*u_2;% 将对象的输出写入到PLC中write(mb,'holdingregs',1,c,'double');% 将控制器输出读取到u中u = read(mb,'holdingregs',9,1,'int16');u = 100*u/27648;% 更新参数c_1=c;u_2=u_1;u_1=u;pause(Ts);
end

二、S7-200 SMART代码

1.将double类型变量转换为real类型变量

Alt

图2.1 将MATLAB传输的double类型数据转换为real类型数据

  在MATLAB中的小数是通过double类型写入PLC中,而PLC中的double类型变量是存放在V寄存器的一个字节中,将输入的double类型数据转换为可以供PID指令使用的real类型可以使用指令DF_R。

2.建立Modbus TCP服务器

Alt

图2.2 建立Modbus TCP服务器

  在PLC中建立Modbus TCP服务器,用于和MATLAB中的Modbus TCP客户端进行通信,各个端口的含义如下:

  • EN:功能块使能端,EN=1功能块有效,EN=0功能块无效;
  • Connect:功能块Server功能,Connect=1激活Server功能,Connect=0关闭Server功能,注意在更改相关参数时需要令Connect=0,否在将会报错;
  • IP_Port:网络端口,默认502;
  • MaxIQ:可操作输入/输出线圈最大个数,将可用于 Modbus 地址 0xxxx 到 1xxxx 的 I 和 Q 点数设置为 0 至 256。值 0 表示禁用对输入和输出的所有读取和写入。建议将 MaxIQ 值设置为 256;
  • MaxAI:可操作输入寄存器最大个数,将可用于 Modbus 地址 3xxxx 的字输入 (AI) 数设置为 0 至 56。值 0 表示禁用对模拟量输入的读取。要允许访问所有 CPU 模拟量输入。对于 CPU CR40 和 CR60为 0,对于所有其它 CPU 型号为 56;
  • MaxHold:可操作保持寄存器最大个数,设置可用于 Modbus 地址 4xxxx 或 4yyyyy 的 V 存储器中的字保持寄存器数,需要注意的是一个保持寄存器占用两个V寄存器的字节,即一个VM;
  • HoldStart:保持寄存器的开始地址,如果 HoldStart 指向超出允许范围的存储位置,则 Modbus TCP 库指令将返回错误。CPU 还会生成非致命错误:间接寻址错误 (0x06);
  • Done:Modbus TCP通信状态,Done=1连接至客户端设备、与客户端断开连接、响应 Modbus 请求、返回错误,Done=0没有请求用于此程序周期
  • Error:指令执行结果代码,且仅在发生错误后的一个周期内有效。

3.将real类型的过程变量转换为word类型的过程变量

Alt

图2.3 将real类型的过程变量转换为word类型的过程变量

  在PLC中将过程变量的REAL值转换为PID控制器可以识别的WORD,各个端口的含义如下:

  • EN:功能块使能端,EN=1功能块有效,EN=0功能块无效;
  • Inpuut:输入的REAL类型值;
  • ISH:输入REAL类型值的上限;
  • ISL:输入REAL类型值的下限;
  • OSH:输出WORD类型值的上限;
  • OSL:输出WORD类型值的下限;
  • Output:输出的WORD类型值。

4.PID控制器

4.1PID回路控制算法

  在介绍如何使用向导设置PID控制之前,需要了解S7-200 SMART的PID控制器算法。首先给出时域下的PID控制器输出:
M ( t ) = K C e + K I ∫ e d t + M i n i t i a l + K D d e d t (4) M\left( t \right)=K_Ce+K_I{\int e\, dt}+M_{initial}+K_D\frac{de}{dt} \tag{4} M(t)=KCe+KIedt+Minitial+KDdtde(4)其中 M ( t ) 、 e 、 K C 、 K I 、 K D 、 M i n i t i a l M\left( t \right)、e、K_C、K_I、K_D、M_{initial} M(t)eKCKIKDMinitial分别表示当前时间下的控制器输出函数、当前时间下的系统误差函数、比例系数、积分系数、微分系数、回路输出的初始值。将上述公式离散化后可得:
M n = K C e n + K I T S ∑ k = 1 n e n + M i n i t i a l + K D e n − e n − 1 T S (5) M_n=K_Ce_n+K_IT_S{\sum_{k=1}^n e_n}+M_{initial}+K_D\frac{e_n-e_{n-1}}{T_S} \tag{5} Mn=KCen+KITSk=1nen+Minitial+KDTSenen1(5)其中 M n 、 e n 、 e n − 1 、 T S M_n、e_n、e_{n-1}、T_S Mnenen1TS分别表示当前采样时刻的控制器输出、当前采样时刻的误差、前一个采样时刻的误差、采样时间。引入参数前一个采样时刻的积分值 M X MX MX,上述离散化PID控制器输出可化为:
M n = K C e n + K I T S e n + M X + M i n i t i a l + K D e n − e n − 1 T S (6) M_n=K_Ce_n+K_IT_Se_n+MX+M_{initial}+K_D\frac{e_n-e_{n-1}}{T_S} \tag{6} Mn=KCen+KITSen+MX+Minitial+KDTSenen1(6)考虑
e n = P V n − S V n (7) e_n=PV_n-SV_n \tag{7} en=PVnSVn(7)其中 P V n 、 S V n PV_n、SV_n PVnSVn分别表示过程变量与设定变量。将公式(4)代入公式(3)可得:
M n = M P n + M I n + M D n = K C ( S P n − P V n ) + K I T S ( S P n − P V n ) + M X + K D [ ( S P n − P V n ) − ( S P n − 1 − P V n − 1 ) ] T S = K C ( S P n − P V n ) + K I T S ( S P n − P V n ) + M X + K D ( P V n − 1 − P V n ) T S = K C ( S P n − P V n ) + K C T I T S ( S P n − P V n ) + M X + K C T D ( P V n − 1 − P V n ) T S (8) \begin{align} M_n &=MP_n+MI_n+MD_n \\ &={K_C\left( SP_n-PV_n \right)} +{K_IT_S\left( SP_n-PV_n \right)+MX} +{K_D\frac{\left[ \left( SP_n-PV_n \right)-\left( SP_{n-1}-PV_{n-1} \right) \right]}{T_S}} \\ &={K_C\left( SP_n-PV_n \right)}+{K_IT_S\left( SP_n-PV_n \right)+MX} +{K_D\frac{\left( PV_{n-1}-PV_n \right)}{T_S}} \\ &={K_C\left( SP_n-PV_n \right)}+{\frac{K_C}{T_I}T_S\left( SP_n-PV_n \right)+MX} +{K_CT_D\frac{\left( PV_{n-1}-PV_n \right)}{T_S}} \end{align} \tag{8} Mn=MPn+MIn+MDn=KC(SPnPVn)+KITS(SPnPVn)+MX+KDTS[(SPnPVn)(SPn1PVn1)]=KC(SPnPVn)+KITS(SPnPVn)+MX+KDTS(PVn1PVn)=KC(SPnPVn)+TIKCTS(SPnPVn)+MX+KCTDTS(PVn1PVn)(8)其中 M P n 、 M I n 、 M D n MP_n、MI_n、MD_n MPnMInMDn分别表示当前采样时刻控制器比例项输出、积分项输出、微分项输出。

4.2PID向导

  在PLC中可以通过向导实现PID控制器的各种参数设置:
①点击工具栏的PID向导:
Alt

图2.4 打开PID向导

②回路选择
Alt

图2.5 选择需要组态的回路

③回路命名
Alt

图2.6 回路命名

④控制参数设置
Alt

图2.7 PID控制参数设置

控制器类型可以选择温度或常规:
Alt

图2.8 控制器类型

这里由于是对MATLAB中的被控对象进行仿真,控制器类型选择常规。
Alt

图2.9 启用双向输出

如果勾选了双向输出,正向参数中的增益只能为正,负向参数中的增益只能为负。在双向输出的情况下允许 S V n < P V n SV_n<PV_n SVn<PVn的情况出现,此时负向输出有效,在 S V n ≥ P V n SV_n \ge PV_n SVnPVn时正向输出有效。如果不勾选双向输出则没有负向参数设置、只有正向参数设置,如果增益大于零则属于正向控制——控制器正作用于回路,此时只有 S V n ≥ P V n SV_n \ge PV_n SVnPVn输出有效;如果增益小于零则属于负向控制——控制器反作用于回路,此时只有 S V n ≤ P V n SV_n \le PV_n SVnPVn输出有效。不勾选双向输出的情况下,对于增益值为 0.0 的 I 或 ID 控制,如果将积分时间和微分时间指定为正值,则控制器将是正作用回路;如果指定负值,则控制器将是反作用回路。
Alt

图2.10 设置增益与积分时间

在MATLAB中通过比例度整定法确认增益 K C = 7.21 K_C=7.21 KC=7.21、积分时间 T I = 11 s T_I=11s TI=11s故在向导中分别将增益、积分时间设置为 7.21 、 1.7 60 ≈ 0.028 7.21、\frac{1.7}{60}\approx0.028 7.21601.70.028分钟。需要注意的是如果不需要积分作用,则可设置积分时间= 10000.0 m i n 10000.0min 10000.0min;如果不需要微分作用,则可设置微分时间= 0.0 m i n 0.0min 0.0min;如果不需要比例作用,则设置增益= 0.0 0.0 0.0,此时积分环节与微分环节的计算是基于 K C = 1.0 K_C=1.0 KC=1.0进行的:
M I n = K C T I T S ( S P n − P V n ) + M X = 1 T I T S ( S P n − P V n ) + M X M D n = K C T D ( P V n − 1 − P V n ) T S = T D ( P V n − 1 − P V n ) T S (9) \begin{align} MI_n &=\frac{K_C}{T_I}T_S\left( SP_n-PV_n \right)+MX \\ &=\frac{1}{T_I}T_S\left( SP_n-PV_n \right)+MX \\ MD_n &=K_CT_D\frac{\left( PV_{n-1}-PV_n \right)}{T_S} \\ &=T_D\frac{\left( PV_{n-1}-PV_n \right)}{T_S} \end{align} \tag{9} MInMDn=TIKCTS(SPnPVn)+MX=TI1TS(SPnPVn)+MX=KCTDTS(PVn1PVn)=TDTS(PVn1PVn)(9)
Alt

图2.11 不激活PID

为了获得更好的PID控制效果,往往会选择不激活PID,在程序运行后通过PID整定控制面板进行控制激活。
⑤输入参数设置
Alt

图2.12 不激活PID

过程变量的标定有单极、单极20%偏移量、双极、温度×10℃和温度×10℉:

  • 单极: 0 ∼ 10 0\sim10 010V、 0 ∼ 20 0\sim20 020mA、 0 ∼ 5 0\sim5 05V;
  • 单极20%偏移量: 1 ∼ 5 1\sim5 15V、 4 ∼ 20 4\sim20 420mA;
  • 双极: − 10 ∼ 10 -10\sim10 1010V、 − 5 ∼ 5 -5\sim5 55V
  • 温度×10℃/℉:特定的温度模块

这里使用的选择双极。
⑥输出参数设置
Alt

图2.13 输出参数设置

在输出类型中可选择模拟量或数字量。模拟量可从模拟量模块输出、数字量是通过PWM控制其他传感器。
⑦控制区域参数设置
Alt

图2.14 控制区域参数设置

在控制区域中无任何设置。
⑧报警
Alt

图2.15 报警

报警包括过程变量上限报警、过程变量下限报警、模拟量模块报警。
⑨代码
Alt

图2.16 设置代码名称与手动控制

需要注意的是子例程与中断例程内容是被封存的,添加手动PID控制可以控制PID控制器屏蔽过程变量与设置变量,输出任意合法值。
⑩为PID控制相关参数分配地址
Alt

图2.17 为控制器相关参数分配存储地址

分配地址后相关参数将会存储到对应的位置,在数据块中可见:
Alt

图2.18 数据块

从数据块中的分布可见,参数保存到了VB8000~VB8239的地址中。
⑪组件
Alt

图2.19 组件

在组件页面中主要是确认准备初始化的各种内容信息。
⑫最后在完成页面点击生成
Alt

图2.20 在完成页面点击生成

4.3PID0_CTRL

Alt

图2.21 PID控制器

  在PLC中实现PID控制,各个端口的含义如下:

  • EN:功能块使能端,EN=1功能块有效,EN=0功能块无效;
  • PV_I:输入过程变量
  • Setpont_R:输入设定变量
  • Auto_Manual:自动模式/手动模式切换,Auto_Manual=1自动模式,Auto_Manual=0手动模式;
  • Manual_Output:手动模式下的输出 0.0 ∼ 1.0 0.0\sim1.0 0.01.0
  • Output_Forward:正向回路输出,输出的范围与向导中的选择有关,单极 0 ∼ 27648 0\sim27648 027648,双极 − 27648 ∼ 27648 -27648\sim27648 2764827648
  • Output_Reverse:反向回路输出,输出的范围与向导中的选择有关,单极 0 ∼ 27648 0\sim27648 027648,双极 − 27648 ∼ 27648 -27648\sim27648 2764827648
  • HighAlarm:PV值高限位报警,PV值高限位值可在向导中确定;
  • LowAlarm:PV值低限位报警,PV值低限位值可在向导中确定;
  • ModuleErr:PID控制器错误信号,ModuleErr=1PID控制器错误,ModuleErr=0PID控制器无错误;
  • ErrorCode:错误代码。

5.控制器输出处理

Alt

图2.22 PID控制器输出处理

  基于输入的过程变量实数值 r P V rPV rPV与设定变量实数值 r S V rSV rSV,即实际的温度与设定温度之间的关系,确定控制器输出:

  • r S V ≥ r P V rSV \ge rPV rSVrPV:PID控制输出为正向输出,此时令 w M = w M 1 wM=wM1 wM=wM1,即实际控制器输出=正向控制器输出;
  • r S V < r P V rSV < rPV rSV<rPV:PID控制输出为正向输出,此时令 w M = − w M 2 wM=-wM2 wM=wM2,即实际控制器输出=-反向控制器输出。

三、仿真实验

1.手动模式下的输出

  将Auto_Manual的输入端置0,开启手动模式:
Alt

图3.1 手动模式

在单极输出的情况下:
Alt

图3.2 单极输出

激活PID控制:
Alt

图3.3 激活PID输出

对于单极输出的情况下Manual_Output=0.5:
Alt

图3.4 单极输出Manual_Output=0.5

对于单极输出的情况下Manual_Output=1.0:
Alt

图3.5 单极输出Manual_Output=1.0

对于单极输出的情况下Manual_Output=-0.5:
Alt

图3.6 单极输出Manual_Output=-0.5

对于单极输出的情况下Manual_Output=-1.0:
Alt

图3.7 单极输出Manual_Output=-1.0

在双极输出的情况下:
Alt

图3.8 双极输出

对于双极输出的情况下Manual_Output=0.5:
Alt

图3.9 双极输出Manual_Output=0.5

对于双极输出的情况下Manual_Output=1.0:
Alt

图3.10 双极输出Manual_Output=1.0

对于双极输出的情况下Manual_Output=-0.5:
Alt

图3.11 双极输出Manual_Output=-0.5

对于双极输出的情况下Manual_Output=-1.0:
Alt

图3.12 双极输出Manual_Output=-1.0

2.自动模式下的输出

Alt

图3.13 自动模式

启动MATLAB程序:
Alt

图3.14 运行MATLAB程序

通过PID整定控制面板激活PID控制:
Alt

图3.15 激活PID控制

写入设定值SV=40.0:
Alt

图3.16 写入设定值40.0

PID控制结果:
Alt

图3.17 设定值等于40.0时的PID控制结果

写入设定值SV=-30.0:
Alt

图3.18 写入设定值-30.0

PID控制结果:
Alt

图3.19 设定值等于-30.0时的PID控制结果

总结

  本文基于MATLAB与S7-200 SMART实现了PID控制的仿真。

相关文章:

基于S7-200 SMART实现PID控制仿真实验

关键字&#xff1a;Matalb&#xff1b;S7-200 SMART&#xff1b;Modbus TCP&#xff1b;PID控制 系列文章目录 基于S7-200 SMART实现一键启停 顺序功能图——&#xff08;二&#xff09;设计机组延时关机程序 基于S7-200 SMART实现Modbus TCP通信 基于S7-200 SMART实现MATLAB写…...

社交及时通讯平台完整版源码,uniapp技术,可打包成app

源码简介&#xff1a; 全原生&#xff0c;从底层开始结构就完全不一样&#xff0c;mongodb的库&#xff0c;uniapp混编手端&#xff0c;二开难度要比视酷或者酷信容易很多。全开源&#xff0c;带开发文档。前端用的是uniapp技术&#xff0c;所以是多端合一&#xff0c;可以做h…...

TensorFlow和Pytorch是什么?干什么用的?

TensorFlow和Pytorch都是机器学习框架&#xff0c;允许用户自定义开发机器学习模型&#xff08;利用已经实现好的神经网络层&#xff09;。 1. 加载和预处理数据 加载数据&#xff1a;使用合适的库&#xff08;如 Pandas、Numpy 或 TensorFlow 的数据处理 API&#xff09;从文…...

采购人可否自行选择采购方式?|数智化招采系统支持多种采购方式

采购人是否有权自行确定采购方式&#xff0c;主要取决于采购项目的性质和规模&#xff0c;特别是是否达到公开招标的数额标准。 一、达到公开招标数额标准以上的项目 《中华人民共和国政府采购法实施条例》第二十三条规定&#xff1a;“采购人采购公开招标数额标准以上的货物…...

ubuntu dde 改为中文

在 Ubuntu Deepin Desktop Environment (DDE) 中&#xff0c;如果已经将系统语言设置为中文&#xff0c;但系统菜单仍然显示英文&#xff0c;可以尝试以下步骤解决&#xff1a; 检查语言设置&#xff1a;确保你的系统语言已经正确设置为中文。你可以在“系统设置”->“区域和…...

Nginx配置小细节,location和proxy_pass 斜杠/ 问题

理解nginx的配置有助于理解前后端调用的过程&#xff0c;这里是location与proxy_pass需要注意的点 location 不带斜杠 的是模糊匹配&#xff0c;例如 location /abc 可以匹配 /abc/index.html&#xff0c;也可以匹配 /abcd/index.html location 带斜杠的是固定匹配&#xff0c…...

java 解析 PDF OFD 发票 部分文字缺失

1、pdfbox https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox 到这里用最新的版本 最近碰到发票各式各样&#xff0c;千奇百怪&#xff1a;记录其中一个 解析出来是&#xff1a;缺少一个通字 发票好几处都缺少文字&#xff0c;解析出来的是 一个 圆点 原因&…...

C/C++数字与字符串互相转换

前言&#xff1a; 在C/C程序中&#xff0c;会需要把数字与字符串做出互相转换的操作&#xff0c;用于实现程序想要的效果。下面将介绍多种方法实现数字与字符串互相转换。 字符串转为数字 一、利用ASCII 我们知道每个字符都有一个ASCII码&#xff0c;利用这一点可以将字符-0…...

[Spring] Spring AOP

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…...

鸿蒙 webview 实现顶部 Progress进度条

1, 先看效果 2, 直接cv代码 import web_webview from ohos.web.webview;interface PerUrl {url: string,age: number } Component export struct webviews {controller: web_webview.WebviewController new web_webview.WebviewController();ports: web_webview.WebMessageP…...

Pytest-BDD实现接口自动化测试,并附全部代码

引言 在之前的文章中简单的介绍了怎么使用Pytest-BDD进行接口测试&#xff0c;可以参考《pytest-bdd 行为驱动自动化测试》。本篇文章主要介绍使用Pytest-BDD实现接口自动化测试。后面的文章会介绍生成测试报告&#xff0c;和流程性接口测试。 feature文件 首先我们先整理好…...

Sqli-labs-master靶场--布尔盲注

目录 1、布尔盲注 2、布尔盲注的流程&#xff08;以靶场less-8为例&#xff09; 2.1输入id尝试是否存在注入点 2.1.1通过以上尝试&#xff0c;联想到可能是布尔盲注 2.2猜测数据库长度 2.3获取数据库名 2.3.1python脚本获取 代码&#xff1a; 获取结果为&#xff1a; …...

【QGroundControl二次开发】十. QT添加GStreamer视频播放同时保存

上一章介绍使用QT播放GStreamer视频流 【QGroundControl二次开发】八. QT实现播放gstreamer视频。 这章介绍如何在原有基础上保存为视频,同时保存为一个个规定大小的小视频。 先展示代码: #include <QApplication> #include <QWidget> #include <QtConcurrent…...

double类型 精度丢失的问题

前言 精度丢失的问题是在其他计算机语言中也都会出现&#xff0c;float和double类型的数据在执行二进制浮点运算的时候&#xff0c;并没有提供完全精确的结果。产生误差不在于数的大小&#xff0c;而是因为数的精度。 一、double进行运算时,经常出现精度丢失 0.10.2使用计算…...

C++ 重要特性探究

shared_from_this 使用分析 场景 类的成员函数需要获取指向自身的shared_ptr的时候类成员函数传递shared_ptr给其他函数或者对象的时候&#xff0c;目的是为了管理对象生命周期使用方法 首先类必须继承 std::enable_shared_from_this<T>必须使用 shared_from_this 获取指…...

c++_游戏_狼人杀

思路主要包括以下几个部分&#xff1a; 角色分配&#xff1a;代码中通过随机数的方式给狼人、平民、预言家和法师等角色进行分配&#xff0c;保证每个角色的数量和身份的随机性。 游戏进行&#xff1a;根据狼人、平民、预言家和法师等角色的身份&#xff0c;游戏进行了夜晚和白…...

MySQL——数据类型、索引的建立、数据的约束

文章目录 数据类型索引的建立普通索引唯一索引使用ALTER 命令添加和删除索引使用ALTER 命令添加和删除主键显示索引信息 数据的约束非空约束&#xff1a;not null&#xff0c;值不能为null唯一约束&#xff1a;unique&#xff0c;值不能重复主键约束&#xff1a;primary key外键…...

常见框架漏洞详解③!!

Apache Apache 是世界使⽤排名第⼀的 Web 服务器软件。它可以运⾏在⼏乎所有⼴泛使⽤的计算 机平台上&#xff0c;由于其跨平台和安全性被⼴泛使⽤&#xff0c;是最流⾏的 Web 服务器端软件之⼀。 apache⽬录结构&#xff1a; bin&#xff1a;存放常⽤命令⼯具&#xff0c;如h…...

大数据基础知识

大数据&#xff08;Big Data&#xff09;是指无法用传统数据处理工具和技术有效处理的大规模、复杂的数据集。大数据技术通过对这些数据进行存储、处理和分析&#xff0c;从中提取有价值的信息和见解。 1. 大数据的特点 大数据通常具有以下四个主要特点&#xff0c;被称为“4…...

SQL Server 的透明数据加密

透明数据加密是SQL Server数据库安全众多特性中的一个&#xff0c;本文只针对透明数据加密。 在此测试之前&#xff0c;已经按照文档如何快速获得一个测试用SQL Server企业版创建了一个SQL Server 2019&#xff0c;并按照文档为SQL Server安装示例数据库AdventureWorks安装了…...

一起学Spring AI:核心概念

人工智能概念 本节描述了 Spring AI 使用的核心概念。我们建议您仔细阅读&#xff0c;以理解 Spring AI 实现背后的思想。 模型&#xff08;Models&#xff09; 人工智能模型是设计用来处理和生成信息的算法&#xff0c;通常模仿人类的认知功能。通过从大型数据集中学习模式…...

链表题解——环形链表【LeetCode】

141. 环形链表 方法一 核心思想&#xff1a; 使用一个集合 seen 来记录已经访问过的节点。遍历链表&#xff0c;如果当前节点已经存在于集合中&#xff0c;说明链表存在环&#xff1b;否则&#xff0c;将当前节点添加到集合中&#xff0c;继续遍历。如果遍历结束&#xff08;h…...

免费插件集-illustrator插件-Ai插件-随机填色

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;实现路径随机填色。首先从下载网址下载这款插件https://download.csdn.net/download/m0_67316550/87890501&#…...

DelayQueue、ScheduledThreadPoolExecutor 和 PriorityBlockingQueue :怎么利用堆实现定时任务

DelayQueue DelayQueue 的最大亮点&#xff1a; 并不是简单全局锁的“单调队列”实现&#xff0c;而是用Leader-Follower 模式极大减少了线程唤醒的开销。插入与唤醒、等待与 leader 变更&#xff0c;都通过巧妙的锁和条件变量组合完成。 如果只关注“线程安全的优先队列全局…...

tensorflow image_dataset_from_directory 训练数据集构建

以数据集 https://www.kaggle.com/datasets/vipoooool/new-plant-diseases-dataset 为例 目录结构 训练图像数据集要求&#xff1a; 主目录下包含多个子目录&#xff0c;每个子目录代表一个类别。每个子目录中存储属于该类别的图像文件。 例如 main_directory/ ...cat/ ...…...

Vue3 GSAP动画库绑定滚动条视差效果 绑定滚动条 滚动条动画 时间轴

介绍 GSAP 用于创建高性能、可控制的动画效果。由 GreenSock 团队开发&#xff0c;旨在提供流畅、快速、稳定的动画效果&#xff0c;并且兼容各种浏览器。 提供了多个插件&#xff0c;扩展了动画的功能&#xff0c;如 ScrollTrigger&#xff08;滚动触发动画&#xff09;、Dra…...

手机号段数据库与网络安全应用

手机号段数据库的构成与原理 手机号段数据库存储着海量手机号段及其关联信息&#xff0c;包括号段起始与结束号码、运营商归属、地区编码、卡类型等核心数据。这些数据主要来源于通信管理机构的官方分配信息、运营商的业务更新数据以及合法采集的使用数据。经过数据清洗、校验…...

Imprompter: Tricking LLM Agents into Improper Tool Use

原文&#xff1a;Imprompter: Tricking LLM Agents into Improper Tool Use 代码&#xff1a;Reapor-Yurnero/imprompter: Codebase of https://arxiv.org/abs/2410.14923 实机演示&#xff1a;Imprompter 摘要&#xff1a; 新兴发展的Agent可以将LLM与外部资源工具相结合&a…...

Linux基础命令which 和 find 简明指南

&#x1f3af; Linux which 和 find 命令简明指南&#xff1a;从入门到实用 &#x1f4c5; 更新时间&#xff1a;2025年6月7日 &#x1f3f7;️ 标签&#xff1a;Linux | which | find | 命令行 | 文件查找 文章目录 前言&#x1f31f; 一、Linux 命令的本质与 which、find 的作…...

03 Deep learning神经网络的编程基础 代价函数(Cost function)--吴恩达

深度学习中的损失函数(Cost Function)用于量化模型预测与真实数据的差距,是优化神经网络的核心指标。以下是常见类型及数学表达: 核心原理 逻辑回归通过sigmoid函数将线性预测结果转换为概率: y ^ ( i ) \hat{y}^{(i)}...