输出自定义FC其它算法实现,可以参考下面文章:
https://rxxw-control.blog.csdn.net/article/details/125994252https://rxxw-control.blog.csdn.net/article/details/125994252下面我们看下我们的控制要求。在学习本篇博客之前大家可以熟悉下数据结构图的概念和存储知识,链接如下:
https://rxxw-control.blog.csdn.net/article/details/131797993https://rxxw-control.blog.csdn.net/article/details/131797993
1、映射矩阵
下面我们一步步分析代码如何编写,
2、实现不了
上面的代码看着简单清爽,不过没什么用实现不了我们需要的功能。
下面利用数据结构里的树来分析我们的问题
3、数据结构-树
分析其中的根节点"OUT0。
4、根节点"OUT0"
根节点的输出条件我们知道了,8个AND 和7个OR完成,边的存储我们借助博途里的2维矩阵实现。
5、自定义映射FB
下面我们给出完整SCL代码,大家可以尝试进一步优化此代码,以并适应不同的矩阵大小。
6、完整SCL代码
FUNCTION_BLOCK "FB_DO_MapMartiex"
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
VAR_INPUT
Input : Array[0..7] of Bool; // 输入信号
END_VAR
VAR_OUTPUT
Out : Byte; // 输出信号
END_VAR
VAR
MapMartiex : Array[0..7, 0..7] of Bool; // 输出设置映射矩阵 关系矩阵
END_VAR
BEGIN
//输出自定义映射矩阵
//RXXW_Dor
//2024-02-16
//DO0
#Out.%X0 :=(#Input[0] AND #MapMartiex[0, 0])
OR (#Input[1] AND #MapMartiex[1, 0])
OR (#Input[2] AND #MapMartiex[2, 0])
OR (#Input[3] AND #MapMartiex[3, 0])
OR (#Input[4] AND #MapMartiex[4, 0])
OR (#Input[5] AND #MapMartiex[5, 0])
OR (#Input[6] AND #MapMartiex[6, 0])
OR (#Input[7] AND #MapMartiex[7, 0]);
//DO1
#Out.%X1 :=(#Input[0] AND #MapMartiex[0, 1])
OR (#Input[1] AND #MapMartiex[1, 1])
OR (#Input[2] AND #MapMartiex[2, 1])
OR (#Input[3] AND #MapMartiex[3, 1])
OR (#Input[4] AND #MapMartiex[4, 1])
OR (#Input[5] AND #MapMartiex[5, 1])
OR (#Input[6] AND #MapMartiex[6, 1])
OR (#Input[7] AND #MapMartiex[7, 1]);
//DO2
#Out.%X2 :=(#Input[0] AND #MapMartiex[0, 2])
OR (#Input[1] AND #MapMartiex[1, 2])
OR (#Input[2] AND #MapMartiex[2, 2])
OR (#Input[3] AND #MapMartiex[3, 2])
OR (#Input[4] AND #MapMartiex[4, 2])
OR (#Input[5] AND #MapMartiex[5, 2])
OR (#Input[6] AND #MapMartiex[6, 2])
OR (#Input[7] AND #MapMartiex[7, 2]);
//DO3
#Out.%X3 :=(#Input[0] AND #MapMartiex[0, 3])
OR (#Input[1] AND #MapMartiex[1, 3])
OR (#Input[2] AND #MapMartiex[2, 3])
OR (#Input[3] AND #MapMartiex[3, 3])
OR (#Input[4] AND #MapMartiex[4, 3])
OR (#Input[5] AND #MapMartiex[5, 3])
OR (#Input[6] AND #MapMartiex[6, 3])
OR (#Input[7] AND #MapMartiex[7, 3]);
//DO4
#Out.%X4 :=(#Input[0] AND #MapMartiex[0, 4])
OR (#Input[1] AND #MapMartiex[1, 4])
OR (#Input[2] AND #MapMartiex[2, 4])
OR (#Input[3] AND #MapMartiex[3, 4])
OR (#Input[4] AND #MapMartiex[4, 4])
OR (#Input[5] AND #MapMartiex[5, 4])
OR (#Input[6] AND #MapMartiex[6, 4])
OR (#Input[7] AND #MapMartiex[7, 4]);
//DO5
#Out.%X5 :=(#Input[0] AND #MapMartiex[0, 5])
OR (#Input[1] AND #MapMartiex[1, 5])
OR (#Input[2] AND #MapMartiex[2, 5])
OR (#Input[3] AND #MapMartiex[3, 5])
OR (#Input[4] AND #MapMartiex[4, 5])
OR (#Input[5] AND #MapMartiex[5, 5])
OR (#Input[6] AND #MapMartiex[6, 5])
OR (#Input[7] AND #MapMartiex[7, 5]);
//DO6
#Out.%X6 :=(#Input[0] AND #MapMartiex[0, 6])
OR (#Input[1] AND #MapMartiex[1, 6])
OR (#Input[2] AND #MapMartiex[2, 6])
OR (#Input[3] AND #MapMartiex[3, 6])
OR (#Input[4] AND #MapMartiex[4, 6])
OR (#Input[5] AND #MapMartiex[5, 6])
OR (#Input[6] AND #MapMartiex[6, 6])
OR (#Input[7] AND #MapMartiex[7, 6]);
//DO7
#Out.%X7 :=(#Input[0] AND #MapMartiex[0, 7])
OR (#Input[1] AND #MapMartiex[1, 7])
OR (#Input[2] AND #MapMartiex[2, 7])
OR (#Input[3] AND #MapMartiex[3, 7])
OR (#Input[4] AND #MapMartiex[4, 7])
OR (#Input[5] AND #MapMartiex[5, 7])
OR (#Input[6] AND #MapMartiex[6, 7])
OR (#Input[7] AND #MapMartiex[7, 7]);
END_FUNCTION_BLOCK