DI批量处理程序实例

已锁定

luotg

  • 帖子

    98
  • 精华

    0
  • 被关注

    1

论坛等级:游民

注册时间:2003-06-06

普通 普通 如何晋级?

DI批量处理程序实例

544

0

2005-06-30 09:47:55

下面是我写的一个批量处理程序,已经在多台设备上运行。敬请高手指导!

FUNCTION "DiTreat" : VOID
TITLE =::::::::::::数字量输入处理::::::::::::
// 程序可以将给定端口的数据进行报警联锁判断以及8个
//周期数字量消抖处理,并且可以选择NC、NO型输入产生报
//警脉冲,并可进行上位操作。报警铃状态位于数据块的
//--DBX0.5。
// ----完成于2004-11-22
//::::::::::::::::::::::::::::::::::::::::::::
//:: USAGE ::
//::::::::::::::::::::::::::::::::::::::::::::
//IN: DB_NUM Block_DB 要处理的数据块
//OUT: Lamp Bool 报警灯
// Interlock Bool 联锁
//--------------------------------------------
//0.0 Read BOOL FALSE 是否读取
//0.1 NC BOOL FALSE 是否常闭点
//0.2 Alarm BOOL FALSE 是否报警
//0.3 Interlock BOOL FALSE 是否联锁
//0.4 Cmd_pc BOOL FALSE 上位操作
//0.5 tmp BOOL FALSE 临时
//0.6 IN_fp BOOL FALSE 脉冲产生比较位
//0.7 IN BOOL FALSE 处理后的状态
//1.0-1.7 Read1-8 BOOL FALSE 第1-8周期状态
//2.0 Addr INT 0 端口地址
//4.0 ActYear BYTE 0 年
//5.0 ActMonth BYTE B#16#0 月
//6.0 ActDate BYTE B#16#0 日
//7.0 ActHour BYTE B#16#0 时
//8.0 ActMinute BYTE B#16#0 分
//9.0 ActSecond BYTE B#16#0 秒
//================================================
// 2004-11-30修改:Addr由DINT型改为INT型,增加INT型
//Serial----变量序号
// 2004-12-14修改:从4.0到9.0分别定义为年月日时分秒,
//用来记录动作时间,并增加程序的记录动作时间功能,取消了
//变量序号。
{ LUOTG := '1' }
AUTHOR : LuoTG
FAMILY : Treat
NAME : Di_treat
VERSION : 2.2


VAR_INPUT
DB_NUM : BLOCK_DB ; //要处理的数据块
ActYear : BYTE ; //年
ActMonth : BYTE ; //月
ActDate : BYTE ; //日
ActHour : CHAR ; //时
ActMinute : BYTE ; //分
ActSecond : BYTE ; //秒
END_VAR
VAR_OUTPUT
LAMP : BOOL ; //报警灯
INTERLOCK : BOOL ; //联锁
END_VAR
VAR_TEMP
CNT : INT ; //计数器
XX : DWORD ; //临时
XXX : DWORD ; //临时2
END_VAR
BEGIN
NETWORK
TITLE =DI_Treat

CLR ;
= #LAMP;
= #INTERLOCK; //初始化LAMP和INTERLOCK
LAR1 P#DBX 0.0; //装载数据块首地址
LAR2 P#DBX 0.0;
OPN #DB_NUM; //打开指定数据块
L DBLG; //数据块长度
L 10; //每个数据的长度
/I ; //数据数量
NEX1: T #CNT; //数据的数量保存于CNT,用作计数器
A [AR1,P#0.0]; //如果读取本次数据(read==1)
JCN M001; //否则转到M004执行
L W [AR1,P#2.0]; //Addr
T #XX; //将数据块中W[AR1,P#2.0]的内(Addr)容保存于xx中
A [AR1,P#1.6]; //第7周期数据
= [AR1,P#1.7]; //移入第8周期
A [AR1,P#1.5]; //第6周期数据
= [AR1,P#1.6]; //移入第7周期
A [AR1,P#1.4]; //第5周期数据
= [AR1,P#1.5]; //移入第6周期
A [AR1,P#1.3]; //第4周期数据
= [AR1,P#1.4]; //移入第5周期
A [AR1,P#1.2]; //第3周期数据
= [AR1,P#1.3]; //移入第4周期
A [AR1,P#1.1]; //第2周期数据
= [AR1,P#1.2]; //移入第3周期
A [AR1,P#1.0]; //第1周期数据
= [AR1,P#1.1]; //移入第2周期
A [AR1,P#0.1]; //IS_NC
JCN M002; //IS_NC=0,GOTO M002
ON I [#XX]; //ADDR所指端口
O [AR1,P#0.4]; //上位操作
= [AR1,P#1.0]; //将所指端口状态取反后送入第1周期
JU M003; //GOTO M003
M002: O I [#XX]; //ADDR所指端口
O [AR1,P#0.4]; //上位操作
= [AR1,P#1.0]; //将所指端口状态送入第1周期
M003: L B [AR1,P#1.0];
L 255;
==I ;
= [AR1,P#0.7]; //如果8个周期的状态均为1,则判定动作
A [AR1,P#0.7]; //如果状态为1
A [AR1,P#0.2]; //且允许报警
FP [AR1,P#0.6];
S [AR2,P#0.5]; //置位报警铃
JCN M004;
L #ActYear;
T B [AR1,P#4.0]; //记录年
L #ActMonth;
T B [AR1,P#5.0]; //记录月
L #ActDate;
T B [AR1,P#6.0]; //记录日
L #ActHour;
T B [AR1,P#7.0]; //记录时
L #ActMinute;
T B [AR1,P#8.0]; //记录分
L #ActSecond;
T B [AR1,P#9.0]; //记录秒
M004: O( ;
A [AR1,P#0.7]; //如果状态为1
A [AR1,P#0.2]; //且允许报警
) ;
O #LAMP;
= #LAMP; //报警状态

O( ;
A [AR1,P#0.7]; //如果状态为1
A [AR1,P#0.3]; //且允许联锁
) ;
O #INTERLOCK;
= #INTERLOCK; //联锁
M001: +AR1 P#10.0; //指向下一数据
L #CNT;
LOOP NEX1; //如果没有处理完则继续
END_FUNCTION

数据块需要以下数据格式:
TYPE "di_type"
TITLE =数字量输入型
VERSION : 0.1


STRUCT
Read : BOOL ; //是否读取
NC : BOOL ; //是否常闭点
Alarm : BOOL ; //是否报警
Interlock : BOOL ; //是否联锁
Cmd_pc : BOOL ; //上位操作
tmp : BOOL ; //临时
IN_fp : BOOL ; //脉冲产生比较位
IN : BOOL ; //处理后的状态
Read1 : BOOL ; //第1周期状态
Read2 : BOOL ; //第2周期状态
Read3 : BOOL ; //第3周期状态
Read4 : BOOL ; //第4周期状态
Read5 : BOOL ; //第5周期状态
Read6 : BOOL ; //第6周期状态
Read7 : BOOL ; //第7周期状态
Read8 : BOOL ; //第8周期状态
Addr : INT ; //端口地址
ActYear : BYTE ; //年
ActMonth : BYTE ; //月
ActDate : BYTE ; //日
ActHour : BYTE ; //时
ActMinute : BYTE ; //分
ActSecond : BYTE ; //秒
END_STRUCT ;
END_TYPE

注:ADDR(端口地址是根据地址指针的格式计算出来的,我做了一个SIEMENS默认地址的计算程序,根据机架号、插槽号和通道号计算默认地址)
DI批量处理程序实例 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54617条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。