PLC¶
约 4690 个字 114 行代码 预计阅读时间 20 分钟
question¶
- 变送器规格
- 怎么看出来几路记录
- 模拟量输入的通道是什么意思
- 循环的时候每次加多少
- UNSCALE 函数哪里是什么意思
系统组成和硬件构成 ¶
简单介绍常识
负载电源(PM)
- 为各种模块、其他负载提供外接 24V 电源。
- 为部分 PS 模块提供 24V 电源。
系统电源(PS)
- 通过背板总线为模块提供内部所需的电源(外部负载回路还需由 PM 接线来供电
) 。 - 只能为 CPU 和本机加模块供电。
AI 连接
AI 接口接收 4~20mA 电流输入,如何连接
- PLC 为每个输入分配好了独立的内存地址
I0.0 false I0.1 true
- 输出也分配了独立的内存
内存:内部存储器 断电不保存
外部存储器 - 无法直接处理
PLC(可编程逻辑控制器)的主要组件包括以下部分:
1. CPU(中央处理单元)¶
- 功能:PLC 的核心组件,负责处理程序逻辑、执行运算、存储数据,并控制其他模块的运行。
- 组成:
- 处理器:执行用户编写的控制程序(梯形图、STL 语言等
2. DI(数字输入,Digital Input)¶
- 功能:用于接收外部开关量信号(如按钮、限位开关、光电传感器等
3. DO(数字输出,Digital Output)¶
- 功能:用于控制外部设备的开关状态(如继电器、电磁阀、信号灯等
4. AI(模拟输入,Analog Input)¶
- 功能:用于接收外部模拟信号(如压力传感器、温度传感器、流量计等
5. AO(模拟输出,Analog Output)¶
- 功能:用于输出模拟信号控制外部设备(如变频器、伺服驱动器、调光系统等
冗余系统与可靠度 ¶
无故障概率:单元设备在规定的环境温度、湿度、振动和使用方法及维护措施等条件下,在规定的工作期限内,设备无故障地发挥规定功能的概率。
- 并联可以提高系统的可靠性(冗余)
- 冗余设计: 1oo1、1oo2、2oo2、2oo3
可靠度的计算
第二个题计算的时候,可以按照中间的块是否有效进行分类讨论;
- 如果有效,则可以等效为左边的块
- 如果无效,则可以等效为串联电路
可以使用下面的代码进行验证
from itertools import product
# 定义成功的条件
success_conditions = [
(1, 3),
(1, 4, 5),
(2, 5),
(2, 3, 4)
]
# 生成所有可能的情况
all_cases = list(product([0, 1], repeat=5))
# 计算每种情况的概率
probabilities = {}
total_probability = 0
for case in all_cases:
probability = 0.8 ** sum(case) * 0.2 ** (5 - sum(case))
probabilities[case] = probability
total_probability += probability
# 计算成功的概率
success_probability = 0
for case, probability in probabilities.items():
for condition in success_conditions:
if all(case[i-1] == 1 for i in condition):
success_probability += probability
break
# 输出结果
print("所有可能的情况及其对应的概率:")
for case, probability in probabilities.items():
print(f"{case}: {probability}")
print(f"所有情况的概率之和为:{total_probability}")
print(f"成功的概率为:{success_probability}")
数据类型 ¶
可支持二进制、十进制、十六进制、BCD 码、ASCII 码、时间、日期等格式的数据
1D = 2W = 4B = 32bit
1 real = 4 byte = 32 bit
常见的数据类型 | 描述 | 位数 | 常数举例 | 编程举例 |
---|---|---|---|---|
BOOL | 二进制位 | 1 | TRUE/FALSE | I3.2 |
BYTE | 字节 | 8 | B#16#2F | IB3,由 I3.0~I3.7 组成的一个字节 |
WORD | 无符号字 | 16 | W#16#247D | MW100,MB100,MB101 组成的字 |
DWORD | 无符号双字 | 32 | DW#16#149E857A | MD100 |
LWORD | 长字 | 64 | LW#16#ADAC1EF5 | - |
INT | 有符号整数 | 16 | -362 | -32768~32768 |
DINT | 有符号长整数 | 32 | L#23 | -2147483648~2147483647 |
REAL | IEEE 浮点数 | 32 | 20.1234 | - |
S5TIME | SIMATIC 时间 | 16 | S5T#1H3M50S | - |
TIME | IEC 时间 | 32 | T#1H3M50S | - |
LTIME | IEC 时间 | 64 | T#11350d20h25m14s830ms652μs315ns | - |
CHAR | ASCII 字符 | 8 | '2A' | - |
位、字节、字、双字的关系
地址 ¶
地址区域 | 可以访问的地址单位 | 符号及标识方法 | 说明 |
---|---|---|---|
过程映像输入区 | 位 · 字节 · 字 · 双字 | I·IB·IW·ID | 对应输入模块端口 |
过程映像输出区 | 位 · 字节 · 字 · 双字 | Q·QB·QW·QD | 对应输出模块端口 |
标志位存储区 | 位 · 字节 · 字 · 双字 | M·MB·MW·MD | 全局变量区 |
数据块 | 位 · 字节 · 字 · 双字 | DBX·DBB·DBW·DBD | 用OPN DB打开 |
位 · 字节 · 字 · 双字 | DIX·DIB·DIW·DID | 用OPN DI打开 | |
定时器 | 位 | T | - |
计数器 | 位 | C | - |
本地数据区 | 位 · 字节 · 字 · 双字 | L·LB·LW·LD | 局部变量 |
- 不建议绝对地址寻址 , 确有需要,可修改数据块属性(非优化模式
每一通道均配置独立的地址,应用程序根据地址实现 IO 操作开关量 1/0 模块
- 开关量 IO:每个通道的地址占 1 位(1bit
) ,16 通道模块的地址占 2 字节,32 通道模块地址占 4 字节模拟量 1/0 模块 - 模拟量 IO 模块:每个模拟量地址为 16 位(2 字节),8 通道模块的地址占 16 字节,2 通道模块地址占 4 字节
I/O 地址生成方式:在配置硬件时,系统自动提供缺省地址(推荐使用,通常地址是够用的
过程映像区 ¶
过程映像区(Process Image)是 PLC(可编程逻辑控制器)中用于存储输入和输出信号状态的区域。它位于 CPU 的系统存储区中,用于在程序执行过程中提供一致的输入和输出信号状态
程映像区的更新机制:过程映像区在每个扫描周期中更新一次。
- 输入、输出地址是不同的(
I
、 Q
) 。模块地址在硬件配置时生成或指定。端口状态与映像区周期性自动映射。 - 支持绝对地址访问,用
%
开头。非必要情况下建议优先对映像区读写。 - 支持变量名称访问,不容易搞错。建议自己定义变量名称,容易记忆。
- 即读即写指令中应加
:P
。
寻址方式 ¶
立即寻址 | 直接给出操作数的值 ¶
x.y - x: 字节数:0-65536 - y: 位数:0-7
直接给出操作数的值
直接寻址 | 直接给出地址 ¶
给出操作数的地址,直接访问存储器中的数据
寄存器间接寻址和存储器间接寻址有什么区别?
存储器间接寻址 ¶
指令中给出的地址不是操作数的直接地址,而是指向操作数地址的指针。
寄存器间接寻址 | 循环操作 ¶
把I0.0
开始的 64 个连续位状态,通过循环方式逐个转存到从DB1.DBX10.0
开始的连续 64 个位中
多个开关量信号的批量采样,批量存放到数据块中
L P#0.0
LAR1
L P#10.0
LAR2
L 64 //把64装入A1,相当于循环的次数
n1: T #loopcounter //把累加器A1内容放入临时变量loopcounter(首次执行值为64)
OPN %DB1 //需在DB块属性中设置为不选取“优化的访问”
CLR //清除A1的内容
A I[AR1,P#0.0]
= DBX[AR2,P#0.0]
L P#0.1 //将地址偏移量0.1装入累加器A1
+AR1 //AR1加上偏移量0.1,指向下一个地址
L P#0.1
+AR2
L #loopcounter //把loopcounter中的内容载入A1
LOOP n1 //A1自动减1,若A1不为0则循环到n1,否则跳出循环;相当于是一个跳转的指令
A I[AR1,P#0.0]
A
:将指定地址的位状态加载到累加器A1
。I
:输入存储器(I
存储器) 。[AR1, P#0.0]
:使用地址寄存器AR1
的值作为基地址,偏移量为0.0
的地址。- 功能:将
I
存储器中由AR1
(当前值为0.0
)和偏移量0.0
确定的地址处的位状态加载。
= DBX[AR2, P#0.0]
=
:将累加器A1
的内容存储到指定地址。DBX
:数据块中的位存储器。[AR2, P#0.0]
:使用地址寄存器AR2
的值作为基地址,偏移量为0.0
的地址。- 功能:将累加器
A1
中的位状态存储到DBX
存储器中由AR2
(当前值为10.0
)和偏移量0.0
确定的地址处。
把从DB2.DBD400
开始的连续 32 个 0-100 的模拟量,逐个通过UNSCALE
函数转换为 0-27648 范围的某一个数值,并采用循环方式输出到地址从300.0
开始的 32 个模拟量输出端口
多个阀位信号的批量输出!
L P#400.0
LAR1
L P#300.0
LAR2
L 32 //循环次数
n2: T #loopcounter
OPN %DB2
L DBD[AR1,P#0.0] //从DB2中DBD400开始循环
T #V_out
CALL "UNSCALE"
IN :=#V_out
HI_LIM :=1.0000000e+002
LO_LIM :=0.0000000e+000
BIPOLAR:=FALSE
RET_VAL:=#ret
OUT :=#V_dec
L #V_dec
T QW[AR2,P#0.0] // 将转换后的值存入到QW300.0开始的地址当中
L P#4.0 //移动AR1的偏移量,实现顺序读取
+AR1
L P#2.0
+AR2
L #loopcounter
LOOP n2
这里为什么 AR1 的偏移量是 4.0,而 AR2 的偏移量是 2.0 呢?
- UNSCALE 函数:
程序表示 ¶
LAD( 梯形图 )、STL( 语句表 )、FBD( 功能块图 )、SCL( 结构化语言,如类 Pascal 语言 )、GRAPH( 图表化语言 ) 等,LAD 和 FBD 可以互相转化,其他不可互相转化
编程语言对应:
- STEP 7:用于西门子 PLC 编程的软件,支持结构化编程。
- C 语言:一种通用的编程语言,也支持结构化编程。
1. LAD(梯形图 Ladder Diagram)¶
特点: - 图形化语言:使用图形符号表示逻辑关系,类似于继电器控制电路图。 - 直观易懂:适合电气工程师和初学者,易于理解和调试。 - 逻辑结构清晰:通过梯级(Rung)表示逻辑关系,从上到下执行。
应用场景: - 常用于简单的逻辑控制和顺序控制。 - 适合处理开关量信号和基本的逻辑运算。
软继电器:梯形图中某些编程元件沿用了继电器这一名称 能流:即“概念电流”,从左向右流动 母线:可想象左正右负的直流电源,右母线有时可以不画出
2. FBD(功能块图 Function Block Diagram)¶
特点: - 模块化编程:通过功能块(Function Block)实现模块化编程,提高代码复用性。 - 图形化语言:使用图形符号表示功能块和信号流向。 - 适合复杂控制:适合处理复杂的逻辑关系和算法。
应用场景: - 常用于复杂的逻辑控制、过程控制和算法实现。 - 适合处理模拟量信号和复杂的数学运算。
3. SCL(结构化控制语言 Structured Control Language)¶
特点:
- 文本化语言:类似于高级编程语言(如 C、Pascal
应用场景: - 常用于复杂的算法实现、数据处理和高级控制逻辑。 - 适合处理大量的数据和复杂的数学模型。
4. STL(语句表 Statement List)¶
操作码 操作数(<=1个)
过程:读取指令、翻译代码、执行指令
- A1,A2 累加器
- AR1
- AR2
特点: - 文本化语言:使用文本编写代码,类似于汇编语言。 - 底层编程:适合处理底层的硬件操作和优化。 - 执行效率高:由于接近机器语言,执行效率较高。
应用场景: - 常用于对执行效率要求较高的场合。 - 适合处理实时性要求高的控制任务。
L %IW 256:P //从端口地址(如256)读入转换结果,:P 表示脉冲采集
T #Dec_in//存入临时变量Dec_in,#abc表示临时变量,变量名abc
CALL "SCALE"//直接调用系统函数,以下是输入输出参数
IN :=#Dec_in//入口参数:十进制转换结果
HI_LIM :=2.000000e+002//入口参数:工程量上限200,kPa(本身没有单位概念)
LO_LIM :=0.000000e+000//入口参数:工程量下限0
BIPOLAR :=FALSE//入口参数:TRUE为双极性,FALSE为单极性
RET_VAL :=#ret//出口参数:返回值(准确-0,错误-其它值)
OUT :=#In_result//出口参数:工程量转换结果
- 通过
:=
运算符将变量的值传递给函数参数。 :P
表示脉冲采集#abc
表示临时变量,变量名abc
2.000000e+002
是科学计数法表示的 200%
是一个前缀,用于表示特定的数据类型或地址空间- 工程量是指以物理计量单位或自然计量单位所表示的各个分项或子分项工程和构配件的数量单位
CALL "UNSCALE" // 直接调用系统提供的转换函数,以下是输入输出参数
IN := #Out // 入口参数:阀位值0 ~ 100%浮点数
HI_LIM := 1.000000e+002 // 入口参数:阀位上限100
LO_LIM := 0.000000e+000 // 入口参数:阀位下限0
BIPOLAR := FALSE // 入口参数:TRUE为双极性输出,FALSE单极性输出
RET_VAL := #Err // 出口参数:返回值
OUT := #Out_result // 出口参数:十进制转换结果存入临时变量
L #Out_result // 将#Out_result的值加载到累加器1
T %QW416:P // 十进制转换结果输出到过程输出缓冲区,如416
CALL
是调用函数的关键字
程序指令 ¶
根据图片内容,我将操作码指令分为以下几类,并提供示例使用和讲解:
累加器数据装入 ¶
L means load
- L:将 A1 中的数据移入 A2,并将操作数内容(如 20)装入 A1。
L 20
累加器数据传送 ¶
T means transfer
- T:把 A1 中的内容传送到目标位置(如 MW6
) ,A1 中原数据不变。
T MW6
地址寄存器地址装入 ¶
- LAR1(LAR2):将操作数装入 AR1(AR2
) ,若指令中没有给出操作数,则将 A1 内容装入 AR1(AR2) 。
LAR1 20
地址寄存器地址传送 ¶
- TAR1(TAR2):将 AR1(AR2)的内容传送给目标位置,若指令中没有给出操作数,则将 AR1(AR2)的内容传送给 A1。
TAR1 MW6
地址寄存器地址交换 ¶
- CAR:交换 AR1 和 AR2 的内容。
CAR
比较指令 ¶
- >I:I 为整数型比较(累加器中低 16 位
) 。 - >D:D 为长整数比较。
- >R:R 为浮点数比较。
>I A2
数值运算指令 ¶
数值运算指令 ¶
加法 ¶
- +I:将 A2 与 A1 相加,结果的 16 位和放入 A1 低字。
- +D:将 A2 与 A1 相加,结果的 32 位和放入 A1。
- +R:将 A2 与 A1 相加,结果的浮点数和放入 A1。
+R A2
减法 ¶
- -I:将 A2 与 A1 相减,结果的 16 位差放入 A1 低字。
- -D:将 A2 与 A1 相减,结果的 32 位差放入 A1。
- -R:将 A2 与 A1 相减,结果的浮点数差放入 A1。
-R A2
乘法 ¶
- *I:将 A2 与 A1 相乘,结果的 32 位积放入 A1。
- *D:将 A2 与 A1 相乘,结果的 64 位积放入 D。
- *R:将 A2 与 A1 相乘,结果的浮点数积放入 A1。
*R A2
除法 ¶
- /I:将 A2 除以 A1,结果的 16 位商放入 A1 低字,余数放入 A1 高字。
- /D:将 A2 除以 A1,结果的 32 位商放入 A1(D 相除无余数
) 。 - /R:将 A2 除以 A1,结果的浮点数商放入 A1。
/R A2
绝对值 ¶
- ABS:对 A1 的 32 位实数取绝对值,结果放入 A1。
ABS
位逻辑运算 ¶
与操作 ¶
- 与:
A
- 与非:
AN
或操作 ¶
- 或:
O
- 或非:
ON
赋值操作 ¶
- 赋值:
=
状态操作 ¶
- 置位:
S
- 复位:
R
状态位 ¶
首次检测位(FC)¶
- 定义:首次检测位(FC)用于指示新逻辑串的开始。
- 作用:
- 当
FC = 0
时,表示新逻辑串开始。当执行位逻辑指令时,系统会直接将操作数内容保存到RLO
位中,并将FC
位置1
。 - 当
FC = 1
时,操作数与RLO
进行逻辑运算,并将结果存于RLO
。
- 当
- 特殊指令:当执行到
R
、S
、=
等指令时,FC
会清0
,表示逻辑串结束。 - 用途:通过
FC
来区分不同的逻辑串。
逻辑操作结果(RLO,Result of Logic Operation)¶
- 定义:逻辑操作结果(RLO)用于存储位逻辑指令或算术比较指令的结果。
- 作用:
- 存储位逻辑指令(如
AND
、OR
等)的执行结果。 - 存储算术比较指令(如
>
、<
等)的执行结果。
- 存储位逻辑指令(如
- 特点:所有的逻辑运算结果均存储在此处。
程序结构 ¶
组织块(OB)¶
- OB1 块:对应于 C 语言中的
main()
函数,是程序的入口点。
- 其他 OB 块:对应于中断函数,用于处理特定的中断事件。
设置不同的组织块,用以完成不同的功能
每一个 OB 块都对应为一种有不同优先级的中断,优先级从 1(最低)到 26(最高)
OB 块 | 说明 | OB 编号 | 优先级(默认) | 可能的 OB 个数 | 备注 |
---|---|---|---|---|---|
启动 | 系统从停止切换到运行状态时调用,进行初始化 | 100,≥123 | 1(1) | 0-100 | 多个启动 OB 按编号由小到大依次执行 |
程序循环 | 基本组织块,每隔循环周期执行 1 次 | 1,≥123 | 1(1) | 0-100 | 同上 |
时间中断 | 根据设置的日期、时间定时启动执行 | 10-17,≥123 | 2-24(2) | 0-20 | - |
循环中断 | 按照设定的时间间隔循环执行 | 30-38,≥123 | 2-24(8-17) | 0-20 | OB 块中程序执行时间应小于时间间隔 |
函数 / 块(FC 和 FB)¶
- FC(Function):子程序或函数,通过赋实参来调用。
- FB(Function Block):函数块,通过背景数据块赋值来调用。
数据块(DB)全局变量 ¶
- 数据块是 PLC 最主要的数据存储区,需要用户自己定义,相当于 C 语言全局变量
- 主要存放 IO 结果、中间运算结果和状态、与其他设备或系统交互的数据等 , 块内数据可定义 bool、byte、int、real、date、time 等多种数据类型
- 数据块应先定义、后访问,可根据需要定义不同数据块
- 数据块分为共享数据块和背景数据块,本质都是全局变量 - 共享数据块:在多个程序块中使用,类似于 C 语言中的全局变量。 - 背景数据块定义:附属于某个 FB 块、数据结构与 FB 输入输出数据格式完全相符的数据块,可以理解为 FB 批量赋值的数据块,也可以当作一般 DB 块用
系统函数(SFB/SFC)¶
类似于库函数
- SFB(System Function Block):系统功能块,提供特定的系统功能。
- SFC(System Function):系统功能,提供特定的系统服务。
调用关系 ¶
- OB 块只能被系统调用(被事件触发
) ,不可以被其他程序调用。 - OB 块可以调用 FB 或 FC。
- FB 或 FC 可以调用其他 FB、FC。
- 系统为每个优先级分配 64KB 的临时变量(L 堆栈
) ,供组织块、程序块使用。 - 嵌套越深,占用 L 堆栈越多,需防止“爆栈”现象。
定时器 ¶
要求掌握 SS 和 TON
S5 定时器 ¶
STL | LAD | LAD 扩展形式 | 描述 |
---|---|---|---|
SS | SS | S_ODTS | 保持型接通延时定时器 |
SP | SP | S_PULSE | 脉冲定时器 |
SE | SE | S_PEXT | 扩展的脉冲定时器 |
SD | SD | S_ODT | 接通延时定时器 |
SF | SF | S_OFFDT | 断开延时定时器 |
R | R | - | 定时器复位 |
SS(保持型接通延时定时器)¶
A %I0.0
L S5T#10s
SP %T1
A %I0.1
R %T1
A %T1
= %Q0.0
类型 | 描述 | 应用场景 |
---|---|---|
SS(保持型接通延时定时器) | 当输入条件为 ON 时开始计时,即使输入条件变为 OFF,定时器也会继续计时直到达到设定值。 | 设备启动后的延时操作。 |
SP(脉冲型定时器) | 当输入条件为 ON 时立即动作,但经过设定的时间后,即使输入条件仍为 ON,定时器也会变为 OFF 状态。 | 产生脉冲信号,如控制电机的启动和停止。 |
SE(扩展的脉冲型定时器) | 只要输入条件出现 ON 状态,无论持续时间多长,定时器都会保持 ON 状态直到达到设定值。 | 产生稳定脉冲信号,如控制灯光的闪烁。 |
SD(接通延时定时器) | 当输入条件为 ON 时开始计时,当达到设定值时动作。如果输入条件变为 OFF,定时器会立即停止计时。 | 输入条件为 ON 时的延时操作,如设备启动延时。 |
SF(断开延时定时器) | 当输入条件为 ON 时不动作。当输入条件变为 OFF 时开始计时,当达到设定值时动作。 | 输入条件消失后的延时操作,如设备停止延时。 |
R(定时器复位) | 用于复位定时器,使其重新开始计时。 | 重新启动定时器的场景。 |
IEC 定时器 ¶
IEC 定时器 ¶
类型 | 描述 | 应用场景 |
---|---|---|
TP(启动脉冲定时器) | 当输入条件为 ON 时立即动作,但经过设定的时间后,即使输入条件仍为 ON,定时器也会变为 OFF 状态。 | 产生脉冲信号,如控制电机的启动和停止。 |
TON(启动接通延时定时器) | 当输入条件为 ON 时开始计时,当达到设定值时动作。如果输入条件变为 OFF,定时器会立即停止计时。 | 输入条件为 ON 时的延时操作,如设备启动延时。 |
TONR(记录一位信号为 1 的累计时间) | 用于记录输入条件为 ON 的累计时间。 | 统计设备运行时间的场景。 |
RT(复位定时器) | 用于复位定时器,使其重新开始计时。 | 重新启动定时器的场景。 |
PT(加载定时时间) | 用于加载定时器的设定值。 | 动态调整定时器设定值的场景。 |