发表于:2019/1/24 14:39:20
#0楼
最近在学习某友商的产品,从学习他们的知识过程中得到一些关于编程的启示,而且我相信以下说法有些和我们平常的工作是相似的。
引文:
把大象装进冰箱的步骤:打开冰箱-->将大象放进去-->关上冰箱门;
这里有2个问题:
1.冰箱空间是否足够装载大象;
2.冰箱是否能承受如此重量的大象;
正题:
客户说要把大象装进冰箱里!
程序员二话不说针对这个需求作出分析之后列出了几个步骤:
1.把冰箱门打开。
2.把大象装进去。
3.把冰箱门关上。
上面每一个步骤,程序员都会用一个函数或者功能来实现,比如定义了如下的功能块:
FB_OpenTheDoor();
FB_PushElephant();
FB_CloseTheDoor();
再通过排列组合完成客户的需求,顺利交工。
通过以上描述我们发现,程序员做的工作就是在接到需求以后,会把这些需求拆成一个一个的指令或者步骤,然后根据客户的需求串起来交给控制器去执行。我们把这类的处理方式定义为面向过程(工艺需求)。
我们以为这样就结束了?但是后续交流客户又说还要实现以下功能:
【我要把大象装冰箱,但是门别关,敞着就行】
【我还需要冰箱的冷藏温度调到10°】
。。。。。。
这个时候我们就必须得把整个程序系统通读一遍,找出可以用的函数(如果没有就再定义一个),最后依次调用它们。随着客户后续要求的不断提出,最后整个系统越来越杂乱无章难以管理,程序员不堪重负。
面向对象思维,从另一个角度来解决这个问题。面向对象是把【对象】作为程序的基本单元,我们控制过程中的驱动器,传感器,智能设备都可以归纳为对象。那么对象到底是什么呢?对象就是对事物的一种抽象描述。人们发现,现实世界中的事物,都可以用「数据」和「能力」来描述。比如我要描述一个人,「数据」就是他的年龄、性别、身高体重,「能力」就是他能做什么工作,承担什么样的责任。
例如你可以让「狗」这个对象「吃狗粮」,就可以把「吃狗粮」的命令发给「狗」让其执行,然后我们就实现了「狗吃狗粮」的需求。
如何进行面向对象的编程呢?根据上面那个客户的需求,演示按照面向对象是怎么编程的。
客户需求:把大象装进冰箱;
第一步,提炼对象。
分析这个需求里面我们要面对的对象是显而易见的,大象和冰箱都是这个需求中明确的实体对象。
装进这个动作是一串的指令,其实包括两方面的动作:打开(冰箱)+装(大象);那这个需求的对象就如下表;
序号 对象名称 对象动作
1 大象 装
2 冰箱 打开
表格1:对象提炼清单
第二步,对象属性分析
对象属性分析就是描述对象特征,像上文说的一样,可以用一些数据和能力来描述,如下表所示提炼的对象的数据和能力。
在PLC编程过程中,除了分析这个对象属性以为,其实我们还要做的就是将对象属性和我们程序结构相关联,细化到程序中就如下表所示。
第三步:对象编程
3.1.冰箱的编程
参数说明:可以来自HMI或者信息管理系统,包括冷藏室温度设置和冷冻室温度设置;
输入说明:
存储:向冰箱下达存储指令,存储指令包括的信息有存储的对象(大象),存储的位置(冷冻室还是冷藏室)等;
取件:向冰箱下达取件指令,存储指令包括的信息有取件的对象(大象),取件的位置(冷冻室还是冷藏室)等;
启停命令:此信号为True的时候冰箱启动,否则冰箱停止运行;
输出说明:
冷冻室门的开关:True表示冷冻室打开,False表示冷冻室关闭;
冷藏室门的开关:True表示冷藏室打开,False表示冷藏室关闭;
启停状态:True:冰箱已经启动,False:冰箱停止运行;
属性说明:
三维尺寸:冰箱的外在存储,包括长宽高的尺寸;
冷藏室:当前温度以、当前剩余空间、载重能力;
冷冻室:当前温度以、当前剩余空间、载重能力;
逻辑信息:包括运算逻辑以及运行状态;
运算逻辑信息,比如储存对象不符合当前冰箱的容量、取件对象在冰箱里面不存在、大象重量超重(以上信息冷藏冷冻是分别存储的);
运行状态数,比如冰箱是否启动,是否有故障等等;
将以上信息概括后可以在一个统一的模型中得到体现,具体见下图所示:
3.2.大象的编程
参数:没有;
输入说明:
进冰箱:True表示要求大象进入冰箱,False无定义;
出冰箱:True表示要求大象走出冰箱,False无定义;
输出说明:
正向行走:True表示大象进冰箱方向行走,False无定义;
反向行走:True表示大象出冰箱方向行走,False无定义;
属性说明:
三维尺寸:大象的体积,包括长宽高的尺寸;
重量:大象的总重量;
智商:大象的智商;
将以上信息概括后可以在一个统一的模型中得到体现,具体见下图所示:
如此,就将冰箱和大象的模型在程序中得以再造,只要将这两个模型在程序中建立接口关系,那客户的需求将大象装进冰箱就很容易得以实现。此时,只要我们给大象下达走进冰箱的指令,冰箱就会在得到信息后打开对应门,大象自己就走进去了。
若此时大象体积太大或者超重(数据来自传感器),冰箱模块还会告知系统不能装载大象的原因。
同时,后续客户有其他需求的时候,只要在给冰箱的输入信息中说明,冰箱就会执行相应的动作,比如门打开就好或者冷冻温度设置到-18°等等其他需求;
后续
通过上述的描述发现大象和冰箱有两个相同点:
1.两个控制对象的控制模型是一样的;
2.两个控制对象有一个相同的Function:正反转;
表格4:对象正反转定义
现假设冰箱对象的程序名为FB_Fridge,大象的程序名为FB_Elephant。那后续的项目中只要有这两个对象,我们要做的工作就是将程序名实例化而已。
面向过程只是着眼于当前工艺需求,编程简便快捷但后续维护和再次使用比较困难,也无法形成对应模型知识库,相关技术及知识得不到累积和传承。
面向对象就是在制造东西,是将现实中的对象在程序中再造一次。面向对象编程工作量大且需要具备相当的能力将对象的属性提炼总结出来,但面向对象的程序具有模块化,接口化等特点,便于后续的维护和使用,利于形成行业知识库,技术可以得到累积、发展、传承和更新。
随着技术发展,冰箱的能力会越来越先进,那对于程序员来说要做的工作就是与时俱进更新FB_Fridge的功能,这样FB_Fridge的版本就会从原始版本跟着时代的更新发展到更多的版本。这样,对于冰箱这个对象,我们的再造功能已经完成而且我们还能按照客户需求选择不同版本的程序来满足客户(客户的冰箱可能是老款)的需求;
面向对象的优点:
模块化,接口化;
便于后续维护;
使用方便;
功能齐全,能满足对象可以实现的功能;
便于版本控制,利于技术的累积和发展;
面向对象的缺点:
程序员具备一定的分析解决问题、良好的思维以及严谨的测试能力
面向过程的优点:
简单快捷
面向过程的缺点:
功能更新困难,后续维护使用不便,技术无法得以累积并发展
——————————————————————
文章转自:工控网把大象装进冰箱的步骤-——面向对象的PLC编程
作者:流浪枭雄
引文:
把大象装进冰箱的步骤:打开冰箱-->将大象放进去-->关上冰箱门;
这里有2个问题:
1.冰箱空间是否足够装载大象;
2.冰箱是否能承受如此重量的大象;
正题:
客户说要把大象装进冰箱里!
程序员二话不说针对这个需求作出分析之后列出了几个步骤:
1.把冰箱门打开。
2.把大象装进去。
3.把冰箱门关上。
上面每一个步骤,程序员都会用一个函数或者功能来实现,比如定义了如下的功能块:
FB_OpenTheDoor();
FB_PushElephant();
FB_CloseTheDoor();
再通过排列组合完成客户的需求,顺利交工。
通过以上描述我们发现,程序员做的工作就是在接到需求以后,会把这些需求拆成一个一个的指令或者步骤,然后根据客户的需求串起来交给控制器去执行。我们把这类的处理方式定义为面向过程(工艺需求)。
我们以为这样就结束了?但是后续交流客户又说还要实现以下功能:
【我要把大象装冰箱,但是门别关,敞着就行】
【我还需要冰箱的冷藏温度调到10°】
。。。。。。
这个时候我们就必须得把整个程序系统通读一遍,找出可以用的函数(如果没有就再定义一个),最后依次调用它们。随着客户后续要求的不断提出,最后整个系统越来越杂乱无章难以管理,程序员不堪重负。
面向对象思维,从另一个角度来解决这个问题。面向对象是把【对象】作为程序的基本单元,我们控制过程中的驱动器,传感器,智能设备都可以归纳为对象。那么对象到底是什么呢?对象就是对事物的一种抽象描述。人们发现,现实世界中的事物,都可以用「数据」和「能力」来描述。比如我要描述一个人,「数据」就是他的年龄、性别、身高体重,「能力」就是他能做什么工作,承担什么样的责任。
例如你可以让「狗」这个对象「吃狗粮」,就可以把「吃狗粮」的命令发给「狗」让其执行,然后我们就实现了「狗吃狗粮」的需求。
如何进行面向对象的编程呢?根据上面那个客户的需求,演示按照面向对象是怎么编程的。
客户需求:把大象装进冰箱;
第一步,提炼对象。
分析这个需求里面我们要面对的对象是显而易见的,大象和冰箱都是这个需求中明确的实体对象。
装进这个动作是一串的指令,其实包括两方面的动作:打开(冰箱)+装(大象);那这个需求的对象就如下表;
序号 对象名称 对象动作
1 大象 装
2 冰箱 打开
表格1:对象提炼清单
第二步,对象属性分析
对象属性分析就是描述对象特征,像上文说的一样,可以用一些数据和能力来描述,如下表所示提炼的对象的数据和能力。
在PLC编程过程中,除了分析这个对象属性以为,其实我们还要做的就是将对象属性和我们程序结构相关联,细化到程序中就如下表所示。
第三步:对象编程
3.1.冰箱的编程
参数说明:可以来自HMI或者信息管理系统,包括冷藏室温度设置和冷冻室温度设置;
输入说明:
存储:向冰箱下达存储指令,存储指令包括的信息有存储的对象(大象),存储的位置(冷冻室还是冷藏室)等;
取件:向冰箱下达取件指令,存储指令包括的信息有取件的对象(大象),取件的位置(冷冻室还是冷藏室)等;
启停命令:此信号为True的时候冰箱启动,否则冰箱停止运行;
输出说明:
冷冻室门的开关:True表示冷冻室打开,False表示冷冻室关闭;
冷藏室门的开关:True表示冷藏室打开,False表示冷藏室关闭;
启停状态:True:冰箱已经启动,False:冰箱停止运行;
属性说明:
三维尺寸:冰箱的外在存储,包括长宽高的尺寸;
冷藏室:当前温度以、当前剩余空间、载重能力;
冷冻室:当前温度以、当前剩余空间、载重能力;
逻辑信息:包括运算逻辑以及运行状态;
运算逻辑信息,比如储存对象不符合当前冰箱的容量、取件对象在冰箱里面不存在、大象重量超重(以上信息冷藏冷冻是分别存储的);
运行状态数,比如冰箱是否启动,是否有故障等等;
将以上信息概括后可以在一个统一的模型中得到体现,具体见下图所示:
3.2.大象的编程
参数:没有;
输入说明:
进冰箱:True表示要求大象进入冰箱,False无定义;
出冰箱:True表示要求大象走出冰箱,False无定义;
输出说明:
正向行走:True表示大象进冰箱方向行走,False无定义;
反向行走:True表示大象出冰箱方向行走,False无定义;
属性说明:
三维尺寸:大象的体积,包括长宽高的尺寸;
重量:大象的总重量;
智商:大象的智商;
将以上信息概括后可以在一个统一的模型中得到体现,具体见下图所示:
如此,就将冰箱和大象的模型在程序中得以再造,只要将这两个模型在程序中建立接口关系,那客户的需求将大象装进冰箱就很容易得以实现。此时,只要我们给大象下达走进冰箱的指令,冰箱就会在得到信息后打开对应门,大象自己就走进去了。
若此时大象体积太大或者超重(数据来自传感器),冰箱模块还会告知系统不能装载大象的原因。
同时,后续客户有其他需求的时候,只要在给冰箱的输入信息中说明,冰箱就会执行相应的动作,比如门打开就好或者冷冻温度设置到-18°等等其他需求;
后续
通过上述的描述发现大象和冰箱有两个相同点:
1.两个控制对象的控制模型是一样的;
2.两个控制对象有一个相同的Function:正反转;
表格4:对象正反转定义
现假设冰箱对象的程序名为FB_Fridge,大象的程序名为FB_Elephant。那后续的项目中只要有这两个对象,我们要做的工作就是将程序名实例化而已。
面向过程只是着眼于当前工艺需求,编程简便快捷但后续维护和再次使用比较困难,也无法形成对应模型知识库,相关技术及知识得不到累积和传承。
面向对象就是在制造东西,是将现实中的对象在程序中再造一次。面向对象编程工作量大且需要具备相当的能力将对象的属性提炼总结出来,但面向对象的程序具有模块化,接口化等特点,便于后续的维护和使用,利于形成行业知识库,技术可以得到累积、发展、传承和更新。
随着技术发展,冰箱的能力会越来越先进,那对于程序员来说要做的工作就是与时俱进更新FB_Fridge的功能,这样FB_Fridge的版本就会从原始版本跟着时代的更新发展到更多的版本。这样,对于冰箱这个对象,我们的再造功能已经完成而且我们还能按照客户需求选择不同版本的程序来满足客户(客户的冰箱可能是老款)的需求;
面向对象的优点:
模块化,接口化;
便于后续维护;
使用方便;
功能齐全,能满足对象可以实现的功能;
便于版本控制,利于技术的累积和发展;
面向对象的缺点:
程序员具备一定的分析解决问题、良好的思维以及严谨的测试能力
面向过程的优点:
简单快捷
面向过程的缺点:
功能更新困难,后续维护使用不便,技术无法得以累积并发展
——————————————————————
文章转自:工控网把大象装进冰箱的步骤-——面向对象的PLC编程
作者:流浪枭雄