EPICS DataBase详解

1、分布式EPICS设置

1) 操作界面:包括shell命令行方式(caget, caput, camonitor等)和图形界面方式(medm, edm, css等)。

2)输入输出控制器(IOC)

2、IOC

1) 数据库:数据流,基本上周期运行

2)sequencer:基本上按需的状态机

"硬"IOCs运行vxWorks并且直接连接了A/D, D/A, LLRF等硬件。

"软"IOCs运行在linux等上并且除了串口或网络设备外没有I/O硬件。

3、IOC数据库

1)'IOCcore'软件装载并且执行'记录(records)'-记录配置替代了编写自定义代码。

2)所有控制系统控制箱有:GUI工具; 网络协议;硬件驱动,但基本上没有一个相当的数据库。

4、示例:基本的温度控制

任务:

1)从设备读取温度

2)根据需要接通/断开开关

3)重复

一个温控数据库:

使用VisualDCT设计的由四个记录组成的数据库:

1)模拟输入记录(ai:$(TANK)TEMPERATURE)从设备读取温度值,并且把温度值写入到calcout($(TANK)CHECK)记录。

2)calcout($(TANK)CHECK)记录是通过通道访问从$(TANK)TEMPERATURE获取当前温度和通过数据库访问从模拟输入记录ai($(TANK)SETPOINT)获取了设定温度,并且把二者进行比较,并且把比较结果写入到二进制输出记录bo($(TANK)SWITCH)。

3)二进制输出记录bo($(TANK)SWITCH)根据写入的值是0或1,向设备发出断开或者闭合开关的指令。

以下是文本数据库:

1)$(TANK)TEMPERATURE:模拟输入记录ai用于读取设备的输入。

2)$(TANK)CHECK:calcout记录用于比较输入和设定值,并且在比较结果发生变化时,输出比较结果。

3)$(TANK)SWITCH:二进制输出记录bo,向设备输出向其写入的值。

4)$(TANK)SWITCH_RBV:二进制输入记录bi,用于读取设备的开关状态。

5)$(TANK)SETPOINT:模拟输入记录ai,提供给用户设置温度设定值。

record(ai, "$(TANK)TEMPERATURE") {field(DESC, "Read Temperature")field(SCAN, "I/O Intr")field(DTYP,"asynFloat64")field(INP,"@asyn($(PT1), 0,1000)FLOAT32_BE")field(PREC, "1")field(LINR, "NO CONVERSION")field(EGU, "Celsius")field(HOPR, "100")field(LOPR, "0")field(SMOO, "0.5")field(HIGH, "15")field(HSV, "MINOR")field(PINI, "NO")
}record(calcout, "$(TANK)CHECK") {field(DESC, "Control Heater")field(CALC, "A<B")field(INPA, "$(TANK)TEMPERATURE CP MS")field(OUT, "$(TANK)SWITCH PP")field(OOPT, "On Change")field(DOPT, "Use CALC")field(INPB, "$(TANK)SETPOINT")
}record(bo, "$(TANK)SWITCH") {field(DESC, "Heater Switch")field(SCAN, "Passive")field(DTYP,"asynUInt32Digital")field(OUT,"@asynMask($(PT2) 0 0x1)")field(OMSL, "supervisory")field(ZNAM, "Open")field(ONAM, "Closed")field(IVOA, "Set output to IVOV")field(IVOV, "0")
}record(bi, "$(TANK)SWITCH_RBV") {field(DESC, "Heater Switch Readback")field(SCAN, "I/O Intr")field(DTYP,"asynUInt32Digital")field(INP,"@asynMask($(PT3) 0 0x1)")field(ZNAM, "Open")field(ONAM, "Closed")
}record(ai, "$(TANK)SETPOINT") {field(DESC, "Temperature Setpoint")field(SCAN, "Passive")field(INP, "10")field(HOPR, "100")field(LOPR, "0")
}

使用modbus-slave软件模拟设备端:

1)温度定义如下:用两个字组成一个32位大端浮点数

2) 开关定义如下:用一个线圈位模拟一个开关

启动脚本设定如下:

