跳转至

PLC

4690 个字 114 行代码 预计阅读时间 20 分钟

question

  • 变送器规格
  • 怎么看出来几路记录
  • 模拟量输入的通道是什么意思
  • 循环的时候每次加多少
  • UNSCALE 函数哪里是什么意思

系统组成和硬件构成

简单介绍常识

负载电源(PM)

  • 为各种模块、其他负载提供外接 24V 电源。
  • 为部分 PS 模块提供 24V 电源。

系统电源(PS)

  • 通过背板总线为模块提供内部所需的电源(外部负载回路还需由 PM 接线来供电
  • 只能为 CPU 和本机加模块供电。

AI 连接

AI 接口接收 420mA 电流输入,如何连接

  • PLC 为每个输入分配好了独立的内存地址

I0.0 false I0.1 true

  • 输出也分配了独立的内存

内存:内部存储器 断电不保存

外部存储器 - 无法直接处理

PLC(可编程逻辑控制器)的主要组件包括以下部分:

1. CPU(中央处理单元)

- 功能PLC 的核心组件,负责处理程序逻辑、执行运算、存储数据,并控制其他模块的运行。 - 组成: - 处理器:执行用户编写的控制程序(梯形图、STL 语言等。 - 存储器: - ROM(只读存储器):存储 PLC 固件和系统程序。 - RAM(随机存取存储器):存储用户程序、运行时数据、I/O 状态等。 - EEPROM/Flash:用于掉电保持用户程序和参数。 - 通讯接口:用于与上位机、HMI(人机界面)或其他设备通讯(如 RS-232、RS-485、Ethernet


2. DI(数字输入,Digital Input)

- 功能:用于接收外部开关量信号(如按钮、限位开关、光电传感器等。 - 特点: - 只接收两种状态的信号:0(低电平)1(高电平)。 - 常见电压等级:DC 24V、DC 12V、AC 220V 等。 - 可能分为漏型(NPN)源型(PNP)输入。


3. DO(数字输出,Digital Output)

- 功能:用于控制外部设备的开关状态(如继电器、电磁阀、信号灯等。 - 类型: - 继电器输出(Relay Output):使用继电器控制,适用于高电压、高电流负载。 - 晶体管输出(Transistor Output): - NPN 输出(低电平有效) - PNP 输出(高电平有效) - 可控硅输出(Triac Output):适用于交流负载。 - 特点: - 只能输出开(1)关(0)信号。 - 典型输出电压:DC 24V、AC 220V 等。


4. AI(模拟输入,Analog Input)

- 功能:用于接收外部模拟信号(如压力传感器、温度传感器、流量计等。 - 类型: - 电压输入(0-10V、±10V。 - 电流输入(4-20mA、0-20mA。 - 特点: - 需要 A/D(模数转换)转换,将模拟信号转换为数字信号供 CPU 处理。 - 通常具有分辨率(如 12-bit、16-bit)影响信号精度。


5. AO(模拟输出,Analog Output)

- 功能:用于输出模拟信号控制外部设备(如变频器、伺服驱动器、调光系统等。 - 类型: - 电压输出(0-10V、±10V。 - 电流输出(4-20mA、0-20mA。 - 特点: - 需要 D/A(数模转换)转换,将数字信号转换为模拟信号输出。 - 输出信号可以用于调节电机速度、阀门开度等。

冗余系统与可靠度

无故障概率:单元设备在规定的环境温度、湿度、振动和使用方法及维护措施等条件下,在规定的工作期限内,设备无故障地发挥规定功能的概率。

  • 并联可以提高系统的可靠性(冗余)
  • 冗余设计: 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 位(1bit16 通道模块的地址占 2 字节,32 通道模块地址占 4 字节模拟量 1/0 模块
  • 模拟量 IO 模块:每个模拟量地址为 16 位(2 字节)8 通道模块的地址占 16 字节,2 通道模块地址占 4 字节

I/O 地址生成方式:在配置硬件时,系统自动提供缺省地址(推荐使用,通常地址是够用的,也可手动设置地址

过程映像区

过程映像区(Process Image)是 PLC(可编程逻辑控制器)中用于存储输入和输出信号状态的区域。它位于 CPU 的系统存储区中,用于在程序执行过程中提供一致的输入和输出信号状态

程映像区的更新机制:过程映像区在每个扫描周期中更新一次。

  • 输入、输出地址是不同的(IQ。模块地址在硬件配置时生成或指定。端口状态与映像区周期性自动映射。
  • 支持绝对地址访问,用 % 开头。非必要情况下建议优先对映像区读写。
  • 支持变量名称访问,不容易搞错。建议自己定义变量名称,容易记忆。
  • 即读即写指令中应加 :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
讲解:执行该指令后,A1的值变为20,同时A1中原数据被移入A2。

累加器数据传送

T means transfer

  • T:把 A1 中的内容传送到目标位置(如 MW6A1 中原数据不变。

示例使用
T MW6
讲解:执行该指令后,A1的值被传送到MW6,但A1的值保持不变。

地址寄存器地址装入

  • LAR1(LAR2):将操作数装入 AR1(AR2,若指令中没有给出操作数,则将 A1 内容装入 AR1(AR2

示例使用
LAR1 20
讲解:执行该指令后,AR1的值变为20。如果指令中没有给出操作数,则AR1的值将变为A1的值。

地址寄存器地址传送

  • TAR1(TAR2):将 AR1(AR2)的内容传送给目标位置,若指令中没有给出操作数,则将 AR1(AR2)的内容传送给 A1

示例使用
TAR1 MW6
讲解:执行该指令后,AR1的值被传送到MW6。如果指令中没有给出操作数,则AR1的值将被传送到A1。

地址寄存器地址交换

  • CAR:交换 AR1 AR2 的内容。

示例使用
CAR
讲解:执行该指令后,AR1和AR2的值将被交换。

比较指令

  • >II 为整数型比较(累加器中低 16
  • >DD 为长整数比较。
  • >RR 为浮点数比较。

示例使用
>I A2
讲解:执行该指令后,如果A2的值大于A1的值(低16位),则RLO置“1”,否则RLO置“0”。

数值运算指令

数值运算指令

加法

  • +I:将 A2 A1 相加,结果的 16 位和放入 A1 低字。
  • +D:将 A2 A1 相加,结果的 32 位和放入 A1
  • +R:将 A2 A1 相加,结果的浮点数和放入 A1

示例使用
+R A2
讲解:执行该指令后,A2与A1相加,结果的浮点数和放入A1。

减法

  • -I:将 A2 A1 相减,结果的 16 位差放入 A1 低字。
  • -D:将 A2 A1 相减,结果的 32 位差放入 A1
  • -R:将 A2 A1 相减,结果的浮点数差放入 A1

示例使用
-R A2
讲解:执行该指令后,A2从A1中减去,结果的浮点数差放入A1。

乘法

  • *I:将 A2 A1 相乘,结果的 32 位积放入 A1
  • *D:将 A2 A1 相乘,结果的 64 位积放入 D
  • *R:将 A2 A1 相乘,结果的浮点数积放入 A1

示例使用
*R A2
讲解:执行该指令后,A2与A1相乘,结果的浮点数积放入A1。

除法

  • /I:将 A2 除以 A1,结果的 16 位商放入 A1 低字,余数放入 A1 高字。
  • /D:将 A2 除以 A1,结果的 32 位商放入 A1D 相除无余数
  • /R:将 A2 除以 A1,结果的浮点数商放入 A1

示例使用
/R A2
讲解:执行该指令后,A2除以A1,结果的浮点数商放入A1。

绝对值

  • ABS:对 A1 32 位实数取绝对值,结果放入 A1

示例使用
ABS
讲解:执行该指令后,A1的值取绝对值,结果放入A1。

位逻辑运算

与操作

  • A
  • 与非AN

或操作

  • O
  • 或非ON

赋值操作

  • 赋值

状态操作

  • 置位S
  • 复位R

状态位

首次检测位(FC)

  • 定义:首次检测位(FC)用于指示新逻辑串的开始。
  • 作用
    • FC = 0 时,表示新逻辑串开始。当执行位逻辑指令时,系统会直接将操作数内容保存到 RLO 位中,并将 FC 位置 1
    • FC = 1 时,操作数与 RLO 进行逻辑运算,并将结果存于 RLO
  • 特殊指令:当执行到 RS= 等指令时,FC 会清 0,表示逻辑串结束。
  • 用途:通过 FC 来区分不同的逻辑串。

逻辑操作结果(RLO,Result of Logic Operation)

  • 定义:逻辑操作结果(RLO)用于存储位逻辑指令或算术比较指令的结果。
  • 作用
    • 存储位逻辑指令(如 ANDOR 等)的执行结果。
    • 存储算术比较指令(如 >< 等)的执行结果。
  • 特点:所有的逻辑运算结果均存储在此处。

程序结构

组织块(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(保持型接通延时定时器)

LAD图

SDL
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(加载定时时间) 用于加载定时器的设定值。 动态调整定时器设定值的场景。

系统开发

实验课