AI小西
热门搜索
1847工业学习平台选型选型3TF退市声明3RW常见问题目录非接触雷达资料汇总

签到有奖

  • 移动端入口

  • 工业服务小程序
  • 支持中心移动端首页
  • AI小西-AI智能问答助手
  • SIEMENS工业找答案小程序
  • 工业培训与认证
  • 西门子工业1847俱乐部
  • SIEMENS工业技术支持与服务
@CurrentUser.EmailCount@

消息提醒

登录 | 注册
@CurrentUser.NickName@
1847会员:未开通
VIP等级 @CurrentUser.vipLevel@
西币
@CurrentUser.coin@
  • 我的支持中心
  • 我的1847会员
  • 我的技术论坛
  • 我的找答案
  • 我的下载中心
  • 我的售后服务
  • 我的培训认证
  • 我发的帖子
  • 我跟的帖子
  • 我的论坛设置
  • 论坛用户指南
  • 我的下载中心
  • 我的培训认证
  • 我的提问
  • 我的回答
  • 已经帮助了@CurrentUser.allAnswercount@人我要回答
  • 已连续活跃@CurrentUser.allLoginDayCount@天我要提问
  • 首次回答问题获得双倍西币积分
  • 个人设置
  • 退出
  • 首页
  • 技术支持
    • 技术支持
    • AI小西
    • 风驰卡
    • 产品入门
    • 在线产品选型
  • 售后服务
    • 售后登记和质保查询
    • 备件商城
    • ASP工程师验证
    • ASP公司证书验证
    • 售后服务常见问题
  • 下载中心
    • 首页
    • 售前文档(样本、宣传册等)
    • 售后文档(FAQ、手册等)
  • 工业学习平台
    • 首页
    • 了解会员权益
    • 立即开通1847会员
    • 标准机型应用中心
  • 培训认证
    • 首页
    • 教室培训课
    • 取证训练营
    • 在线自学课
    • 认证证书查询
    • 培训伙伴验证
  • 技术论坛
    • 首页
    • 最新发帖
    • 精华帖
    • 发新帖
  • 找答案
    • 首页
    • 已解决问题
    • 精华常见问题
    • 发布新问题

官方商城

  • 西门子中国
  • 技术支持与服务首页
    我的支持中心
    下载中心首页
    全球技术资源
    1847工业学习平台
    产品入门新手必读
    找答案
    技术论坛
    售后服务
    网络资源新手必读
    高级搜索
  • 技术论坛
    论坛公告
    论坛使用指南
    最新发帖
    精华帖
    分享帖
    高赞帖
    热门帖
    高端推荐帖
    最高收藏帖
  • 自动化系统 / SIMATIC S7-1500系列
  • FB/FC 参数传递机制与Pointer数据类型

技术论坛

 • 产品分类
自动化系统
  • SIMATIC S7-1500系列 
  • SIMATIC S7-1200系列 
  • SIMATIC S7-200
  • SIMATIC S7-200 SMART 
  • SIMATIC S7-300/400 
  • 通信与网络组件
  • Profinet技术开发专区
  • 工业边缘计算
  • SIMATIC WinCC / Panel 
  • SIMATIC WinCC OA (原PVSS)
  • DCS/SIMATIC PCS7
  • IPC/PG
  • LOGO!
  • 物联网(IOT)
  • 工业电源
驱动技术
  • SINAMICS 
  • SINAMICS S200 
  • 直流调速器
  • 电机
  • SIMOTION
  • MicroMaster
  • 驱动技术综合产品
  • MasterDrives 
  • DCMA 变频器健康管家 维护智库
数控系统
  • SINUMERIK 
  • SIMODRIVE
低压电气
  • 低压电气
  • 低压数字化
传感器与通讯
  • 过程仪表
  • 分析仪器
  • 工厂传感器
谈天说地
  • 谈天说地
 • 咱工程师的故事
咱工程师的故事
  • 网友专栏 
  • 工程师随笔
1847大咖专栏
  • 崔工谈博途与PLC
  • PROFINET工业通信详解
  • 冯工聊工业网络
  • 电磁兼容问题及处理
  • 大咖专栏合集
特别专题
  • 专家大讲堂课后探讨
  • 西门子工业1847俱乐部
  • 特别专题合集
 • 培训与认证答疑专区
培训与认证答疑专区
  • PLC编程精英训练营
  • MA 小型自动化系统
  • WinCC系统开发工程师精英训练营
  • V90精英训练营
  • WinCC精英训练营
  • S7-1200精英训练营
  • G120变频器精英训练营
  • S7-200SMART精英训练营
 • 服务合作伙伴专区
服务合作伙伴专区
  • FA合作伙伴共创社区
  • Networks and Communication
  • GMC蓝黄带考试-G120
  • GMC蓝黄带考试-V90
  • GMC 合作伙伴专区