#!../../bin/linux-aarch64/tank#- You may have to change tank to something else
#- everywhere it appears in this file< envPathscd "${TOP}"## Register all support components
dbLoadDatabase "dbd/tank.dbd"
tank_registerRecordDeviceDriver pdbbasedrvAsynIPPortConfigure("TANK","192.168.50.252:502",0,0,1)
#modbusInterposeConfig(const char *portName,
#                      modbusLinkType linkType,
#                      int timeoutMsec,
#                      int writeDelayMsec)
modbusInterposeConfig("TANK",0, 5000,0)# one float32 input read
drvModbusAsynConfigure("PT1", "TANK", 1, 4,  0, 2, 0, 500,  "Tank")# one bit write
drvModbusAsynConfigure("PT2", "TANK", 1, 5,  0, 1, 0, 1000, "Tank")
# one bit read
drvModbusAsynConfigure("PT3", "TANK", 1, 1,  0, 1, 0, 500,  "Tank")## Load record instances
dbLoadRecords("db/tank.db","TANK=TANK:, PT1=PT1,PT2=PT2,PT3=PT3")cd "${TOP}/iocBoot/${IOC}"
iocInit

运行这个IOC,并且查看IOC中加载的记录:

../../bin/linux-aarch64/tank st.cmd
#!../../bin/linux-aarch64/tank
< envPaths
...
############################################################################
## EPICS R7.0.7
## Rev. 2023-05-18T10:40+0800
## Rev. Date build date/time:
############################################################################
iocRun: All initialization complete
## Start any sequence programs
epics> dbl
TANK:TEMPERATURE
TANK:SETPOINT
TANK:SWITCH_RBV
TANK:SWITCH
TANK:CHECK

CSS界面:

1) 当在modbus-slave中设置环境温度大于Set Point的温度时,开关会自动打开。

2)当在modbus-slave中设置环境温度小于Set Point的温度时,开关会自动闭合。

 

5、Database = Records + Fields + Links 

1)IOC装载并且执行一个或多个数据库。

2)每个数据库有若干记录。

3)每个记录有以下字段:

  • 名称(在整个网络上唯一)
  • 类型(确定字段和它们的功能)
  • 字段(属性,可以运行时被读取,绝大部分也能被写入)。
  • 经常有与硬件连接的设备支持。
  • 指向其他记录的链接。

6、记录是活动的

1)记录做事情的

  • 从其他记录或者硬件获取数据
  • 执行计算
  • 检查值范围,产生警报
  • 写入其他记录或硬件

记录做什么取决于记录类型,字段值,设备支持

2) 何时运行记录

记录周期性运行或者被事件或者其他记录触发运行。

除非一个记录被运行了,否则不发生操作。

7、第一个记录"first.db"

这是最简单的记录,它每秒产生一个随机数。

record(calc, $(P)Random)
{field(SCAN, "1 second")field(INPA,  "10")field(CALC,  "RNDM*A")
}

1)执行:softIoc -m P=FIRST: -d first.db

root@orangepi5:/usr/local/EPICS/program/softdb# softIoc -m P=FIRST: -d first.db
Starting iocInit
############################################################################
## EPICS R7.0.7
## Rev. 2023-05-18T10:40+0800
## Rev. Date build date/time:
############################################################################
iocRun: All initialization complete
epics>

2) 在另一个终端中:camonitor FIRST:Random

(base) [blctrl@localhost EPICS]$ camonitor FIRST:Random
FIRST:Random                   2024-05-01 03:34:42.839417 3.26696
FIRST:Random                   2024-05-01 03:34:43.839276 0.0920119
FIRST:Random                   2024-05-01 03:34:44.839298 2.97612
FIRST:Random                   2024-05-01 03:34:45.839343 4.24582
^C

3) 尝试dbl,dbpr, dbpf命令:

epics> dbl
FIRST:Random
epics> dbpf FIRST:Random 10
DBF_DOUBLE:         10
epics> dbpr FIRST:Random
A   : 10            AMSG:               ASG :               B   : 0
C   : 0             CALC: RNDM*A        D   : 0             DESC:
DISA: 0             DISV: 1             E   : 0             F   : 0
G   : 0             H   : 0             I   : 0             J   : 0
K   : 0             L   : 0             NAME: FIRST:Random  NAMSG:
SEVR: NO_ALARM      STAT: NO_ALARM      TPRO: 0
VAL : 3.27107652399481

