恭喜,你发布的帖子
发布于 2025-10-03 14:15:27
14楼
我听劝
代码如下:
FUNCTION "SizeOf" : UDInt
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
VAR_INPUT
Data : Variant;
END_VAR
VAR_IN_OUT
BUFFER : Array[*] of Byte;
END_VAR
VAR_TEMP
Pos : DInt;
ret : Int;
END_VAR
BEGIN
#Pos := 0;
#ret := Serialize(SRC_VARIABLE := #Data, DEST_ARRAY => #BUFFER, POS := #Pos);
IF #ret = 0 THEN
#SizeOf := #Pos;
ELSE
#SizeOf := 0;
END_IF;
END_FUNCTION
除了上述代码外,还需要一个数据块的辅助
再讲点细节上的处理
1)数据缓存gDB,我不会用全局数据块,我会在FC里的临时变量区开一个字节数组,数组的上限在FC里定义一个常数变量,固定值,FC不需要数据缓存这个参数引脚。
2)此外,楼主输入变量Data采用的是VARIANT变量定义,而缓存变量gDB采用的ARRAY[*]的定义,这里会有两个数据区长度适配的问题,楼主在程序中没有做合法性检测,以确保gDB的ARRAY[*]数组的长度大于Dada的数据长度。
一般来说,在使用VRIANT以及ARRAY[*]变量作为功能块的接口时,在功能块内部我们需要对接口是否为空,变量类型,元素类型,以及元素数量做合法性检测,如果合法性检测不通过,应退出程序执行并给出错误字。
请填写推广理由:
分享
只看
楼主