当前位置: 首页 > news >正文

博途PLC的值传输与指针传输

今天说一个PLC编程的基础知识:块调用的值传输与指针传输。我们以使用最广泛的博途PLC为例子。

在块调用时会传递参数,被传递的参数可以是值也可以是指针。这是一个知识点。不过平时对这个知识点没有什么感觉。我也如此,虽然知道这个事情,但是似乎与我平时编程关系不大。but上周的调试经历,让我在这个问题上整整付出了几个小时的心思才越过这道坎。这几个小时我更多在思考为什么我的预期与实际程序监控完全不同?心里的冲突很激烈。为了让伙计们少走类似的弯路,今天就说说块调用的值传输与指针传输。

为了突出问题,这里不把我遇到的真实问题拿来说。我把我遇到的真实问题简化后分享给大家。

先介绍这个例子。

图 1

项目如图1,很简单。1个FC,1个OB1,1个数据块。

图 2

数据块中的内容也很简单,如图2。我们整个项目只对Flag1进行操作。

图 3

如图3,在OB1中调用FC1。并设置观察点1,这个观察点用来观察Flag1的值。在OB1调用FC1时,引脚“tag_INOUT”的实际参数是Flag1。

图 4

图4是FC1的情况。该FC有一个IN-OUT引脚“tag_INOUT”。在该FC1内部对Flag1进行置位操作。到此,所有程序和数据到此就介绍完毕。

观察程序执行的情况。在FC1中对标志位进行置位,标志位的值是1;在观察点1,标志位是0。奇怪不?整个程序都没有复位标志位的程序,可是,可是,可是结果使人意外。伙计们阅读到此,可以先缓一缓神,不要急于向下看结果。先想5分钟这是为什么。我遇到的实际情况比这个要复杂得多。我遇到的问题卡了我几个小时。我怀疑了各个可能出问题的地方,试图修正程序,但都失败。

在观察点1,标志位为什么被复位了呢?好了,我们给出答案和分析。

观察图3,我们知道在图3调用FC1时刻(network 1),Flag1是0。在调用FC1后,CPU运行FC1中的程序,当运行完FC1的network 1后(图4),Flag1是1。

然后CPU会结束FC1的运行返回OB1中。在结束FC1运行前,CPU会做一件事,这件事情就是将在FC1中的运行结果输出到FC1的输出引脚以及输入输出引脚。问题就出现在这里。在FC1中变量tag_INOUT始终是0,因为在FC1中从没对这个变量进行置位操作。在结束FC1运行返回OB1时刻,CPU将tag_INOUT(值是0)的值赋值给Flag1。此时Flag1的值就是0了。好了,完全能解释通了。

上一段介绍的就是函数引脚的值传输。值传输在类似上述的一些情况,容易出问题。所以博途引入了函数引脚的指针传输。下面我们看看指针传输是否能修正这个问题。我们首先对FC1的引脚进行改造。

图 5

我们不更改FC1的程序,只更改引脚。我们把gDB中的结构体复制到FC1的引脚中。

图 6

在OB1中把gDB中的结构体放到FC1中的引脚,其余都不改。然后下载程序,进行监控,我们发现这个错误已经得到修正,Flag1的值和编程者的意图一致了。

当输入输出引脚是结构体时,在调用程序块时引脚向程序块内部传输的是指针不是值。在结束FC1调用前,不会把FC1中的相关值赋值给引脚。所以也就不会复位Flag1了。这一段就是程序块引脚指针传输的原理。

另外,在程序块内对IN-OUT中的结构变量操作,是对引脚实际参数的直接操作。这种直接操作本质上就是利用指针对数据进行操作,所以称为引脚的指针传递。

好了,稍微有点绕。需要反复琢磨一下就明白了。

在IT的高级语言中同样存在着函数引脚的值传输和指针传输。比如在C#中,如果引脚增加关键字REF,那么这个引脚就是指针传输。但是在博途中,由于没有REF或者类似的关键字,所以很容易忽视程序块传输的到底是值还是指针。这也是为什么会给我带来这么大调试困扰的重要原因。因为虽然我知道这个知识点,但是出现问题时,并不会天然的想到是这个问题。如果博途日后的版本能把值传输还是指针传输显性化,那么碰到类似的问题就容易排查了。

总结:

这次调试的遭遇让我想起了一句老话,别拿豆包不当干粮。

伙伴们有啥问题,欢迎在此讨论。

关注我,会有更多技术博客在这里分享。

http://www.gsyq.cn/news/1628302.html

相关文章:

  • IS31FL3731 LED驱动与PIC24微控制器的应用指南
  • 造形家和Hektar有什么区别?一篇看懂实景建模与生成式规划推演
  • 数据结构查找算法大全
  • 我们调研了四个AI编程平台的2.5万个Skill,发现Agent生态正在发生这五件事
  • 解决Windows 11系统安装引导-无法识别到硬盘/存储驱动器
  • ASM330LHH与PIC18F4455在运动跟踪中的优化实践
  • 技术深度解析:纽约市出租车与网约车大数据处理架构实践
  • 3步解锁跨平台应用:Windows直接运行Android的终极方案
  • VRRTest:终极可变刷新率检测工具完整指南
  • 嵌入式系统中DS28EC20 EEPROM的应用与优化
  • 学术写作新纪元!2026全能型AI论文写作工具终极指南
  • utdnsmasq架构深度剖析:Rust模块设计与核心组件
  • RTSPtoWeb深度解析:如何用纯Golang实现RTSP到Web视频流的无缝转换
  • PCF8591与PIC18F2585的I2C通信与信号处理优化
  • STM32F303VE与LP5812实现RGB LED动态灯光控制
  • macOS Adobe全家桶下载终极指南:Adobe Downloader完整使用教程
  • STM32L432KC与DS28EC20 EEPROM数据存储方案
  • 冷挤压技术深度解析:从工艺原理到产业化实践——以浙江三维大通精锻为例
  • 工业级传感器控制系统核心组件选型与设计实践
  • LinQuickRec未来路线图:即将发布的5大功能与技术升级
  • M24256E与PIC32MX675F256L的工业级嵌入式存储方案
  • 基于STM32与TPAFE0808的多通道信号采集系统设计
  • openeuler/cdf-crypto安全随机数生成机制:保护你的密钥不被破解
  • 如何用AI技术让老照片重现青春:RestorePhotos.io深度解析
  • DDE异常日志收集器使用教程:快速定位和解决桌面问题
  • 如何将dpu-utilities集成到现有基础设施:企业级部署的最佳实践
  • 2026图片去水印方法:手机电脑免费工具,无痕去水印教程
  • DevEco Studio 和 Android Studio jcef兼容性问题
  • dpu-utilities未来展望:DPU生态系统的演进方向与技术趋势
  • Gemma 4轻量多模态模型如何重塑广告AI工作流