技术论坛

 回复:从来都没搞懂,什么叫面向对象编程?

返回主题列表
作者 主题
芳季
至圣

经验值:72121
发帖数:15507
精华帖:101
楼主    2022-06-18 08:30:49
主题:从来都没搞懂,什么叫面向对象编程? 精华帖  精编帖 

刚出来工作就遇到这种字眼,特别深刻。那时候不懂,不懂就不懂吧。做着做着再算。反正不知道又不碍事。结果……十几年了,还没遇到答案。

到底什么是面向对象编程?


Ghostep
侠士

经验值:1300
发帖数:227
精华帖:1
1楼    2022-06-18 08:42:52
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

面向对象,面对的是对象。其实就是把过程封装成包。指挥这个包去干什么什么

  比较抽象,学计算机的我也不大好解释

芳季
至圣

经验值:72121
发帖数:15507
精华帖:101
2楼    2022-06-18 09:24:05
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

做工控的有哪样事情不是面向面前这台机器的?

人机界面是面向人的?是吗?

yanxiao
版主

经验值:28607
发帖数:12144
精华帖:46
3楼    2022-06-18 10:28:22
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

我也没正儿八双引号地写过什么面向对象的程序,只了解一点皮毛。


比如,经常有人讨论N台电机,几用几备、轮换启动等。

如果把电机看成一个对象,它有属性和行为

可能的属性有:

启用状态(检修状态)、运行状态、故障状态、当前停机时间、当前运行时间、总的运行时间,等等;

可能的行为:

启动、停止。

把这些属性、行为定义好,什么几用几备、轮换启动等,写起来就容易得多了。

yming
至圣

经验值:138382
发帖数:23141
精华帖:880
6楼    2022-06-18 11:38:11
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

“做工控的有哪样事情不是面向面前这台机器的?”

说对了。这就是面向对象。

但不一定是面向对象的编程(方法)。

面向对象的编程说的是方法

按这种方法描述:对象具有三种属性:状态属性、行为属性、标识属性

后面的所有,都是围绕属性来分类、操作的。

状态属性,至少得有两。0/1。

行为属性可以有多种。例如:指示灯,灭、慢闪、快闪、全亮;但不能有发射;发射那就是另一个类:曳光弹了。

标识属性就是给它个性化、分类了。

继而,行为属性可扩展:旋转、颜色等等。

把这些做成函数、功能块;用的时候调用,给各个属性赋予值即可。

很明显,对于内存小,运算慢的处理器,运行效率低,(就是一亮一灭的功能,运行也需要一堆属性判别。)不合适!

编程可能方便些。

如果把它做成图标点击填写参数表格,这就叫可视化 Visual 的面对对象的编程。

反之,如果面对各项目机器,每次编程都要从头来,一行行敲代码;肯定不是面向对象的编程方法。

学而时习之,不亦说乎?温故而知新,不亦乐乎?
yanxiao
版主

经验值:28607
发帖数:12144
精华帖:46
7楼    2022-06-18 12:00:59
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

面向机器,还是面积人:

我的看法:初级编程是面向机器的,搞清楚机器是第一步。

高级编程是面向人的,人才是主体。


面向机器的程序,性能可能不错,但不好伺候。

有人说,20%的工作量是功能编程,80%的工作量是解决各种的异常情况。

面向机器的编程,完成的是20%的工作。


如果有一个系统,一有问题机器就停摆,也不告诉你那里有问题,或者仅仅显示一个XX异常,没有具体的细节信息,可以判断,这个程序不是面向人的。

Zaxife
至圣

经验值:12614
发帖数:2450
精华帖:31
8楼    2022-06-18 12:38:03
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

面向对象编程?啥?我没有对象无法面向对象编程啊...........

在面向对象编程的人眼里,一切皆对象。

举个栗子,Q0.0就是一个开关量输出类型的对象,这对象的方法就是给0?给1?啥都不给?然后可以给对象增加更多的属性,比如延时输出、比如脉冲输出、频率输出、PWM输出....比如Q0.0的通讯质量状态。

在举个栗子,比如Modbus通讯模块也是个对象,这个对象关联哪个通讯口、通讯参数是啥、关联哪个数据表、使能通讯、通讯各种事物.....


反正,面向对象编程就是把一切都认定是对象,然后给对象各种定义、各种操作....以前叫变量的玩意现在叫数据对象、以前叫模块的玩意现在叫类对象、以前叫函数?子程序的玩意现在叫类...以前混乱的叫法做统称或者说换个叫法。


想真正了解啥是面向对象编程?C++就是首选。


Zane
至圣

