news 2026/3/6 18:11:46

西门子PLC STL编程常见的错误(6):在FC的使用当中常见的错误

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
西门子PLC STL编程常见的错误(6):在FC的使用当中常见的错误

1.ENO 的误解

对于初学者来说,容易在EN0的使用上出错误,由于不清楚EN0来龙去脉,经常认为只要调用FC是无条件的,那么EN0也是永远导通的,实则不然。下图中的例子将说明这个问题。程序原目的:进行模拟量转换,并无条件地将MD10的数值传送至MD14。

在图中可以看出,当FC105的输入端PIW256在正常范围内的时候,MOVE指令被执行(ENO=EN),当PIW256超出了上限值后,MOVE指令不再被执行(ENO≠EN)。此故障还是比较隐蔽的,因为大部分情况下,输入可能都处于正常范围。

故障分析:在STEP7的LAD编程手册中有对EN/EN0机制的详细描述,这里不再赘述。仅列出主要部分内容:

ENO的值取决于公式:EN0=EN与非error)

如果程序调用没有错误(error=0),则ENO=EN。

如果程序调用有错误(error=1),则EN0=0。EN/ENO 机制用于:

数学运算指令

传输及转换指令

移位及循环移位指令

块调用

EN/ENO 机制不能用于:

比较指令

计数器

定时器

