恭喜,你发布的帖子
发布于 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];
项目工程
推荐帖推荐理由:不吝分享,这种做法就值得敬仰!
先收藏了慢慢学习!(推荐人:澹澹)
请填写推广理由:
分享
只看
楼主