经验值:85179
发帖数:21055
精华帖:399
11楼    2022-06-18 21:33:19
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

虽然都有面向对象编程这个概念,但我并不认同PLC编程可以直接借鉴PC的做法。


PC是事件响应机制,而PLC则是扫描机制

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

经验值:85179
发帖数:21055
精华帖:399
12楼    2022-06-18 21:35:32
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

万物皆对象,无论虚实,只要心中有对象,你就可以面向对象编程

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

经验值:15756
发帖数:3179
精华帖:34
17楼    2022-06-19 19:01:07
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

版主大人说的真好。本胖对于PLC关于对象编程的理解就是直接给IO点编程还是调用FB,假设一个泵吧,这个FB的接口如果有启停、运行反馈、超时设定...启动、报警、故障、故障码等等......,就可以看成面向对象了。

因为面对的是泵的参数而不是PLC的IO等等参数。

本胖不保证说得对啊,但本胖真是这么想的。

国人当自强 共同努力 抵制日货
holdkcsxyz
至圣

经验值:13739
发帖数:1560
精华帖:24
21楼    2022-06-20 09:09:29
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

芳工应该不用纠结,每一个全局变量(输入/线圈)就是一个对象,搞PLC的天然的面对最简单的对象,因此要面向对象就要全部用全局变量编程,偶尔不得已面向过程用个子程序封装编程.

芳季
至圣

经验值:72121
发帖数:15507
精华帖:101
22楼    2022-06-20 11:46:25
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

哦。原来除了面向对象,还可以面向过程。

感觉就好像是一张方格纸,上面的格子,列分类还是行分类。

很难说出这种感觉。

最好还是要实例举一下。

xinchen
侠圣

经验值:2020
发帖数:230
精华帖:1
23楼    2022-06-20 13:50:37
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

我个人是这么理解

  1. 描述本身

    对象本身通过属性和动作描述本身,比如阀门有状态属性(开关到位、超时报警、手自状态等等),也有动作(打开、关闭),当然在PLC中都是用参数指示,而不是调用方法;

    a) 电机,最简单的起保停;当有多个电机时,一个个起保停,或是循环,或是按字与或,都可以;

    b) 而需求变复杂时(还是以阀门举例,加入超时报警、尝试次数、开关自锁、切换延迟、手自操作、状态枚举等),面向过程后程序容易混乱繁琐,所以是把相关逻辑封装到类中,也就是 FB 中,使得逻辑清晰,外部只需要根据接口准备对应参数即可;

    这个其实很多工程师已经是这么做了;


  2. 描述关系

    a) 描述相似关系或是相近功能,比如是 DI 信号处理(直入直出,或是加个定时器防抖动),可以是内部功能对象的不同组合;(因为java .net 之类 有继承、重载等功能,这个在上位机上更能体现);

    b) 描述对象之间关系,比如阀泵的开关启停,由于泵的特性,先起泵还是先开阀是不一样的;

        如果是面向过程,很多程序实现时是在原有阀/泵的起保停上加入另一个的状态做限制;

        如果是面向对象,那首先先定义阀、泵两个对象,然后定义控制器,控制器内部决定当前是开阀还是起泵,如果顺序相反,那只需要稍微调整控制器内部即可,本身对阀/泵各自的操作没关系;


以上是局部的对象定义,对象有多大或是多小都可以,大到架构模块,小到状态定义,这个看需求和设计;

总之面向对象,期望能使结构更加简洁,无关的逻辑不用对外,提高复用性,并能以更小的变动满足不断变化的需求;








xinchen
侠圣

经验值:2020
发帖数:230
精华帖:1
24楼    2022-06-20 14:04:03
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

对于功能来说

面向过程就像远程IO,我要的数据要自己一点点分析处理,我要你做的要一步步指挥你做;

面向对象就像远程CPU,我要的直接取就行,我要你做的只需要告知你就行,你会自己看着办;


对于程序结构就不好说,这个要看小的功能和对象是怎么定义描述的,描述的好,赏心悦目,描述不好,还是面向过程吧,毕竟面向过程性能好;

锋言锋语
至圣

经验值:26740
发帖数:3942
精华帖:54
27楼    2022-06-20 14:27:04
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

简单来说就是抽象。


抽象是人脑最喜闻乐见的事情。

一件事, 抽象描述就是 时间, 人物, 事件。  简单清楚明了。 你面对的是抽象的人, 有与人相联系的各种行为。


面向过程, 有点***。 将一个人, 割裂为嘴巴的行为(说话), 指头的坐标变化(动手), ......等等, 也就是一堆冰冷的函数。


