恭喜,你发布的帖子
发布于 2022-12-18 15:40:06
4楼
S7-300不定时报DP总线通讯故障,到现场后,所有状态灯都恢复正常,请教如何通过程序记录到底是哪个ET200站点,或者是变频器出现过通讯故障。有没有具体操作实例。
/////////////////////////////
这个故障有可能是单独或者同时发生的。
硬件故障是造成通讯的最大源头。 特备是干扰,以及电缆的长期老坏,供电电源等。
我利用SFC13进行DP 监控
例如
FUNCTION FC301 : VOID
TITLE = 'DP_诊断'
//
// DB_诊断
//
VERSION: '1.0'
AUTHOR: baikai
NAME: DP_check
FAMILY: use_group
VAR_INPUT
enable:BOOL:=false; // 诊断使能
device_address:WORD; // 设备诊断地址
fault_reset:BOOL:=false; // 故障复位
END_VAR
VAR_OUTPUT
DP_error:BOOL:=false;
END_VAR
"DB302".DP1.STATUS:=DPNRM_DG(REQ :=enable ,
LADDR :=device_address , //对应硬件组态里的诊断地址。4089 = W#16#FF9
RECORD :="DB302".DP1.STORE_DATA ,
BUSY :="DB302". DP1.RUNNING
);
IF "DB302".DP1.STORE_DATA[0] <> 0 THEN
DP_error:= TRUE;
END_IF;
IF fault_reset THEN
DP_error:= false;
END_IF;
END_FUNCTION
TYPE UDT44 // 这里做了连个从站的诊断,如果需要增加,可以复制DP2
know_how_protect
STRUCT
DP1 : STRUCT //DP1 的1 为组态DP 地址号
STORE_DATA : ARRAY [0 .. 10 ] OF BYTE ; //存存储状态数据
STATUS : INT ; //状态返回值
RUNNING : BOOL ; //运行
END_STRUCT ;
DP2 : STRUCT //DP2 的2 为组态DP 地址号
STORE_DATA : ARRAY [0 .. 10 ] OF BYTE ; //存存储状态数据
STATUS : INT ; //状态返回值
RUNNING : BOOL ; //运行
END_STRUCT ;
END_STRUCT
END_TYPE
DATA_BLOCK DB302 UDT44
BEGIN
END_DATA_BLOCK
以上的处理方式是这样的,例如有 DP1------DP10 共10 个从站,
如果诊断反馈从DP3---DP10 均故障,则通过FIFO 可以制作先入先出,如下
校准当前时间,有时候PLC 时间与实际生活的时间不同步,先同步时间。
其次 利用FIFO 存储故障时间
我这里做了10个故障点的时间存储。
这样可以获取哪个先报,然后分段处理。 这样的用于多从站,例如挂了20个以上,且分布比较散开的。
以上仅供参考,但主要还是硬件,先试试如果工艺允许,降低通讯速率,测量ET200供电电压,DP头更换等等。
请填写推广理由:
分享
只看
楼主