| 作者 | 主题 |
|---|---|
|
question 奇侠
经验值:5626 发帖数:872 精华帖:6 |
楼主
主题: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楼
主题:回复:FB 接口只有in_out 才能定义variant,FC的in,output,和in_out都可以定义variantvariant的本质不是指针,是变量的解释说明
Zane
注册自动化系统工程师
Always save before download
|
|
Letham 至圣 经验值:14191 发帖数:2021 精华帖:43 |
4楼
主题:回复:FB 接口只有in_out 才能定义variant,FC的in,output,和in_out都可以定义variant
人生就像一场旅行!
|
|
yming 至圣 经验值:138360 发帖数:23136 精华帖:880 |
5楼
主题:回复:FB 接口只有in_out 才能定义variant,FC的in,output,和in_out都可以定义variant是的。Variant 的参数是“指针”,它本身是一种变量,是变量的解释说明。这里可能用解释说明更好。 因为,一说到指针,就容易让人觉得像是 P#;一关联到P#,就会使用到绝对地址,非优化的块。这绝对不是TIA开发者创建Variant的初衷。 Variant不是指针,也不是指针类型,它也不占用空间。它完全可以接受没有绝对地址的变量名、优化的块内变量、用户定义的变量。不管这个变量名的数据类型是什么样的。我觉得,这些才是TIA 开发者提出它的初衷。
学而时习之,不亦说乎?温故而知新,不亦乐乎?
|
|
v_wind 侠圣 经验值:2552 发帖数:287 精华帖:3 |
6楼
主题:回复:FB 接口只有in_out 才能定义variant,FC的in,output,和in_out都可以定义variantvariant绝对不可能是指针,不论从命名上还是功能上都和指针相差很大,TIA提倡优化的块、用符号寻址。编程语言里C的指针被称为精华所在,C的指针能够直接修改指向地址的值,直接调用类型的子变量(读写),能够指向函数,应该说用好了真是无敌了(用不好危险性也大)。在看看variant,个人感觉就是个连接管道,指向了,但是不能用,非得找个载体再使用,不仅浪费空间(载体需要开辟),还比较麻烦。个人感觉variant它在字符串处理上应用比较舒服,再有就是数组处理MOVE_BLK_VARIANT是为数组类型量身定做的,一切其他类型必须转换到数组才可以用,用序列化和反序列或是仅仅MOVE_BLK_VARIANT一个。 |
|
question 奇侠 经验值:5626 发帖数:872 精华帖:6 |
7楼
主题:回复:FB 接口只有in_out 才能定义variant,FC的in,output,和in_out都可以定义variant
drongh
|
|
yming 至圣 经验值:138360 发帖数:23136 精华帖:880 |
9楼
主题:回复: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处有真正的数值。 你说对么?
学而时习之,不亦说乎?温故而知新,不亦乐乎?
|