4. PLC编程基础

在西门子S7-1500的工程开发中,编程基础决定了程序的可读性、可维护性与运行可靠性。数据类型决定“数据长什么样”,变量存储区决定“数据放在哪里”,位逻辑指令决定“逻辑怎么判断”,定时器与计数器指令决定“时间与次数怎么控制”。四者构成梯形图与SCL编程的底层骨架,必须系统掌握。

一、数据类型:先定义数据,再谈逻辑

S7-1500的数据类型分为基本数据类型与复杂数据类型。基本类型包括布尔型(Bool)、字节(Byte)、字(Word)、双字(DWord)、整型(Int、DInt)、实数(Real、LReal)、时间(Time)、日期时间(DTL)等。复杂类型包括数组(Array)、结构(Struct)、字符串(String)以及PLC数据类型(UDT)。

选择数据类型时,应遵循“够用且明确”的原则:位状态用Bool,计数用Int或DInt,模拟量用Real,时间用Time。若把模拟量直接放入Int,会丢失小数精度;若把计数器放入Byte,超过255就会溢出。数据类型不匹配是S7-1500编译报错的常见原因,也是运行异常的隐蔽来源。

数据类型 典型长度 典型用途 常见误区
Bool 1位 按钮、限位、线圈状态 误当字节使用
Int / DInt 16位 / 32位 计数、编号、整数运算 计数范围估算不足
Real 32位 模拟量、温度、压力 与Int直接混合运算
Time 32位 定时器设定值 单位混淆(ms/s)
Array / UDT 复合 批量数据、设备模板 下标越界、结构不统一

二、变量存储区:I、Q、M、DB与L

S7-1500的变量按存储区划分:输入过程映像区(I)、输出过程映像区(Q)、位存储区(M)、数据块(DB)和局部数据(L)。I区反映外部输入状态,Q区驱动外部输出,M区用于中间标志,DB区用于结构化数据存储,L区用于块内临时变量。

编程规范上,建议:输入输出尽量通过过程映像访问,保证扫描周期一致性;中间状态优先使用M区或DB,但DB更适合结构化与掉电保持;临时变量只在当前块内有效,不能跨块使用。对于需要掉电保持的计数器值、配方参数,应使用保持型DB或设置保持属性。

在S7-1500中,优化访问的DB不再依赖绝对地址,而是通过符号名访问。这提高了可读性,但也要求变量命名规范、结构清晰,否则后期维护困难。

三、位逻辑指令:触点、线圈与置复位

位逻辑指令是梯形图的核心,包括常开触点(—| |—)、常闭触点(—|/|—)、输出线圈(—( )—)、置位线圈(—(S)—)和复位线圈(—(R)—)。常开触点在其位为1时导通,常闭触点在其位为0时导通,输出线圈把逻辑运算结果写入目标位。

置位与复位指令用于保持状态,常见于启保停电路。例如:启动按钮I0.0按下,置位Q0.0;停止按钮I0.1按下,复位Q0.0。若同时使用置位和复位,需注意扫描顺序,后执行的指令优先。实际工程中,建议对同一输出只使用一种控制方式,避免双线圈冲突。

// 启保停逻辑(梯形图等效SCL)
"Motor_Run" := ("Start_Btn" OR "Motor_Run") AND NOT "Stop_Btn";

// 置位/复位方式
IF "Start_Btn" THEN
    "Motor_Run" := TRUE;
END_IF;
IF "Stop_Btn" THEN
    "Motor_Run" := FALSE;
END_IF;

四、定时器与计数器指令:时间与次数的控制

S7-1500提供TON(接通延时)、TOF(断开延时)、TP(脉冲)和TONR(保持型接通延时)等定时器指令。TON最常用:当IN端为1并保持设定时间PT后,Q端输出1;IN端变为0时,Q端立即复位。PT的数据类型为Time,如T#5S表示5秒。

计数器指令包括CTU(加计数)、CTD(减计数)和CTUD(加减计数)。CTU在CU端每次上升沿使计数值加1,当CV大于等于PV时,Q端输出1。计数器常用于产量统计、循环次数控制、报警次数累计等场景。

// TON定时器调用示例
"Timer_1".TON(IN := "Start_Btn",
              PT := T#3S,
              Q  => "Delay_Done",
              ET => "Elapsed_Time");

// CTU计数器调用示例
"Counter_1".CTU(CU := "Part_Sensor",
                R  := "Reset_Counter",
                PV := 100,
                Q  => "Batch_Full",
                CV => "Current_Count");
定时器与计数器背景数据块必须唯一对应,不能多个调用点共用一个实例DB,否则会出现时间或计数值互相干扰。建议每个定时器/计数器使用独立背景DB,并在符号表中命名清晰。

五、综合案例:电机延时启动与批次计数

场景:按下启动按钮后,电机延时3秒启动;每检测到100个零件,批次完成指示灯亮起;按下停止按钮,电机停止并复位计数器。

  1. 定义变量:Start_Btn(I0.0)、Stop_Btn(I0.1)、Part_Sensor(I0.2)、Motor_Run(Q0.0)、Batch_Full(Q0.1)。
  2. 调用TON定时器,IN接Start_Btn,PT设为T#3S,Q输出到Motor_Run。
  3. 调用CTU计数器,CU接Part_Sensor上升沿,PV设为100,Q输出到Batch_Full。
  4. Stop_Btn同时复位Motor_Run和计数器。
S7-1500 位逻辑 + 定时器 + 计数器 信号链 输入 I 区 I0.0 启动按钮 I0.1 停止按钮 I0.2 零件传感器 位逻辑指令 常开/常闭触点 置位 S / 复位 R 输出线圈 ( ) 定时器 TON IN 启动延时 PT = T#3S Q 延时输出 计数器 CTU CU 上升沿计数 PV = 100 Q 批次完成 输出 Q 区 / 数据块 DB Q0.0 电机运行 Q0.1 批次完成指示 DB 计数当前值 停止按钮 I0.1 → 复位电机与计数器

六、编程规范与常见误区复盘

  • 命名规范:变量名应体现设备、功能与状态,如“Conveyor1_Run”“Tank2_Level_High”,避免使用“M1”“T1”等无意义名称。
  • 单一职责:一个FC或FB只完成一个明确功能,定时器与计数器使用独立背景DB。
  • 避免双线圈:同一输出位在多个位置被线圈驱动,会导致实际输出取决于最后扫描结果。
  • 时间单位统一:PT值统一使用T#格式,避免把毫秒当秒用。
  • 计数器复位:计数器必须设计明确复位条件,否则断电重启或批次切换后计数不归零。
  • 数据类型匹配:Real与Int运算前先转换,避免隐式转换带来的精度损失或编译错误。
掌握数据类型、存储区、位逻辑、定时器与计数器,是S7-1500编程从“能跑”走向“可靠、可维护”的关键一步。建议在练习中先画信号链,再写程序,最后用变量表在线监控,形成闭环验证习惯。