您现在的位置是:网站首页> PLC自动化

AI学习PLC编程&教程

摘要

AI学习PLC编程&教程

***将实际工程情况阐述清楚,让AI给你建议方案及元件选型参数***

***OB在拖拽调用FB时自动生成的DB会自动映射保存FB中的静态变量,为好维护可定义一个全局DB所有模块可访问***

***PLC的输入输出端口需要格外供电有源输出本身带电,无源输出只是通断***

***继电器输出都只是通断,并不供电,需外部供电。晶体管(接直流-输出区分PNP还是NPN型》又分)与晶闸管(接交流,COM一般接零线,端口通过负载接火线)有源输出带电***

晶体管输出带不动大功率设备时可使用-》中间继电器-》设备

传感器NPN = 漏型(Sink,灌入电流,COM口接+24V,IO口常态0V);传感器PNP = 源型(Source,流出电流,COM口接0V,IO口常态+24V),是否有电流通过IO作为是否有信号

不管是NPN还是PNP,只要传感器感应到物体(动作了),PLC程序里读到的就是“1”

无论NPN还是PNP传感器说白了就是通断信号,输入端口是外部传感器控制通断,输出端口是PLC控制通断

西门子全系普通晶体管出厂固定为 PNP‑源型输出,硬件不能切换成 NPN(漏型)

通俗解释(200‑SMART / S7‑1200 / S7‑1500)

1. 晶体管输出公共端子 1M 接 0V、1L + 接 DC24V 正极

2. Q 点导通之后,输出端子直接送出 +24V 高电平(标准 PNP 源型)

西门子直流输入是双向光耦,可以自由切换 NPN / PNP,只靠公共端子 1M 接线决定

OB主程序,FB功能块【可用静态变量】,FC函数块,DB存储块

***SCL代码内部写 VAR_TEMP / VAR_INPUT / VAR_OUTPUT / VAR_IN_OUT / VAR_STAT … END_VAR,1200 全部不支持,所有局部变量强制在块上方接口表格定义,Constant是常量都是用加#访问,用拖拽FC、FB到OB实现调用***

临时变量、输入变量、输出变量、常量直接在OB、FB、FC中的接口定义,PLC的变量是为了能方便访问I Q M存储区,DB是静态存储类似硬盘存储

1.jpg

1.png


1.png

AI学习PLC咒语收集


教程收集

零基础小白必学的电路到自动化工程师



AI学习PLC咒语收集

PLC的输出输出端口需要格外供电

给一段西门子的 SCL 代码,并详细讲解如何在博途中上传到 PLC,以及这段 SCL 的执行逻辑全过程

PLC 所有变量 / 数据一共存哪几个地方

DB 如何使用

FB使用



####【豆包】

Q:你是PLC开发工程,PLC的输出输出端口需要格外供电吗?

A:...


PLC 输入输出端口供电详解

是的,PLC 的输入输出端口通常需要额外供电,具体取决于应用场景和端口类型

一、输出端口必须外接电源

PLC 输出端口本质上只是电子开关,本身不提供电源,必须外接电源才能驱动负载。

1. 不同输出类型的供电要求

输出类型 电源要求 特点

晶体管输出 必须提供外部 DC 电源

(通常 DC 24V) 响应快 (0.2ms),适合高频动作

负载能力较小 (0.5A / 点)

继电器输出 必须提供外部电源

(AC 或 DC 均可) 触点无极性,电压范围广

(最高 AC 250V),负载能力大 (2A)

晶闸管输出 必须提供外部 AC 电源

(通常 AC 220V) 适合高频交流负载

响应时间约 1ms

2. 输出端口工作原理

输出端口相当于一个单刀单掷开关

2.1晶体管输出:控制电路通断,需外部电源正极接负载,负载另一端接输出点,公共端接电源负极

2.2继电器输出:控制触点开合,负载接在输出点与外部电源之间

关键:没有外部电源,输出端口即使动作,负载也不会工作。

二、输入端口供电选择

1. 内部供电 (PLC 自带 24V)

1.1PLC 通常提供内置 24V 传感器电源 (如西门子 S7 系列的 24VDC 传感器电源)

1.2仅适用于小电流设备(如按钮、小型开关),单点电流通常≤4mA

1.3总负载不能超过 CPU 提供的电源额定值(如 FX5U 系列 DC24V 输出最大 480mA)

2. 外部供电 (推荐)

工业应用中强烈推荐为输入端口提供独立外部电源,原因如下:

2.1稳定性更高:外部稳压电源抗干扰能力强,避免 PLC 内部电源波动影响输入信号

2.2保护 PLC:外部电源故障不影响 PLC 本身运行

2.3扩展能力:可同时驱动更多传感器,不受 PLC 内部电源容量限制

接线方式:

NPN 型传感器:电源正极→传感器→PLC 输入点→公共端 (M)→电源负极

PNP 型传感器:电源正极→公共端 (S/S)→PLC 输入点→传感器→电源负极

三、特殊情况说明

1. 模拟量 I/O 端口

模拟量输入

2 线制传感器:由 PLC 模块提供电源(通过 I + 端子)

3/4 线制传感器:必须外接独立电源

模拟量输出

部分高端 PLC (如西门子 S7-1215C) 集成的模拟量输出自带 24V 电源,可直接驱动小型负载

大多数模拟量输出模块需要外接电源驱动执行器

2. 紧凑型 PLC 的特殊设计

部分小型 PLC (如 FX 系列) 将输入公共端 (S/S) 与内部 24V 电源连接,可直接接入开关,但不建议用于大功率传感器

四、最佳实践建议

1. 电源配置方案

工业控制系统推荐采用双电源配置

系统电源 (PS):专门为 PLC 本体和逻辑电路供电

负载电源 (PM):专门为输入输出端口和外部设备供电

优势:故障隔离、提高系统可靠性,便于维护和故障排查

2. 接线注意事项

输出回路:

晶体管输出:外部 DC 电源正极接负载,负载另一端接 Y 点,公共端 (M) 接电源负极

继电器输出:负载一端接外部电源,另一端接 Y 点,公共端接电源另一端

输入回路

开关类输入:一端接外部电源,另一端接 X 点,公共端接电源另一端

传感器输入:严格按 NPN/PNP 类型接线,确保信号回路正确

安全措施

所有外部电源应加短路保护(断路器或熔断器)

24V 电源的 0V 端应可靠接地

输入输出线缆应分开布线,避免干扰

总结

PLC 输出端口:必须外接电源,因为它们仅是电子开关,不提供电能

PLC 输入端口:建议外接独立电源,尤其是工业环境和大功率应用

记住:PLC 是控制系统的 "大脑",而外部电源才是让 "手脚"(负载) 动起来的 "肌肉"。正确的电源配置是 PLC 系统稳定运行的基础。


零基础小白必学的电路到自动化工程师

点击查看原视频



给一段西门子的 SCL 代码,并详细讲解如何在博途中上传到 PLC,以及这段 SCL 的执行逻辑全过程

# 一、示例 SCL 程序(自锁启停‑电机点灯,最经典入门案例)

项目需求:I0.0 启动按钮、I0.1 停止按钮、Q0.0 指示灯输出,实现自锁;增加故障复位、运行状态标志。

```

// 变量声明区

VAR_INPUT

    StartBtn: BOOL;      // I0.0 启动按钮,高电平接通

    StopBtn: BOOL;       // I0.1 停止按钮

    Reset_Fault: BOOL;   // I0.2 故障复位按键

END_VAR

VAR_OUTPUT

    Lamp: BOOL;           // Q0.0 指示灯

    Run_Flag: BOOL;       // 运行标志

END_VAR

VAR

    Lock: BOOL;           // 自锁中间变量

    Fault: BOOL;          // 故障标记

END_VAR


// 故障简单模拟,这里手动演示故障条件

Fault := FALSE;


// 故障复位

IF Reset_Fault THEN

    Fault := FALSE;

END_IF;


// 核心自锁逻辑

IF Fault = FALSE THEN

    Lock := (StartBtn OR Lock) AND NOT StopBtn;

ELSE

    Lock := FALSE;

END_IF;


// 输出赋值

Run_Flag := Lock;

Lamp := Lock;

```

## 代码逻辑通俗解释

1. 定义输入、输出、内部中间变量;

2. Fault 故障标记,故障状态直接强制关闭自锁;

3. `Lock := (启动按键 或者 已经自锁) 并且 没有按下停止`

- 按下 I0.0 → Lock 置 1;松开按钮,依靠 Lock 自身保持导通(自锁)

- 按下 I0.1 停止,NOT‑StopBtn 变成 FALSE,回路断开

4. 运行标志、指示灯跟随自锁状态输出




# 二、完整博途操作步骤,从新建代码直至下载进 PLC

## 环境:TIA‑Portal V18 + S7‑1200‑CPU1214C

## 步骤 1:新建项目、添加硬件

1. 新建项目,命名为`SCL_Demo`

