在做了些项目后,感觉博途总体来上还是不错的,在程序编写的风格上,SCL语法更严格,而且编译器自动对齐,程序的编写风格非常直观。但是在调试方面还不是很好,比如FOR循环的内部调试,无法像单片机那样使用断点监视,很多时候会导致程序无法预测的情况。笔者针对这一情况,自己编写了一段基于WinCC的变量监视程序,这样程序的调试就直观很多。
如下图1,这是博途仿真的效果,无法查看变量的值,
笔者编写了DebugHandler的FB块后,变量每次的变化将保存在DB块里,在用WinCC显示出来,这样程序的调试就直观了很多,如图2:在这里分享给大家,仅供参考
图1:
图2:
以下是源程序,Main的:
"DebugHandler_DB".index := 0;// 从第一条开始记录
FOR #Int := 0 TO 10 DO// 开始FOR循环仿真
#Real += 1.0;
"DebugHandler_DB"(nIfValue:=#Int,// 条件变量
strTitleIn := WSTRING#'Main ',
strValue1 := WSTRING#'#Sint ',
strValue2 := WSTRING#' #Int',//输入标题
"Int":=#Int,//记录Int变量每一次变量的变化
strValue3 := WSTRING#'#Dint ',
strValue4 := WSTRING#'#Real',
"Real":=#Real,
strValue5 := WSTRING#'#LReal',
strValue6 := WSTRING#'#Usint',
strValue7 := WSTRING#'#UInt',
strValue8 := WSTRING#'#UDint');;
END_FOR;
FB块的:
//将inout变量value循环记录到TP700.aryLoopRec中
//如果暂停按钮打开,暂停记录
//如果自录按钮打开,暂停按钮关闭,启用自录模式,可观察程序是否循环
//如果复位按钮打开,清空数组
IF #bReset OR (#bAutoClear AND #index = 0) THEN// 复位缓冲区
FOR #index_1 := 0 TO 16 DO
#aryData[#index_1] := #ZeroDebug;
END_FOR;
#index := 0;
END_IF;
IF #bRec = FALSE THEN// 不执行记录
RETURN;
END_IF;
IF #bLoopMode = FALSE THEN//自动循环模式
#index := 0;
END_IF;
#strTitle := #strTitleIn;//保存文本条数据
#aryText[0] := #strValue1;//保存变量标题
#aryText[1] := #strValue2;
#aryText[2] := #strValue3;
#aryText[3] := #strValue4;
#aryText[4] := #strValue5;
#aryText[5] := #strValue6;
#aryText[6] := #strValue7;
#aryText[7] := #strValue8;
IF #bIF = TRUE THEN//如果条件记录开启,且条件不符合,退出程序
CASE #usAction OF
0://默认等于匹配
IF #nIfValue <> #usIfSet THEN
RETURN;
END_IF;
1://大于匹配
IF #nIfValue <= #usIfSet THEN
RETURN;
END_IF;
2://小于匹配
IF #nIfValue >= #usIfSet THEN
RETURN;
END_IF;
3://大于等于
IF #nIfValue < #usIfSet THEN
RETURN;
END_IF;
4://小于等于
IF #nIfValue > #usIfSet THEN
RETURN;
END_IF;
ELSE//默认等于匹配
IF #nIfValue <> #usIfSet THEN
RETURN;
END_IF;
END_CASE;
END_IF;
IF #bPause = 0 THEN
IF #bRecIndex THEN
#aryData[#index]."Int" := #index;//自记录模式,观测是否死机
ELSE
#aryData[#index]."SInt" := #Sint;//记录待记录的变量
#aryData[#index]."Int" := #Int;//记录待记录的变量
#aryData[#index]."DInt" := #Dint;//记录待记录的变量
#aryData[#index]."Real" := #Real;//记录待记录的变量
#aryData[#index]."LReal" := #LReal;//记录待记录的变量
#aryData[#index]."USInt" := #USInt;//记录待记录的变量
#aryData[#index]."UInt" := #UInt;//记录待记录的变量
#aryData[#index]."UDInt" := #UDInt;//记录待记录的变量
#usTxtList := #usTxtListIn;
END_IF;
IF #index >= 16 THEN//向量自动加1
IF #bSingle = 0 THEN// 如果非单次记录模式,向量自动回零
#index := 0;
END_IF;
ELSE
#index := #index + 1;
END_IF;
END_IF;