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或设置保持属性。
三、位逻辑指令:触点、线圈与置复位
位逻辑指令是梯形图的核心,包括常开触点(—| |—)、常闭触点(—|/|—)、输出线圈(—( )—)、置位线圈(—(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");
五、综合案例:电机延时启动与批次计数
场景:按下启动按钮后,电机延时3秒启动;每检测到100个零件,批次完成指示灯亮起;按下停止按钮,电机停止并复位计数器。
- 定义变量:Start_Btn(I0.0)、Stop_Btn(I0.1)、Part_Sensor(I0.2)、Motor_Run(Q0.0)、Batch_Full(Q0.1)。
- 调用TON定时器,IN接Start_Btn,PT设为T#3S,Q输出到Motor_Run。
- 调用CTU计数器,CU接Part_Sensor上升沿,PV设为100,Q输出到Batch_Full。
- Stop_Btn同时复位Motor_Run和计数器。
六、编程规范与常见误区复盘
- 命名规范:变量名应体现设备、功能与状态,如“Conveyor1_Run”“Tank2_Level_High”,避免使用“M1”“T1”等无意义名称。
- 单一职责:一个FC或FB只完成一个明确功能,定时器与计数器使用独立背景DB。
- 避免双线圈:同一输出位在多个位置被线圈驱动,会导致实际输出取决于最后扫描结果。
- 时间单位统一:PT值统一使用T#格式,避免把毫秒当秒用。
- 计数器复位:计数器必须设计明确复位条件,否则断电重启或批次切换后计数不归零。
- 数据类型匹配:Real与Int运算前先转换,避免隐式转换带来的精度损失或编译错误。