2. 设备与网络 → 添加新设备 → SIMATIC S7‑1200 → CPU 1214C DC/DC/DC

3. 配置 PLC IP 地址,例如:`192.168.0.1`,电脑网卡设置同网段 IP


## 步骤 2:创建变量表,绑定硬件 IO

1. 打开 PLC 变量 → 新建变量表 IO_Table

1.png

Run_Flag、Lock、Lock 属于内部变量,可以写在 FB 或者 OB1 本地变量


## 步骤 3:打开 OB1,编程语言切换为 SCL

1. 展开【程序块】→ 双击 `OB1 (Main‑[OB1])`

2. 顶部菜单栏:**编程语言 → 结构化文本 (SCL)**

3. 删除自带默认代码,把上方整套 SCL 粘贴进去

4. 上方变量区,在 OB1‑接口参数内依次新建 Input、Output、Static 静态变量

 Lock、Fault 需要选择 Static(静态变量);临时 VAR 每次扫描会重置,无法保存自锁状态(新手高频踩坑)


## 步骤 4:编译程序

快捷键 `Ctrl+B`

- 无报错代表语法正常;

- 报错检查:变量名字写错、Static 静态变量没有设置、语法符号中英文混乱


## 步骤 5:网线连接 PLC、下载程序

1. 网线直连 PLC,在线 → 可访问设备,搜到你的 CPU

2. 点击【在线】‑【转到在线】

3. 下载选项:硬件组态 + 程序全部勾选

4. 点击下载;下载完成 PLC 会自动停止‑载入‑重新运行


## 步骤 6:在线监控

1. 开启监控模式,观察变量实时状态;

2. 接通 I0.0,Q0.0 指示灯输出;松开 I0.0 依旧保持输出;接通 I0.1 输出断开



# 三、SCL 代码完整运行全过程(PLC 扫描周期原理,重中之重)

西门子 PLC 采用**周期性循环扫描机制**,一次扫描分为三步:

`读取IO → 从上往下执行OB1‑SCL代码 → 刷新硬件输出`

循环周期一般 1~10ms


### 单次扫描完整流程

1. **输入刷新阶段**

PLC 读取物理端子 I0.0、I0.1、I0.2 当前高低电平,存入内存变量:StartBtn、StopBtn、Reset_Fault。

2. **从上至下逐行执行 SCL 代码**

① `Fault := FALSE;`

默认无故障;

② 判断复位按键,如果 I0.2 接通,清除故障标记;

③ 执行自锁公式 `Lock := (StartBtn OR Lock) AND NOT StopBtn;`


- Lock 是**Static 静态变量**,扫描周期结束之后数值会保存,不会清零;

- 第一次按下 I0.0:StartBtn=TRUE → Lock 变为 TRUE;

- 松开 I0.0:StartBtn=FALSE,但是 `OR Lock(现在是TRUE)`,条件依旧成立,实现自锁;

- 按下停止 I0.1,NOT StopBtn 等于 FALSE,Lock 被清空;

④ 将 Lock 状态赋值给运行标志和灯 Q0.0。


3. **输出刷新阶段**

程序运算完毕,把 Lamp 的布尔状态,同步刷新到硬件端子 Q0.0,外接指示灯亮 / 灭。


 之后 PLC 立刻重新开始新一轮扫描,循环往复。

--


# 四、新手常见坑点讲解

1. **自锁变量 Lock 不能设置成临时变量 VAR**

临时变量每一轮扫描结束就释放,无法保存状态,自锁直接失效;必须选用 **Static 静态变量**。

2. SCL 所有括号、分号必须是英文符号,中文符号直接编译报错

3. PLC 扫描周期是循环执行,不像 C/Python 顺序运行一次就结束

4. 硬件 IO 地址只能在变量表绑定,SCL 代码无法修改硬件地址


PLC 所有变量 / 数据一共存哪几个地方

PLC 变量表只是**电脑软件层面的符号翻译表**,就算你不定义符号,直接写硬件绝对地址,CPU 照样正常执行。符号名不下载到 PLC,CPU 只认内存地址

如直接地址访问

"M0.0" := TRUE;       //自动模式标记

IF "M0.1" THEN ...;   //故障标记

也可以在 PLC 变量表给 M0.0 起名字Auto_Mode,直接写Auto_Mode:=TRUE;

//1.直接写IO绝对地址,没有在PLC变量表定义名字,合法

IF "I0.1" THEN

    "Q0.0":=TRUE;

END_IF;


