使用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