技术论坛

 回复:FB 接口只有in_out 才能定义variant,FC的in,output,和in_out都可以定义variant

返回主题列表
作者 主题
question
奇侠

经验值:5626
发帖数:872
精华帖:6
楼主    2017-09-22 20:45:04
主题:FB 接口只有in_out 才能定义variant,FC的in,output,和in_out都可以定义variant 精编帖 

传值(pass by value)和传引用(pass by reference)的区别。

传值有拷贝开销,而传引用没有,传引用的实质就是传指针,所以可以在函数体内修改传进来的那个变量。而传值是不行的。


对于基本数据类型,FC和FB接口都是传值。这里我们讨论复合数据类型。


variant的本质是指针,只能在传引用的接口区声明。

FB 的in,output接口都是传值,而in_out 接口是传引用,故variant必须在in_out区声明,可以在函数块内修改实参的值。


对于FC的in,output,in_out接口都是传引用,都可以定义variant变量。既然in接口是传引用,为何不能在函数内修改函数外的值呢,因为这个引用是只读引用。


如果有一个大型数组,读取无需修改元素的值,对于FC,尽量在in接口声明,而不是在in_out接口。

对于FB,建议放在in,而不是放在in_out, 虽然这么做会牺牲效率,但代码更清晰,防止非法修改。

drongh
Zane
版主

经验值:85161
发帖数:21047
精华帖:399
2楼    2017-09-22 23:04:54
精华帖  精编帖  主题:回复:FB 接口只有in_out 才能定义variant,FC的in,output,和in_out都可以定义variant

 variant的本质不是指针,是变量的解释说明

Zane 注册自动化系统工程师 Always save before download
Letham
至圣

经验值:14191
发帖数:2021
精华帖:43
4楼    2017-09-23 13:24:18
精编帖  主题:回复:FB 接口只有in_out 才能定义variant,FC的in,output,和in_out都可以定义variant


官方解释,连接到VARIANT类型的参数是指针




人生就像一场旅行!
yming
至圣

经验值:138360
发帖数:23136
精华帖:880
5楼    2017-09-23 20:48:23
精编帖  主题:回复:FB 接口只有in_out 才能定义variant,FC的in,output,和in_out都可以定义variant

  是的。Variant 的参数是“指针”,它本身是一种变量,是变量的解释说明。这里可能用解释说明更好。

因为,一说到指针,就容易让人觉得像是 P#;一关联到P#,就会使用到绝对地址,非优化的块。这绝对不是TIA开发者创建Variant的初衷。

Variant不是指针,也不是指针类型,它也不占用空间。它完全可以接受没有绝对地址的变量名优化的块内变量、用户定义的变量。不管这个变量名的数据类型是什么样的。我觉得,这些才是TIA 开发者提出它的初衷。


学而时习之,不亦说乎?温故而知新,不亦乐乎?
v_wind
侠圣

经验值:2552
发帖数:287
精华帖:3
6楼    2017-09-23 21:55:37
精编帖  主题:回复:FB 接口只有in_out 才能定义variant,FC的in,output,和in_out都可以定义variant

variant绝对不可能是指针,不论从命名上还是功能上都和指针相差很大,TIA提倡优化的块、用符号寻址。编程语言里C的指针被称为精华所在,C的指针能够直接修改指向地址的值,直接调用类型的子变量(读写),能够指向函数,应该说用好了真是无敌了(用不好危险性也大)。在看看variant,个人感觉就是个连接管道,指向了,但是不能用,非得找个载体再使用,不仅浪费空间(载体需要开辟),还比较麻烦。个人感觉variant它在字符串处理上应用比较舒服,再有就是数组处理MOVE_BLK_VARIANT是为数组类型量身定做的,一切其他类型必须转换到数组才可以用,用序列化和反序列或是仅仅MOVE_BLK_VARIANT一个。

question
奇侠

经验值:5626
发帖数:872
精华帖:6
7楼    2017-09-24 10:17:43
精编帖  主题:回复:FB 接口只有in_out 才能定义variant,FC的in,output,和in_out都可以定义variant



任何编程语言,函数传参,要么是传值,要么是传指针或引用,而引用是指针的更高级形态。


plc编程都是基于计算机技术,就不可能超出这个范围。


variant就是传引用。。。





drongh
yming
至圣

经验值:138360
发帖数:23136
精华帖:880
9楼    2017-09-24 11:54:32
精编帖  主题:回复:FB 接口只有in_out 才能定义variant,FC的in,output,和in_out都可以定义variant

关于Variant这种数据类型我很少使用,因为我不是做专业软件编程的,大部分的时间还是机械设计。

撇开Variant序列化,反序列化不谈(这些是为通讯使用的)。对于Variant这个数据类型说一点认识:

如果你观察TIA 提供的许许多多的指令(LAD常规指令,扩展指令),都可以发现,它的输入就是Variant类型。它自带了数据类型识别。

例如,一个最简单的MOVE,你不用去考虑数据类型,直接将一个变量拖到输入即可。这个MOVE指令函数,对所有PLC数据类型通用。这个MOVE指令函数的输入,就是Variant。

对于我们非专业软件编程的来说,博图提供的这些基本指令,扩展指令...已经满足:够用的要求了。但是,对于专业的软件编程来说,可能还不够。

比如:需要一个通用函数,其功能就是将输入的变量数值减半输出。而它可以接受INT、DINT、浮点之类的数据类型。

怎么办呢?其实就是用Variant作为FC的输入输出;用VariantGet获得数据值(类型),按各类型处理减半,用VariantPut输出。(这个VariantGet的最大好处就是数据类型不对,不传送!不用你再去写判断!这样处理就变得简单多了。)

一个通用的FC就完成了,做好注释,你就可以把它保存到自己的全局库中,随时调用。

这就是西门子的开放。

你也可以写个单极值的0.618法,可以处理整数、长整数、浮点的函数么?

这就是Variant的意义,它在输入处,接受除它自己之外的所有数据类型,只在VariantGet处有真正的数值。

你说对么?

学而时习之,不亦说乎?温故而知新,不亦乐乎?
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。