你这样对比一下, 其实没这么复杂。面向对象, 不过是OOP直译过来的。  其核心思想, 就是适度的抽象。用抽象思维描述和解决问题。


在举个例子,  你从小教自己小孩子各种东西, 就是从面向对象开始的。 比如说, 这是爸爸, 这是妈妈, 找妈妈有奶吃, 这是苹果,苹果是酸的, 这就是面向对象的思维。 可见, 人脑是适合这种思维方式的。


反之, 我们在进入学校, 尤其是到高中以上, 就有点面向过程了, 将一个物体, 从物理和化学角度分解的支离破碎, 研究每个细节。 其过程痛苦不堪。


话又说回来, 其实两种思维相辅相成。   能深入地研究细节和过程而不不迷失, 也能跳出细节,抽象思维和规划, 这都是不可少的。


一句话, 不要被面向对象, 这四个字迷了双眼。  不就是OOP的汉语翻译吗?  要领会这种思想。


不忘初心
yming
至圣

经验值:138382
发帖数:23141
精华帖:880
28楼    2022-06-20 18:04:12
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

这个概念还是搞明白些比较好。迟早工控要和IT越来越紧密地结合。

而IT编程大多是面向对象的编程方法。

在IT那边。对象、属性、方法都已经定义好了。直接拿来用即可。本身就是面对对象的编程方法。

在工控这边,也可以用面对对象的编程方法。明确地说,就是一些FB/FC。

例如:

对象:模拟量输入,0-27648

属性:死区、最小值、最大值、溢出值。。。

行为方法转换成0-100%;整数/浮点输出;报警输出;断线输出;反相输出等等。

据此,写出一个FB/FC,来处理模拟量。有一堆输入;一堆输出。

越通用,这些属性、方法就越多。(为适用一切工况)

编程使用时,拖进来,填入属性即可。

这就是面向对象的编程方法。(这不是面向过程的。与之前、之后没关系。)

很明显,这样虽通用,但运行效率低。处理时间多、占内存也大。

西门子提供的各种函数快、功能块,理论上也都是面对对象的。

那些与上一周期的,之前的状态相关的,就属于面对过程的。

我就是这么理解的。


再举例:

对象:一个输入框

它有属性:字长,小数点几位,是否允许字母/数字等等

行为方法:鼠标指针,进入框时(显示提示?提示内容?);浮动上方时;离开输入框时(提示消失);点击输入框时。。。。。

面对对象的编程,可以调用这个Function()后面写属性、方法;

如果是可视化的(可见即可得),就和FB/FC一样,填写属性、行为方法“表格”。





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

经验值:12614
发帖数:2450
精华帖:31
30楼    2022-06-20 21:10:09
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?
emmmmmmmmm…
有必要这么纠结这种事么?就是换个编程方式换个叫法。
smart200的modbus从站库就是最形象面向对象的栗子啊,你只需要输入参数,然后每周期都EN,然后就等待结果…这就是一个对象…以前叫子程序…可里面还是那些东西。我是很反感那些扯一堆新名词来忽悠别人的人的。
至于不是面向对象的?你把库打开看里面的逻辑就知道了,里面就是过程编程。说白了就是把过程编程封装起来用更形象的方式调用罢了,他们管这叫面向对象编程(面向PLC的Modbus从站编程)…
我个人建议不要去太纠结这玩意。如果以前都是程序容量差不多用满的更不要去折腾这玩意,这玩意的代价是浪费更多的硬件资源。面向过程才是执行效率更高的。
大酱猛男
侠客

经验值:775
发帖数:36
精华帖:0
31楼    2022-06-20 22:11:37
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

前面的说的还行,后面怎么就歪了?
“那些与上一周期的,之前的状态相关的,就属于面对过程的。”

PLC本来就是扫描机制,一个对象的调用顺序上不一样,那肯定就会存在读取上一一个周期的状态。


yming
至圣

经验值:138382
发帖数:23141
精华帖:880
32楼    2022-06-20 23:07:09
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

不是指扫描机制。我没表达正确。

面向过程指的是调用的前后,从输入到输出(从输出到输入)来写的方法。(第一步、第二步、第三步。。。)

仅是我的理解而已。

我觉得就是那些计算机专业的给这儿套用的名称。

我原来的认知“面向对象编程方法”为:模块化。

“面向过程的编程方法”就是:层次化、结构化。


学而时习之,不亦说乎?温故而知新,不亦乐乎?
飘凡尘
游侠

经验值:396
发帖数:31
精华帖:0
35楼    2022-06-23 15:09:06
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

