技术论坛

 回复:在S7-300程序中做一个类式电气的消声程序

返回主题列表
作者 主题
笑眯眼
游侠

经验值:367
发帖数:143
精华帖:0
楼主    2012-02-08 09:47:06
主题:在S7-300程序中做一个类式电气的消声程序(声光报警)
各位师兄师姐你们好, 我是新手, 请教一个问题就是: 怎么做一个程序能像电气那样的有消声功能,
具体情况是这样的: 从I0.0- I0.7都是常开报警输入, Q0.0外接一个蜂鸣器, I1.0外接一个自复位按钮. 如果I0.0有报警输入, 蜂鸣器响, 按一下按钮, 蜂鸣器停止响, 再来一路报警I0.2, 蜂鸣器再一次响起, 再按一下按钮, 蜂鸣器又停止响应. 以此类推.

请问这个小程序怎么处理, 谢谢啊
冬日
奇侠

经验值:8680
发帖数:3358
精华帖:56
32楼    2012-02-17 12:28:11
精华帖  主题:回复:在S7-300程序中做一个类式电气的消声程序
这是我用了多年的程序,绝对的原创。
需要把所有的故障都放在sorce DB,再增加一个DB用于保存旧的故障。输出有两个:
F_actived 表示有故障,不管有多少个故障都为true输出。正常输出给故障报警灯用的,再跟CPU的心跳位相与就可以作为一个闪烁的报警灯了。
New_Fault 表示有新故障,只要有新的故障都将输出一个周期,一般增加一个时间延时后输出到故障蜂鸣器。

FUNCTION FC 6 : VOID
TITLE =
AUTHOR : Franklin
VERSION : 0.1


VAR_INPUT
Src_DB : INT ; //Sorce DB of faults
Copy_DB : INT ; //Copy DB of faults
Words : INT ; //Number words of faults
END_VAR
VAR_OUTPUT
F_actived : BOOL ; //Fault active
New_Fault : BOOL ;
END_VAR
BEGIN
NETWORK
TITLE =

SET ;
SAVE ;

CLR ;
= #F_actived;
= #New_Fault;

L 0;
T LD 4;
T LW 2;

L #Src_DB;
T LW 0;
OPN DB [LW 0];
L #Copy_DB;
T LW 0;
OPN DI [LW 0];


_000: L 0;
L DBW [LD 4];
==I ;
JC _003;
S #F_actived;
L DIW [LD 4];
<=I ;
JC _001;
S #New_Fault;
TAK ;
_003: T DIW [LD 4];

_001: L LW 2;
+ 1;
T LW 2;
L #Words;
< I ;
JCN _en;
L LD 4;
+ L#16;
T LD 4;
JU _000;
_en: NOP 0;

END_FUNCTION
If anything can go wrong, it will.
伊默
至圣

经验值:19233
发帖数:4257
精华帖:118
58楼    2012-02-20 21:16:54
精华帖  主题:回复:在S7-300程序中做一个类式电气的消声程序
俺来佬…… 嘿嘿。
虽然一直喜欢西门子的东东,但是真正用的却非常非常少。 前几年一直用S7-200,后来种种原因改用别的了。
毕业到现在,加起来也就用了4次S7-300。 不过个人非常喜欢300的编程理念,甚至有的时候实际一些功能有些小别扭(比如上升沿和下降沿,),但是感觉还是痛并快乐着……

回到正题,在我做的项目里,报警是必不可少的。 而且拓展开来,应该分为:
报警:仅仅是警告,以声光提示给操作员,但是还可以继续工作。
故障:这个产生了,就必须停机,同时声光报警给操作员。

所以我的习惯是针对报警/故障建一个双字(如果报数数量超过31个,那么可以建立多个)比如
ALM_C : STRUCT //当前故障记录,每个位可以记录一个故障状态,最多31个(32-符号位)
b00: BOOL ;
b01: BOOL ;
b02: BOOL ;
b03: BOOL ;
b04: BOOL ;
b05: BOOL ;
b06: BOOL ;
SIG: BOOL ; //特别注意这个是符号位
b10: BOOL ;
b11: BOOL ;
b12: BOOL ;
b13: BOOL ;
b14: BOOL ;
b15: BOOL ;
b16: BOOL ;
b17: BOOL ;
...........
b37: BOOL ;
END_STRUCT;
ALM_L : DWORDL //故障记录暂存,每个位可以记录一个故障状态,最多31个


L ALM_L; //上次报警值
L ALM_C; //当前报警值
<D; //说明有新报警发生了
= L20.0; //输出一个标志位
T ALM_L; //暂存报警值,为下次使用做准备

A L20.0;
O Q0.0; //蜂鸣器
AN I0.0; //复位按钮
= Q0.0;

因为<D这个比较指令在STL语句里是有符号的双整数比较,所以要符号位不能记录报警信息,即一个双字只能记录31个报警信息……

开始编辑一下还不行,只好删了重发,汗……
我现在用1200,用TIAPortal使用UDINT类型,就不用管符号位,这样一个双字就可以记录32个报警了……

NND,怎么小于D这个还给屏蔽了,发不了啊?杯具
I can do it
dcount107
侠圣

经验值:2840
发帖数:1737
精华帖:55
67楼    2012-02-21 10:00:57
精华帖  主题:回复:在S7-300程序中做一个类式电气的消声程序
看各位大侠讨论的这么激烈,我也来凑凑热闹。先声明,我对PLC处理报警的理解可能不深,此程序仅满足zane斑竹提出的一些具体要求。
如有不妥之处,还请多多指正。
DB块声明及FC块见附件PDF。
点击此处查看附件
非淡泊无以明志,非宁静无以致远
冬日
奇侠

