回复:PORTAL编程题,可能与指针和间接寻址有关

Letham

西门子1847工业学习平台

  • 帖子

    2023
  • 精华

    43
  • 被关注

    360

论坛等级:至圣

注册时间:2006-04-15

钻石 钻石 如何晋级?

发布于 2018-07-03 13:30:51

27楼

也做了一个 基本算法和易思特 相同,尽量不使用间接寻址,使用索引寻址。
1500 的数据存储比较大,所以这程序 ,做的比较浪费数据存储;

上位机 通过 字符串数组strParameter 中的输入参数 "XX:Y"来确定 DI/DO的匹配关系,FB程序最多同时可以执行8路DI/DO匹配的过程,通过参数ParNoOfInstance设定 ,默认值是2.

至于 细节方面没有 做很多 就是根据DI和参数"XX:Y"来匹配 相应的输出;

感觉主要精力花在了 参数解析上面。。。。。。。。

UDT 类容


FB 参数区


FB代码

   


 

If #Data.ParNoOfInstance > #MaxInstance Then

    Return;

End_If;


For #Data.LoopIndex := 1 To #Data.ParNoOfInstance Do

   

    Region Decode Input String 

    (*

    Decode the Input And output index from input string like "xx:y"

    *)

        

        #inpStringLen := LEN(#strParameter[#Data.LoopIndex]);

        If #inpStringLen = 0 Then

            #Data.OutNoParameter[#Data.LoopIndex] := TRUE;

           Goto Nxt;

        Else

            #Data.OutNoParameter[#Data.LoopIndex] := FALSE;

        End_If;

        #Data.SplictReturnPostion := FIND(IN1 := #strParameter[#Data.LoopIndex] , IN2 := #SplitCharactor);

        If #Data.SplictReturnPostion = 0 Then

            #Data.OutParameterFormatError[#Data.LoopIndex]  := True;

            Goto Nxt;

        Else

            #Data.OutParameterFormatError[#Data.LoopIndex]  := False;

        End_If;

        

        

        #Data.InputIndex := STRING_TO_INT(LEFT(IN := #strParameter[#Data.LoopIndex] , L := #Data.SplictReturnPostion - 1));

        #Data.OutputIndex := STRING_TO_INT(RIGHT(IN := #strParameter[#Data.LoopIndex] , L := LEN(#strParameter[#Data.LoopIndex] )

                                                     - #Data.SplictReturnPostion));

        

        #Data.OutInputParOutofRange[#Data.LoopIndex]  := #Data.InputIndex > #MaxInput Or #Data.InputIndex <= 0;

        #Data.OutOutputParOutofRange[#Data.LoopIndex]  := #Data.OutputIndex > #MaxOutput Or #Data.OutputIndex <= 0;

        If #Data.OutInputParOutofRange[#Data.LoopIndex]  Or #Data.OutOutputParOutofRange[#Data.LoopIndex]  Then

            #Data.OutParameterOutOfRange[#Data.LoopIndex]  := TRUE;

            Goto Nxt;

        Else

            #Data.OutParameterOutOfRange[#Data.LoopIndex]  := FALSE;

        End_If;

    End_Region

    

    Region Wait for Commond

        #Data.DelayTimer[#Data.LoopIndex](IN := #Data.Input[#Data.InputIndex],

                            PT := #Data.ParDelayTime);

        If Not #Data.Input[#Data.InputIndex] Then

            ;//Correspond input not receieved ,TODO

        ElsIf #Data.Output[#Data.OutputIndex] Then

            ;//The Corresponding output already set,TODO

            

        End_If;

        

        If #Data.DelayTimer[#Data.LoopIndex] .Q Then

            #Data.Output[#Data.OutputIndex] := TRUE;

            #Data.Input[#Data.InputIndex] := FALSE;

        End_If;

    End_Region

   Nxt:;

End_For;


IO缓存DB


 OB1 代码


(*

Copy IO to I/O buffer DB

*)

If "DI_1" Then

    "DB_IO_Buffer".InputBuffer[1] := "DI_1";

End_If;

If "DI_2" Then

    "DB_IO_Buffer".InputBuffer[2] := "DI_2";

End_If;

If "DI_3" Then

    "DB_IO_Buffer".InputBuffer[3] := "DI_3";

End_If;

If "DI_4" Then

    "DB_IO_Buffer".InputBuffer[4] := "DI_4";

End_If;

If "DI_5" Then

    "DB_IO_Buffer".InputBuffer[5] := "DI_5";

End_If;

If "DI_6" Then

    "DB_IO_Buffer".InputBuffer[6] := "DI_6";

End_If;

If "DI_7" Then

    "DB_IO_Buffer".InputBuffer[7] := "DI_7";

End_If;

If "DI_8" Then

    "DB_IO_Buffer".InputBuffer[8] := "DI_8";

End_If;

If "DI_9" Then

    "DB_IO_Buffer".InputBuffer[9] := "DI_9";

End_If;

If "DI_10" Then

    "DB_IO_Buffer".InputBuffer[10] := "DI_10";

End_If;


(*

Call the Program


"Test_DB".Data.ParNoOfInstance should be set ,the default is 2,Max value is 8;

*)

"Test_DB".Data.Input := "DB_IO_Buffer".InputBuffer;


"Test_DB"();


"DB_IO_Buffer".OutputBuffer := "Test_DB".Data.Output;


(*

Copy IO to I/O buffer DB

*)

"DO_1" := "DB_IO_Buffer".OutputBuffer[1];

"DO_2" := "DB_IO_Buffer".OutputBuffer[2];

"DO_3" := "DB_IO_Buffer".OutputBuffer[3];

"DO_4" := "DB_IO_Buffer".OutputBuffer[4];

"DO_5" := "DB_IO_Buffer".OutputBuffer[5];

"DO_6" := "DB_IO_Buffer".OutputBuffer[6];

"DO_7" := "DB_IO_Buffer".OutputBuffer[7];

"DO_8" := "DB_IO_Buffer".OutputBuffer[8];


项目工程

Test.rar


人生就像一场旅行!

推荐帖推荐理由:不吝分享,这种做法就值得敬仰! 先收藏了慢慢学习!(推荐人:澹澹)

评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1500系列

共有10582条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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