倍福实现LOG记录功能(★★★★★)

使用LOG记录可以帮助调试人员在异常发生时获取足够的信息处理BUG。

本次文档中,采用文本记录和事件记录的方式分别完成LOG功能。

一 传统做法:txt文本储存

1.建立文件夹

选用FB_CreateDir功能块,文件储存默认路径为:C:\Windows\SysWOW64加文件名(sPathName)。

如果加上了文件路径则储存路径为自己的路径比如:'C:\Users\Public\Desktop\PLCLog\'

FB_CreateDir(
	sNetId:= , 
	sPathName:='C:\Users\Public\Desktop\PLCLog\' , 
	ePath:= , 
	bExecute:= , 
	tTimeout:= , 
	bBusy=> , 
	bError=> , 
	nErrId=> );

2.文件夹中文件的创建以及打开

选用FB_FileOpen功能块。下面语句的含义为,找到C:\Users\Public\Desktop\PLCLog\文件下的AA.txt文本文档,如果没有,则创建该TXT文档。

fbFileOpen(
	sNetId:= , 
	sPathName:='C:\Users\Public\Desktop\PLCLog\AA.txt' , 
	nMode:=FOPEN_MODEAPPEND OR FOPEN_MODEPLUS OR FOPEN_MODETEXT, 
	ePath:= , 
	bExecute:=bExcute , 
	tTimeout:= , 
	bBusy=> , 
	bError=> , 
	nErrId=> , 
	hFile=>hFile );

其中最重要的是,nMode的 选用,在官网文档上,找到了如下解释。

比如我要建立一个,可以将nMode选择为 FOPEN_MODEAPPEND。

注意:hFile句柄,对以后的读写,起作用,一定要定义一个UINT的变量。

3.文件的读取流开启(文件读取)

功能块:FB_FileRead

文件读取流程:先将文件打开,然后读文件

注意:请看我定义的数据流接收数组:buffRead    :ARRAY[1..1048576] OF BYTE

cbRead表示包含当前已读取的BYTE数组,做长度判断使用。

数据串的长度需要用LEN()而不是SIZEOF()

下面的代码表示,将上面2里边AA.txt文件中的数据读写到buffRead 的BYTE数组中 。

FB_FileRead(
	sNetId:= , 
	hFile:=hFile , 
	pReadBuff:=ADR(buffRead) , 
	cbReadLen:=SIZEOF(buffRead) , 
	bExecute:=bExcute , 
	tTimeout:= , 
	bBusy=> , 
	bError=> , 
	nErrId=> , 
	cbRead=> , 
	bEOF=> );

4.数据流关闭(文件关闭)

FB_FileClose(
	sNetId:= , 
	hFile:= hFile, 
	bExecute:=bExcute , 
	tTimeout:= , 
	bBusy=> , 
	bError=> , 
	nErrId=> );

5. 文件写入

写的流程:先将文件打开,然后写文件,最后将文件关闭。文件流关闭后数据才写入进去。        

换行:$n

FB_FileWrite(
	sNetId:= , 
	hFile:=hFile , 
	pWriteBuff:=ADR(sWriteString) , 
	cbWriteLen:=INT_TO_UINT(LEN(sWriteString)) , 
	bExecute:=bExcute , 
	tTimeout:= , 
	bBusy=> , 
	bError=> , 
	nErrId=> , 
	cbWrite=> );

二 事件记录器的方式实现

注意:在Twincat软件的输出里边,切换显示输出来源为Twincat,就可以查看事件

1.添加EventLog库:Tc3_EventLogger;

2.添加tmc

在EventLog上,右键new,跳转到tmc界面。如下图,注意Name,后边程序用到。

DisplayText是每次都显示的。

Event中的Severity定义事件严重等级。

3.定义事件严重等级

eEventSeverity					: TcEventSeverity := TcEventSeverity.Verbose;

4.大于事件严重等级后,清除所有事件,并写入事件(SendMessage会返回HRESULT值)

fbTcEventLogger 				: FB_TcEventLogger;//事件记录器
fbArguments						: FB_TcArguments;//继承I_TcArguments;
hr 								: HRESULT;//检查值
hrLastInternalError 			: HRESULT;//错误的HRESULT
(********************************************************************)
IF eEventSeverity >= eTraceLevel THEN
		fbArguments.Clear();//清除所有事件
		fbArguments.AddString(value:= sEventLogInfo);//添加string类型的信息
		hr:=fbTcEventLogger.SendMessage(
			eventClass:= TC_EVENTS.LogEventClass.Event.uuidEventClass, 
			nEventId:= 1, 
			eSeverity:= eEventSeverity, 
			ipSourceInfo:= 0, 
			nTimeStamp:= 0, 
			ipArguments:= fbArguments);
	END_IF

5.检查HRESULT值是否会出错

IF FAILED(hr) THEN
		hrLastInternalError := hr;
		M_Send := FALSE;
	ELSE
		M_Send := TRUE;
	END_IF

6.封装成FB

7.打印log

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值