数据库可以分开,用以下方法在一个IOC中加载若干数据库文件:

first_a.db:

# first_a.db
record(ai, "$(P)Range")
{info(autosaveFields, "VAL")field(INP,  "10")field(PINI, "YES")
}

first_b.db:

# first_b.db
record(calc, "$(P)Random")
{field(SCAN, "1 second")field(INPA, "$(P)Range")field(CALC, "RNDM*A")
}

#softIoc -m P=FIRST: -d first_a.db -d first_b.db     

root@orangepi5:/usr/local/EPICS/program/softdb# softIoc -m P=FIRST: -d first_a.db -d first_b.db         
Starting iocInit
############################################################################
## EPICS R7.0.7
## Rev. 2023-05-18T10:40+0800
## Rev. Date build date/time:
############################################################################
iocRun: All initialization complete
epics> dbl
FIRST:Range
FIRST:Random
epics>

8、记录类型

1)ai/ao:模拟输入/输出:-读取/写入数值,映射成工程单位

2)bi/bo:二进制输入/输出:-读取/写入位,映射成字符串

3)calc:公式

4)mbbi/mbbo:多位二进制输入/输出:-读取/写入16位数值,映射位模式到字符串。

5)stringin/stringout:longin/longout, seq, compress, histogram, waveform, sub, ..

9、公共字段

1)设计时间

  • -NAME:记录明,网上唯一。
  • -DESC:描述。
  • -SCAN:扫描机制。
  • -PHAS:扫描阶段。
  • -PINI:初始化时运行一次。
  • -FLNK:转发链接。

2)运行时

  • -TIME:时间戳。
  • -SEVR,STAT:警报严重性,状态。
  • -PACT:运行活动的。
  • -UDF:未定义?从未运行?
  • -PROC:强制运行。

3)还有

-TPRO:跟踪运行,设为1来调试记录运行。

10、记录扫描

1)SCAN字段

- 当被其它记录运行时:"Passive"(默认)

-周期地:".1 second", ".2 second", ".5 second", "1 second", "2 second", "5 second", "10 second"。

-事件触发:

  • "Event":(EVNT字段选择事件)
  • "I/O Intr":(如果设备支持允许这个)。

2)PHAS字段

对处于相同周期扫描地记录添加顺序。首先PHAS=0, 接着PHAS=1, ...

3)PINI字段

设置成"YES"使得记录启动时运行一次。对基本不再更改的"操作输入"记录有用,因此它们有一个初始值。

4)PROC字段

写入这个字段将运行一个记录。

11、数据库和IOC其它部分

1)记录扫描运行优先级高于通道访问或PV访问

在高CPU负载,PVs在记录仍然在运行时可能没有连接。

2)0.1秒扫描运行优先级高于10秒扫描。

3)PRIO字段为异步完成和事件扫描的记录选择优先级。

12、公有的输入/输出记录字段

  • DYTP:设备类型。
  • INP/OUT:如何读取/写入,格式取决于DTYP。
  • RVAL:原始值(例如:16位整数)
  • VAL:工程单位值(例如:64位float)

仅限输出:

  • DOL:所需输出链接。输出记录读取这个链接获取VAL,接着写入OUT。
  • OSML:输入模式选择,closed_loop, supervisory。
  • IVOA:无效时,输出操作。
  • DRVL,DRVH:驱动限制。

13、扩展"first.db"

一个从0到上限的渐变,通过一个单独的记录可以设置这个上限。

ramp.db:两个记录组成的数据库文件。

1)$(P)Limit是模拟输出记录,用它设置渐变的上限。使用输出。输入也有效,由于没有要读或要写的硬件,但仅输出有DRVH。

2)$(P)Ramp是calc记录,它每秒运行一次,如果计算结果小于上限,则其值每次加1,否则,其只被设为0。读取输入:A=我自己的当前值;B=$(P)Limit激烈的值。