面向对象编程是一种编程方法,既然是方法那肯定比不用方法有好处才有意义。

那么好处在哪里呢?个人感觉吧,最大的好处就是重用性,其次整体结构上可能更清晰一点,其实差距不大。

你定义一个类,这个类呢有好多属性,换个马甲就代表不同的人,但是干的事都差不多。

就好比开发一个房地产项目,100幢楼,房子都一样,只需要1套设计图纸,等房子造好挂上不同门牌号就可以区分开来了。至于房子卖给谁,什么时候卖和房子本身无关。

要是做的项目房子每幢都不一样,那有可能永远不会考虑重复使用的问题,用不到这个方法,也就没有好处,相对来说就没有意义

当你排除了所有的不可能,无论剩下的是什么,即使再不可能也一定是真相
sangshunyang
侠圣

经验值:4443
发帖数:618
精华帖:4
36楼    2022-06-23 15:46:50
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

       对PLC编程来讲,提面向对象编程就是瞎扯淡,或者说是偷换概念,就目前的情况来讲都不具备这方面的能力。面向对象编程的三大特性: 封装,继承,多态。问问那一家的PLC厂家 敢说提供面向对象的编程能力。就PLC编程来讲可以借鉴高级语言的编程思想和编程模式,编程风格,但总不能生搬硬套,非要公鸡下蛋。

   不要说PLC,就连目前用到的HMI和SCADA 都不具备,严格来讲这些都不能称为编程,如果能牵强的沾点边的就是西门子新的提供JS脚本支持的HMI还勉强说得上。

锋言锋语
至圣

经验值:26740
发帖数:3942
精华帖:54
37楼    2022-06-23 16:08:14
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

楼主, OOP 就是 orinted object program。  翻译过来就是面向对象编程。


然后, 我的理解, 其实就是用抽象思维描述和解决问题。 至于什么封装,多态,继承, 这是具体实现的方法。   


正如我上面帖子提到的, 抽象思维或者面向对象思维, 是天生适合人脑的。 仅此而已。 面向对象 ,也得依赖底层的面向过程的代码。 所以,用一种处理问题的思想来描述更适合。 

不忘初心
sangshunyang
侠圣

经验值:4443
发帖数:618
精华帖:4
38楼    2022-06-23 16:29:22
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

面向对象编程是个非常抽象的概念,把一类具有共性东西抽取出来放到一起,这个类有它的属性(也有称字段 可以理解为变量)和它的行为(方法 或函数) ,可以理解为一个模板。当需要这个类的个体时就从这个模板中造一个出来,需要多少就个体就造多少个体,术语是实例化对象。面向对象的强大之处 继承与多态,继承是在原来模版上再增加东西生成新的模板,就是不需要把原来的模板再写一遍,自动的就有原模板的所有东西(仅有一点点没有),多态是有好多种情形不做介绍。

   面向对象 与 面向过程 编程的一大好处,数据和行为放在了一起,这数据可以是个体的私有数据只它本身可以访问(在方法),其它的访问不到,方法也同样,这就是面向对象的一大特性:封装。面向过程 数据和函数是分离的数据也不能私有 (不是作用域和生命周期),方法造出来谁都可以调用。


还有的是高内聚低耦合不是面向对象特有的, 我们在PLC编程中同样适用,简单的讲就是各个模块完成各自的功能,各个模块不存在因果关系或内在联系。比如子程序中不使用全局变量。不过在SMART编程中这个就不好使。

Zane
至圣

经验值:85179
发帖数:21055
精华帖:399
39楼    2022-06-23 17:59:16
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

我认为,实在没有必要把PLC编程与PC编程去强行挂起钩来,将来控制系统会远多于PC系统,数不清地各类控制系统更多的在后台工作,而PC系统更多的是人机交、及数据处理及与控制系统的通信,像PLC这样的控制系统的编程也有可能会发展成一门独立的编程学科。

Zane 注册自动化系统工程师 Always save before download
电气成套厂商
侠士

经验值:1744
发帖数:152
精华帖:0
45楼    2022-08-08 10:45:19
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

PLC和PC还是有必要区别对待

专业电气控制柜成套
手机用户20200103736849
游侠

经验值:362
发帖数:50
精华帖:0
46楼    2022-08-09 16:58:03
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

面向对象应该是数据和算法(工艺)封装到一个块.输入输出加背景数据块是我以前以为的标准化,是可以只少量更改接口参数或屏蔽某个功能块输入,就可以实现同一个程序块用在不同的类似设备上,或者同一个工程项目的不同硬件控制上,我觉得对于非标设备前期方案的不确定性和后期的快速更改调试有用.只是这样既费内存空间又增大扫描周期.而有些情况,直接写更简单有效率,plc又不像pc有无限的内存,对实时性要求又不高

