|
手里有个项目 要求报警设置要在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
本文转载自:西门子工业技术论坛
|
|