基于modbus rtu协议操作PLC的EPICS示例
硬件设备
本实验中使用到的设备如下:
1、S7-200 Smart SR20 PLC
作为受控设备,执行机构。
S7-200 Smart是西门子的一款小型PLC产品(以下简称Smart系列)。
Smart系列PLC是西门子公司经过大量调研,为中国小型自动化市场量身打造的一款PLC产品。与西门子S7-1200系列相比,Smart系列不支持博途开发环境(使用STEP 7-MicroWIN SMART编程)、不支持Profinet通信(但支持Profibus);最多能扩展6个信号模块(EM)和1个信号板(SB)。
S7-200 SMART PLC 主要性能参数 V2.3,如下图


2、串口服务器 :USR-TCP232-410s
将PLC的485 串口信号转成网络信号接入局域网

产品参数如下:

3、单板机Orange Pi 3 LTS
运行EPICS IOC,运行上位控制程序。

4、串口线

软件部分
1、PLC上编程
初始化PLC为从设备,设置其工作模式为modbus rtu, 地址为3,波特率为115200,使用PLC自带串口,无延时,最大IO个数为256,最大模拟量为56个字,V存储器是从VB2000开始的100个字

一直使能这个从设备

2、串口服务器部分
通过浏览器设置串口服务器的IP地址为自己所需的地址:

设置RS485端口的串口参数,需要和PLC设置的参数保持一致,以及访问此RS485所需的端口号:

3、单板机部分:
安装操作系统和所需的EPICS模块
1) 操作系统
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.2 LTS
Release:        22.04
Codename:       jammy2)所需安装的EPICS 模板
由于EPICS模块之间的依赖关系,需要以下4个模块:
base, seq , ipac ,asyn, modbus
4、IOC建立过程
先创建一个项目目录,在其下用makeBaseApp工具创建一个IOC应用程序的框架,编辑configure/RELEASE文件,添加本IOC依赖的模块,在程序src下Makefile中添加所依赖的库文件和源文件; 在Db文件下添加模板文件:
configure/RELEASE:
...
SUPPORT=/usr/local/EPICS/synApps/support# If using the sequencer, point SNCSEQ at its top directory:
#SNCSEQ = $(MODULES)/seq-ver
ASYN=$(SUPPORT)/asyn
MODBUS=$(SUPPORT)/modbus
AUTOSAVE=$(SUPPORT)/autosave...xxxApp/src:
....sr20smart_DBD += asyn.dbd
sr20smart_DBD += drvAsynIPPort.dbdsr20smart_DBD += modbus.dbd
sr20smart_DBD += asSupport.dbd# Include dbd files from all support applications:
# #sr20smart_DBD += xxx.dbd
#
# # Add all the support libraries needed by this IOC
#sr20smart_LIBS += xxx
sr20smart_LIBS += asyn
sr20smart_LIBS += modbus
sr20smart_LIBS += autosave...xxxApp/Db:
bi_bit.template:用于按位读取PLC的输入输出点。
record(bi,"$(P)$(R)$(D)$(M)_$(N)") {field(DTYP,"asynUInt32Digital")field(INP,"@asynMask($(PORT) $(OFFSET) 0x1)")field(SCAN,"$(SCAN)")field(ZNAM,"$(ZNAM)")field(ONAM,"$(ONAM)")field(ZSV,"$(ZSV)")field(OSV,"$(OSV)")
}bo_bit.template:用于按位写PLC的输出点。
record(bo,"$(P)$(R)Q$(M)_$(N)") {field(DTYP,"asynUInt32Digital")field(OUT,"@asynMask($(PORT) $(OFFSET) 0x1)")field(ZNAM,"$(ZNAM)")field(ONAM,"$(ONAM)")
}longin_int16.template:用于按字读取PLC的V存储器以及模拟输入映像区,并且转成16位整数。
record(longin,"$(P)$(R)$(T)_$(M)") {field(DTYP,"asynInt32")field(INP,"@asyn($(PORT) $(OFFSET))$(DATA_TYPE)")field(SCAN, "$(SCAN)")
}longoutInt16.template: 用于把16位整数按字写入PLC的V存储器。
record(longout,"$(P)$(R)$(T)_$(M)") {field(DTYP,"asynInt32")field(OUT,"@asyn($(PORT) $(OFFSET))$(DATA_TYPE)")
}
float32_in.template:用于按双字读取PLC的V存储区,并且转成32位浮点数。
record(ai, "$(P)$(R)$(T)_$(M)") {field(DTYP,"asynFloat64")field(INP,"@asyn($(PORT) $(OFFSET))$(DATA_TYPE)")field(HOPR,"$(HOPR)")field(LOPR,"$(LOPR)")field(PREC,"$(PREC)")field(SCAN,"$(SCAN)")
}float32_out.template:用于将32位浮点数按双字写入到PLC的V存储器。
record(ao, "$(P)$(R)$(T)_$(M)O") {field(DTYP,"asynFloat64")field(OUT,"@asyn($(PORT) $(OFFSET))$(DATA_TYPE)")field(HOPR,"$(HOPR)")field(LOPR,"$(LOPR)")field(PREC,"$(PREC)")
}回到此IOC的顶层目录,编译以上代码,生产IOC程序。
5、编辑启动目录,添加模板替换文件,编辑启动脚本st.cmd:
1)添加的实例化文件如下:
1)qb.substitutions:实例化8个bo记录,用于写,分别写一个位到PLC的输出点Q0.0~Q0.7
file "../../db/bo_bit.template" { pattern
{P,             R,      M,      N,          PORT,           OFFSET,             ZNAM,           ONAM}
{SR20SMART:,   BIT:,     0      0               QB0,            0,              Low,            High}
{SR20SMART:,   BIT:,     0      1               QB0,            1,              Low,            High}
{SR20SMART:,   BIT:,     0      2               QB0,            2,              Low,            High}
{SR20SMART:,   BIT:,     0      3               QB0,            3,              Low,            High}
{SR20SMART:,   BIT:,     0      4               QB0,            4,              Low,            High}
{SR20SMART:,   BIT:,     0      5               QB0,            5,              Low,            High}
{SR20SMART:,   BIT:,     0      6               QB0,            6,              Low,            High}
{SR20SMART:,   BIT:,     0      7               QB0,            7,              Low,            High}
}2) qb_rbv.substitutions:实例化8个bi记录,用于读取,分别读取一个位到PLC的输出点Q0.0~Q0.7
file "../../db/bi_bit.template" { pattern
{P,             R,      D,      M,      N,         PORT,         OFFSET,   ZNAM,                                                                 ONAM,  ZSV,       OSV,    SCAN}
{SR20SMART:,    BIT:,   Q,      0,      0_RBV,  QB0_RBV,        0,        Low,                                                                  High,  NO_ALARM,  MAJOR,  "I/O Intr"}
{SR20SMART:,    BIT:,   Q,      0,      1_RBV,  QB0_RBV,        1,        Low,                                                                  High,  NO_ALARM,  MAJOR,  "I/O Intr"}
{SR20SMART:,    BIT:,   Q,      0,      2_RBV,  QB0_RBV,        2,        Low,                                                                  High,  NO_ALARM,  MAJOR,  "I/O Intr"}
{SR20SMART:,    BIT:,   Q,      0,      3_RBV,  QB0_RBV,        3,        Low,                                                                  High,  NO_ALARM,  MAJOR,  "I/O Intr"}
{SR20SMART:,    BIT:,   Q,      0,      4_RBV,  QB0_RBV,        4,        Low,                                                                  High,  NO_ALARM,  MAJOR,  "I/O Intr"}
{SR20SMART:,    BIT:,   Q,      0,      5_RBV,  QB0_RBV,        5,        Low,                                                                  High,  NO_ALARM,  MAJOR,  "I/O Intr"}
{SR20SMART:,    BIT:,   Q,      0,      6_RBV,  QB0_RBV,        6,        Low,                                                                  High,  NO_ALARM,  MAJOR,  "I/O Intr"}
{SR20SMART:,    BIT:,   Q,      0,      7_RBV,  QB0_RBV,        7,        Low,                                                                  High,  NO_ALARM,  MAJOR,  "I/O Intr"}
}
3)ib.substitutions:实例化8个bi记录,用于读取,分别读取一个位到PLC的输出点I0.0~I0.7
file "../../db/bi_bit.template" { pattern
{P,        R,           D,      M,      N,         PORT,         OFFSET,   ZNAM,   ONAM,  ZSV,       OSV,    SCAN}
{SR20SMART:,    BIT:,   I       0       0       IB0_1,     0,        Low,    High,  NO_ALARM,  MAJOR,  "I/O Intr"}
{SR20SMART:,    BIT:,   I       0       1       IB0_1,     1,        Low,    High,  NO_ALARM,  MAJOR,  "I/O Intr"}
{SR20SMART:,    BIT:,   I       0       2       IB0_1,     2,        Low,    High,  NO_ALARM,  MAJOR,  "I/O Intr"}
{SR20SMART:,    BIT:,   I       0       3       IB0_1,     3,        Low,    High,  NO_ALARM,  MAJOR,  "I/O Intr"}
{SR20SMART:,    BIT:,   I       0       4       IB0_1,     4,        Low,    High,  NO_ALARM,  MAJOR,  "I/O Intr"}
{SR20SMART:,    BIT:,   I       0       5       IB0_1,     5,        Low,    High,  NO_ALARM,  MAJOR,  "I/O Intr"}
{SR20SMART:,    BIT:,   I       0       6       IB0_1,     6,        Low,    High,  NO_ALARM,  MAJOR,  "I/O Intr"}
{SR20SMART:,    BIT:,   I       0       7       IB0_1,     7,        Low,    High,  NO_ALARM,  MAJOR,  "I/O Intr"}
}4) int.substitutions:实例化2个longin记录,第一个实例将从PLC模拟输入区或V存储区读取的一个字转换成16位有符号数,第二个实例将从PLC模拟输入区或V存储区读取的一个字转换成16位无符号数。
file "../../db/longin_int16.template" { pattern
{P,             R,     T,       M       PORT,         OFFSET,  DATA_TYPE  , SCAN}
{SR20SMART:,    INT,   16,      I0,     VW,             0 , INT16 , "I/O Intr"}
{SR20SMART:,    UINT,  16,      UI0,    VW,             1 , UINT16 , "I/O Intr"}
}5)into.substitutions:实例化2个longout记录,第一个实例将16位有符号数按字写入到PLC的V存储区,第一个实例将16位无符号数按字写入到PLC的V存储区。
file "../../db/longoutInt16.template" { pattern
{P,             R,      T,      M,      PORT,           OFFSET,         DATA_TYPE}
{SR20SMART:,    INT     16,     IO,     VWO,            0,              INT16}
{SR20SMART:,    UINT    16,     UIO,    VWO,            1,              UINT16}
}6) float.substitutions:实例化2个ai记录,这两个实例将分别从PLC模拟输入区或V存储区读取的二个字转换成32位浮点数。
file "../../db/float32_in.template" { pattern
{P,             R,      T,      M,          PORT,         OFFSET,  DATA_TYPE , HOPR,   LOPR, ,   PREC ,SCAN}
{SR20SMART:,    FLOAT,   32:    F00             VW,             2 ,FLOAT32_BE ,        1000,    -1000,  ,3 , "I/O Intr"}
{SR20SMART:,    FLOAT,   32:    F01             VW,             4 ,FLOAT32_BE ,        1000,    -1000,  ,3 , "I/O Intr"}
}7)实例化2个ao记录,这两个实例将分别将32位浮点数按双字写入到PLC的V存储区
file "../../db/float32_out.template" { pattern
{P,             R,      T,      M,          PORT,         OFFSET,  DATA_TYPE , HOPR,   LOPR, ,   PREC}
{SR20SMART:,    FLOAT,   32:    F00             VWO,            2 ,FLOAT32_BE ,        1000,    -1000,  ,3 }
{SR20SMART:,    FLOAT,   32:    F01             VWO,            4 ,FLOAT32_BE ,        1000,    -1000,  ,3 }
}2) 编辑st.cmd文件:
#!../../bin/linux-x86_64/sr20smart#- You may have to change sr20smart to something else
#- everywhere it appears in this file< envPathscd "${TOP}"## Register all support components
dbLoadDatabase "dbd/sr20smart.dbd"
sr20smart_registerRecordDeviceDriver pdbbasedrvAsynIPPortConfigure("sr20smart","192.168.3.209:6666",0,0,1)
modbusInterposeConfig("sr20smart",1 ,2000,0)# func code = 5 按位写线圈
drvModbusAsynConfigure("QB0",   "sr20smart", 3, 5,  0, 8 , 0, 100, "QB0")
# func code = 1 按位读线圈
drvModbusAsynConfigure("QB0_RBV", "sr20smart", 3, 1,  0, 8 , 0, 200, "QB0_RBV")# func code = 2 按位读取离散输入
drvModbusAsynConfigure("IB0_1", "sr20smart", 3, 2,  0, 8 , 0,   200, "IB0_1")# func code = 3 按字读取保持寄存器
drvModbusAsynConfigure("VW",    "sr20smart", 3, 3,  0, 20  , 0, 200, "VW")# func code = 4 按字读取输入寄存器
drvModbusAsynConfigure("AWI",   "sr20smart", 3, 4,  0, 10  , 0,  200, "AWI")# func code = 6 按字写入保持寄存器
drvModbusAsynConfigure("VWO",   "sr20smart", 3, 6,  0, 20  , 0,  200, "VWO")cd "${TOP}/iocBoot/${IOC}"
dbLoadTemplate("qb.substitutions")
dbLoadTemplate("qb_rbv.substitutions")
dbLoadTemplate("ib.substitutions")dbLoadTemplate("int.substitutions")
dbLoadTemplate("float.substitutions")
dbLoadTemplate("floato.substitutions")
dbLoadTemplate("into.substitutions")iocInit
IOC程序启动以及测试
在IOC启动目录下,程序启动命令:../../bin/linux-aarch64/sr20smart st.cmd
dbl查看所有加载的记录。
root@orangepi3-lts:/usr/local/EPICS/program/sr20smart/iocBoot/iocsr20smart# ../../bin/linux-aarch64/sr20smart st.cmd
#!../../bin/linux-x86_64/sr20smart
...
iocInit
Starting iocInit
############################################################################
## EPICS R7.0.7
## Rev. 2023-06-25T15:50+0000
## Rev. Date build date/time:
############################################################################
iocRun: All initialization complete
## Start any sequence programs
#seq sncxxx,"user=blctrl"
epics> dbl
SR20SMART:FLOAT32:_F00
SR20SMART:FLOAT32:_F01
SR20SMART:FLOAT32:_F00O
SR20SMART:FLOAT32:_F01O
SR20SMART:BIT:Q0_0_RBV
SR20SMART:BIT:Q0_1_RBV
SR20SMART:BIT:Q0_2_RBV
SR20SMART:BIT:Q0_3_RBV
SR20SMART:BIT:Q0_4_RBV
SR20SMART:BIT:Q0_5_RBV
SR20SMART:BIT:Q0_6_RBV
SR20SMART:BIT:Q0_7_RBV
SR20SMART:BIT:I0_0
SR20SMART:BIT:I0_1
SR20SMART:BIT:I0_2
SR20SMART:BIT:I0_3
SR20SMART:BIT:I0_4
SR20SMART:BIT:I0_5
SR20SMART:BIT:I0_6
SR20SMART:BIT:I0_7
SR20SMART:BIT:Q0_0
SR20SMART:BIT:Q0_1
SR20SMART:BIT:Q0_2
SR20SMART:BIT:Q0_3
SR20SMART:BIT:Q0_4
SR20SMART:BIT:Q0_5
SR20SMART:BIT:Q0_6
SR20SMART:BIT:Q0_7
SR20SMART:INT16_I0
SR20SMART:UINT16_UI0
SR20SMART:AINT16_I0
SR20SMART:AUINT16_UI0
SR20SMART:INT16_IO
SR20SMART:UINT16_UIO
1)bo记录SR20SMART:BIT:Q0_0 ~ SR20SMART:BIT:Q0_7:用于设置PLC Q0.0~Q0.7。
2)bi记录SR20SMART:BIT:Q0_0_RBV ~ SR20SMART:BIT:Q0_7_RBV:用于读取PLC Q0.0~Q0.7的状态。
3)bi记录SR20SMART:BIT:I0_1~SR20SMART:BIT:I0_7:用于读取PLC I0.0~I0.7的状态。
4) longin记录SR20SMART:INT16_I0和SR20SMART:UINT16_UI0:用于读取V存储区VW2000,VW2002。
5)longin记录SR20SMART:AINT16_I0和SR20SMART:AUINT16_UI0:用于读取模拟量输入寄存器AIW0和AIW2。
6)bo记录SR20SMART:INT16_IO和SR20SMART:UINT16_UIO:用于写入V存储区VW2000,VW2002。
7)ai记录SR20SMART:FLOAT32:_F00和SR20SMART:FLOAT32:_F01用于读取V存储区VD2004和VD2008。
8) ao记录SR20SMART:FLOAT32:_F00O和SR20SMART:FLOAT32:_F01O:写入V存储区VD2004和VD2008。
测试
用STEP7 Micro/Win SMART状态表设置V存储区如下:

