【万泉河】有偿悬赏PORTAL程序块功能实现
我有一个心结。
这个心结困扰我好几年了,在做标准化项目之前就存在。我以前的文章提到过几次,如文章
《【万泉河】重新发现FB块之INOUT》
《【求助】PORTAL编程题,可能与指针和间接寻址有关》
都提出过。
但一直没能实现。
可能因为我自己总结归纳的需求并不够清晰,读者不能完全理解我的所指的需求,给出的解决方案都偏向于头疼医头,为了解决我所列出的具体问题,试图更改原本的底层程序逻辑,把原本的程序框架结构都破坏了,导致最终实现的程序远远偏离了标准化的标准,又回到了老实的平铺式的编程模式。
不是我想要的。
这次,我把需求重新定义一下,即:如何实现设备对象数组化的问题。
比如,我现在有一批设备对象(FB的实例),这里是电机,即#M1, #M2,#M3,#M4。
如何把这些FB的对象赋值到一个ARRAY OF FB的数组中?
比如:
MOT[1]=#M1;
MOT[2]=#M2;
MOT[3]=#M3;
MOT[4]=#M4;
这里的等号不是程序语法,而是同步映射的意思。左边完全就相当于右边。
不管是对象赋值也好,指针赋值也可,最终,程序中对MOT数组元素的任何读写操作,都相当于对对象本身的直接操作。
这样通过指定数组下标,简单实现对特定电机的控制。
比方说,我在上位设置INDEX=3, 以及START=1, 则#M3电机duang的一声就运行起来.了。INDEX不变,再赋值STOP=1, 则#M3电机duang就停止了。
程序中这样子:
以及其它的更复杂的应用逻辑。
这如果能实现,好处是非常多的。不需要在每个电机的控制指令之前加上复杂的数值比较判断,而读取设备运行状态的时候也要每次都串联序号判断,即便很简单的逻辑,最终都能非常复杂的程序才能实现。
而且工业应用中需要的场合也非常多。
比方说恒压供水,除了设备的维修状态,故障状态禁止启动之外,还有可能需要根据设备的投入运行时间做个排序,排序最后选择出优先级最高的水泵编号,那么这里发编号,发指令,就好了。
再有化工或者只要行业,罐体,管路和泵阀非常多,罐体之间互相倒液,会指定A#,B#C#,D#,E#,F#一批阀依次打开,打通管路,然后P1,P2泵开,进行输送。复杂的情况下会有许多中运输途径和方案,甚至需要形成配方。程序中都会要求直接指定编号,然后启动设备。
以及更多的应用场景大家给我提供。
这个功能一直不能实现,导致我们的标准化程序道路不能通畅,设计中逻辑分工不清,总有一些非模块化的程序在其中,干扰我们的精力,增加了调试工作量。
这几年来想尽各种办法,学习PORTAL语言中的各种高级功能,和数据类型,VARIANT, ANY , REF-TO,BLKMOVE等等,尝试解决这个问题。但发现都不能很好的实现。
所以,最终,我用最笨笨的方法,大约近似实现了:
建立了一个FB3, INOUT管脚上8个Moter,
但其实是要把前4个对象的值同步映射给后4个:
我直接只复制了其中几个当下逻辑中用到的重要的管脚:
后面注释的4行原本是我希望的实现形式,但很遗憾,PORTAL语法错误。
方法笨是笨了些,但总算实现了,而且在模块化架构下:
监控表中,
设置INDEX=3,然后START=1, 则标记为M3#的实际设备NM-1103就自动运行起来了!
我当然对此实现方法很不满意,但我对自己满意的一点是,终于可以模块化的把需求提出来了!
问题最终聚焦为:
如何在FB3的框架内部,实现从M1,2,3,4到O1,2,3,4的映射?
由此,可以悬赏求答案了!
各种编程方法不限,能实现功能就行。
实现所有管脚数据的同步,但不可以和我一样把所有管脚都在程序写一遍。
还有条件是,只许修改FB3, 不许提要求对程序的任何其它地方做更改。包括底层逻辑块和上层逻辑块,也包括不许更改FB块的优化寻址方式。
欢迎有志研究此算法的同仁下载我的源程序,修改实现后单独发FB3的源码给我,我加入到原程序中测试通过后,按投稿顺序发红包奖励。
依次为:
第一名 200元;
第二名 100元;
第三名 50元;
……..依次递减减半。
当然了,由于我的示例程序已经深度包含标准化PLC程序设计理念的精髓,所以程序不能免费发放。需要扫描二维码,发20红包给我,并在后台截图通知,我发程序给你。
对有志参加悬赏的高手,这20元算是门票。
仅仅是感兴趣围观的朋友,算是付费窥探下标准化程序的仪容。
我求得答案后,会和原作者商议,再把我们合作而成的程序成果分享。
*********************************************************************
网页编辑贴图太难, 图文全文请移步浏览公众号文章:
https://mp.weixin.qq.com/s/gDw1r4sB1zRGesZVoQJmjA
获得源程序也在关注公众号之后后台操作。