基于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:       jammy

2)所需安装的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存储器的读写。

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

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

相关文章

Javaweb之SpringBootWeb案例之登录校验功能的详细解析

2. 登录校验 2.1 问题分析 我们已经完成了基础登录功能的开发与测试&#xff0c;在我们登录成功后就可以进入到后台管理系统中进行数据的操作。 但是当我们在浏览器中新的页面上输入地址&#xff1a;http://localhost:9528/#/system/dept&#xff0c;发现没有登录仍然可以进…

五、优化日程(Optimize Your Schedule)

3. Optimize Your Schedule 三、优化日程 The right length of time for focus is the time you have available.If you only have half an hour to squeeze in on a side project, then that’s the time you have.If you can devote a block of four hours every morning, ma…

async 与 await(JavaScript)

目录捏 前言一、async二、await三、使用方法总结 前言 async / await 是 ES2017(ES8) 提出的基于 Promise 解决异步的最终方案。上一篇文章介绍了 回调地狱 与 Promise&#xff08;JavaScript&#xff09;&#xff0c;因为 Promise 的编程模型依然充斥着大量的 then 方法&#…

【力扣】查找总价格为目标值的两个商品,双指针法

查找总价格为目标值的两个商品原题地址 方法一&#xff1a;双指针 这道题和力扣第一题“两数之和”非常像&#xff0c;区别是这道题已经把数组排好序了&#xff0c;所以不考虑暴力枚举和哈希集合的方法&#xff0c;而是利用单调性&#xff0c;使用双指针求解。 考虑数组 pri…

可达鸭二月月赛——入门赛第四场(周三)题解

可达鸭二月月赛——入门赛第四场&#xff08;周三&#xff09;题解 博文作者&#xff1a;王胤皓 题目&#xff08;可达鸭学员应该能打开&#xff0c;打不开的题解里有题目简述&#xff09;题解(点击即可跳转&#xff0c;里面有我的名字)T1 小可喝水linkT2 \texttt{ }\texttt{ …

数据结构:双向链表

文章目录 1. 双向带头循环链表的结构2. 相关操作2.1 创建节点2.2 尾插2.3 头插2.4 打印2.5 尾删2.6 头删2.7 查找2.8 指定位置前/后插入2.9 删除指定位置的节点2.10 删除指定位置后的节点2.11 销毁链表 3.顺序表与链表区别 1. 双向带头循环链表的结构 与单链表不同的是&#xf…

详解计算机软件基本概念

软件基本概念 软件的定义 一个完整的计算机系统是由硬件系统和软件系统协同工作来完成某一给定的任务的。 只有硬件的计算机称为裸机&#xff0c;裸机必须安装了计算机软件后才可以完成各项任务。 从广义地讲&#xff0c;软件是指计算机程序、数据以及开发、使用和维护程序…

Python 视频转场特效处理笔记

本文参考Python-OpenCV 实现美图秀秀视频剪辑效果【特效】_opencv 多张图片 视频 特效-CSDN博客 最近研究了点python处理视频相关的东西&#xff0c;本文展示特效包括&#xff0c;竖向开幕/横向开幕&#xff0c;渐隐/渐显&#xff0c;推近/拉远&#xff0c;方形开幕&#xff0…

Excel——有效性、二级菜单联动

一、录入规范数据 1.手动输入序列录入有效性信息 选择需要录入有效性的所有单元格 选择【数据】——【有效性】——【有效性】 在【允许】输入的值之间选择【序列】 在【序列】输入框中输入想要选择的值&#xff0c;中间用逗号&#xff08;必须是英文逗号&#xff09;隔开 。…

Spring Authorization Server Spring Security密码加密

