news 2026/3/31 20:01:05

西门子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/26 9:06:17

Swift-All序列分类实战:文本分类任务从数据到部署全流程

Swift-All序列分类实战:文本分类任务从数据到部署全流程 1. 引言:大模型时代下的文本分类新范式 随着大规模预训练语言模型的快速发展,文本分类作为自然语言处理中最基础且广泛应用的任务之一,正经历着从传统机器学习向大模型微…

作者头像 李华
网站建设 2026/3/24 14:45:19

Elasticsearch 201状态码场景分析:何时返回创建成功

Elasticsearch 201状态码深度解析:如何精准识别文档“首次创建”?在构建现代数据系统时,我们常常依赖 Elasticsearch 来处理日志、事件流和业务指标。它的 RESTful API 设计简洁直观,但正是这种“简单”,让不少开发者忽…

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

AI 印象派艺术工坊创意营销案例:品牌联名艺术图生成实操

AI 印象派艺术工坊创意营销案例:品牌联名艺术图生成实操 1. 引言 1.1 业务场景描述 在数字营销日益同质化的今天,品牌如何通过视觉内容打造差异化记忆点成为关键挑战。传统广告素材制作周期长、成本高,且难以实现个性化互动。某轻奢生活方…

作者头像 李华
网站建设 2026/3/25 14:09:57

从科幻片看未来,人类的繁衍不再是生育,而是按需制造

今天看到新闻,去年新生人口790多万。大家都在讨论人越来越生得少了,以后是老龄化社会怎么办。但我总觉得,咱们是不是有点杞人忧天了?老祖宗说车到山前必有路,科技发展到今天,我们看问题的角度,是…

作者头像 李华
网站建设 2026/3/26 22:33:32

零基础也能用!Emotion2Vec+大模型一键部署语音情感分析

零基础也能用!Emotion2Vec大模型一键部署语音情感分析 1. 引言:语音情感识别的现实需求与技术突破 在智能客服、心理评估、人机交互等场景中,准确理解语音背后的情感状态已成为关键能力。传统方法依赖人工标注和浅层特征提取,存…

作者头像 李华
网站建设 2026/3/23 23:57:12

医疗文本抽疾病药物?Qwen3-0.6B定制化方案来了

医疗文本抽疾病药物?Qwen3-0.6B定制化方案来了 1. 引言:医疗信息抽取的现实挑战与LLM破局之道 在医疗健康领域,非结构化文本占据了临床记录、科研论文和药品说明书的主要部分。如何从这些文本中高效准确地提取关键医学实体——如疾病名称、…

作者头像 李华