2、PLC编程基础回顾(一):西门子S7-1200/1500基础、TIA Portal项目创建、基本逻辑指令(位逻辑、定时器、计数器)编程实践
各位同学,咱们开始上课。
这一章,我打算带大家快速回顾一下PLC编程的基础。你可能会问:“老师,我们不是要学IPC和PLC协同吗?怎么又回头讲基础?”
嗯,这个问题问得好。我个人的经验是,很多协同项目出问题,根源往往不在通讯协议上,而是PLC侧的逻辑本身就埋了雷。所以,咱们花点时间,把地基夯实了,后面盖楼才稳当。
2.1 西门子S7-1200/1500:选型与硬件认知
先聊聊硬件。S7-1200和S7-1500,这两兄弟是西门子当前的主力。我在项目里经常被问到:“到底选1200还是1500?”
我的建议很简单:
- S7-1200:适合中小型项目,点数不多,逻辑不复杂。比如单机设备、小型产线。性价比高,上手快。
- S7-1500:适合中大型项目,对性能、通讯、冗余有要求。比如大型流水线、过程控制。处理速度快,扩展能力强。
说白了,如果你只是控制几个气缸、几个电机,1200绰绰有余。但如果你要搞一个几十个轴的运动控制,或者跟MES系统做大数据交互,那还是得上1500。
核心区别速览:
| 特性 | S7-1200 | S7-1500 |
|---|---|---|
| 程序执行速度 | 较快 | 极快(纳秒级) |
| 最大工作存储器 | 150KB ~ 4MB | 1MB ~ 60MB |
| 通讯接口 | PROFINET(标配) | PROFINET + 可选DP/PN |
| 典型应用 | 单机、小型线 | 大型线、过程控制 |
2.2 TIA Portal项目创建:从零开始
好,硬件选好了,咱们打开TIA Portal。我习惯用V17或V18版本,界面清爽,功能也全。
创建一个新项目,步骤其实很简单:
- 打开TIA Portal,点击“创建新项目”。
- 输入项目名称,比如“PLC_Basics_Review”。
- 点击“添加新设备”,选择你手里的PLC型号。比如我选CPU 1214C DC/DC/DC。
- 系统会自动生成一个机架,你可以在设备组态里添加IO模块。
这里有个小细节,我提醒一下:设备名称和IP地址,一定要在项目一开始就规划好。我曾经见过一个项目,现场十几台PLC,IP地址全是乱的,最后排查通讯问题花了整整两天。你想想看,这多耽误事。
我的习惯:设备名称用“站点_功能”命名,比如“Line1_Conveyor”。IP地址按网段统一规划,比如192.168.1.10~192.168.1.20留给PLC,.30~.50留给IPC。这样后期维护起来,一目了然。
2.3 基本逻辑指令:位逻辑
接下来,咱们进入编程实战。先从最基础的位逻辑开始。
位逻辑,说白了就是处理“0”和“1”的逻辑。在PLC里,就是常开触点、常闭触点、线圈。
- 常开触点(--| |--):当输入为1时,触点闭合,信号通过。
- 常闭触点(--|/|--):当输入为0时,触点闭合,信号通过。
- 线圈(--( )--):输出赋值,将结果写入输出点或中间变量。
举个例子,一个最简单的起保停电路:
// 起保停电路(LAD)
// 启动按钮 I0.0,停止按钮 I0.1,输出 Q0.0
// 网络1:
I0.0 Q0.0
--| |----------( )
|
Q0.0
--| |--
这个电路,我相信大家都很熟悉。按下启动,Q0.0自锁;按下停止,Q0.0断开。
但我在项目中遇到过一个问题:如果停止按钮用的是常闭触点,程序里该怎么写?
嗯,这个问题很经典。如果外部接线是常闭,那程序里就要用常开触点来读取。否则逻辑会反。你想想看,是不是这个道理?
2.4 定时器指令:时间控制
定时器,是PLC里最常用的指令之一。西门子S7-1200/1500里,主要有三种:
- TON(接通延时):输入为1后,延时一段时间,输出才变为1。
- TOF(断开延时):输入从1变0后,延时一段时间,输出才变为0。
- TP(脉冲定时):输入触发一个脉冲,输出保持一段时间的高电平。
我个人用得最多的是TON。比如控制一个电机,启动后先等3秒,再打开冷却风扇。代码大概是这样:
// TON定时器示例(SCL)
#myTimer(IN := #startSignal,
PT := T#3S,
Q => #fanOn,
ET => #elapsedTime);
这里,#startSignal是启动信号,#fanOn是风扇输出。定时3秒后,风扇自动打开。
避坑指南:我曾经在调试一个项目时,发现定时器偶尔不工作。查了半天,原来是定时器的背景数据块被重复调用了。记住:每个定时器实例,必须使用独立的背景数据块。否则,定时器会互相干扰,逻辑全乱套。
2.5 计数器指令:计数与统计
计数器,用来统计脉冲次数。S7-1200/1500支持CTU(加计数)、CTD(减计数)、CTUD(加减计数)。
我举个例子,产线上需要统计通过的工件数量。每来一个工件,传感器给一个脉冲,计数器加1。当达到设定值(比如100个),就通知机器人来取料。
// CTU加计数器示例(LAD)
// 计数输入 I0.2,复位输入 I0.3,设定值 100
// 网络1:
I0.2 #myCounter
--| |----------(CTU)
|
I0.3 #myCounter.R
--| |----------(R)
|
#myCounter.Q Q0.1
--| |----------( )
当#myCounter的计数值达到100时,Q0.1输出1,通知机器人取料。复位信号I0.3为1时,计数器清零。
这里有个小技巧:计数器的设定值,我建议用变量而不是常量。这样,如果工艺要求变了,比如从100个改成120个,直接在HMI上改变量就行,不用重新下载程序。是不是方便很多?
2.6 综合小实践:一个简单的启停+计时+计数逻辑
好,咱们把刚才学的串起来,做一个简单的小程序。
场景:一个传送带,按下启动按钮,传送带运行。每通过一个工件,计数器加1。当通过10个工件后,传送带自动停止,并亮起指示灯。
// 主程序(OB1)
// 网络1:起保停控制传送带
"StartBtn" "StopBtn" "Conveyor"
--| |------------|/|------------( )
|
"Conveyor"
--| |--
// 网络2:工件计数(使用CTU)
"Sensor" "Count_Workpiece"
--| |------------(CTU)
|
"ResetCount" "Count_Workpiece".R
--| |------------(R)
|
"Count_Workpiece".Q "FullLight"
--| |----------------( )
// 网络3:满10个后停止传送带
"FullLight" "Conveyor"
--| |------------(R)
|
"FullLight" "StartBtn"
--| |------------(R) // 复位启动信号,防止重启
这个程序很简单,但很实用。我在调试一个小型包装线时,就用过类似的逻辑。当时客户要求每10个一包,用这个逻辑,配合一个气缸推料,完美解决问题。
好了,这一章的内容就到这里。咱们回顾了S7-1200/1500的选型、TIA Portal的项目创建,以及位逻辑、定时器、计数器的基础编程。这些内容虽然基础,但非常重要。下一章,咱们会继续深入,聊聊更复杂的数据类型和程序结构。
记住,基础不牢,地动山摇。多动手,多练习,有问题随时问我。
公众号:蓝海资料掘金营,微信deep3321