输出自定义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.1VAR_INPUT Input : Array[0..7] of Bool; // 输入信号END_VARVAR_OUTPUT Out : Byte; // 输出信号END_VARVAR MapMartiex : Array[0..7, 0..7] of Bool; // 输出设置映射矩阵 关系矩阵END_VARBEGIN//输出自定义映射矩阵//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