技术论坛

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

返回主题列表
作者 主题
牛逼之人必有牛逼之处
游士

经验值: 241
发帖数: 30
精华帖: 0
楼主    2023-07-17 18:20:22
主题:分享一个分布式的功能块,涉及到一种新的编程思想

某些功能在逻辑上是存在重复性的,但有一些人非要写成一个整体,就是不想分开,不知道是什么原因。


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


不,其实见到过,但由于多个块之间存在复杂的连锁关系,不管是变量链接非常复杂,而且还需要其他功能块对这些块进行协调处理。


我真正没有见到过的是,即使多个块之间存在复杂的连锁关系,但他们只需要通过一个简单的数组连接,便能够处理块与块之间的连锁关系,并不需要其他块进行协调。


这种调用方式看起来有点像串行总线,仅通过一条总线连接多台设备,这些设备便能够轻松交换信息,而且可以轻松增加与减少总线中的设备数量。


如果要比喻的话,我这种编程方式就像串行总线,常规的编程方式则像是硬接线。



图片中是一个调用例子,每个排队块的调用(实例)相当于一个栈位。

所有的排队块通过【连接】Array[0..1] of Int 来连接,解决多个块之间的连锁关系。(这些连锁关系是比较复杂的。)


于是十个排队块的调用,组成了一个10栈位的FIFO。


如果你需要更多的栈位,只需要增加排队块的调用次数即可。





通过这个功能,你能够轻松的编写很多功能,例如夹具的先入先出处理,多台设备的固定数量自动轮换运行处理,信号的前后关系处理。



Zane
至圣

经验值: 85436
发帖数: 21094
精华帖: 401
1楼    2023-07-18 08:20:52
主题:回复:分享一个分布式的功能块,涉及到一种新的编程思想

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

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

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




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

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

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

Zane 注册自动化系统工程师 Always save before download
牛逼之人必有牛逼之处
游士

经验值: 241
发帖数: 30
精华帖: 0
2楼    2023-07-18 13:06:42
主题:回复:分享一个分布式的功能块,涉及到一种新的编程思想

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

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

这个实现起来并不难,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数组,连接起来之后,这些设备之间就能够自动形成队列,即使你突然增加一台设备,也无需重新考虑逻辑,直接增加一个排队块的实例即可。





执笔画管脚
侠圣

经验值: 3099
发帖数: 278
精华帖: 2
3楼    2023-07-18 14:47:57
主题:回复:分享一个分布式的功能块,涉及到一种新的编程思想

很好奇你的“数组连接”,是怎么个连接法

你若安好便是晴天
Zane
至圣

经验值: 85436
发帖数: 21094
精华帖: 401
4楼    2023-07-18 15:05:23
主题:回复:分享一个分布式的功能块,涉及到一种新的编程思想

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


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

Zane 注册自动化系统工程师 Always save before download
牛逼之人必有牛逼之处
游士

经验值: 241
发帖数: 30
精华帖: 0
5楼    2023-07-18 15:50:21
主题:回复:分享一个分布式的功能块,涉及到一种新的编程思想

假设一种场景而已。

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

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


牛逼之人必有牛逼之处
游士

经验值: 241
发帖数: 30
精华帖: 0
6楼    2023-07-18 15:52:49
主题:回复:分享一个分布式的功能块,涉及到一种新的编程思想

这是一个引用例子,通过数组传递多个功能块之间的信息,从而实现功能块之间的互相配合,互相连锁。

一个比较恰当的比喻是:数组本身类似串口通讯的总线,总下能够为各个功能块传递数据,它是任务式的,总线所连接的任意一个功能块产生变更,总线将会产生一个任务,通知所有功能块针对该任务进行自己的处理。

例如入栈、出栈、插栈,中间位出栈等任意变更都会产生一个独立的任务代号,通知其他所有功能块进行变更操作。

针对排队块,变更的主要数据就是栈位,当这个思想可以应用在很多功能中,不仅仅是排队块,我这个只是例子。


'Razor
至圣

经验值: 24608
发帖数: 3214
精华帖: 42
7楼    2023-07-18 20:02:51
主题:回复:分享一个分布式的功能块,涉及到一种新的编程思想

看了好几遍,楞是一点儿也没看明白,想必是我还不够牛逼。

只弄明白了一点,这是个一对多的玩意。有一个变化,全体被影响。

少即是多
'Razor
至圣

经验值: 24608
发帖数: 3214
精华帖: 42
8楼    2023-07-18 20:28:02
主题:回复:分享一个分布式的功能块,涉及到一种新的编程思想

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

少即是多
牛逼之人必有牛逼之处
游士

经验值: 241
发帖数: 30
精华帖: 0
10楼    2023-07-19 21:59:27
主题:回复:分享一个分布式的功能块,涉及到一种新的编程思想

格局小了兄弟,先入先出,后入先出都是栈,参考:先进先出栈_百度百科 (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,且无入栈数量限制,它能够容纳多少个对象,取决于你调用多少个排队块的实例。

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

xf123456
侠圣

经验值: 3552
发帖数: 397
精华帖: 9
11楼    2023-07-20 15:52:18
主题:回复:分享一个分布式的功能块,涉及到一种新的编程思想

有点深奥,看的不是太明白,先收藏了慢慢看吧

有啥别有病,没啥别没钱
'Razor
至圣

经验值: 24608
发帖数: 3214
精华帖: 42
12楼    2023-07-20 20:14:09
主题:回复:分享一个分布式的功能块,涉及到一种新的编程思想

楼主还是拿代码说话吧,在论坛里代码是最直接的通用语言。

少即是多
北风_
侠士

经验值: 1283
发帖数: 127
精华帖: 0
13楼    2023-07-21 16:12:04
主题:回复:分享一个分布式的功能块,涉及到一种新的编程思想

我以前想过一个问题,应该和楼主说的类似

一台设备用了多个伺服轴,这几个轴控制功能都一样的,所以我写了一个块把各个功能封装在了一起,然后想只调用一次这个功能块,通过这个块中修改对应伺服的硬件标识符来控制这个轴,然后还给每个硬件标识符建立了一个数组,进行0-10的编号,这样我就可以只用在我写的功能块中填0-10的编号来控制这些轴。但实践的时候发现写的块还是得重复调用10次,因为硬件标识符没法写成变量

Zane
至圣

经验值: 85436
发帖数: 21094
精华帖: 401
15楼    2023-07-22 15:43:03
主题:回复:分享一个分布式的功能块,涉及到一种新的编程思想

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

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

你靠PLC扫描来实现吗?    建议你先学习一下SOE.



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

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

FIFO不是已经排好队了吗?还要排队?怎么排?

就算是排队应用,就是一个链表记录的添加与删除。是不是每个夹具功能块都要带这点代码,我看未必。

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

经验值: 85436
发帖数: 21094
精华帖: 401
30楼    2023-07-26 22:29:51
主题:回复:分享一个分布式的功能块,涉及到一种新的编程思想


这好像才是我当年学的知识,队列FIFO,堆栈LIFO

Zane 注册自动化系统工程师 Always save before download
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。