record(ao, "$(P)Limit")
{field(DRVH, "100")field(DOL,  "9")field(PINI, "YES")
}record(calc, "$(P)Ramp")
{field(SCAN, "1 second")field(INPA, "$(P)Ramp")field(INPB, "$(P)Limit")field(CALC, "A<B?A+1:0")
}

使用softIoc -m P=SECOND: -d ramp.db

root@orangepi5:/usr/local/EPICS/program/softdb# softIoc -m P=SECOND: -d ramp.db
Starting iocInit
############################################################################
## EPICS R7.0.7
## Rev. 2023-05-18T10:40+0800
## Rev. Date build date/time:
############################################################################
iocRun: All initialization complete
epics> dbl
SECOND:Limit
SECOND:Ramp

从CSS软件中查看calc记录随时间的变化:

14、模拟记录字段

1)EGU:工程单位名称。

2)SMOO:平滑。

  • -VAL:(1-SMOO) * new_value + SMOO*last_value
  • -SMOO=0:VAL=new_value, 默认行为
  • -SMOO=1:VAL=last_value, 失效行为
  • -0<SMOO<1:VAL ‘平滑地’跟随最新地读数。

3)LINR:线性化(None, Slope, 断点表):-EGUL,EGUF,ESLO,EOFF:用于LINR的参数。

4)LOLO,LOW,HIGH,HIHI:警报限制:-LLSV,LSV,HSV,HHSV:相关联的警报严重性。

15、二进制记录字段

1) ZNAM, ONAM:对应"0", "1"的状态名称。

2)ZSV,OSV:警报严重性。

16、记录链接

1)输入或输出记录可以是

-其他记录的字段名称:“other”, “other.VAL”,"other.A"
  • 如果其他记录是在相同IOC中,"数据库链接"
  • 如果没有找到名称:"通道访问链接"
-硬件链接
  • 具体取决于设备支持
  • DTYP字段选择设备支持
  • 格式示例:"field(OUT,"@asynMask($(PT2) 0 0x1)")"

2) 输入链接可以是

-常数数值:"0", "3.14", "1.6e-19"。

3) 一个记录的FLNK记录在当前记录结束后运行另一个记录。

17、数据库链接

1) 格式:"record.field {flags}"

-VAL是字段的默认。

2)Flags:

-PP:运行一个被动目标记录。

  • INP,DOL:在读取前。
  • OUT:在写入后。

-NPP:非运行被动(默认)。

-MS:最大化严重性

-NMS:非MS(默认)

-MSS:最大化严重性和状态。

-MSI:当severity=INVALID时。

3)示例:

field("INP", "other_rec.VAL PP MS")

18、通道访问链接

当被链接的记录不是在这个IOC中时,自动使用通道访问链接。

flags:

-PP:被忽略。不触发另一个IOC上运行。

-MS,MSI:(INVALID时)最大化严重性。

通道访问链接flags:

1)CA:强制CA链接,即使目标记录在相同IOC中,可以用于打破'锁集'。

2)CP:用于INP链接,对收到的CA monitor时运行。一般在链接的值变化时引起运行。具体取决于源的MDEL。

3)CPP:CP,但仅限SCAN=Passive。

19、转发链接(Forward links)

1) 触发运行,但不传递数据。

2)如果SCAN=Passive,目标记录被运行。

3)可以使用CA链接:

-必须使用

  • FLNK=“other.PROC”(其他IOC)
  • FLNK=“ohter.PROC CA”(相同IOC)

-即使SCAN!=Passive,总是触发运行。

20、运行链

1) 运行链1

以上记录都是每0.1秒执行一次,执行顺序由PHAS=0,1,2指定;Calculation_1通过INPA字段从Input_1获取输入,Output_1通常DOL从Calculation_1获取输入。

2)运行链2

Input_2记录每0.1秒运行一次,在其运行结束时,通过FLNK链接,使得Calculation_2运行,在Calculation_2运行期间,通过INPA从Input_2获取输入,并进行计算,在其运行结束时,通过FLNK链接,使得Output_2运行,在Calculation_2运行期间,通过DOL从Calculation_2获取输入。

