一,前言
很多控制器都有SizeOf这个功能。作用就是统计数据占用的字节数量。但是1X00控制器的标准库和指令中没有这个功能。可是我的一些项目中,尤其与通讯有关的项目需要这个功能,为此我开发了这个FC。
二,外特性
我们先看看这个FC的外特性。

图 1
图1 是在main中4次调用了SizeOf函数。这个块的功能是统计出一个数据结构所占用的字节数量。
我们要注意2个问题。
1,我们注意到data占用8个字节,但是在data这个结构体中的所有数据占用字节总和是6个。这是我们需要注意的问题。
2,对于bool类型的数组。不同CPU占用的字节数不同。比如X86系列CPU以及1500优化块,每个bool类型占用一个字节。对于非优化块,每个bool类型占用一个bit。Sizeof采用非优化块标准。
三,代码
先给出代码
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
除了上述代码外,还需要一个数据块的辅助
。
图2
四,CODESYS的情形

图3
在CODESYS中有SizeOf这个功能。图3是Control Win X64 PLC上得到的结果。在此我们重点关注占用空间。得到如下结论:
1,bool类型占用byte
2,数据之间有间隙,这一条结论从图3中得不到。有机会时但开一篇探讨。
五,结束语
各位同业如果觉得有帮助,请点赞+关注。后续会分享更多内容。如果有疑问,可以留言,我们共同探讨。
237

被折叠的 条评论
为什么被折叠?