//2.如果PLC变量表里定义Start=%I0.1,就可以写别名

IF Start THEN

    "DB1".MotorRun:=TRUE; //DB1变量,DB块内定义,和PLC变量表无关

END_IF;


# PLC 所有变量 / 数据一共存哪几个地方(通俗版,S7‑1200/1500)

一共 5 大类存储区域:I、Q、M、DB、局部 L 区

## 1. I 输入过程映像区

- 存放:外部传感器、按钮进来的信号

- 来源:硬件端子

- 特点:PLC 硬件自动刷新,程序只读,一般不写

- 断电:上电全部刷新为硬件实际状态


## 2. Q 输出过程映像区

- 存放:要输出给接触器、指示灯的状态

- 写程序修改 Q,PLC 自动把值输出到硬件端子

- 断电:上电默认清零


 I 和 Q 叫**过程映像区**,本质也是一块内存,专门映射外部硬件。


## 3. M 位存储器(你刚才问的 M 区)

- 存放:**全局中间标记、标志位**,所有 OB/FB/FC 都能读和写

- 容量:1200 是 4K/8K 字节;1500 是 16K 字节

- 默认断电丢失,可以设置前面一部分字节断电保持

- 只有地址,变量名字只是软件上贴的标签


 适合:自动 / 手动标志、故障报警、使能信号,少量开关。


## 4. DB 数据块(最重要,绝大多数数据放这里)

DB 又分两种:

1)**全局 DB**:全局所有块都访问,存放参数、设定值、计数、配方、状态、数组、结构体。

2)**背景 DB(Instance‑DB)**:FB 功能块自动生成,存 FB 里面的 Static 静态变量。


特点:

- 容量很大,几乎没有限制

- 每个变量自带名字,支持数组、结构体、字符串

- **可以单个变量勾选断电保持**,非常灵活


 设备 90% 以上参数数据,全部放在 DB。


## 5. L 局部存储器(临时区,Temp)

就是 FB、FC 接口里的 Temp 临时变量。

- **只属于当前这个 FB/FC,别的块访问不到**

- FB/FC 运行的时候占用,执行完立刻释放,**断电直接消失**

- 不能做断电保持!


举例子:FC 内部做计算的临时中间数,循环临时计数,就放 Temp (L 区)。

⚠️外部 OB、别的 FB 不能读取另外一个 FC 的 Temp 变量。


## 非常关键的区分

1. **全局(I/Q/M/ 全局 DB)**:整个程序随便哪个 OB、FB、FC 都可以读写。

2. **局部 L (Temp)**:只属于当前 FB/FC,出了这个块就看不见。


汇总一张总表

1.jpg



## 实操最佳实践(记这个写程序就不乱)

1. 外部硬件信号 → I、Q

2. 少量全局开关标记(十几个以内)→ M 区

3. 所有参数、设定、计数、配方、状态、数组结构体 → **DB 块**

4. FB、FC 内部计算用的临时中间变量 → Temp (L 局部区)


补充比喻复习电脑:

- I/Q = 键盘显示器

- M = 一小块高速全局缓存

- DB = 固态硬盘 SSD

- L (Temp) = 函数内部 CPU 寄存器,函数执行完就销毁。


DB 如何使用

## 一、全局 DB(最常用,所有 OB/FB/FC 都能访问)

### 步骤 1:新建全局 DB

1. 项目树 →你的 CPU →【数据块】右键 →【新建数据块】

2. 名称:例如 `DB_Global`

3. 类型:**全局 DB**

4. 属性:✅优化的块访问(打勾)

5. 确定。


打开 DB_Global,在表格里面直接填变量:

1.png


- **保持列打勾:这个变量断电保存**;不打勾上电清零。

优化 DB,看不到偏移地址,不用管地址。


### 步骤 2:SCL 访问全局 DB

访问格式:`"DB块名".变量名`,DB 名字必须带英文双引号。

//赋值

"DB_Global".Auto_Mode := TRUE;

"DB_Global".Set_Speed := 1500;


//条件判断

IF "DB_Global".Motor_Fault THEN

    "DB_Global".Set_Speed := 0;

END_IF;


梯形图:直接填写 "DB_Global".Set_Speed


### 步骤 3:下载 DB

DB 和程序一起下载到 PLC;修改 DB 变量定义后必须重新下载。

⚠注意:下载 DB 时,如果 PLC 里面 DB 有运行数据,下载会把变量重置;在线修改可以选择 “仅下载程序,不初始化 DB” 保留现场数值。


