如果有人说:“我的这个临时变量好像受到了EMC干扰,数据都是乱的!”那你可以逗逗他:“EMC都精准干扰到你的某一个变量了”,简直是太厉害了!
>>>立即发帖,聊聊Temp区抗干扰那些事。
今天我来帮你加强程序块的局地址区Temp的知识!先考考你:

大家都知道,CPU中包含装载存储器、工作存储器以及系统存储器,局部变量区也可以称之为临时变量区位于系统存储器。如果创建了三个FC块,FC1、FC2、FC3,然后在三个FC中又分别创建了临时变量,现在问题来啦,三个FC中临时变量占用的地址空间是由CPU独立划分给每个FC,其他的FC以后再也不能使用呢?还是动态划分?想3秒钟。
答案是:FC 里的 TEMP 临时变量,是 CPU 调用时临时动态划分的,不是固定分给这个 FC 的,别的 FC 可以共用这块空间。也就是说当你调用这个 FC 时,CPU 临时从 L 区里划分一段给它用,当 FC 执行完、退出,这段空间立刻释放,再还给系统。下一个 FC、FB 调用时,可以继续用同一块物理地址。
那问题又来啦,如果在FC中的临时变量区中写了一个值,会不会其他FC使用时,这个值还存在呢?答案也是肯定存在。因为是共用、临时的,TEMP 变量不会自动清零。
基于这样的特点,需要注意以下两点:
第一:退出FC后临时变量不保持,所以不能作为边沿信号的存储位使用。
第二:再次调用FC,临时变量的数据可能是脏数据、随机值,例如其他FC赋值了一个浮点数,4个字节,本地临时变量可能是一个整型,只使用其中两个字节,把不是就乱套了吗。
所以使用TEMP 必须先清零,再使用!可不可以不清零呢
看看下面的示例。

如果不清零,M1.1 为0时,TEMP1的值可能是随机值。

这种情况直接赋值,可以不用清零。总之带有条件的赋值一定要清零。
知道问题的原因后,在遇到这样的问题就不要大惊小怪。如果有人说,我的这个临时变量好像受到了EMC干扰,数据都是乱的,你可以开玩笑地回答:“EMC都精准干扰到你的某一个变量了”,简直是太厉害了,可能你的临时变量没有清零吧。
我们再回来看一看S7-1500 是否需要清零呢?可能看到这么多的人都犯了这个错误,这个清零的任务就由系统完成了。
>>>立即发帖,聊聊Temp区抗干扰那些事。
好,还有什么问题,欢迎在评论区留言,我都能看到。更多知识点在西门子1847工业学习平台都能找到,搜索西门子1847!
往期回顾:
【每周热议】第26期 | 工程师常犯的错:这个感性负载隐患,你避开了吗
【每周热议】第25期 | 三两分钟搞明白Pointer、Any-这个你受的了吗?
【每周热议】第24期 | 设备“抽风”问题解决方法!99%工控人踩过的坑