关于SCL 的FOR循环程序调试

已锁定

3DD15

  • 帖子

    32
  • 精华

    2
  • 被关注

    3

论坛等级:游侠

注册时间:2012-06-28

黄金 黄金 如何晋级?

关于SCL 的FOR循环程序调试

1212

6

2022-12-26 00:33:38

在做了些项目后,感觉博途总体来上还是不错的,在程序编写的风格上,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;

    

















关于SCL 的FOR循环程序调试 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1200系列

共有12957条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。