3)运行链3

Output_3记录每0.1秒记录运行一次,在其运行期间,通过DOL从Calculation_3获取输入,由于其链接属性是PP,此时Calculation_3开始运行,其运行期间通过INPA从Input_3获取输入,由于其输入链接是PP,此时Input_3开始运行,其运行结束后,Calculation_3获取了输入值,并进行计算并得到结果,此时Calculation_3运行结束,Output_3开始运行,从Calculation_3获取了输入,并完成之后的运行。

21、变化率示例

计算一个输入的变化率:

Rate记录的类型是calc,它每1秒钟运行一次,当其运行时,首先通过INPA从Input记录获取输入,并且存入其A字段,然后通过INPB记录从Input记录获取输入,由于此输入链接是PP属性,此时会将运行权交给Input记录使得Input记录运行,当其运行结束时,将运行全交给Rate记录,INPB获取了Input新产生的值,并且将其放入字段B,然后根据CALC中指定的A-B进行计算,计算结果便是Input记录一秒间隔的变化值。

22、仿真模式

当在仿真模式时,AO记录不调用设备支持并且AI记录从AO记录获取其输入。

23、多扫描触发

慢周期扫描和快变化响应

每5秒钟以及在AO记录被更改时,AI记录被运行。即使正常扫描速率非常满,这也提供了对操作人员更改的立即响应。对电源设置的更改被代表一个本地/远程切换开关的BO记录禁止。

24、设备支持

1)记录(AI, AO,..)靠它们自己仅读写其它记录。

2)设备支持链接它们到硬件

3)硬件设备支持是EPICS ‘base’之外的。根据需要被添加到IOC中。

4)DTYP选择了一个设备支持模块。

5)INP/OUT提供细节。

25、同步与异步

1)”快“:在记录被运行时,同步设备支持读或写一个记录的VAL。

2)"慢“:当记录被运行时,异步支持开始读取或写入。记录保持在PACT=true状态,并且在数据已经被读/写时,设备支持触发运行结束。

3)无论记录是否正在运行,通道访问'get/put'读/写当前VAL。

4) 通道访问'get/put callback'在运行结束时将结束。

26、'软'设备支持

1)用于AI,AO,BI,BO,...的"软通道"

读/写这个VAL字段

2)用于AI,AO,BI,BO,...的"原始软通道"

读写RVAL字段,转成/或从VAL转换

3)用于AI,AO,BI,BO,...的”异步软通道“

执行一个get/put回调,等待结束。

27、锁集

1)由链接连接起来的记录组。

2)运行一个记录锁定了它的锁集。

  • -防止由多个线程运行。
  • 类似,但技术上与PACT分开

常能透明地避免问题,使用"CA"标记打破锁集。

28、记录锁定 VS PACT

取决于记录地设备支持,一个记录可以运行很长时间:

-运行置位PACT并且触发驱动程序获取数据。

-一段时间后,驱动程序再次运行这个记录,并且复位PACT。

当以下情况,在锁集中的记录被锁定:

1)运行开始,在其结束时,再次,但不在两个时段之间。

2)读取一个字段。

3)写一个字段。

29、警报

1)公共字段:

  • SEVR:警报严重性。NONE,MINOR, MAJOR, INVALID
  • STAT:警报状态。UDF, READ, WRITE, CALC, HIGH, STATE, ...

2) 二进制字段

-ZSV, OSV:对应'zero'和'one'状态的严重性。

3)模拟字段

  • -LOLO, LOW, HIGH, HIHI:阈值
  • -LLSV, LSV, HSV, HHSV:相关的严重性。
  • HYST:回滞。

警报示例

当温度接近沸点时,产生警报:

record(ai, "$(P)TANK")
{field(DESC,  "Water Temperature")field(SCAN,  "xxx")field(INP,   "xxx")field(EGU,   "C")field(PREC,  "1")field(HIGH,  "90")field(HSV,   "MINOR")field(HIHI,  "100")field(HHSV,  "MAJOR")
}

30、监视死区

模拟记录发送更新给CA客户端

-MDEL:用于大部分客户端的变化yu'zhi