FB/FC 参数传递机制与Pointer数据类型

Letham

西门子1847工业学习平台

  • 帖子

    2101
  • 精华

    44
  • 被关注

    364

论坛等级:至圣

注册时间:2006-04-15

钻石 钻石 如何晋级?

FB/FC 参数传递机制与Pointer数据类型

462

1

2026-04-15 17:04:27

今天突然想写一篇帖子是因为,今天自己犯了一个想当然的错误,写出来分享给大家


第一部分 错误程序分析


为了避免浪费大家时间,所以,先就把自己的观点给抛出来

FC 块接口Input/output对于复杂数据类型参数,是按引用/地址方式传递的。
既然按地址传,那这个参数本质上就是个 数据类型Pointer,我可以按照Pointer类型进行分析处理。


基于以上观点,自己编写了一个程序,程序简单介绍如下

 一个PLC数据类型(UDT)-PointerAsStruct 用于对Pointer数据类型进AT,结构如下


TYPE " PointerAsStruct"

VERSION : 0.1

   STRUCT

      Datablock { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : UInt;

      Offset { ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : DWord;

   END_STRUCT;

 

END_TYPE

l   一个FC功能,部分类容如下

 

FUNCTION " CalcPreStopWeight" : DInt

TITLE = CalcPreStopWeight

{ S7_Optimized_Access := 'FALSE' }

FAMILY : ASW

VERSION : 1.0

   VAR_INPUT

      BaseWeight : DInt;

      InMode : Int;

      BinCtrlDB_PLC : "BinCtrl_PLC";

      BinCtrlDB_PLCAsStruct AT BinCtrlDB_PLC : "PointerAsStruct";

      BinCtrlDB_PCReadBins : Pointer;

      BinCtrlDB_PCReadBinsAsStruct AT BinCtrlDB_PCReadBins : "PointerAsStruct";

      BinCtrlDB_PCWriteExt : Pointer;

      BinCtrlDB_PCWriteExtAsStruct AT BinCtrlDB_PCWriteExt : "PointerAsStruct";

      BinCtrlDB_ASW : Pointer;

      BinCtrlDB_ASWAsStruct AT BinCtrlDB_ASW : "PointerAsStruct";

   END_VAR

 

   VAR_TEMP

      tmpActive : Bool;

      tmpByteOffset : DInt;

      tmpDBNo : UInt;

      tmpNoOfBin : Int;

      tmpActiveBins : Int;

      tmpIdx : Int;

      tmpParseAddr : Struct

         PCReadBinsStartAddr : DInt;

         PCReadBinsPerBin : DInt;

         PCWriteExtStartAddr : DInt;

         PCWriteExtPerBin : DInt;

         ASWStartAddr : DInt;

      END_STRUCT;

      tmpPreStopWeight : Int;

      tmpPreStopWeightBuffer : Array[0..#MAX_DISCHARGERS] of Int;

      tmpRet : Int;

   END_VAR

 

   VAR CONSTANT

      MAX_DISCHARGERS : Int := 64;

      OFFSET_MASK : DWord := 16#F_FFFF;

   END_VAR

 

BEGIN

 

    IF #BinCtrlDB_PLCAsStruct.Datablock <> #BinCtrlDB_PCReadBinsAsStruct.Datablock

     OR #BinCtrlDB_PLCAsStruct.Datablock <> #BinCtrlDB_PCWriteExtAsStruct.Datablock

    THEN

        #ASW_UL_Sec_CalcPreStopWeight := #BaseWeight;

        RETURN;

    ELSIF NOT #BinCtrlDB_PLC.ToASW.InfActive THEN

        #ASW_UL_Sec_CalcPreStopWeight := #BaseWeight;

        RETURN;

    ELSE

    ;

END_IF;

以上程序运行结果:

#BinCtrlDB_PLCAsStruct.Datablock 中的值不是实参的DB号;

#BinCtrlDB_PCReadBinsAsStruct.Datablock中的值是实参的DB号;

基于结果分析,下个正确结论:

FC 块接口Input/output复杂数据类型参数,是“按引用/地址方式传入”的;但这并不等于该参数在语言层面就是 Pointer数据类型。

AT 是对一个变量的覆盖,必须和被覆盖变量字节相同,因此对BinCtrlDB_PLC使用AT 也应该是,覆盖数据类型”BinCtrl_PLC”,而不是一Pointer数据类型

所以,对输入参数BinCtrlDB_PLC,进行AT,并且数据类型是"PointerAsStruct";就是致命错误了

 BinCtrlDB_PLC : "BinCtrl_PLC";

 BinCtrlDB_PLCAsStruct AT BinCtrlDB_PLC : "PointerAsStruct";

总结下,自己错误原因:1.有点想当然了;2.对于AT 的使用上存在误区



第二部分  再次学习下参数传递方式


我们,知道当一个程序块被调用时,程序员通过块接口传递参数,参数传递主要通过以下2种方式:

l   以拷贝方式传递(值传递)- Transfer as copy (Call by value)

l   以指针方式传递(引用传递)- Transfer as pointer (Call by reference)

看看博途手册中,S7-1200/1500对于FB/FC 2种类型的程序块参数传递机制


基于以上表格,我们可以看到以下几点

1.       对于复杂数据类型,通过InOut接口传递,是默认以指针方式传递的,这就意味着,这些实参在FC/FB内部是可以进行读写操作的。

2.       对于FC来说复杂数据类型通过Input与Output块接口定义的参数,都是以指针方式传递的,但是对于FB来说确是以拷贝方式传递,核心原因是FB有自己的实例。

3.       对于工艺对象,不管参数定义在块接口的什么区域,全部按照以指针方式传递的

4.       最后,一个很重要的事情,如果,在优化与非优化块之间传递参数,始终都是以拷贝方式进行传递的,同时,还涉及到高低字节顺序互换处理,所以,要避免在优化与非优化块之间进行大量数据的传递

 

FB与FC对于以指针方式传递方式还有以下不同

1.       FC Input/output复杂类型参数传递,需要依赖与调用者的局域堆栈,它是把实参的引用地址拷贝一份到调用者的局域堆栈中

2.       FC块接口中定义的参数,必须连接实参;FB中InOut中定义的数据可以不赋予实参,对于Input/output数据直接保存在FB实例中

3.       定义在InOut中的复杂数据类型,它是对实参地址的直接引用



 


剩余80%未阅读, 请登录阅读

回帖加入探讨技术论坛守则

上传附件要求

1. 文件大小:上传文件的大小请限制在2M以内。

2. 文件格式:请不要上传.exe文件,系统支持的格式有:
.avi,.wmv,.mp3,.rar,.zip,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.wma,.asf,.txt,.7z

 
发分享帖
爱工控,乐分享,
分享您的经验与案例
发故事
发表您的精彩故事,
参与征文活动
技术探讨帖
阐述您的观点,
表达我的看法
西家杂谈
海侃天南地北,
闲聊工控世界
发求助帖
求道解惑,“刨根问底”
解决问题
发投票帖
邀投票,做调查,
网友帮您来作主
取消原因:
FB/FC 参数传递机制与Pointer数据类型
编辑推荐: 关闭

请填写推广理由:

活动公告 查看全部公告>

【热门学习中】前沿技术专题:西门子工业新产品新功能新技术

1,870,398 条
海量精彩技术内容

100,000+ 网友与你交流

助你技有所长,论有所获

热门视频,猜你喜欢

本版热门话题

SIMATIC S7-1500系列

共有11094条技术帖

更多

评选标准

相关推荐

换一换

热门标签

换一换

相关帖子推荐

换一换
正在加载...
guzhang

恭喜,你发布的帖子

被评为精华帖!

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

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

  • 分享

  • 只看
    楼主

top
X 图片

下载中心

  • 首页
  • 查找文档
  • 常见问题大全
  • 精选主题
  • 全球技术资源

  • 首页
  • 知识库
  • 订阅文档

1847工业学习平台

  • 首页
  • 了解会员权益
  • 立即开通1847会员
  • 课程中心
  • 学习路线
  • 初级工程师认证
  • 高级工程师认证

培训与认证

  • 首页
  • 教室培训课
  • 取证训练营
  • 在线自学课
  • 认证证书查询
  • 培训伙伴验证

技术论坛

  • 首页
  • 发帖
  • 最新发帖
  • 精华帖
  • 高赞贴
  • 当前热门帖
  • 高端推荐帖
  • 用户荣誉榜

找答案

  • 首页
  • 提问
  • 精华问答
  • 高赞问答
  • 新解决问题
  • 待解决问题
  • 总积分排行榜

售后服务

  • 我要报修
  • 服务进度查询
  • 质保及权益查询
  • 备件商城
  • ASP工程师验证
  • ASP公司证书验证
  • 支持中心网站重要声明

西门子中国   © 西门子(中国)有限公司 1996 – 2026   企业信息    隐私政策   使用条款   京ICP备06054295号   京公网安备 11010502040638号
 
支持中心新发布“关注”功能了!实时查看彼此动态,更方便地进行技术交流。
不管是“关注”与“被关注”,相信都是一个美好的开始!
还有多重奖励派送,快快行动起来吧!

20秒帮我们优化支持中心!

欢迎您访问支持中心!

丰富的视频,全方位的文档,大量的网友交流精华……

为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!

感谢您的支持!

您收到0封站内信:
×
×
立即
签到
已签到
已签到0天
累计可抽西币次数:0次抽奖机会
累计可抽惊喜实物奖次数:0次抽奖机会
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。