| 作者 | 主题 |
|---|---|
|
笑眯眼 游侠 经验值:367 发帖数:143 精华帖:0 |
楼主
主题:在S7-300程序中做一个类式电气的消声程序(声光报警)
各位师兄师姐你们好, 我是新手, 请教一个问题就是: 怎么做一个程序能像电气那样的有消声功能,
具体情况是这样的: 从I0.0- I0.7都是常开报警输入, Q0.0外接一个蜂鸣器, I1.0外接一个自复位按钮. 如果I0.0有报警输入, 蜂鸣器响, 按一下按钮, 蜂鸣器停止响, 再来一路报警I0.2, 蜂鸣器再一次响起, 再按一下按钮, 蜂鸣器又停止响应. 以此类推. 请问这个小程序怎么处理, 谢谢啊 |
|
冬日 奇侠 经验值:8680 发帖数:3358 精华帖:56 |
32楼
主题:回复:在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.
|
|
伊默 至圣 经验值:19234 发帖数:4258 精华帖:118 |
58楼
主题:回复:在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楼
主题:回复:在S7-300程序中做一个类式电气的消声程序
看各位大侠讨论的这么激烈,我也来凑凑热闹。先声明,我对PLC处理报警的理解可能不深,此程序仅满足zane斑竹提出的一些具体要求。
如有不妥之处,还请多多指正。 DB块声明及FC块见附件PDF。 点击此处查看附件
非淡泊无以明志,非宁静无以致远
|
|
冬日 奇侠 经验值:8680 发帖数:3358 精华帖:56 |
72楼
主题:回复:在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楼
主题:回复:在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;
业精于勤,行成于思
|
|
伊默 至圣 经验值:19234 发帖数:4258 精华帖:118 |
76楼
主题:回复:在S7-300程序中做一个类式电气的消声程序
国外的设备复位按钮都是两个,一个用来消声,一个是用来复位故障的…… 从设计上来讲,这个也是对的! 你不能因为声音响,就只让他响两秒。 否则的话,不要蜂鸣器,不是更安静了?呵呵。
不过我设计的时候只搞一个复位按钮,点去该按钮就消音,连续按住一秒钟就复位故障……
I can do it
|
|
liucs_2009 奇侠 经验值:8458 发帖数:565 精华帖:5 |
78楼
主题:回复:在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
工控生活、精彩人生
|