-ADEL:用于存档的客户端。

31、记录小提示

1)对用户输入使用AO,模拟输出

-DRVL,DRVH可以限制值范围。

2)BO记录可以用作计时器:

-HIGH字段:当写VAL=1时,保持1 HIGH秒。

-对操作接口按钮有用:按钮西1,记录在HIGH=1后恢复为0。

3)MBBI,MBBO记录映射状态:

  • 通过ZRVL/ZRST,ONVL/ONST,TWVL/TWST,...定义值和状态。
  • 可以像BI/BO一样使用:ZRVL=0, ONVL=1, ZRST<=>ZNAM, ONST<=>ONAM
  • 对于除了0,1外的值,ZRVL=0, ONVL=255
  • 从位解码限位开关状态:
    • ZRVL=0,ZRST=‘Moving’
    • ONVL=1,ONST='At Left limit'
    • TWVL=2,TWST='At Right Limt'
    • THVL=3,THST='Broken', THSV=MAJOR

4) 对if-then-else逻辑使用CALCOUT

  • INP*和CALC如CALC记录中的INP*和CALC。
  • OOPT "On Change", "When Zero", "Transition to Zero"等。
  • 输出可以使用CALC或者一个单独的OCAL。

5) SEQ, FANOUT, DFANOUT可以运行一个记录列表

  • 只是运行或者写值。
  • SEL可以从运行所有更改到运行选取的记录。

6)COMPRESS记录可以

  • 在一个环形缓存中保持最新的N个值。
  • 计算数组的平均,最大或最小。

7)ASUB记录可以调用C代码

  • INAM,SNAM:initial()和sub()的名称。
  • 很多INP*和VAL*字段。

8)EVENT记录可以提交数据库事件

-触发SCAN=Event并且EVNT=那个事件的记录。

32、Calcout记录详解

1)结合了calc记录和模拟输出功能。

  • -INPA,INPB,..., INPL和CALC计算VAL。
  • OUT指向要写VAL的位置。

2)OOPT确定了OUT是否/何时输出OUT。

-”Every time“, ”On Change“, ”When None-zero“, ”Transition to Zero“, ...

3)默认,VAL被输出,但也可以配置:

  • -field(OCAL, "A/B+..."):计算另外的OVAL
  • -field(DOPT, "Use OCAL"):选择输出OVAL而不是VAL到OUT。

4) 在一个记录内两个计算和一个"if"类型选择器。

record(calcout, “Corrector”)
{field(SCAN, “.1 second”)field(INPA, “Enable”)field(INPB, “Setpoint”)field(INPC, “Readback”)field(INPD, “17.54”)field(CALC, “A”)field(OOPT, “When Non-zero”)field(DOPT, “Use OCAL”)field(OCAL, “D*(B-C)”)field(OUT, ”SteeringMagnet PP”)
}

CALC确定我们是否应该做任何事情,OCAL用于实际计算,OVAL值用于实际输出到OUT。

33、EPICS base之外的'synApps'记录

1) MOTOR记录

用于控制电机的整个生态系统。

2)BUSY记录可以用于支持put-回调:

  • 某些设置点记录FLNKs指向设置BUSY记录=1的逻辑。
  • 当设备支持到达设置点,设置BUSY记录VAL=0
  • 在设置达到设置点后,指向设置点的CA 'put-callback'将结束。

34、Motor记录详解

1)这个记录有超过100个字段。

2)基本控制

  • VAL:电机需要的位置。支持put-calback
  • RBV:回读值,实际电机位置
  • DONE:结束移动电机了吗?
  • HLS,LLS:电机在上限位或下限位吗?
  • STOP:停止移动。

3) 分辨率:

-MRES,DIR,OFF,EGU:将电机脉冲数转成了"mm"或"degrees"工程单位。

-它时步进电机或伺服电机?我们有编码器吗,如果标定它。

4)移动

  • VBAS, VMAX,ACCL,HVEL,JVEL, ... 速度,加速度
  • HLM,LLM,移动范围的限制。
  • BDST,BACC,RTRY,...齿隙补偿,重试。

5)其它:Homing, "Jog", "tweak", status

