Network 1 — Factory IO 通信配置

目的:调用 SCL 函数完成 Factory IO 的通信/同步配置。
条件 → 动作:无条件调用 MHJ-PLC-Lab-Function-S71200。
注意:这段 SCL 是仿真环境的底层握手(PEEK/POKE、固定内存地址、系统时间读写),不是分拣逻辑;导出代码里还有 511Ret_Val、空 GOTO ; 等疑似语法问题。
Factory IO 分拣箱产线:18 个网络的启停、进料、左右分拣、计数与出料控制,外加 Factory IO 通信配置 SCL。
通过 TiaLink 把本示例的 8 个对象导入你当前打开的 TIA Portal 项目。导入前会先预检,默认不覆盖同名对象,导入后不会自动保存。
这是一个 Factory IO 分拣箱产线:启动后进料输送机送箱,高度传感器判断箱子类型,左右链条/输送机把箱子分流,入口传感器计数,最后出料器动作。
程序由 18 个网络组成:1 个 Factory IO 通信 SCL 调用、启停与指示灯、进料控制、左右分拣、计数和出料。它比前面的单功能示例更接近真实产线,也暴露了原工程里右分拣分支不完整的问题(见 Network 11/12)。
| 信号 | 类型 | 含义 | 作用 |
|---|---|---|---|
Start_Button_1 / Reset_Button_1 |
I | 启动/复位 | 控制运行标志 Tag_1 |
Height_sensor_1 |
I | 进料高度检测 | 允许进料 |
Height_sensor_2 / _3 |
I | 分拣高度检测 | 组合判断箱子类型 |
Load |
I | 负载/到位检测 | 停止进料、触发分拣 |
Left Entry / Right Entry |
I | 左/右入口 | 分拣完成、复位分支、计数 |
Tag_1 |
M | 运行标志 | 总使能 |
Tag_2 |
M | 左分支标志 | 左分拣保持 |
Tag_5 |
M | 右分支标志 | 右分拣保持(程序中没有置位它) |
Tag_9 |
M | 出料节拍 | 10 秒周期的短脉冲 |
Feed Conveyor |
Q | 进料输送机 | 送箱/停止 |
Chain_Transfer_Left/Right |
Q | 左右链条 | 分流 |
Left_Conveyor / Right_Conveyor |
Q | 左右输送机 | 分流后输送 8 秒 |
Remover 1/2 |
Q | 推料器 | 运行时动作 |
Emitter |
Q | 出料器 | 由 Tag_9 触发 |
right counter / Left counter |
QW | 左右计数 | CTU 的 CV |
Start Light / Reset Light |
Q | 状态灯 | 运行/停止指示 |
Start_Button_1 → Tag_1 置位;按 Reset_Button_1 → 复位;Height_sensor_1 检测到箱子且 Load=0 → 启动进料;Load=1 或复位 → 停止进料;Tag_2;Tag_2 且 Load=1 → 左链条动作,左输送机运行 8 秒;Left Entry 下降沿 → 复位左分支;右分支结构类似(但 Tag_5 从未被置位,见下);Reset_Button_1 复位计数器;Tag_9 每 10 秒产生一个短脉冲,驱动 Emitter;
目的:调用 SCL 函数完成 Factory IO 的通信/同步配置。
条件 → 动作:无条件调用 MHJ-PLC-Lab-Function-S71200。
注意:这段 SCL 是仿真环境的底层握手(PEEK/POKE、固定内存地址、系统时间读写),不是分拣逻辑;导出代码里还有 511Ret_Val、空 GOTO ; 等疑似语法问题。

条件 → 动作:按 Reset_Button_1 → 复位 Tag_1。
逻辑:Tag_1 = Reset_Button_1(复位线圈)

条件 → 动作:按 Start_Button_1 → 置位 Tag_1。
逻辑:Tag_1 = Start_Button_1(置位线圈)

条件 → 动作:Tag_1=1 → Feed Conveyor、Start Light、Remover 1、Remover 2 输出。
为什么:四个输出共用运行标志,保证启停一致。
逻辑:Feed Conveyor = Tag_1(其余同理)

条件 → 动作:Tag_1=0 → Reset Light=1。
逻辑:Reset Light = NOT Tag_1

