作者 | 主题 |
---|---|
3DD15 游侠 经验值:495 发帖数:32 精华帖:2 |
楼主 2022-12-26 00:33:38
主题:关于SCL 的FOR循环程序调试 在做了些项目后,感觉博途总体来上还是不错的,在程序编写的风格上,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;
|