35、时间戳

1)TIME一般设置成记录上次被运行的时间。

2)TSE=-2:例如,设备支持已经设置TIME为从硬件获取的准确触发时间。

3)TSE=1...255:设置TIME为从定时系统获取的事件1..255的上次发生。

4)TSEL:允许从另一个记录获取时间戳。

36、线性转换

模拟记录转换RVAL<=>VAL

1) LINR=NO CONVERSION,VAL=RVAL

2) LINR=SLOPE:VAL=(RVAL)*ESLO+EOFF。

这假设设备支持填充整数RVAL字段。如果设备支持已经有了一个浮点值,它放置这个值到浮点VAL字段。需要进一步转换,则使用一个CALC记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/6836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

插入法(直接/二分/希尔)

//稳定耗时&#xff1a; 双向冒泡&#xff0c;可指定最大最小值个数MaxMinNum<nsizeof(Arr)/sizeof(Arr[0]), void BiBubbleSort(int Arr[],int n&#xff0c;int MaxMinNum){int left0,rightn-1;int i;bool notDone true;int temp;int minPos;while(left<right&&am…

图像处理--空域滤波增强(原理)

一、均值滤波 线性滤波算法&#xff0c;采用的主要是邻域平均法。基本思想是使用几个像素灰度的某种平均值来代替一个原来像素的灰度值。可以新建一个MN的窗口以为中心&#xff0c;这个窗口S就是的邻域。假设新的新的像素灰度值为&#xff0c;则计算公式为 1.1 简单平均法 就是…

LeetCode 234.回文链表

题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff…

PWN入门之Stack Overflow

Stack Overflow是一种程序的运行时&#xff08;runtime&#xff09;错误&#xff0c;中文翻译过来叫做“栈溢出”。栈溢出原理是指程序向栈中的某个变量中写入的字节数超过了这个变量本身所申请的字节数&#xff0c;导致与其相邻的栈中的变量值被改变。 在本篇文章中&#xff…

常用语音识别开源四大工具:Kaldi,PaddleSpeech,WeNet,EspNet

无论是基于成本效益还是社区支持&#xff0c;我都坚决认为开源才是推动一切应用的动力源泉。下面推荐语音识别开源工具&#xff1a;Kaldi&#xff0c;Paddle&#xff0c;WeNet&#xff0c;EspNet。 1、最成熟的Kaldi 一个广受欢迎的开源语音识别工具&#xff0c;由Daniel Pove…

代码随想录算法训练营DAY54|C++动态规划Part15|647.回文子串、516最长回文子序列、

文章目录 647.回文子串思路CPP代码双指针 516最长回文子序列思路CPP代码 动态规划总结篇 647.回文子串 力扣题目链接 文章链接&#xff1a;647.回文子串 视频链接&#xff1a;动态规划&#xff0c;字符串性质决定了DP数组的定义 | LeetCode&#xff1a;647.回文子串 其实子串问…

第07-6章 应用层详解

HTTP、SSL&#xff1a;基于TCP&#xff0c;HTTP端口:80、HTTPS&#xff08;加密&#xff09;端口&#xff1a;443&#xff1b;FTP:基于TCP&#xff0c;两类端口&#xff1a;21、20&#xff08;数据传输之前需要建立连接此时是21&#xff0c;真正传输数据时用20&#xff09;TFTP…

机器学习中线性回归算法的推导过程

线性回归是机器学习中监督学习中最基础也是最常用的一种算法。 背景&#xff1a;当我们拿到一堆数据。这堆数据里有参数&#xff0c;有标签。我们将这些数据在坐标系中标出。我们会考虑这些数据是否具有线性关系。简单来说 我们是否可以使用一条线或者一个平面去拟合这些数据的…

如何在交换机上重置密码而不丢失配置?如何配置SSH远程登录?

在网络设备管理中&#xff0c;保持设备的安全性是至关重要的&#xff0c;所以console密码是必须设置的&#xff0c;绝对不能偷懒。 但是&#xff0c;如果习惯不好&#xff0c;或者离职时交接不好&#xff0c;就会导致密码丢失&#xff0c;此时想要修改网络设置的配置就麻烦了。…