用通道访问进行读取:
# VW2000
orangepi@orangepi5:~$ caget SR20SMART:INT16_I0
SR20SMART:INT16_I0             -12345
# VW2002
orangepi@orangepi5:~$ caget SR20SMART:UINT16_UI0
# VD2004
SR20SMART:UINT16_UI0           22222
orangepi@orangepi5:~$ caget SR20SMART:FLOAT32:_F00
SR20SMART:FLOAT32:_F00         3.1415
# VD2008
orangepi@orangepi5:~$ caget SR20SMART:FLOAT32:_F01
SR20SMART:FLOAT32:_F01         0.1111
# AIW0
orangepi@orangepi5:~$ caget SR20SMART:AINT16_I0
SR20SMART:AINT16_I0            -2000
# AIW2
orangepi@orangepi5:~$ caget SR20SMART:AUINT16_UI0
SR20SMART:AUINT16_UI0          2000
用通道访问写更改Q和V存储区:
# Q0.0
orangepi@orangepi5:~$ caput SR20SMART:BIT:Q0_1 0
Old : SR20SMART:BIT:Q0_1             High
New : SR20SMART:BIT:Q0_1             Low
# Q0.1
orangepi@orangepi5:~$ caput SR20SMART:BIT:Q0_0 0
Old : SR20SMART:BIT:Q0_0             High
New : SR20SMART:BIT:Q0_0             Low
# VW2000
orangepi@orangepi5:~$ caput SR20SMART:INT16_IO -6666
Old : SR20SMART:INT16_IO             0
New : SR20SMART:INT16_IO             -6666
# VW2002
orangepi@orangepi5:~$ caput SR20SMART:UINT16_UIO 8888
Old : SR20SMART:UINT16_UIO           0
New : SR20SMART:UINT16_UIO           8888
# VD2004
orangepi@orangepi5:~$ caput SR20SMART:FLOAT32:_F00O 1.2345
Old : SR20SMART:FLOAT32:_F00O        0
New : SR20SMART:FLOAT32:_F00O        1.2345
# VW2008
orangepi@orangepi5:~$ caput SR20SMART:FLOAT32:_F01O 5.4321
Old : SR20SMART:FLOAT32:_F01O        0
New : SR20SMART:FLOAT32:_F01O        5.4321
从STEP7 Micro/Win SMART状态表查看相应的存储区:

结论
通过EPICS modbus模块通过modbus rtu协议能够实现对PLC输入映像区和模拟输入区的读取和对输出映像区和V存储器的读写。
相关文章:
 
基于modbus rtu协议操作PLC的EPICS示例
硬件设备 本实验中使用到的设备如下: 1、S7-200 Smart SR20 PLC 作为受控设备,执行机构。 S7-200 Smart是西门子的一款小型PLC产品(以下简称Smart系列)。 Smart系列PLC是西门子公司经过大量调研,为中国小型自动化…...
 
网站被攻击有什么办法呢?
最近,德迅云安全遇到不少网站用户遇到攻击问题,来咨询安全解决方案。目前在所有的网络攻击方式中,DDoS是最常见,也是最高频的攻击方式之一。不少用户网站上线后,经常会遭受到攻击的困扰。有些攻击持续时间比较短影响较…...
VoIP之主备注册服务器机制
在IP话机的实际使用中,不可避免的会出现服务器离线运维、服务宕机、IP话机和服务器连接中断等情况。为了保证电话服务的连续性,在VoIP部署服环境中必须有冗余机制。常见的冗余机制以主备服务器的形式实现。 一、主备机制原理 话机正常情况下注册在主服…...
 
【数据分享】1929-2023年全球站点的逐年平均降水量(Shp\Excel\免费获取)
气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,说到常用的降水数据,最详细的降水数据是具体到气象监测站点的降水数据! 有关气象指标的监测站点数据,之前我们分享过1929-2023年全…...
 
