回复:分享一个分布式的功能块,涉及到一种新的编程思想

已锁定

牛逼之人必有牛逼之处

  • 帖子

    30
  • 精华

    0
  • 被关注

    0

论坛等级:游士

注册时间:2020-04-20

普通 普通 如何晋级?

发布于 2023-07-19 21:59:27

10楼

展开查看
以下是引用唐诗宋瓷在2023-07-18 20:28:02的发言 >8楼

栈是LIFO(后进先出),夹具FIFO(先进先出),我有点拎不清了。

以下是引用牛逼之人必有牛逼之处在2023-07-18 15:50:21的发言 >5楼:假设一种场景而已。...

引用5楼详细内容:

假设一种场景而已。

比如报警排序,你需要区分报警设备的报警先后顺序,每当设备报警时需要入栈,处理后出栈。

比如多工位夹具的先入先出处理,每一个家具一个功能块,每一个块内置一个排队块,他们能够得知自己所在的栈位,而无需单独写一个外置的功能块来协调多个夹具的先后关系。


以下是引用Zane在2023-07-18 15:05:23的发言 >4楼:请说明一下,100台...

引用4楼详细内容:

请说明一下,100台设备在程序里的存在是何种形式?


这100台设备为什么一定要排队?

以下是引用牛逼之人必有牛逼之处在2023-07-18 13:06:42的发言 >2楼:我却没有见到过有...

引用2楼详细内容:

我却没有见到过有人编写一个块,这个快只能控制一个设备,但是通过多次调用这个块,并使用数组连接起来,于是可以像搭积木一样,形成可以控制任意数量设备的大功能块。

---------------------------------------------------------------------------------------------------------------

这个实现起来并不难,300、400的年代就可以实现。


--------------------------------------------------------------------------------------------------------


只要使用功能块都是可以实现的,但我要说的是,每一个功能块都是同样的,且任意一个实例与其他所有实例都存在连锁关系。

就拿排队块来说。

栈位1到栈位100,调用100个实例,如果栈位1功能块出栈,那么栈位2-100的功能块的栈位输出都会减一。

如果有功能块入栈,且它入栈得到的栈位是50,那么原来的栈位为50的功能块会变成51,原来的51变成52......

一般实现这些功能,以往都喜欢做成一个功能块,然后所有的连锁、输出都在这个功能块中,但是往往存在弊端。

比如需求变为101个,又该如何?重新写逻辑关系?调试?修复bug?

为什么不能写成一个块,这个块只能提供一个栈位输出,当需要两个栈位时,调用两个实例,则提供两个栈位输出,需要100个栈位则调用100个实例......

这些功能块之间只需要一个简单的数组:Array[0..1] of Int 负责连接成为整体,它能够传递这些块之间的连锁关系、信息。

值得一说的是,即使你调用六万个实例,依然可以使用Array[0..1] of Int 将他们连接,它不会因为你调用的实例多了,数组的元素也需要增加,永远是Array[0..1] of Int。


甚至,你还能够将这些栈位分为两组,使用同一个数组连接。


通过这样,我们可以把这个功能块放在一个fb内,组成一个大功能块,也可以打散。



比如,当我们有一百台设备,他们需要进行排队,于是我们可以将一个排队块集成在设备功能块内,只需在inout定义一个Array[0..1] of Int数组,连接起来之后,这些设备之间就能够自动形成队列,即使你突然增加一台设备,也无需重新考虑逻辑,直接增加一个排队块的实例即可。





以下是引用Zane在2023-07-18 08:20:52的发言 >1楼:我却没有见到过有...

引用1楼详细内容:

我却没有见到过有人编写一个块,这个快只能控制一个设备,但是通过多次调用这个块,并使用数组连接起来,于是可以像搭积木一样,形成可以控制任意数量设备的大功能块。

---------------------------------------------------------------------------------------------------------------

这个实现起来并不难,300、400的年代就可以实现。




还有,最简单的入栈出栈功能块,我见到的也是一个块,但是这个块的栈位总是有限的,但完全可以编写一个块,这个块只能提供一个栈位,通过多次调用并使用同一个数组连接,于是可以提供任意多的栈位。

------------------------------------------------------------------------------------------------------------

数组数组,组就是集中在一起,无论是逻辑上的或者是物理上的,楼主分散集中的想法够新颖,是不是能再仔细说说呢?

格局小了兄弟,先入先出,后入先出都是栈,参考:先进先出栈_百度百科 (baidu.com)

不过这并非重点,重点在于一个思想:分布式功能块——同一个小功能块组成一个大功能块,打到协同多个对象的连锁关系的目的,由于可以自由的增加小功能块的数量,所以被控对象的数量可以简单、无限的拓展。


排队块只是一个例子:

它是分布式的,虽然只能提供一个栈位,但是它能输出当前栈位,于是N个功能块提供N个栈位。

要知道不管是LIFO(后进先出),还是FIFO(先进先出),一般来说只能在出栈请求后知道出栈的是谁,而无法实时知道某个对象处于那个栈位,排队块完全可以实时知道自己处于那个栈位以及入栈的总数。

当需要出栈时,对于FIFO(先进先出),则出栈的应该是栈位=1的对象,对于LIFO(后进先出),出栈的便是栈位=总数的对象,当对象出栈后,栈位并不会一直空缺,未出栈的对象会自动移位填补空缺,但不会让栈位的前后关系弄乱。


由于是实时知道自己的栈位,栈的方式并不仅仅是LIFO或FIFO,所以在必要时,比如某个对象故障时,你甚至可以让指定栈位的对象出栈,比如你直接让中间的栈位为2的对象出栈,出栈后,并不会捣乱原本的栈位,但对于LIFO与FIFO,如果在对象入栈后出现故障,你根本无法单独将这个对象抽离。


不仅仅提供灵活性,这种编程方式还有它的扩展性与分布式特点。


不管是LIFO还是FIFO,他们提供的栈位总是有限的,因为他是有一个功能块组成,内部防止一个数组存放他的栈位,但是总有上线,分布式编程思路是一个功能块提供一个栈位,你需要多少个栈位,增加这个块的实例即可,如果你的CPU允许,你甚至可以增加到十万个、百万个栈位,他没有上限,因为一个实例提供一个栈位,N个实例提供N个栈位,这是分布式的一种体现。

你可以这样理解,我将LIFO撕裂为N块一样的功能块得到了排队块,多个排队块实例通过一个数组连接起来,也能够变成LIFO,但不同的是,这个LIFO能够容纳的对象数量是可以是无限的,它能够变为一个超级LIFO或者FIFO,且无入栈数量限制,它能够容纳多少个对象,取决于你调用多少个排队块的实例。

总之,我主要是想通过排队块这个例子,来说明这种编程思路的灵活性、扩展性与分布式特点。

评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1500系列

共有10590条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

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