华为OD机试 - 符号运算 - 递归(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

使用 FFmpeg 从音视频中提取音频

有时候我们需要从视频文件中提取音频&#xff0c;并保存为一个单独的音频文件&#xff0c;我们可以借助 FFmpeg 来完成这个工作。 一、提取音频&#xff0c;保存为 mp3 文件: 要使用 FFmpeg 从音视频文件中提取音频&#xff0c;并将 ACC 编码的音频转换为 MP3 格式&#xff0…

CNN实现fashion_mnist数据集分类(tensorflow)

1、查看tensorflow版本 import tensorflow as tfprint(Tensorflow Version:{}.format(tf.__version__)) print(tf.config.list_physical_devices())2、加载fashion_mnist数据与预处理 import numpy as np (train_images,train_labels),(test_images,test_labels) tf.keras.d…

Neo4j+LLM+RAG 环境配置报错处理

开发KGLLMRAG程序时遇到以下报错&#xff0c;记录下处理方案&#xff1a; ValueError: Could not use APOC procedures. Please ensure the APOC plugin is installed in Neo4j and that ‘apoc.meta.data()’ is allowed in Neo4j configuration 这个参考文章&#xff1a;link…

FFmpeg学习记录(四)——SDL音视频渲染实战

1.SDL使用的基本步骤 SDL Init/sDL _Quit()SDL_CreateWindow()/SDL_DestoryWindow()SDL CreateRender() SDL_Windows *windows NULL;SDL_Init(SDL_INIT_VIDEO);window SDL_CreateWindow("SDL2 Windows",200,200, 640,480,SDL_WINDOW_SHOWN);if(!window) {printf(&…

【链表】:链表的带环问题

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;数据结构 &#x1f337;追光的人&#xff0c;终会万丈光芒 前言&#xff1a; 链表的带环问题在链表中是一类比较难的问题&#xff0c;它对我们的思维有一个比较高的要求&#xff0c;但是这一类…

【linux-IMX6ULL配置GPIO通用流程-以及时钟配置】

目录 1. GPIO模式控制流程1.1 LED、蜂鸣器、按键1.2 GPIO控制流程 2. 标准库的简要分析及实现&#xff1a;2.1 问题引入&#xff1a;2.2 代码实现&#xff1a; 3. 时钟配置总结&#xff1a;3.1 时钟树概要&#xff1a;3.2 IMX6ULL时钟概要及时钟树&#xff1a;3.3 IMX6ULL时钟配…

机器学习周记(第三十七周:语义分割)2024.4.29~2024.5.5

目录 摘要 ABSTRACT 1 DeepLabV3 1.1 空间金字塔池化&#xff08;ASPP&#xff09; 1.2 解码器&#xff08;Decoder&#xff09; 1.3 Xception 2 相关代码 摘要 DeepLabV3 是由Google Brain团队开发的深度学习模型&#xff0c;专注于语义分割任务。它采用深度卷积神经网…

QtWindows任务栏

目录 引言任务栏进度右键菜单缩略图工具栏完整代码 引言 针对Windows系统的任务栏&#xff0c;Qt基于系统的原生接口封装有一些非常见类&#xff0c;如QWinTaskbarButton、QWinTaskbarButton、QWinThumbnailToolBar等&#xff0c;用于利用工具栏提供更多的信息&#xff0c;诸如…

【CTF Web】XCTF GFSJ0482 weak_auth Writeup(弱口令+密码爆破)

weak_auth 小宁写了一个登陆验证页面&#xff0c;随手就设了一个密码。 解法 随便输入一些字符&#xff0c;提示以 admin 登录。 使用 Burp 抓包。 导入密码字典。 进行爆破。 得到密码。 账号&#xff1a;admin 密码&#xff1a;123456取得 flag。 Flag cyberpeace{42c9664…

Servlet框架

简介 Servlet是运行在web服务器或应用服务器上的程序&#xff0c;他是作为来自web浏览器或其他http客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。 使用Servlet可以手机来自网页表单的用户输入&#xff0c;呈现来自数据库或者其他源记录&#xff0c;还可以动态创…