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

已锁定

牛逼之人必有牛逼之处

  • 帖子

    30
  • 精华

    0
  • 被关注

    0

论坛等级:游士

注册时间:2020-04-20

普通 普通 如何晋级?

发布于 2023-07-22 12:36:55

14楼

展开查看
以下是引用北风_在2023-07-21 16:12:04的发言 >13楼

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

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

可能我们想要解决的点与方式都不同。


你是想要单次"调用"代替多次"调用",但我只想通过统一且简单的变量连接,解决多个"调用"之间的连锁关系,并且不需要考虑"调用"的次数。


如图:



你说:"给每个硬件标识符建立了一个数组,进行0-10的编号,这样我就可以只用在我写的功能块中填0-10的编号来控制这些轴。"


你只是通过数组与这些块建立了映射关系,这意味着,每增加一个轴,你的数组元素需要增加一个,例如,10个轴,你需要10个元素,11个元素你则需要11个元素。

你甚至在控制2个轴的时候,看起来只使用了2组元素,但你的背景数据块中却实例化了你预设的10个元素。

但是不应该是这样的。


我要说的终点是任务式处理的思维,这正是体现灵活性、扩展性与分布式特点的重要点。



2楼中,我说:

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


多个轴之间存在连锁关系,该连锁关系由一个数组传递连锁信息,该数组不会因为轴的增加,而增加元素,两个轴是Array[0..1] of Int,十个轴也是Array[0..1] of Int,一万个轴也是Array[0..1] of Int(如果你的硬件允许)


为什么能够做到这一点?


并非简单的将一个元素与一个实例进行映射,而是通过任务式来处理。


例如,当你的系统初次启动时,需要为10个轴进行编号:

我想你应该是在一个块内对数组内10个元素进行编号,然后将这些编号传递到每一个轴的功能块中。


但是不应该这样做!


下面是关于任务式处理的程序编写方法:


任务式的处理方式是,在程序中定义一个任务,该任务通过周期循环,历遍所有轴的功能块,告知每一个轴他的编号应该为多少。

更加具体的做法是,通过Array[0..1] of Int传递一个值,该值来到任意一个块都进行【自加1】的操作,然后将该值作为编号赋值给轴。


又例如,当启动轴1与轴2时,系统要求禁止其他轴的启动,你可以定义另一个任务,该任务通知所有的轴是否应该被禁止。


你还可以增加更多的任务。


这种编程思维,功能块不会限制设备数量,你可以随意的增加设备,因为他是串行的,就像modbus总线,站号范围内,你可以随意增加设备。








评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1500系列

共有10587条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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