条件 → 动作:Tag_1=1 且 Height_sensor_1=1 且 Load=0 → 置位 Feed Conveyor。
为什么:只有检测到箱子、且当前没有负载时才继续进料,避免堆箱。
逻辑:Feed Conveyor = Tag_1 AND Height_sensor_1 AND NOT Load(置位)

条件 → 动作:Load=1(箱子到位)或 Reset_Button_1=1 → 复位 Feed Conveyor。
逻辑:Feed Conveyor = Load OR Reset_Button_1(复位)

条件 → 动作:Height_sensor_2=1 且 Height_sensor_3=1 → 置位 Tag_2。
为什么:两个高度传感器同时动作代表一种箱型,用 Tag_2 记住分拣方向。
逻辑:Tag_2 = Height_sensor_2 AND Height_sensor_3(置位)

条件 → 动作:Tag_2=1 且 Load=1 → 置位 Chain_Transfer_Left;Left_Conveyor 由 TOF 保持 8 秒。
为什么:TOF 让左输送机在条件消失后继续运行 8 秒,保证箱子走完。
逻辑:
Chain_Transfer_Left = Tag_2 AND Load(置位)
Left_Conveyor = TOF(IN = Tag_2 AND Load, PT = T#8s).Q

条件 → 动作:Left Entry 的下降沿(NBox,存储位 Tag_4)→ 复位 Chain_Transfer_Left 和 Tag_2。
为什么:箱子到达左入口后结束左分支,准备下一次分拣。
逻辑:Chain_Transfer_Left = FALLING(Left Entry)(复位);Tag_2 = FALLING(Left Entry)(复位)

条件 → 动作:Tag_5=0 且 Load=1 → Chain_Transfer_Right=1。
注意:Tag_5 在整个程序里没有置位逻辑(只有 Network 12/13 的置位/复位?实际只有复位),所以右分支通常不会按"箱型"触发;而且本网络用普通线圈、Network 12 又用置位线圈驱动同一个输出,容易互相覆盖。右分拣逻辑很可能漏了一个网络,使用前需要补上 Tag_5 的置位条件(例如"高度传感器另一种组合")。
逻辑:Chain_Transfer_Right = NOT Tag_5 AND Load

条件 → 动作:Tag_5=1 且 Load=1 → 置位 Chain_Transfer_Right;Right_Conveyor 由 TOF 保持 8 秒。
注意:由于 Tag_5 从未置位,这一支路实际不会触发;保留它是为了对照 Network 9 的左分支结构。
逻辑:
Chain_Transfer_Right = Tag_5 AND Load(置位)
Right_Conveyor = TOF(IN = Tag_5 AND Load, PT = T#8s).Q

条件 → 动作:Right Entry 的下降沿(NBox,存储位 Tag_6)→ 复位 Chain_Transfer_Right 和 Tag_5。
逻辑:Chain_Transfer_Right = FALLING(Right Entry)(复位);Tag_5 = FALLING(Right Entry)(复位)

条件 → 动作:Right Entry 的上升沿(PBox,存储位 Tag_7)→ CTU 计数,PV=100,CV 写入 right counter;Reset_Button_1 复位。
逻辑:right counter = CTU(CU = RISING(Right Entry), PV = 100, R = Reset_Button_1).CV

条件 → 动作:Left Entry 的上升沿(PBox,存储位 Tag_8)→ CTU 计数,PV=100,CV 写入 Left counter;Reset_Button_1 复位。
逻辑:Left counter = CTU(CU = RISING(Left Entry), PV = 100, R = Reset_Button_1).CV

条件 → 动作:Tag_1=1 且 Tag_9=0 → TON 计时 10 秒;到时 Tag_9=1,下一扫描条件断开,Tag_9 又复位,形成周期性短脉冲。
注意:这不是"保持 10 秒"的输出,而是每 10 秒一个扫描周期的脉冲;如果出料器需要持续动作,应改用 TP 或自锁。
逻辑:Tag_9 = TON(IN = Tag_1 AND NOT Tag_9, PT = T#10s).Q

条件 → 动作:Tag_9=1 → Emitter=1。
逻辑:Emitter = Tag_9
| 名称 | 数据类型 | 注释 |
|---|---|---|
| Input | ||
| Output | ||
| InOut | ||
| Temp | ||
| rdTimeReturn | Int | |
| outputTime | DTL | |
| SyncVal | Byte | |
| forVal | Int | |
| forVal_2 | Int | |
| Value | Byte | |
| Constant | ||
| CompVal | Byte | |
| Value_01 | Byte | |
| Value_01_DW | DWord | |
| Value_02_DW | DWord | |
| Return | ||
| Ret_Val | Void | |
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 并等待同步值,最后清理同步位。
为什么:这是仿真软件/厂商提供的底层连接例程,靠固定地址和标识值完成握手;主程序 Network 1 每个周期调用它一次。
注意:它与分拣逻辑无关,换项目时不能直接照搬;导出代码里的 511Ret_Val 和空 GOTO ; 看起来是语法问题,直接编译可能失败。
Tag_5 没有置位条件,且 Network 11/12 驱动同一个输出;需要补一个"右侧箱型判断"网络。Reset_Button_1 同时用于复位系统和计数器;确认复位信号是否正常。Tag_9 是 10 秒一次的短脉冲,接触器可能来不及响应;改用 TP 保持一段时间。511Ret_Val、GOTO ; 需要修正;它与分拣逻辑无关。Tag_5,并让 Network 11/12 统一用一种线圈类型。Tag_9 改成 TP,让出料器每次动作固定时间。Left counter/right counter 接到 HMI,做产量统计。| 名称 | 数据类型 | 地址 | 注释 |
|---|---|---|---|
| Height_sensor_1 | Bool | %I0.0 | |
| Height_sensor_2 | Bool | %I0.1 | |
| Height_sensor_3 | Bool | %I0.2 | |
| Load | Bool | %I0.3 | |
| Left Entry | Bool | %I0.4 | |
| Right Entry | Bool | %I0.5 | |
| Start_Button_1 | Bool | %I1.0 | |
| Reset_Button_1 | Bool | %I1.1 | |
| Feed Conveyor | Bool | %Q0.0 | |
| Load Sensor | Bool | %Q0.1 | |
| Unload | Bool | %Q0.2 | |
| Chain_Transfer_Left | Bool | %Q0.3 | |
| Chain_Transfer_Right | Bool | %Q0.4 | |
| Left_Conveyor | Bool | %Q0.5 | |
| Right_Conveyor | Bool | %Q0.6 | |
| Reset Light | Bool | %Q0.7 | |
| Start Light | Bool | %Q1.0 | |
| Remover 1 | Bool | %Q1.1 | |
| Remover 2 | Bool | %Q1.2 | |
| Emitter | Bool | %Q1.3 | |
| Tag_1 | Bool | %M0.0 | |
| Tag_2 | Bool | %M0.1 | |
| Tag_3 | Time | %MD1 | |
| Tag_4 | Bool | %M0.5 | |
| Tag_5 | Bool | %M0.2 | |
| Tag_6 | Bool | %M0.7 | |
| Tag_7 | Bool | %M2.0 | |
| right counter | Int | %QW34 | |
| Tag_8 | Bool | %M2.1 | |
| Left counter | Int | %QW30 | |
| Tag_9 | Bool | %M10.0 |
TIA 自动生成的定时器/计数器实例 DB,导入示例时会一并导入。
| 名称 | 数据类型 | 起始值 | 注释 |
|---|---|---|---|
| Static | |||
| CU | Bool | ||
| CD | Bool | ||
| R | Bool | ||
| LD | Bool | ||
| QU | Bool | ||
| QD | Bool | ||
| PV | Int | ||
| CV | Int | ||
| 名称 | 数据类型 | 起始值 | 注释 |
|---|---|---|---|
| Static | |||
| CU | Bool | ||
| CD | Bool | ||
| R | Bool | ||
| LD | Bool | ||
| QU | Bool | ||
| QD | Bool | ||
| PV | Int | ||
| CV | Int | ||
| 名称 | 数据类型 | 起始值 | 注释 |
|---|---|---|---|
| Static | |||
| PT | Time | ||
| ET | Time | ||
| IN | Bool | ||
| Q | Bool | ||
| 名称 | 数据类型 | 起始值 | 注释 |
|---|---|---|---|
| Static | |||
| PT | Time | ||
| ET | Time | ||
| IN | Bool | ||
| Q | Bool | ||
| 名称 | 数据类型 | 起始值 | 注释 |
|---|---|---|---|
| Static | |||
| PT | Time | ||
| ET | Time | ||
| IN | Bool | ||
| Q | Bool | ||