在LGF的基础上改的,把字中位1的在哪几个位置读取出来
REGION Logic
// init counter tags
#tempCountBitsFalse := #ZERO;
#tempCountBitsTrue := #ZERO;
#tempBinaryValues := #value;
#tempBitNumber := #EmptyNumber;
// iterate over input tag
FOR #tempLoopIndex := #START_INDEX TO USINT_TO_UINT(#numberOfBits) DO
// check if bit is true or false
IF #tempBinaryValues.%X0 THEN
#tempCountBitsTrue += #INCREMENT;
#tempBitNumber[#tempCountBitsTrue] := #tempLoopIndex - 1;
ELSE
#tempCountBitsFalse += #INCREMENT;
END_IF;
// shift input tag one to the right
#tempBinaryValues := SHR(IN := #tempBinaryValues, N := #SHIFT_ON_BIT_RIGHT);
END_FOR;
// set output values
#countBitsFalse := #tempCountBitsFalse;
#countBitsTrue := #tempCountBitsTrue;
#TureBitNumber := #tempBitNumber;
// no error handling needed
ENO := TRUE;
END_REGION
根据上端读取位1在字的位置上作比较,把1和1之间有2个0位分界线
REGION Logic
//初始化
"GDB9_ALL".CountData.Area := "GDB9_ALL".CountData.EmptyArea;//注意数组要比正常多1组
#CountMIN := 0;
#CountMAX := 0;
//循环范围保护
IF "GDB9_ALL".CountData.TureCountNumber > 0 THEN
#ReadSenCY_MAX := "GDB9_ALL".CountData.TureCountNumber;
ELSE
#ReadSenCY_MAX := 1;
END_IF;
//相连2个1位置差2以上,认为这是分界线
FOR #ReadSenCY := 1 TO #ReadSenCY_MAX BY 1 DO
//第一个为1的位数肯定是第一个区域的下限
IF #ReadSenCY = 1 THEN
#CountMIN += 1;
"GDB9_ALL".CountData.Area[#CountMIN].MIN := "GDB9_ALL".CountData.TureNumber[1];
END_IF;
//相连2个1位置差2以上;下标小的是最大值;下标大的是最小值
IF "GDB9_ALL".CountData.TureNumber[#ReadSenCY + 1] - "GDB9_ALL".CountData.TureNumber[#ReadSenCY] > 2 THEN
IF #ReadSenCY < #ReadSenCY_MAX THEN
#CountMIN += 1;
"GDB9_ALL".CountData.Area[#CountMIN].MIN := "GDB9_ALL".CountData.TureNumber[#ReadSenCY + 1];
END_IF;
#CountMAX += 1;
"GDB9_ALL".CountData.Area[#CountMAX].MAX := "GDB9_ALL".CountData.TureNumber[#ReadSenCY];
END_IF;
END_FOR;
"GDB9_ALL".CountData.AreaNumber.MIN := #CountMIN;
"GDB9_ALL".CountData.AreaNumber.MAX := #CountMAX;
END_REGION