uniapp /微信小程序 使用map组件实现手绘地图方案
获取地图范围 点图拾取坐标-地图开放平台|腾讯位置服务 获取需要手绘地图左下角和右上角GPS坐标 以北京故宫为例: 截取需要手绘地图进行手绘地图制作  素材处理 由于地图素材文件比较大,小程序又限制包大小<2M,无…...
 
react+antd+CheckableTag实现Tag标签单选或多选功能
1、效果如下图 实现tag标签单选或多选功能 2、环境准备 1、react18 2、antd 4 3、功能实现 原理: 封装一个受控组件,接受父组件的参数,数据发现变化后,回传给父组件 1、首先,引入CheckableTag组件和useEffect, useMemo, use…...
 
UUID和雪花(Snowflake)算法该如何选择?
UUID和雪花(Snowflake)算法该如何选择? UUID 和 Snowflake 都可以生成唯一标识,在分布式系统中可以说是必备利器,那么我们该如何对不同的场景进行不同算法的选择呢,UUID 简单无序十分适合生成 requestID, Snowflake 里…...
 
Jetpack Compose之进度条介绍(ProgressIndicator)
JetPack Compose系列(12)—进度条介绍 Compose自带进度条控件有两个,分别是:CircularProgressIndicator(圆形进度条)和LinearProgressIndicator(线性进度条)。 CircularProgressIn…...
 
