技术论坛

浅谈S7-1500 PLC程序控制

作者 主题
游侠

经验值: 560
发帖数: 20
精华帖: 2
主题:【探讨】浅谈S7-1500 PLC程序控制
推荐帖


只看楼主 楼主 2022-09-01 11:58:34

    在PLC编程中,数学运算可能会发生数据溢出。最近一位朋友编写S7-1500 PLC程序,程序中求算术平均数的数据发生了溢出,最终数学计算结果输出错误。于是,朋友想到了调用状态字判断计算程序错误。可是,1500 PLC中却无状态字踪迹。

    早期使用S7-300 PLC时,PLC的状态字可轻易地调用。然而S7-1500 PLC没有状态字,程序中已无法使用状态字。那么该怎么处理程序执行错误呢?

    加法运算过程中发生溢出可能因为返回错误而导致的错误。但在某些情况下,加法溢出是系统预定义且可以接受,因此PLC系统不再认为加法溢出是一种错误。

通过以下几种方法,可以处理程序执行错误。

一、EN/ENO机制

    S7-1500 PLC通过EN/ENO机制,可以检测和处理程序的系统错误。通过使能输入EN指令,将根据具体条件执行。通过使能输出ENO,可查询指令中的运行错误,并进行相应的响应。

    新建项目“StatusWord”,并在项目中添加一个1500的PLC。

    (1)新建全局数据块“GlobalData”,并添加全局变量:Value1、Value2、Result,ErrorID,Error。

    (2)在主程序循环OB块中,添加“数学函数”计算指令。

    该函数计算公式为OUT=(IN1+IN2)/IN3。IN3输入为固定值2。

    (3)将程序下载到仿真PLC中。

    (4)将“GlobalData”.Value1的值修改为16380,“Global”.Value2的值修改为20000,这时“GlobalData”.Result的值为-14578。“GlobalData”.Result正确的值应为18190。Int是16位有符号整数值,可表示的最大值为32767,在加法的过程中,发生了溢出,因此计算结果出现了错误。

    (5)将PLC转至离线,单击“CALCULATE”指令块,选择”生成ENO“。并将ENO赋值给“GlobalData”.Error。

    “CALCULATE”指令的ENO赋值给“GlobalData”.Error。

    (6)修改完成后,将程序下载到仿真PLC中,再次运行PLC。

    (7)将“GlobalData”.Value1的值修改为16380,“Global”.Value2的值修改为12000,这时“GlobalData”.Result的值为14190。该结果计算正确,ENO输出为True。“GlobalData”.Error的值为True,表示计算未发生错误。将“GlobalData”.Value1的值修改为16380,“Global”.Value2的值修改为22000,此时,数学运算发生溢出,计算出现错误。但是“GlobalData”.Result的值仍为14190。ENO输出为False,“GlobalData”.Error的值为False,表示计算发生错误。("GlobalData”.Result的值仍为上次计算结果,运算指令未写入值。)

    在程序中通过判断“GlobalData”.Error的值,确认计算结果是否溢出或正确。

二、获取本地错误信息

    在全局数据块,“GlobalData”中添加整数型(int)数组Value,数据类型为 Array[0..100] of int,添加变量index(int)作为数组索引。

    (1)在程序主循环OB块程序段2中,添加加法指令,计算公式为:“GlobalData”.Value[100]:= “GlobalData”.Value[“GlobalData”.index]+100。

    (2)将修改后的程序下载到仿真PLC,监视PLC的运行。当“GlobalData”.index的值为0到99时,数组未发生越界,程序运行正确。这时修改“GlobalData”.index的值为101,看看会发生什么。

    此时数组寻址发生错误,PLC停止运行。

    (3)在程序段3,添加GET_ERR_ID(获取本地错误信息)指令。点击“基础指令”->“程序控制指令”->“程序运行时控制”。


    (4)将程序下载到仿真PLC中。再次运行PLC。

    此时,PLC继续运行,并没有停机。GET_ERR_ID获取的本地故障码为16#2522,这时候根据故障码判断数组寻址是否越界。

三、SCL控制机制

    前面我们提到的都是梯形图,而SCL语言中并没有加法等计算块指令,该怎么判断呢?

    (1)新建FC块,命名为“Average”。新建input变量IN1、IN2;新建output变量IN3。变量数据类型均为int。

    (2)编写FC块Average程序,#IN3 := (#IN1 + #IN2) / 2;一个简单的求平均数程序已完成。

    (3)删除以前的程序块,在程序主循环OB块中调用“Average”,填好输入输出值。

    (4)将程序下载到仿真PLC中,运行PLC,观察程序的状态。

    这时,无论数学运算是否溢出,FC块都没有提示。

    (5)点击“Average”属性,勾选“自动置位ENO”。

    (6)将更改后的程序下载到仿真PLC中,改变输入输出值,观察程序状态。

    更改属性后,FC块“Average”通过置位ENO,来判断计算是否溢出。

    (7)通过调用FC块,可以在主程序OB块中判断数学运算是否溢出。在FC内部该如何编写程序呢。

“Average”属性一定要选择“自动置位ENO”。PLC执行完数学指令后,判断ENO的值,调用错误处理程序。

                IF ENO THEN

                                #Error := 1;

                END_IF;

在程序中也可以通过GET_ERR_ID指令控制程序的运行。



 
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1782115&b_id=66&s_id=0&num=16

至圣

经验值: 18898
发帖数: 2108
精华帖: 0
回复:浅谈S7-1500 PLC程序控制
推荐帖


只看楼主 1楼 2022-09-01 12:20:21

分析对比细致,不错


 
以下网友喜欢您的帖子:

  
侠圣

经验值: 4374
发帖数: 674
精华帖: 4
回复:浅谈S7-1500 PLC程序控制


只看楼主 2楼 2022-09-01 12:39:52

学习了,谢谢分享


一天不学习就难受!
以下网友喜欢您的帖子:

  
至圣

经验值: 18407
发帖数: 2409
精华帖: 1
回复:浅谈S7-1500 PLC程序控制


只看楼主 3楼 2022-09-01 12:56:28

原来如此!


 
以下网友喜欢您的帖子:

  
侠圣

经验值: 4940
发帖数: 1174
精华帖: 0
回复:浅谈S7-1500 PLC程序控制
推荐帖


只看楼主 4楼 2022-09-01 13:27:15

数据溢出PLC会报错的,如果不先OB121,PLC会停机,在PLC诊断缓冲区可以定位故障点


13070952128
以下网友喜欢您的帖子:

  
至圣

经验值: 14224
发帖数: 3255
精华帖: 1
回复:浅谈S7-1500 PLC程序控制


只看楼主 5楼 2022-09-01 13:37:41

谢谢分享。


就是一个字——坚持!!!
以下网友喜欢您的帖子:

  
侠士

经验值: 1547
发帖数: 373
精华帖: 4
回复:浅谈S7-1500 PLC程序控制


只看楼主 6楼 2022-09-01 14:52:32

我倒是认为溢出要绝对避免,如果在运行时发生就说明没对数据规格做好规划。


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 8095
发帖数: 1308
精华帖: 6
回复:浅谈S7-1500 PLC程序控制


只看楼主 7楼 2022-09-01 16:33:32

还能生成eno  还不知道...


养活一团春意思,撑起两根穷骨头
以下网友喜欢您的帖子:

  
侠圣

经验值: 3028
发帖数: 294
精华帖: 1
回复:浅谈S7-1500 PLC程序控制


只看楼主 8楼 2022-09-02 08:32:17

谢谢分享,条条大路通罗马。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 19839
发帖数: 4383
精华帖: 2
回复:浅谈S7-1500 PLC程序控制


只看楼主 9楼 2022-09-02 09:14:31

楼主的分析很到位


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 6777
发帖数: 1106
精华帖: 1
回复:浅谈S7-1500 PLC程序控制


只看楼主 10楼 2022-09-02 10:58:59

eno这个使用学习到了,谢谢分享!


 
以下网友喜欢您的帖子:

  
侠客

经验值: 614
发帖数: 143
精华帖: 0
回复:浅谈S7-1500 PLC程序控制


只看楼主 11楼 2022-09-02 17:12:10

学习了,谢谢分享


 
以下网友喜欢您的帖子:

  
游侠

经验值: 488
发帖数: 106
精华帖: 0
回复:浅谈S7-1500 PLC程序控制


只看楼主 12楼 2022-09-02 17:26:04

感谢分享,非常实用


心之所向 行之所往 未来可期
以下网友喜欢您的帖子:

  
至圣

经验值: 26304
发帖数: 5838
精华帖: 5
回复:浅谈S7-1500 PLC程序控制


只看楼主 13楼 2022-09-04 09:31:40

谢谢分享,学习了。


天天学习,天天进步.
以下网友喜欢您的帖子:

  
游士

经验值: 249
发帖数: 21
精华帖: 0
回复:浅谈S7-1500 PLC程序控制


只看楼主 14楼 2022-09-13 16:58:22

一个程序有甚多FB\FC块的话,判断的话,每一个块都要添加嘛


 
以下网友喜欢您的帖子:

  
游侠

经验值: 383
发帖数: 36
精华帖: 1
回复:浅谈S7-1500 PLC程序控制


只看楼主 15楼 2022-09-15 19:24:23

学习了楼主~


FOR BETTER
以下网友喜欢您的帖子:

  
至圣

经验值: 127330
发帖数: 22001
精华帖: 824
回复:浅谈S7-1500 PLC程序控制


只看楼主 16楼 2022-09-15 22:33:31

ENO是使能输出,它有好多用法呢。属于程序控制指令。

尤其是用在自己写的FB、FC功能上; Variant 传送指定数据类型处理上。



学而时习之,不亦说乎?温故而知新,不亦乐乎?
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
浅谈S7-1500 PLC程序控制
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。