## 二、背景 DB(实例 DB,配合 FB 功能块)

背景 DB 是 FB 专属 DB,存 FB 里面的`Static(静态)`变量。

Temp 临时变量不进背景 DB,Temp 在 L 区。

举例:建 FB 功能块 FB_Motor(电机控制)

FB 接口:

1.png


保存 FB,调用这个 FB 的时候,博途会提示生成背景 DB,比如 `DB_Motor1`。

这个`Run_Flag`静态变量就存到 DB_Motor1 里面。

调用 SCL:

#Motor1:FB_Motor(Start:="I0.0",Stop:="I0.1");

访问 FB 静态变量:

"DB_Motor1".Run_Flag := TRUE;

每调用一次 FB,可以生成独立背景 DB;多台电机就生成多个 DB,数据互不干扰。


#Motor1:FB_Motor(Start:="I0.0", Stop:="I0.1");

 `#Motor1` 只是**当前 OB/FC 里面的实例代号**,不是 DB 名字。

 当你写这行,编译之后,它会绑定到你分配的背景 DB:`DB_Motor1`。

#Motor1.Run_Flag := TRUE;   //利用#Motor1实例代号


任意地方(别的 OB、别的 FC),直接写真实 DB 名字(必须双引号)

"DB_Motor1".Run_Flag := TRUE;

"DB_Motor1":FB_Motor(Start:="I0.0", Stop:="I0.1");





## 三、DB 里面支持的高级类型

### 1. 数组

例如 10 个温度点

Temp_Array : ARRAY[0..9] OF Real;


SCL 读写

"DB_Global".Temp_Array[0]:=23.5;

"DB_Global".Temp_Array[1]:=26.1;



### 2. 结构体 STRUCT(UDT 用户自定义数据类型)

适合存一台设备的整套参数,比如一台电机:转速、电流、故障。

可以新建 UDT,然后在 DB 里面直接调用 UDT 类型。


## 四、监控 DB 变量

1. 新建监控表,直接把 DB 里的变量拖拽进去。

2. 可以看监视值,也可以修改值调试。


监控表不下 PLC,仅电脑调试。


## 五、优化 DB vs 非优化 DB(重点坑)

1.✅**优化的块访问(新项目必选)**

- 看不到 DBX、DBW 偏移地址;**只能用变量名访问**

- PLC 自动分配内存,不会地址冲突

- HMI 访问直接填变量名


2.❌非优化(标准块)

- 显示 DB1.DBX0.0、DB1.DBW2 这种偏移地址

- 需要自己管理偏移,容易重叠,老项目兼容才用。


如果你是优化 DB,写`"DB_Global".DBX0.0`直接报错,不能这么写。


## 六、DB 断电保持怎么用

DB 每一行变量都有【保持】复选框:

- 打✅:断电,该变量数值保存;上电恢复数值。

- 不打勾:上电该变量恢复初始值。


对比 M 区:M 区只能整块字节保持;DB 可以**每个变量单独设置是否保持**,灵活很多。


## 七、实操最佳实践

1. 全局状态、工艺参数、计数、配方 → **全局 DB**,尽量少用 M 区。

2.FB 功能块内部需要掉电记忆的状态 → 放在 FB 的 Static,自动进背景 DB。

3.FC 没有背景 DB!FC 不能有 Static;FC 内部记忆数据请放到全局 DB。

4.Temp 变量不要用来存需要记住的数据,运行完就丢。

5. 全部用优化 DB,不要关闭优化访问。


## 八、常见错误

1. 忘记给 DB 名字加英文双引号:`DB_Global.Auto_Mode` 报错,正确:`"DB_Global".Auto_Mode`

2. 优化 DB,硬写 DBX 偏移地址,编译报错。

3.FC 想用 Static 静态变量:FC 没有 Static,把数据放到全局 DB。

4. 修改 DB 的变量结构后,忘记下载 DB 块,PLC 运行异常。


## 简单对比 M 区与 DB 写法

M 区(全局符号表定义别名)

Auto_Mode := TRUE;


DB 区

"DB_Global".Auto_Mode := TRUE;


FB使用

### FB 的接口表

1.png

在 FB 自己的 SCL 代码里面,访问上面这所有接口变量,**前面都必须加#**

#Start        //Input输入

#Stop         //Input输入

#MotorOut     //Output输出

#Run_Flag     //Static静态

❌不能直接写 `Run_Flag:=TRUE;`,不加 #编译报错


SCL代码

IF #Start THEN    

  #Run_Flag := TRUE; 

END_IF;







Top