恭喜,你发布的帖子
发布于 2025-09-29 14:30:04
5楼
坦率地讲,楼主的这个FC写得还有改善空间。
首先可以自行了解一下什么是子程序/函数的“逻辑内聚性”,官方的VAL_STRG指令就挺好用的。
其次,保留原代码风格的话,也是可以改进一下以下代码切片:
//下方指令的IN完全可以使用公共tempIN代替,包括此整条指令都可以公用化
VAL_STRG(IN := #Value_UInt,
SIZE := #Size,
PREC := 0,
FORMAT := W#16#0000,
P := 1,
OUT => #tempStr);
再次,使用CASE,难免会有部分代码是不会执行的“死代码”,在效率上有影响,另外variant的使用有副作用的。
胡言乱语,仅供参考。
程序没有问题。功能主要是将接口区取到的 variant类型的数据,
S 1.判断一下当前实际类型(INT/WORD/REAL/DINT/LREAL...等等)中的一个,
S 2.分别进行下一步转化处理(使用case语句)。
用variant是为了外部接口数据的多种类的覆盖,随便一个类型的数字(程序中好像11种)都可以被处理。
建议:case的最后最好有默认项,即不是这11中数据,就按出错处理。(将
IF ENO = FALSE THEN
#FaultCode := 02; //str too short OR Size too small
这段改成默认项,不要使用ENO判断)
楼上说的问题不存在,VAL_STRG(IN := #Value_UInt,。。。 中的IN,在程序接口调用中,估计就是使用的TEMP区。虽然无法看到源程序,但是这么做是常规行为。
请填写推广理由:
分享
只看
楼主