回复:【实用FC系列】之二,SizeOf 统计数据的大小

Zane

西门子1847工业学习平台

  • 帖子

    21047
  • 精华

    399
  • 被关注

    1484

论坛等级:至圣

注册时间:2003-06-06

钻石 钻石 如何晋级?

发布于 2025-10-03 17:15:41

16楼

展开查看
以下是引用yang9188在2025-10-03 16:01:47的发言 >15楼

谢谢你的留言。我这里对你提到的2个问题做个回应。

先说你的第一个问题:用临时变量。这不合适。因为每个优先级的OB的临时区是有限制的。没有任何一个优先级的临时区能达到64K.

第二个问题,就是因为不知道数据的长度所以才用一个64K近乎最大的字节数量的buffer做辅助。通常没有哪个数据能超过64K。

以下是引用Zane在2025-10-03 14:15:27的发言 >14楼:再讲点细节上的处理1...

引用14楼详细内容:

再讲点细节上的处理

1)数据缓存gDB,我不会用全局数据块,我会在FC里的临时变量区开一个字节数组,数组的上限在FC里定义一个常数变量,固定值,FC不需要数据缓存这个参数引脚。

2)此外,楼主输入变量Data采用的是VARIANT变量定义,而缓存变量gDB采用的ARRAY[*]的定义,这里会有两个数据区长度适配的问题,楼主在程序中没有做合法性检测,以确保gDB的ARRAY[*]数组的长度大于Dada的数据长度。

       一般来说,在使用VRIANT以及ARRAY[*]变量作为功能块的接口时,在功能块内部我们需要对接口是否为空,变量类型,元素类型,以及元素数量做合法性检测,如果合法性检测不通过,应退出程序执行并给出错误字。

以下是引用yang9188在2025-10-01 08:28:23的发言 >4楼:我听劝代码如下:F...

引用4楼详细内容:

我听劝


代码如下:


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


除了上述代码外,还需要一个数据块的辅助




以下是引用Zane在2025-10-01 07:31:42的发言 >2楼:你不分享代码,说...

引用2楼详细内容:

你不分享代码,说明实现原理,别人怎么会觉得有帮助呢? 老是玩这种犹抱琵琶半遮面的把戏,无非就是让别人求着你呗。 做技术的还是真诚一点的好,愿意分享就大大方方一些。

呵呵,没必要的需求,没必要去坚持

Zane 注册自动化系统工程师 Always save before download
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

谈天说地

共有13238条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。