经验值:8680
发帖数:3358
精华帖:56
72楼    2012-02-21 12:59:10
精华帖  主题:回复:在S7-300程序中做一个类式电气的消声程序
做了一个,简单测试了一下。如果有被过滤请下载压缩包。
按Zane如下要求做的:(报警数最大为8x1024,应该够用了)
1.不用考虑报警标志位的置位与复位,只考虑检测报警标志位,任意多条。
2.有新报警到,报警等亮,报警声响;报警不消除,灯不能灭;报警声可灭,新报警重新激发;
3.按复位按钮,报警位不消除,灯不能灭(也不允许闪断);如果报警位已消除,可消声。
4.按消声按钮仅能消声
5.程序的输入1.报警位数据块2.复位按钮3.消音按钮;输出1.灯报警 2.声报警(不允许其他的变量)


FUNCTION_BLOCK FB 6
TITLE =
VERSION : 0.1
VAR_INPUT
Alarm_DB : BLOCK_DB ; //Sorce DB of faults
Reset : BOOL ;
Silence : BOOL ;
END_VAR
VAR_OUTPUT
Alarm_Lamp : BOOL ;
Alarm_Buzzer : BOOL ;
END_VAR
VAR
Buffer : ARRAY [1 .. 1024 ] OF WORD ;
END_VAR
BEGIN
NETWORK
TITLE =

A #Reset;
R #Alarm_Lamp;
R #Alarm_Buzzer;
A #Silence;
R #Alarm_Buzzer;

L 0;
T LD 0;
L 48;
T LD 4;
OPN #Alarm_DB;
L DBLG;
next: T LW 8;
L 0;
L DBB [LD 0];
==I ;
JC _001;
S #Alarm_Lamp;
L DIB [LD 4];
XOW ;
L DBB [LD 0];
AW ;
L 0;
==I ;
JC _001;
S #Alarm_Buzzer;
_001: L DBB [LD 0];
T DIB [LD 4];
L LD 0;
+ L#8;
T LD 0;
L LD 4;
+ L#8;
T LD 4;
L LW 8;
LOOP next;
END_FUNCTION_BLOCK

点击此处查看附件
If anything can go wrong, it will.
火麒麟
侠圣

经验值:4024
发帖数:571
精华帖:18
73楼    2012-02-21 14:37:02
精华帖  主题:回复:在S7-300程序中做一个类式电气的消声程序
呵呵,冬日大侠的程序不错!我现在想如果程序中不要有字节或字等操作,而是检测任意一段长度的报警区域,应该怎么做呢?
但是我觉得冬日大侠的程序有些部分还可以精简下呢,比如间接寻址、字逻辑指令后的跳转可用JZ:
A #Reset;
R #Alarm_Lamp;
R #Alarm_Buzzer;
A #Silence;
R #Alarm_Buzzer;

OPN #Alarm_DB;
LAR1 P#0.0;

L DBLG;
next: T LW 0;
L 0;
L DBB [AR1,P#0.0];
==I ;
JC _001;
S #Alarm_Lamp;
L DIB [AR1,P#6.0];
XOW ;
L DBB [AR1,P#0.0];
AW ;
JZ _001;
S #Alarm_Buzzer;
_001: L DBB [AR1,P#0.0];
T DIB [AR1,P#6.0];
+AR1 P#1.0;
L LW 0;
LOOP next;
业精于勤,行成于思
伊默
至圣

经验值:19233
发帖数:4257
精华帖:118
76楼    2012-02-21 15:49:41
精华帖  主题:回复:在S7-300程序中做一个类式电气的消声程序
国外的设备复位按钮都是两个,一个用来消声,一个是用来复位故障的…… 从设计上来讲,这个也是对的! 你不能因为声音响,就只让他响两秒。 否则的话,不要蜂鸣器,不是更安静了?呵呵。

不过我设计的时候只搞一个复位按钮,点去该按钮就消音,连续按住一秒钟就复位故障……
I can do it
liucs_2009
奇侠

经验值:8458
发帖数:565
精华帖:5
78楼    2012-02-21 19:15:04
精华帖  主题:回复:在S7-300程序中做一个类式电气的消声程序
1. 用一个报警位DB块,前1000个字用于存储实时报警,后1000个字用于存储上一个扫描周期的报警
2. 用两个地址寄存器进行寻址

A #Alarm_acknowledge_button //报警复位按钮
R #Light_alarm
R #Buzzer_alarm



A #Buzzer_acknowledg_button //报警消音按钮
R #Buzzer_alarm



OPN #Alarm_bit_DB //打开报警位数据块



L P#0.0 //指针初始化
LAR1
L P#1000.0
LAR2
Loop: L DBW [AR1,P#0.0] //检查报警位数据块
L W#16#0
OW
L 0
==I
JC _001 //无报警,跳转
S #Light_alarm //有报警,置位
L DBW [AR1,P#0.0]
L DBW [AR2,P#0.0]
XOW //检查有无新报警产生
L DBW [AR1,P#0.0]
AW //屏蔽多个报警,因某个报警消失而产生报警音
L 0
==I
JC _001
S #Buzzer_alarm //有新报警产生,则蜂鸣器响
_001: L DBW [AR1,P#0.0] //储存上个周期的报警位
T DBW [AR2,P#0.0]
TAR1 //继续查询下一个报警字
+AR1 P#2.0
TAR2
+AR2 P#2.0
TAR1
L P#1000.0
< D
JC Loop
工控生活、精彩人生
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。