【Qt基本功修炼】Qt线程的两种运行模式
1. 前言 QThread是Qt中的线程类,用于实现多线程运行。 QThread有两种工作模式,即 消息循环模式无消息循环模式 两种模式分别适用于不同的场景。下面我们将从多个方面,讲解QThread两种工作模式的区别。 2. 消息循环模式 2.1 实现原理 Q…...
 
三、设计模式相关理论总结
一、面向对象编程 1.1 概述 简称Object Oriented Program(OOP),指以类或对象作为基础组织单元,遵循封装、继承、多态以及抽象等特性,进行编程。其中面向对象不一定遵循封装、继承、封装和多态等特性,只是前人总结的套路规范&…...
鸿蒙 WiFi 连接 流程
那当界面上显示扫描到的所有Ap时,我们选择其中的一个Ap发起连接,看下代码流程是怎样的。 // applications/standard/settings/product/phone/src/main/ets/model/wifiImpl/WifiModel.tsconnectWiFi(password: string) {let apInfo this.userSelectedAp…...
golang 创建unix socket http服务端
服务端 package mainimport ("fmt""net""net/http""os" )func main() {http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {w.Write([]byte("hello"))})http.HandleFunc("/world", …...
 
annaconda如何切换当前python环境
annaconda默认的python环境是base: 把各种项目的依赖都安装到base环境中不是一个好的习惯,比如说我们做爬虫项目和做自动化测试项目等所需要的依赖是不一样的,我们可以将为每个项目创建自己的环境,在各自的环境中安装自己的依赖&…...
gtkmm 与 Cambalache 与 Gtk::Builder (新手向)_
文章目录 前言Cambalache检查Xml.cpp文件如何写才能显示UI首先creat获取ui里的对象显示 前言 新手刚刚使用时的笔记 Cambalache检查Xml 窗口右键inspect UI Definition切换到Xml视图, 可以全选复制粘贴到你的ui文件里, Cambalache 只能保存为.cmb工程文件, 导出也不知道导出…...
 
uniapp小程序端使用计算属性动态绑定style样式踩坑
踩坑点: 使用uniapp编译小程序端动态绑定复杂style使用计算属性方式,return必须返回json字符串格式,不能返回object,否则会不起作用。 代码总览 视图层 逻辑层(注意这里是使用的计算属性哈) 这里我封装成了一个个性化…...
 
计算机网络概念、组成、功能和分类
文章目录 概要1.怎么学习计算机网络2.概念3.功能、组成4.工作方式、功能组成5.分类 概要 概念、组成、功能和分类 1.怎么学习计算机网络 2.概念 通信设备:比如路由器、路由器 线路:将系统和通信设备两者联系的介质之类的 计算机网络是互连的、自治的的计…...
 
MyBatisPlus基础操作之增删改查
目录 一、基本使用 1.1 插入数据 1.2 删除操作 1.3 更新操作 二、条件构造器Wrapper 2.1 常用AbstractWrapper方法 2.1.1 示例一 2.2.2 示例二 2.2.3 示例三 2.2 常用QueryWrapper方法 2.2.1 示例一 2.2.2 示例二 2.2.3 示例三(常用) 2.3 常…...
视频处理学习笔记1:YUYV422、NV12和h264
最近因为工作关系在恶补视频相关知识点,在此做一记录便于日后复习。 以下均是个人学习经验总结,可能存在错误和坑,欢迎大佬指教。 工作中用到的是YUYV422存储格式。存储的就是裸流YUYV422格式文件。 YUYV422是两个像素点共用一个UV分量&am…...
 
CTFshow web(命令执行29-36)
?ceval($_GET[shy]);­passthru(cat flag.php); #逃逸过滤 ?cinclude%09$_GET[shy]?>­php://filter/readconvert.base64-encode/resourceflag.php #文件包含 ?cinclude%0a$_GET[cmd]?>&cmdphp://filter/readconvert.base64-encode/…...
 
PyTorch深度学习实战(23)——从零开始实现SSD目标检测
PyTorch深度学习实战(23)——从零开始实现SSD目标检测 0. 前言1. SSD 目标检测模型1.1 SSD 网络架构1.2 利用不同网络层执行边界框和类别预测1.3 不同网络层中默认框的尺寸和宽高比1.4 数据准备1.5 模型训练 2. 实现 SSD 目标检测2.1 SSD300 架构2.2 Mul…...
 
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
 
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
 
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
 
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
 
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
 
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
 
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
 
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
