您现在的位置是:网站首页> PLC自动化
AI学习PLC编程&教程
- PLC自动化
- 2026-08-25
- 1201人已阅读
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是静态存储类似硬盘存储



教程收集
AI学习PLC咒语收集
给一段西门子的 SCL 代码,并详细讲解如何在博途中上传到 PLC,以及这段 SCL 的执行逻辑全过程
####【豆包】
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

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 变量表只是**电脑软件层面的符号翻译表**,就算你不定义符号,直接写硬件绝对地址,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. 外部硬件信号 → I、Q
2. 少量全局开关标记(十几个以内)→ M 区
3. 所有参数、设定、计数、配方、状态、数组结构体 → **DB 块**
4. FB、FC 内部计算用的临时中间变量 → Temp (L 局部区)
补充比喻复习电脑:
- I/Q = 键盘显示器
- M = 一小块高速全局缓存
- DB = 固态硬盘 SSD
- L (Temp) = 函数内部 CPU 寄存器,函数执行完就销毁。
## 一、全局 DB(最常用,所有 OB/FB/FC 都能访问)
### 步骤 1:新建全局 DB
1. 项目树 →你的 CPU →【数据块】右键 →【新建数据块】
2. 名称:例如 `DB_Global`
3. 类型:**全局 DB**
4. 属性:✅优化的块访问(打勾)
5. 确定。
打开 DB_Global,在表格里面直接填变量:

- **保持列打勾:这个变量断电保存**;不打勾上电清零。
优化 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 接口:

保存 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 自己的 SCL 代码里面,访问上面这所有接口变量,**前面都必须加#**
#Start //Input输入
#Stop //Input输入
#MotorOut //Output输出
#Run_Flag //Static静态
❌不能直接写 `Run_Flag:=TRUE;`,不加 #编译报错
SCL代码
IF #Start THEN
#Run_Flag := TRUE;
END_IF;
下一篇:PLC硬件&软件收集