恭喜,你发布的帖子
发布于 2023-07-22 12:36:55
14楼
我以前想过一个问题,应该和楼主说的类似
一台设备用了多个伺服轴,这几个轴控制功能都一样的,所以我写了一个块把各个功能封装在了一起,然后想只调用一次这个功能块,通过这个块中修改对应伺服的硬件标识符来控制这个轴,然后还给每个硬件标识符建立了一个数组,进行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总线,站号范围内,你可以随意增加设备。
请填写推广理由:
分享
只看
楼主