不过看论坛上的标准化,似乎是更侧重于plc资源的标准化利用,约定好各段资源用来干什么,以及程序架构的标准化


我觉得面向过程和面向对象,在plc上可以粗浅的理解为面向输入和面向输出,流程控制本来就是靠启停初始化急停复位,以及各种光电信号,计数信号,模拟量等等,来启动流程和切换流程的,所以面向过程可以理解为面向输入,根据输入条件的变化来控制,围绕流程来组织程序

面向输出,就是面向执行元件,执行元件其实就是控制对象,电机气缸伺服加热棒等等,每一个都有自己的启停和状态变化流程,虽然实际上可能用的都是同样的启动停止信号

面向输入,对信号的读取比较集中,对输出的写入改变比较分散,比如流程1,对一些输出置复位,流程2,对另一些输出置复位

面向输出,对信号的读取比较分散,对输出的写入改变比较集中,比如启停信号在不同的子程序调用都用到,而如果输出使用线圈,那么整个程序只有一个地方会改变输出状态,同样对于中间量也可以使用线圈,不使用置复位,或者只在一个子程序内部使用置复位,子程序以外只读不写,这样时序监控就比较清晰.


面向流程,程序比较好写,面向输出,监控调试比较方便,我现在是写流程,但在流程中不输出置复位,也不使用中间变量,只是在输出线圈那边使用流程作为起保停的条件.其实如果使用s寄存器也是相当于中间变量,如果是高级点的plc,可以定义枚举类型,倒可以定义流程步的枚举,现在只能在注释里写各个流程值是什么意思,流程步多的话,注释还写不下,符号表可以给常量命名,但上传程序后就没了,最后的办法就是用多个寄存器存常量



手机用户20190826N0Z444
游士

经验值:226
发帖数:21
精华帖:0
47楼    2022-08-09 17:56:29
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

PLC是不可能做到面向对象的,不具备封装继承多态这三个完整的特征,你不能依靠程序去生成实例。

芳季
至圣

经验值:72121
发帖数:15507
精华帖:101
48楼    2022-08-09 17:57:13
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

对象是指什么?概念有多大?对象是硬件还是软件?是抽象的概念还是实体?

一个仅仅是启停的运输皮带,是不是也可叫做一个对象?是不是把所有关于这个电机的状态,物料状态,都写到一个子程序中,这个子程序就是面向对象?

菲戈
至圣

经验值:28698
发帖数:5874
精华帖:61
50楼    2022-08-09 20:25:35
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

差不多就是这个意思,貌似在哪个西门子官方资料里面讲到FB就是PLC面向对象编程的基础。或者我再举个例子区别,我最早的编程可能这样一个机器,手动一个FC,自动一个FC,报警一个FC等等,后来编程就是编程比如气缸一个FB,气缸有手动,自动引脚 有报警引脚,再一层层封装,一个组件也可以是一个FB,一个机器也可能是一个FB。这是我理解的PLC面向对象编程

欢迎交流,QQ:2301013064 邮箱:feige6@139.com
Zane
至圣

经验值:85179
发帖数:21055
精华帖:399
52楼    2022-08-10 07:21:48
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

1)没必要把计算机的那套理论搬到PLC上,可以借鉴,但生搬硬套不行,PLC应该有自己的编程理论。

2)万物皆对象,各行业对对象的定义均可不同,对象可以是最基本的原件,也可以是组合好的单机设备,也可以是工艺算法,也可以是由若干个对象组合成的系统对象,用户应根据自己的需求去定义对象,而不是一味的墨守成规。在PLC,我们可以把一个FB/FC面向的对象作为系统的基本对象。

Zane 注册自动化系统工程师 Always save before download
yanxiao
版主

经验值:28607
发帖数:12144
精华帖:46
54楼    2022-08-10 17:09:35
精编帖  主题:回复:从来都没搞懂,什么叫面向对象编程?

想像一下,如果Smart200的程序容量不是20KB、30KB之类的,而是20MB、30MB,会发生什么?

我预测一下,大部分人的程序,扫描周期恐怕做不到10ms以下,有相当一部分人的程序,扫描周期可能在秒数量级。


如果随便写程序,扫描周期可以做到目前20KB-30KB的水平,就不是Smart200了,价格可能实现N翻了。


所以,ZANE说万物皆对象,但不能搞大而全的对象,适用即可。

您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。