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

西门子Variant变量介绍

为什么要使用Variant?

如果我们在编写FB或者FC块时,使用了输入参数或者输出参数,那么我们必须先给这个参数定义一个数据类型,例如int, real,string等。

而我们要调用这个FC块或者FB块的时候,也必须给对应的形参提供正确数据类型的实参。

但如果有些块的功能,它们逻辑完全一样,只有输入的数据类型不同呢?那我们是不是应该每种数据类型都编写一个块呢?有没有方法可以实现,就算输入不同的数据类型,也能得到对应的结果呢?答案就是我们今天要讲的这个variant数据类型。

简单来说,如果你不确定输入是一个什么类型的数据,你可以先把它定义成variant,然后当你输入实参时,再去判断你输入的数据类型,然后根据不同的数据类型进行不同的操作,最后得出结果。

如何使用Variant?

说得可能比较抽象,那么我们直接举个例子来说明这个variant的用法吧。

假设我要创建一个FB块,它实现一个累加的功能,它的输入是一个数组,这个数组的长度不确定,数组里面元素的数据类型也不确定,要求我们把数组里面的所有项相加起来,得出一个总和。

为了简化这个模型,我们假设输入只有两种数据类型,分别是int和real。

整体思路大概如下。

下面是具体的实现方法。

首先我们先创建一个FB块,选择SCL语言编写。先定义一下输入输出引脚。这里要注意的是,variant只能作为输入或者输入输出,而不能作为输出。

这里我们需要两个输入,分别是arrayInput和start。其中前一个参数是用来接收一个数组对象。而start参数则用来控制求和开始。

如果发生报警,error为true。

sum则是我们的求和结果。

然后其他变量定义如下,具体有什么作用?后面我们使用时会介绍。

开始我们要判断输入对象是不是一个数组?这里我们要用到IS_ARRAY()这个函数,如果是数组的话,返回true,否则返回false。

首先,不是数组的话,我们直接把error置true。

反之,如果结果是数组,接着我们要计算数组的长度。这里用CountOfelements()这个函数。

接着,我们就要判断这个数组它的元素类型。TypeOfElement()就可以实现这个功能。它会返回一个数据类型,然后我们把这个返回值跟int,还有real做对比。

假设它返回的是一个int数组,那么我们就把这个输入的数组赋值给一个int数组。

同理,如果返回的是real数组,那么我就把arrayList赋值给real数组。int数值和real数组,它的求和就比较简单了。这里就忽略不讲了。最后我们求出来的那个和,它是一个int类型,但这样子是不满足需求的。因为假设我们输入的是一个real数组,那么我们不可能输出一个int值的和。

所以我们要把这个int值再转化成variant类型。real写法也是同样道理。那样我们的这个FB块就完成了,下面是具体的写法。

写完之后,我们再创建一个DB块。在里面添加两个数组,分别是int类型和real类型。还有两个和。然后把两个数组按照以下的初始值来给它设定。

最后我们在主程序里面调用两次FB块,并在FB块填入data数据块里面的值。然后使用一个M10.0作为触发按钮。

然后把程序下载到plc里面,点击自动运行,切换到在线监控。然后我们手动把那个M10.0切换成true。可以看到两个fb实例的那个和的值已经出来了。一个是15,另一个是16.5。一个是整形,一个是浮点数。说明这个fb块基本实现它的功能。

http://www.cnnetsun.cn/news/4344407.html

相关文章:

  • mpx原型工具实战:PX与PT换算及悬浮窗尺寸最佳实践
  • 京东秋招技术通用岗笔试全攻略:题型解析与备考策略
  • 从仿真到硬件:拆解Unitree机器人技术栈与开发实践
  • QAT伪量化
  • Windows下部署OpenClaw:从WSL2到本地大模型的AI代理实战指南
  • 2025阿里云研发岗春招笔试全解析:考察逻辑与备战策略
  • 【原创】基于AI大模型+SpringBoot+Vue的健身房私教预约及会员办理系统(设计与实现)
  • MKVToolNix:无损封装音视频与字幕的终极工具指南
  • 【单片机毕业设计】基于 STM32 或 51 单片机的激光测距参数设置与移动端监控系统设计 基于 STM32 或 51 单片机的 TOF 传感器距离采集预警设备设计与实现(023305)
  • 国防科大操作系统公开课:从进程内存到文件I/O的体系化学习指南
  • 【设计模式精讲】8.原型模式(Prototype)
  • 安卓4老电视没有输入法?从APK安装到ADB的完整解决指南
  • Cesium三维淹没分析:热力图可视化水深分布实践
  • 27届大模型面试准备(七十):大模型推理服务的负载均衡与智能请求路由
  • 0x28通信控制服务测试用例设计:从需求拆解到落地实践
  • 武汉国家开放大学怎么报名?靠谱教育机构怎么选?华祺教育优势详解
  • 基于微信小程序的餐厅预约系统设计与实现源码+文档+讲解视频
  • 深度学习+CNN 深度学习大白菜病害检测系统预测模型完整项目源码+训练脚本+评估指标【AI毕设】
  • Codex多Agent加密:你的AI编程Agent正在变成监察黑洞
  • STM32F103C8T6驱动WS2812B灯带:基于PWM+DMA的完整方案
  • 2026年AI岗位能力要求与工程实践:从RAG到模型部署全解析
  • 工厂必须设置的安全标识有哪些?分别放在什么位置?
  • 一张图彻底看懂5G RF前端:从PA、ET、FEMiD、Duplexer到Antenna Tuner,为什么中间能损失4~5dB?
  • AI生成测试用例实战:提示词工程与结构化输出设计
  • SpringBoot+Vue入校申报审批系统:从设计到部署全解析
  • Zotero AI插件批量生成文献精读笔记实战指南
  • 数据科学家私藏!5个Python冷门库,告别重复劳动,效率翻10倍
  • Spring Boot+Vue全栈实战:构建自动化网站监控系统
  • 技术经纪人如何提升匹配效率与专业能力?
  • Live2D动画项目工程化全流程:从原画拆分到Web集成的“和弦”实践