跳到正文
Learn-LAD
示例库/Factory IO 连接示例

Factory IO 连接示例

Factory IO 连接示例:LAD 启停主程序 + 一个负责 Factory IO 通信配置的 SCL 函数。

进阶 多块 S7-1200 Factory IO SCL 通信

导入到我的 TIA 项目

通过 TiaLink 把本示例的 3 个对象导入你当前打开的 TIA Portal 项目。导入前会先预检,默认不覆盖同名对象,导入后不会自动保存。

TiaLink 设置

默认 http://localhost:8080。也可以在本页地址后加 ?tialink= 临时指定。

TiaLink 启动时若设置了 --api-token,这里要填相同的值;只保存在本机浏览器 localStorage,不会上传。

概述

这是一个 Factory IO 仿真产线的最小连接示例:LAD 主程序负责启动/停止和输出,另一个 SCL 函数负责 Factory IO 的通信配置。

LAD 部分很好懂:启动自锁 → 输送机、指示灯、出料器、推料器得电;停止 → 复位指示灯亮。SCL 部分则是厂商/仿真环境的握手代码,读起来偏底层,初学可以先跳过。

信号表

信号 类型 含义 作用
START PB I(%I0.0) 启动按钮 置位运行标志
RESET PB I(%I0.1) 停止/复位按钮(常闭) 复位运行标志
Tag_1 M(%M0.0) 运行标志 自锁
COVEYOR Q(%Q0.0) 输送机 运行时输出
START INDICATOR Q(%Q0.1) 启动指示灯 运行时亮
EMMITOR Q(%Q0.3) 出料器 运行时输出
REMOVER Q(%Q0.4) 推料器 运行时输出
RESET INDICATOR Q(%Q0.2) 复位指示灯 停止时亮

工作流程

  1. 按 START PB → Tag_1 置位并自锁;
  2. Tag_1=1 → 输送机、启动灯、出料器、推料器同时输出;
  3. 按 RESET PB → Tag_1 复位,设备停止,复位灯亮;
  4. 每个扫描周期都会调用一次 SCL 通信配置函数。

MainOB · 主程序

Network 1 — 调用 Factory IO 通信函数(LAD)

Network 1

目的:每个周期执行一次 Factory IO 的通信/同步配置。

条件 → 动作:无条件调用 SCL 函数 MHJ-PLC-Lab-Function-S71200。

注意:这段 SCL 不是产线逻辑,而是仿真环境的底层握手;它的内容依赖 Factory IO/TIA 的特定内存布局,换项目时不要直接照搬。

Network 2 — 启停自锁

Network 2:START PB、Tag_1、RESET PB、Tag_1

条件 → 动作:START PB 置位 Tag_1 并自锁;RESET PB 常闭断开时复位。

逻辑:Tag_1 = (START PB OR Tag_1) AND NOT RESET PB

Network 3 — 运行时输出

Network 3:Tag_1、COVEYOR、START INDICATOR、EMMITOR、REMOVER

条件 → 动作:Tag_1=1 → COVEYOR、START INDICATOR、EMMITOR、REMOVER 同时为 1。

为什么:四个输出共用同一个运行标志,保证启停一致。

逻辑:COVEYOR = Tag_1(其余三个同理)

Network 4 — 复位指示灯

Network 4:Tag_1、RESET INDICATOR

条件 → 动作:Tag_1=0 → RESET INDICATOR=1。

逻辑:RESET INDICATOR = NOT Tag_1

MHJ-PLC-Lab-Function-S71200FC · 函数(SCL)

名称数据类型注释
Input
Output
InOut
Temp
rdTimeReturnInt
outputTimeDTL
SyncValByte
forValInt
forVal_2Int
ValueByte
Constant
CompValByte
Value_01Byte
Value_01_DWDWord
Value_02_DWDWord
Return
Ret_ValVoid

Network 1 — Factory IO 通信配置(SCL)

SCL
12#Value:=PEEK(area := 16#82,3     dbNumber := 0,4     byteOffset := 511Ret_Val);5#Value := #Value + 1;67POKE(area := 16#82,8     dbNumber := 0,9     byteOffset := 511,10     value := #Value);1112POKE(area:=16#81,13     dbNumber:=0,14     byteOffset:=1016,15     value:=#16#A165_D992);16POKE(area := 16#81,17     dbNumber := 0,18     byteOffset := 1020,19     value := #16#58BE_4401);2021POKE(area := 16#81,22     dbNumber := 0,23     byteOffset := 511,24     value := B#16#00);2526FOR #forVal := 0 TO 120 DO27    FOR #forVal_2:=0 TO 10 DO28        #rdTimeReturn:=RD_SYS_T(#outputTimeRET_VAL);29        #rdTimeReturn := WR_SYS_T(#outputTimeRET_VAL);30        #rdTimeReturn := RD_SYS_T(#outputTimeRET_VAL);31        #rdTimeReturn := WR_SYS_T(#outputTimeRET_VAL);32    END_FOR;33    #SyncVal:= PEEK(area := 16#81,34                   dbNumber := 0,35                   byteOffset := 511Ret_Val);36    IF #SyncVal = #16#34 THEN37       GOTO ;38    END_IF;39END_FOR;40RETURN;414243POKE(area := 16#81,44     dbNumber := 0,45     byteOffset := 511,46     value := B#16#0);474849    

目的:与 Factory IO 仿真建立/同步通信。

条件 → 动作:代码用 PEEK/POKE 读写特定内存区域(area 16#81/16#82、DB 0、固定偏移),写入固定标识值,循环调用 RD_SYS_T/WR_SYS_T 并等待同步值;最后清理同步位。

为什么:这类代码通常是仿真软件或厂商提供的"连接初始化"例程,靠固定内存地址和标识值完成握手。

注意:导出代码里有 byteOffset := 511Ret_Val 和空的 GOTO ;,看起来是导出/手工修改造成的语法问题,直接编译可能失败;学习时把它当成"通信例程"理解即可,不要作为 SCL 语法范例。

常见问题

  • 按启动没反应:检查 START PB 和 RESET PB 的常闭状态。
  • 通信函数编译失败:先修正 511Ret_Val 和 GOTO ; 两处;不同 TIA/Factory IO 版本的地址可能不同。
  • 换项目后通信失效:SCL 里的内存地址、DB 号、标识值都是项目相关的,不能直接复制。

变体与扩展

  • 去掉通信函数:只保留 LAD 启停,接真实 I/O 即可变成普通输送线控制。
  • 换成标准通信:用 PROFINET/OPC UA 替代底层内存握手,可移植性更好。
  • 把 SCL 独立成 FC:保留接口,内部替换成项目自己的初始化逻辑。

变量与数据块

变量表:Default tag table

名称数据类型地址注释
START PBBool%I0.0
RESET PBBool%I0.1
COVEYORBool%Q0.0
START INDICATORBool%Q0.1
RESET INDICATORBool%Q0.2
EMMITORBool%Q0.3
REMOVERBool%Q0.4
Tag_1Bool%M0.0

下一步