如果用户要创建自己在 FBD或LAD中调用的块,那么必须确保退出块时,置位 BR位。这并不是一个自动处理过程。不能使用BR作为存储位,因为EN/ENO机制会不断重写BR位。作为代替,可使用一个临时变量(例如#error)来保存发生的所有错误,并用0初始化此变量。在块内部程序中,如果用户某处程序执行为错误状态,则可以将此变量置1。并且在块结尾编写以下程序段:

end:AN error

SAVE

确保在任何情况下都处理本程序段,这表示禁止在块内使用BEC,并禁止跳过本程序段。

2.停止对 FC 调用后引起的故障:

下面的程序非常简单,看似正确,但存在着一定隐患。程序原目的:

在0B1中当M0.0为1的时候,调用FC13在0B1中当M0.0为01的时候,不调用FC13FC13中包含简单逻辑及定时器的使用

故障现象:

假设某个时刻,MO.0,M0.1,M2.0都为1,并且维持数值1的时间超过了10秒,那么Q0.1,M2.1 也都会为 1。

假设此时 M0.0变为0,FC13不再被调用,结果如图:

对于初学者来说,容易忽视的问题为:M0.0变为0后,FC13中的Q,M,会保持原来状态,T,C会继续工作,如果M0.0再次变为1,并且此时M2.0也为1,由于定时器保持着计时到达的状态,M2.1会立刻变为1,这种情况可能会导致某些在FC被调用后必须延时执行的逻辑立刻被执行。在实际应用中,如此逻辑为某个设备启动信号,那么这个设备可能会跳过延时或保护逻辑而马上运行! 对于编程人员如果能够确保上述现象不构成对人身及财产的伤害,则可以不采取措施,否则应当加入限制程序,例如下面的复位语句。

3.FC 中临时变量的使用:

很多初学者容易将FC及FB相混淆,认为FB仅仅是比FC多了一个背景数据块,这种认识是非常危险的。在STEP7的关于FC的描述是这样的:

FC是一个没有存储空间的逻辑块。FC的临时变量存储在本地数据堆中,这些数据在FC执

行完毕后将会丢失。为了永久的保存数据,FC可以使用共享数据块。由于FC没有自己的存储空间,所以必须指定实参给它的参数(这就是为什么FC的输入输出管脚必须填写参数的原因)。FC的临时变量(位于本地数据堆栈中)是无法指定初始值的(由于本地数据堆栈是由系统自动动态使用的)。为了更形象的说明这一点,我们来看下面的例子,此例子对L堆栈在程序调用时的分配进行了详细的讲解:

L堆栈永远以地址“0”开始。在L堆栈中,会为每个FC提供一定地址空间,作为存放每个块所拥有的固有数据或局部数据。当某个块终止时,那么它的空间随之也被重新释放出来。 指针总是指向当前打开块的第一个字节。

由上面的例子可以看出:对于FC20曾经使用过的系统中L堆60-80区间(FC20中地址范围为LB0-LB19)在FC20调用结束后,被提供给FC21使用(FC21中地址范围同样为LB0-LB19)。

对于FC的临时变量认识不清晰,用户在对临时变量的使用当中,也经常会出现一些错误,下面将使用一个例子非常直观地说明上面的问题

程序原目的:

在0B1在程序中调用FC20后立即调用FC21

FC20中将20赋值给临时变量FC20TEMP1,将21赋值给临时变量FC20TEMP2FC21中将FC21 TEMP1,FC21 TEMP2 相加

程序分析:我们发现FC20中的临时变量曾经出现的数值(20,21)被FC21中的临时变量FC21 TEMP1,FC21TEMP2得到了,如果直接使用这两个临时变量进行加法操作,可以得到结果 41。对于编程人员来说,临时变量必须要在所在程序段中赋值,而后使用。用户对此例中的FC21 TEMP1,FC21 TEMP2必须先做清零处理,否则其在使用前即可能拥有数值。

结论:对于FC或FB中的临时变量,不要希望将本次调用的数值可以存储在里面以供下次程序调用使用,因为这些临时变量所使用的L堆栈空间在FC或FB调用结束就释放给系统了,其它后续程序可以任意使用。所以下列用法都是错误的:

将临时变量用于上升/下降沿指令

将临时变量用于自保持逻辑

临时变量未在所在程序段中赋值,直接使用

警告:不要试图利用L堆栈的这种特点进行功能或功能块之间的数据传递。程序逻辑改变,语句执行顺序改变,临时数据区长度定义改变,中断程序都会影响L堆中的数据存储顺序。

.4.FC 输出处理

对于FC的使用,另一个的常见的错误是对输出的错误处理:导致这个错误的原因还是对FC认识的不清楚。再次强调:相比较于FB,FC是一个没有存储空间的逻辑块。如果没有数据被写至FC的 OUT参数,FC将会输出一个随机值!对于FB,因为其可以使用背景数据块来存储 0UT 参数的数值,即使某次调用没有对0UT参数进行写操作,0UT参数依然可以输出上一次的旧值。

下面的程序将说明这一点:

程序原本目的:

在 0B1中调两次FC22,将MWO,MW2作为输入参数,DB1.DBX0.0,DB1.DBX0.1分别作为输出参数赋给 FC22

FC22 检测当输入大于10时,置位输出为1

FC22 检测当输入小于-10时,复位输出为0

FC22的输出的动作死区为-10至10

此程序乍看是没有错误的,但是,如果0B1中调用了两次FC22,而且M位于死区(-10至10)之间时,MW0的数值改变将不仅仅改变DB1.DBX0.0的状态,同时会影响输出 DB1.DBX0.1的数值。

故障分析:在上面的例子,0B1中调用了两次FC22,而且MW2位于死区(-10至10)之间时,其输出在FC22没有被赋值,DB1.DBX0.1正常情况下不应当改变数值。但是本例中,MW0的数值改变将不仅仅改变 DB1.DBX0.0的状态,同时会影响输出DB1.DBX0.1的数值。如下图。

结论:

对于FC的输出变量,必须要在每次执行FC时赋给一个确定的值,否则输出有可能会输出一个随机值。下列用法都是错误的:

将输出变量用于上升/下降沿指令

将输出变量用于自保持逻辑

输出变量未在所在程序段中赋值

警告:不要因为在FC编程中遇到没有对输出赋值,而程序执行正确,就忽略了对FC输出编程的注意事项,否则将承担这个错误有可能带来的风险。

建议:

用IN/OUT变量代替UTPUT量

不论何时调用块,FC中的0UT参数都必须被赋值

广州巨控手机 APP 监控PLC 方案

如何从wincc上采集数据

如何实现手机APP控制PLC

如何采集wincc数据并转成HTTPS协议给第三方软件

wincc异地监控1200PLC的方法

组态王与PLC的无线4G通讯

工控人如何用云组态做手机APP实现PLC远程监控

如何实现PLC短信微信报警

两台PLC之间的4G远程无线通讯

如何远程读取wincc数据

如何快速实现互联网远程监控plc?

S7-400H和WINCC通讯

WinCC 画面中浏览 PDF 文件

WinCC V7.5 SP1VBS全局变量的使用

200smart怎么通过4G网络与wincc通讯

WINCC中比较实际趋势曲线和设定值(理想)曲线的实现方法

西门子1500PLC怎样异地远程监控

经典WinCC移植到WinCC Professional

WinCC 数据使用MQTT传送到云端

NET421/NET431西门子plc与ABplc通讯网关

S7-200 SMART 与 S7-1200 之间 TCP 通信— S7-200 SMART 作为服务器

如何在 WinCC Runtime Professional 中自动调整画面分辨率适应窗口的大小?

如何实现简单的 WinCC 项目分屏?

s7-1200通过4G网连接中控室

WinCC C/S结构快速入门

如何防止多个WinCC客户机同时操作或更改数值?

精智Comfort屏如何周期性调用脚本

巨控协议转换网关GRM321GRM322GRM323应用场景

精智面板/二代精简PN面板如何使用Modbus TCP/IP 通信组态

如何快速实现OPC DA转为WEBSEVER

200smart数据日志的功能

HMI如何通过PLC变量控制开始和停止数据记录

WinCC flexible配方与PLC的同步

HMI面板与S7-1500 R/H 冗余PLC的通信

WinCC Flexible Smart快速导入 Smart PLC变量

巨控OPC560系列远程智能控制终端

S7_1200配方功能快速入门

PLC远程调试监控模块-巨控GRM530

PN IO设备ET 200SP将支持R1模式

SCL 常见问题

PLC协议转换网关:巨控NET400

如何判断S7通信中断

S7-1500R/H PROFIBUS DP 通信

如何实现PLC短信报警

WinCC Modbus TCP 通信

wincc 远程和PLC通讯方案

1500PLC与wincc通过4G网络远程通讯

WINCC中自定义 XY 轴的多功能曲线的实现方法

wincc报警如何通过短信发送给手机

在WinCC(TIA Portal)项目中,如何正确的使用面板,模板,弹出窗口和滑入窗口?

通过巨控GRM532Y-C远程调试下载国外PLC

巨控GRM远程模块配置使用流程简介

巨控远程模块微信报警配置方法

TIA中如何将数据块的实际值转到初始值中

wincc 远程和PLC通讯方案

如何使用EXCEL访问WinCC中的实时数据实现报表

西门子PLC无线通讯解决方案

巨控无线通讯模块在带式输送机行业的应用

WinCC激活故障排除及解决思路

Wincc在手机端监控_巨控OPC560解决方案

PLC之间的Profibus 通讯

怎么远程控制国外的PLC

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/4 16:27:05

AI印象派艺术工坊冷热数据分离:存储优化部署实战

AI印象派艺术工坊冷热数据分离:存储优化部署实战 1. 项目背景与挑战 随着AI生成艺术的普及,越来越多用户希望通过轻量、快速的方式将普通照片转化为具有艺术风格的画作。AI印象派艺术工坊(Artistic Filter Studio)正是基于这一需…

作者头像 李华
网站建设 2026/3/2 3:04:03

日志查看排错指南,快速定位模型加载失败

日志查看排错指南,快速定位模型加载失败 在使用 Z-Image-ComfyUI 镜像进行文生图任务时,尽管其容器化设计极大简化了部署流程,但实际运行中仍可能遇到模型加载失败的问题。这类问题往往表现为 ComfyUI 界面报错、节点执行中断或服务启动后无…

作者头像 李华
网站建设 2026/3/4 2:01:25

lora-scripts联邦学习探索:分布式数据下的LoRA协同训练设想

lora-scripts联邦学习探索:分布式数据下的LoRA协同训练设想 1. 引言:从集中式微调到分布式协同的演进需求 随着个性化AI模型需求的增长,LoRA(Low-Rank Adaptation)技术因其轻量高效、易于部署的特性,成为…

作者头像 李华
网站建设 2026/2/27 0:38:52

数据资产入表遇阻?破解实操难题的关键路径

自财政部《企业数据资源相关会计处理暂行规定》正式实施以来,数据资产入表在政策层面已扫清障碍。然而在实操层面,不少企业却陷入“政策热、企业冷”的怪圈,观望情绪浓厚。某制造业数字化负责人坦言:“政策方向很明确,…

作者头像 李华
网站建设 2026/3/4 23:59:48

通俗解释AUTOSAR软件开发中的虚拟功能总线

深入浅出AUTOSAR中的虚拟功能总线:让车载软件“说人话”你有没有遇到过这样的场景?一个负责车身控制的工程师写好了空调温度调节逻辑,结果因为整车通信从CAN换成了以太网,他不得不重写一半代码。更离谱的是,隔壁做动力…

作者头像 李华
网站建设 2026/3/2 11:38:02

亲测MGeo地址对齐效果,真实案例分享超预期

亲测MGeo地址对齐效果,真实案例分享超预期 1. 引言:中文地址匹配的现实挑战与MGeo的突破性表现 在电商订单归集、物流路径优化、城市治理数据融合等实际业务中,地址实体对齐是绕不开的基础环节。然而,中文地址天然存在高度非标准…

作者头像 李华