电工学习网

 找回密码
 立即注册
查看: 7478|回复: 3

PLC设置模拟量的批量报警程序

[复制链接]
发表于 2018-1-2 08:17:39 | 显示全部楼层 |阅读模式
手里有个项目 要求报警设置要在plc中而不是在上位机中使用报警,其实也挺坑的。不过报警做到PLC里面的好处就是电脑关机了这些报警参数依然存在。在使用该程序时需要结合我写的批量转换程序块配合使用代码论坛里面有。请看源代码,其实特简单。该程序通过配合模拟量的批量转换块 可以实现大批量的报警参数的设定以及使能功能。
//#############################################
//仪表报警设定块
//配合模拟量批量转换块使用
//EBC 20171220
//#############################################



FUNCTION FC11 :VOID
TITLE = '仪表报警设定'
//
// 仪表设定警,需结合模拟量批量转换程序使用
//
VERSION: '1.0'
AUTHOR: EBCLW
NAME: AI_ALM
FAMILY: EBC
KNOW_HOW_PROTECT
VAR_TEMP
    I:INT;//循环变量
    VALUE:REAL;
    SET_HH:REAL;
    SET_H:REAL;
    SET_L:REAL;
    SET_LL:REAL;
    EN_HH:BOOL;
    EN_H:BOOL;
    EN_L:BOOL;
    EN_LL:BOOL;
    HH:BOOL;
    H:BOOL;
    L:BOOL;
    LL:BOOL;
    ERR:BOOL;
    RST_ALM:BOOL;
    AI_VALUE:REAL;
    AI_ERR:BOOL;
END_VAR

VAR_INPUT

NUM:INT:=10;//需要报警的信号数量(连续)
AI_BLOCK:BLOCK_DB;//报警仪表数据块编号
ALM_DATA:BLOCK_DB;//报警数据块编号
END_VAR

FOR I:= 1 TO NUM  BY 1 DO
  //-----------------------ALM_DATA---------------------------------------------------
  //值=ALM_DATA.DD[(I-1)*22] =ALM_DATA.DD[(I-1)*22]
  // 高高限设定= ALM_DATA.DD[(I-1)*22+4] =ALM_DATA.DD[22*I-18]
  //高限设定=ALM_DATA.DD[(I-1)*22+8] =ALM_DATA.DD[22*I-14]
  // 低限设定=ALM_DATA.DD[(I-1)*22+12] =ALM_DATA.DD[22*I-10]
  //低低限设定=ALM_DATA.DD[(I-1)*22+16] =ALM_DATA.DD[22*I-6]
  // 高高限报警使能=ALM_DATA.DX[(I-1)*22+20,0] =ALM_DATA.DX[22*I-2,0]
  // 高限报警使能=ALM_DATA.DX[(I-1)*22+20,1] =ALM_DATA.DX[22*I-2,1]
  //低限报警使能= ALM_DATA.DX[(I-1)*22+20,2]  =ALM_DATA.DX[22*I-2,2]
  // 低低报警使能= ALM_DATA.DX[(I-1)*22+20,3]  =ALM_DATA.DX[22*I-2,3]
  // 高高报警=ALM_DATA.DX[(I-1)*22+20,4]  =ALM_DATA.DX[22*I-2,4]
  //高报警 =ALM_DATA.DX[(I-1)*22+20,5]  =ALM_DATA.DX[22*I-2,5]
  //低报警 =ALM_DATA.DX[(I-1)*22+20,6]  =ALM_DATA.DX[22*I-2,6]
  //低低报警 =ALM_DATA.DX[(I-1)*22+20,7]  =ALM_DATA.DX[22*I-2,7]
  //设备故障 =ALM_DATA.DX[(I-1)*22+21,0]  =ALM_DATA.DX[22*I-1,0]
  //故障复位= ALM_DATA.DX[(I-1)*22+21,2] =ALM_DATA.DX[22*I-1,1]
   //---------------------------AI_BLOCK----------------------------------------------
   //值=AI_BLOCK.DD[(I-1)*6]
   //错误=AI_BLOCK.DX[(I-1)*6+2,0]=AI_BLOCK.DX[(I*6-4,0]
   //----------------------------开始赋值到-----------------------------------------

    //AI_BLOCK.DX[I*6-4,0]:=AI_ERR;

    ALM_DATA.DD[(I-1)*22]:= AI_BLOCK.DD[(I-1)*6];

    VALUE:=DWORD_TO_REAL(ALM_DATA.DD[(I-1)*22]);
      //输入参数
    SET_HH :=DWORD_TO_REAL(ALM_DATA.DD[22*I-18]);
    SET_H:=DWORD_TO_REAL(ALM_DATA.DD[22*I-14]);
    SET_L:=DWORD_TO_REAL(ALM_DATA.DD[22*I-10]);
    SET_LL :=DWORD_TO_REAL(ALM_DATA.DD[22*I-6]);
    EN_HH:=ALM_DATA.DX[22*I-2,0];
    EN_H:=ALM_DATA.DX[22*I-2,1];
    EN_L:=ALM_DATA.DX[22*I-2,2];
    EN_LL:=ALM_DATA.DX[22*I-2,3];



    //报警输出
    IF EN_HH & VALUE>=SET_HH THEN
        HH:=1;
    ELSE
        HH:=0;
    END_IF;
    IF EN_H & VALUE>=SET_H THEN
         H:=1;
        ELSE
         H:=0;
    END_IF;
    IF EN_L & VALUE<=SET_L THEN
        L:=1;
    ELSE
        L:=0;
    END_IF;
    IF EN_LL & VALUE<=SET_L THEN
        LL:=1;
    ELSE
        LL:=0;
    END_IF;
        //输出状态
    ALM_DATA.DX[22*I-2,4]:=HH;
    ALM_DATA.DX[22*I-2,5]:=H;
    ALM_DATA.DX[22*I-2,6]:=L;
    ALM_DATA.DX[22*I-2,7]:=LL;
        //输入参数
    RST_ALM:=ALM_DATA.DX[22*I-1,1];//暂未使用复位信号故障信号直接转出
    //故障输出
    ALM_DATA.DX[22*I-1,0]:=AI_BLOCK.DX[I*6-4,0];

END_FOR;

END_FUNCTION
本文转载自:西门子工业技术论坛


回复

使用道具 举报

发表于 2018-1-2 13:09:44 | 显示全部楼层
这个是基于单片机开发的

回复 支持 反对

使用道具 举报

发表于 2018-1-3 09:48:09 | 显示全部楼层
单片机 单片机 单片机

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

电工学习网 ( )

GMT+8, 2024-3-29 15:46

Powered by © 2011-2022 www.diangon.com 版权所有 免责声明 不良信息举报

技术驱动未来! 电工学习网—专业电工基础知识电工技术学习网站。

栏目导航: 工控家园 | 三菱plc | 西门子plc | 欧姆龙plc | plc视频教程

快速回复 返回顶部 返回列表