回复:【SCL编程案例】通例与特例--变化的数据 VS. 变化的代码

WOWUWUWU

  • 帖子

    2173
  • 精华

    0
  • 被关注

    18

论坛等级:至圣

注册时间:2012-11-21

钻石 钻石 如何晋级?

发布于 2025-06-18 07:05:33

3楼

展开查看
以下是引用'Razor在2025-05-28 22:53:28的发言 >0楼



上面图是在网络截取的,问题应用场景未知,但个人理解就是一个多条件“选择”问题。

类似图中的程序,看似控制逻辑不一致地复杂,如果每一行作为一个控制“点”或者“段”,这里用“点”不太合适,应该使用另一个数学名词“区间”。都说“科学的尽头是玄学”,而我一直认为“技术的尽头是数学”,尤其是工科类技术,所以这里使用“区间”是最恰当的,既然是区间,就有闭区间、开区间、半开半闭区间等不同,数学形式就是:

  [端点1,端点2],//闭区间

(端点1,端点2),//开区间

(端点1,端点2],//左开右闭区间

  [端点1,端点2),//左闭右开区间


对应图中的程序,大于等于指令和小于等于指令即相当于区间中包含端点的闭区间,大于和小于指令即相当于区间中不包含端点的开区间。


那么,不同的区间就是对应不同的控制逻辑,到此,我们就可以抽象出共性,把复杂度降低了,把问题简单化了,也就可以写出通用算法代码了,那么如何选择是哪种区间算法以便让其受控呢,一个case语句就解决了,不过是加入一个“sectionMode”参数,而这个参数完全可以放在数据结构中,到现在为止,算法算是基本完成,剩下的就是对数据结构的查找索引利用等操作了;书归正传,我们回到数据结构,当然首选还是数组,这里有个小问题,端点数量问题,如图中所示,有的程序行是两个端点,有的行是一个端点,我们完全可以不用太计较,完全可以在数据结构中解决,这也符合将复杂度放进数据结构的设计理念,每个端点数据类型typePoint应该包括:

limitValue;//端点值

mode;//端点区间模式:闭区间/开区间


每个端点的设计完成了,现在对图中的每一行进行设计数据类型,有的行有两个端点,有的行有一个端点,为了兼容性,每个区间包含两个端点,哪怕有一个不用,只是为了保持形式一致性,当然也可以设计两个段数据类型,一个包含两个端点,一个包含一个端点,这里我们仅设计包含两个端点的段数据类型,故有设计typeSection如下:

pointTotal:int;//端点个数

point1:typePoint;

point2:typePoint;


然后,总体数据结构采用数组array[*]of typeSection。至此,基础的数据结构设计工作全部完成,剩下的就是对数据结构的操作了,也就是一个固定算法了,最重要的是要支持变化,支持区间数量多少的变化。


写了一个“通例”FC,与固定代码行数的“特例”程序比较,仅仅是不同应用需求场景下不同的解决方式,不涉优劣之争。如有不同看法,欢迎探讨。




文章原来在WX公众号发过,论坛搞活动,就来凑个热闹。

有朋友提及使用LAD编写有限数量的程序,在监控时是相当方便的,对此,我是持保留意见的,一个成熟的块是不需要对其内部代码进行监控的,只关注其接口即可。

FC_BatchMapping_V1.0.0.rar


学习了,谢谢分享。

评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1200系列

共有15738条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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