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版本,界面清爽,功能也全。

创建一个新项目,步骤其实很简单:

  1. 打开TIA Portal,点击“创建新项目”。
  2. 输入项目名称,比如“PLC_Basics_Review”。
  3. 点击“添加新设备”,选择你手里的PLC型号。比如我选CPU 1214C DC/DC/DC。
  4. 系统会自动生成一个机架,你可以在设备组态里添加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