文章目录 一、修改密码编码器二、效果三、注意点1. RegisteredClient2. UserDetailsService 一、修改密码编码器 以BCryptPasswordEncoder举例。 直接将其注册成PasswordEncoder 的Bean即可。 Beanpublic PasswordEncoder passwordEncoder() {// 密码为明文方式 // ret…

【Qt学习笔记】Qt Creator环境下 信号与槽 详解(自定义信号槽、断连、lambda表达式等)

文章目录 1. 信号槽概念1.1 信号的本质1.2 槽的本质1.3 标准信号槽1.4 信号槽 实例 2. 自定义信号槽2.1 自定义槽函数2.2 自定义信号2.3 带参 信号槽 3. 信号槽的意义 与 作用4. 信号槽断连 &#xff08;了解&#xff09;5. lamda表达式的使用5.1 基本用法5.2 捕获局部变量5.3 …

JavaScript相关(一)——作用域

本篇将从JS的执行上下文开始&#xff0c;去理解&#xff1a;变量提升、 栈式调用、作用域和闭包。 参考&#xff1a; 浏览器工作原理与实践 JS执行上下文 执行上下文是 JavaScript 执行一段代码时的运行环境&#xff0c;比如调用一个函数&#xff0c;就会生成这个函数的执行…

『运维备忘录』之 Ansible 自动化运维工具

一、简介 Ansible是基于Python开发&#xff0c;集合了众多运维工具&#xff08;puppet、cfengine、chef、func、fabric&#xff09;的优点&#xff0c;实现了批量系统配置、批量程序部署、批量运行命令等功能的自动化运维工具&#xff0c;广泛用于配置管理、应用部署以及任务协…

ES节点故障的容错方案

ES节点故障的容错方案 1. es启动加载逻辑1.1 segment和translg组成和分析1.2 es节点启动流程1.3 es集群的初始化和启动过程 2. master高可用2.1 选主逻辑2.1.1 过滤选主的节点列表2.1.2 Bully算法2.1.2 类Raft协议2.1.3 元数据合并 2.2 HA切换 3. 分片高可用3.1 集群分片汇报3.…

DoWhy:Python 中的因果推断库

DoWhy&#xff1a;Python 中的因果推断库 DoWhy 是一个强大的 Python 库&#xff0c;用于因果推断和因果推断分析。本文将介绍 DoWhy 的基本概念、主要功能和使用方法&#xff0c;帮助读者了解如何利用该库进行因果推断&#xff0c;并解决因果关系的相关问题。 什么是DoWhy&…

备战蓝桥杯---动态规划(理论基础)

目录 动态规划的概念&#xff1a; 解决多阶段决策过程最优化的一种方法 阶段&#xff1a; 状态&#xff1a; 决策&#xff1a; 策略&#xff1a; 状态转移方程&#xff1a; 适用的基本条件 1.具有相同的子问题 2.满足最优子结构 3.满足无后效性 动态规划的实现方式…

2024年【R2移动式压力容器充装】考试内容及R2移动式压力容器充装免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 R2移动式压力容器充装考试内容参考答案及R2移动式压力容器充装考试试题解析是安全生产模拟考试一点通题库老师及R2移动式压力容器充装操作证已考过的学员汇总&#xff0c;相对有效帮助R2移动式压力容器充装免费试题学…

【Java八股面试系列】JVM-内存区域

目录 Java内存区域 运行时数据区域 线程独享区域 程序计数器 Java 虚拟机栈 StackFlowError&OOM 本地方法栈 线程共享区域 堆 GCR-分代回收算法 字符串常量池 方法区 运行时常量池 HotSpot 虚拟机对象探秘 对象的创建 对象的内存布局 句柄 Java内存区域 运…

网络套件字(理论知识)

一、源IP地址和目的IP地址 上次说到IP地址是为了是为了让信息正确的从原主机传送到目的主机&#xff0c;而原IP地址和目的IP地址就是用于标识两个主机的&#xff0c;既然叫做地址必然有着路径规划的作用&#xff0c;而路径规划最重要的就是&#xff0c;从哪来到哪去&#xff0…

机器人学、机器视觉与控制 上机笔记(第一版译文版 2.1章节)

机器人学、机器视觉与控制 上机笔记&#xff08;第一版译文版 2.1章节&#xff09; 1、前言2、本篇内容3、代码记录3.1、新建se23.2、生成坐标系3.3、将T1表示的变换绘制3.4、完整绘制代码3.5、获取点*在坐标系1下的表示3.6、相对坐标获取完整代码 4、结语 1、前言 工作需要&a…