因为项目中用到了格雷码的绝对位置编码器,但是翻找西门子指令库,没有找到相关的格雷码转换成普通二进制的专用指令,格雷码虽然不常用但是他的抗干扰特性,使得在某些领域还有一定的优势。
网上搜索了格雷码转换相关的公式,比较简单。想起前段时间大火的deepseek,正好拿来偷偷懒。整理了一下需求,简单一描述,十几秒钟,参考的SCL程序就出来了。
解答过程不光解释了格雷码相关的原理,指令一步一步解释的也非常详细,更是细心提示到了可能遇到的问题和注意事项。
根据AI提供的思路和程序案例,稍微修改,整合成了需要的格雷码转换二进制的FC。上机一试,效果OK。
虽然也比较简陋,但是快速解决了问题,节约了比较多的时间,贴出来跟大家分享一下,希望能够帮到有需要的人。
FC接口变量:
Input
格雷码 Word
Output
二进制 Word
InOut
Temp
格雷位 Array[0..15] of Bool
二进制位 Array[0..15] of Bool
i Int 循环计数
Constant
Return
格雷码转二进制 Void
SCL程序段
SCATTER(IN:=#格雷码, //拆分成位
OUT=>#格雷位);
#二进制位[15] := #格雷位[15]; //最高位不变
FOR #i := 14 TO 0 BY -1 DO //循环异或
#二进制位[#i] := #格雷位[#i] XOR #二进制位[#i + 1];
END_FOR;
GATHER(IN:=#二进制位, //合并成字
OUT=>#二进制);