S7-200Smart编程思路之一

已锁定

holdkcsxyz

西门子1847工业学习平台

  • 帖子

    1813
  • 精华

    22
  • 被关注

    136

论坛等级:至圣

注册时间:2015-06-03

钻石 钻石 如何晋级?

S7-200Smart编程思路之一

6598

39

2022-08-05 10:21:07

star star star

在论坛学习(Zane/winter938/芳季......)总结子程序编程的八股式套路之一:


01:子程序接口只用一个类似函数指针接口变量(IN双字)用来组织子程序内部的数值型以及指针型或二级指针型数据,Smart的指针由于比较"自由",类似于函数指针以及void*型"万能指针",因此它是一种不错的解耦方法.由于指针本身是一个和系统位数相关的二进制数,这样无论多大的子程序做成库时基本都不用分配库内存,因为就一个函数指针式的"类"参数,当然指针偏移量的安全性也是要仔细考虑的-见间接寻址的帖子例程;


02:子程序的第一个网络把N个指针内的变量BLKMOVE复制到临时局部变量L区变量(把全局变量全部传进来);


03:子程序的最后一个网络把N个临时局部变量L区变量BLKMOVE复制到指针内的变量(把局部变量全部还回去)-绝对正确的是只还回IN_OUT/OUT(类比GET/SET;SET两种属性)属性的变量;


04:最省事的话就像02/03讲的:全部传进来包括 IN/IN_OUT/OUT型;全部还回去也包括IN/IN_OUT/OUT型,比如传进来的L0.0=I0.0;用完后再还回去I0.0=L0.0(理论上这个还回去是多余的,因为I0.0不需要被赋值,但为了省事多数同步场合没有关系,少数异步场合只把IN_OUT/OUT属性的变量还回去),当然全局与局部的互传通过指针方式-见结尾杂谈的帖子例程;


05:想时序优越,空间紧凑可以人为有组织的区分 IN/IN_OUT/OUT型,分批传进来,分批还回去;比如以前提到的把IN_OUT安排在IN之前就可以节省部分时间,子程序内部大概分:公共数据读写/公共数据只读;私有数据读写/私有数据只读,临时数据缓存;把这五类的字节占用大小都用一个变量来表示可做到子程序好维护,OUT类型是要注意的,这个类型也是很关键,官方对子程序内部数据类型IN/IN_OUT/OUT/TEMP的划分是最科学的;同一个扫描周期因为各种原因回跳回去执行处理私有数据的逻辑,可以不必再次复制处理公共逻辑,即使公共数据区有毫秒级时钟也没关系,理论上不差这几毫秒的时间,但如果是回跳回去处理公共逻辑除外.并且要严格控制回跳的逻辑保证既能跳回去又能跳出去;


06:沿指令或者类似于很多静态变量的数据,它们需要额外分配的全局变量缓存区,也一块传进来,一块还回去;


07:PLC基本是单线程的,因此多个复用私有数据的同步子程序(比如同一个扫描周期必须要出结果的阀门子程序)通过控制公共全局的同步FOR循环次数来实现;多个复用私有数据的异步子程序(比如很多个扫描周期才出结果的ModbusRTU通讯)通过控制异步顺控循环次数来控制;


08:时钟靠统一公共全局时钟变量,绝对时钟的话,最好安排六个字节时钟来实现-见结尾杂谈帖子例程,同一个扫描周期复用的私有数据公用同一个时钟,时钟如同一个跳动的节拍,让时序逻辑都找到时序触发点;


09:子程序的L区可以分批传进来,分批还回去;只要还回去了又可以在同一个子程序内从LB0开始再用L区,几乎是无限的,或者全用指针实时传进来,实时还回去,除了大概8个字节的L区腾挪空间外,基本不占用L区;


10:稍多的数据想紧凑分配的话可以用二级(指针的指针)或多级指针来实现,函数指针可以看成"类":它把一类事物全部纳入自己的声明管理范围;指针的本质是一个二进制数+它所指向类型的字节长度+适用的方法......;指针比较大小方法的运用有时可以节省一部分时序,以前延长输出的帖子有个采样取针和采样尾针比较的分享-见延长输出例程.指针的指针是一个人造的概念,它是一种约定,本质还是二进制数,指针太多,子程序的易读性会降低.

      "函数指针"类似于"快递员"在数据间,进程间,线程间......跑腿传参的,减少了成员直接耦合,让成员间接耦合;且不丧失成员之间的流动性(交流接触和动态变化).

       类比"隔离有效的减少了部分感染,但隔离的前提是必须要有效的解决两个问题:(1)"物理实体传递者"-快递员跑腿传递物理实体;(2)"虚拟信息传递者"-以太网传递非实体性的信息;因此规范的声明使用"函数指针"让它成为合格的"快递员",往往是编程中要优先封装解决好的问题.

       多用L区容器空间则有可能减少了指针移来移去跑腿的时间;

       少用L区容器空间则要函数指针反复移来移去跑腿满足传参需求,有可能增加了跑腿的时间;

       释放L并非目的,关键是解除一部分数据的直接耦合;变成利用”函数指针”的间接耦合(起到数据隔离的作用)

       间接耦合的好处是显而易见的类比于硬件:多变比的隔离变压器的作用,既减少了部分干扰,又使对象可以运行在不同的电压等级,并形成自己独立的电压参考点,到达现场后只要分配一片新的场地,大概合规的输入电压就放心的可以运行起来了.

       一个项目需求/实体等一旦确定下来,则整体的"耦合量"基本无法降低到那里去,因此整体的低耦合是不现实的,局部的低耦合是可能的,但做好间接("简洁")耦合的分类规划,可能比局部分散降低耦合还要关键.

       函数指针的好处还体现在:

01:我暂时忙于主任务(一个函数),分不开身,委托一部分任务给你,请快速帮我完成(另一个函数);

02:给你一个声明定义为私有或公共的地址,并限定传参类型;返回值类型,属性,修饰符;请按我的格式来;

03:请在某个条件满足时,某个时序下(初步具备委托类似非常重要的延迟执行,正逆双向传递,隔离数据干扰,虚拟接口等特性)严格的按照条件和时序完成我的委托任务,不得有误;

04:如果给你或让你返回void*型指针,说明我暂时不想让你将参数"写死",我可能用不同数据类型,不同数据长度,所以先请你暂时按我的void*型规则来运行,等我具体引用到你或实例化时再给你具体参数类型;

05:时间换空间,空间换时间在编程时处处存在,比如(1)利用历史数据区和现实数据区的动态比较:即空间换时间来实现"变化才写",进而减少部分时间-空间换时间;(2)将函数指针指向的GET/SET型公共数据和私有数据复制拷贝到L容器,空间换时间减少函数指针移来移去的时间-空间换时间;(3)限制L区空间60Byte内存有效的解决内存不足的问题,解决了必须要解决的空间不够的问题,但同样会使得”函数指针”移来移去,或者作为委托对象传来传去牺牲部分时间,以达到程序紧凑和节省空间的目的-时间换空间;(4)再大的内存都要省着用(假设32G内存),比如复制一个文件流,必须限定容器的大小,以及每次操作的字节数组的大小-时间换空间......所以编程的时候对于时间和空间必须平衡/辩证的考量,以无限的去趋于最优,但可能永远达不到;

06:"函数指针"把字段+属性+构造+析构+方法....这些集总性的看成一个班级来管理,它把一类事物都纳入自己的声明管理范围;

07:指针除了本身是个唯一占据物理实体内存的二进制整数外(方便硬件总线寻址,其不一定是一片连续的物理内存,需要软件编译器把它整理的像整数一样连续),还带有类型信息(大概指的是长度信息,长度信息最重要,还有属性,适用的方法等);类型信息的声明,识别,适用的方法的不断丰富体现了编译器越来越智能;Smart的编译器目前应该无法识别类型信息,可以像C一样美其名曰是信任"程序员",它也确实做到了信任"程序员".并且类型信息越复杂,占用的资源也越多,越难满足实时性,适应的场景也越复杂;

08:工业传感器,电机,阀门,按钮等这些不太复杂,数据量不大,但需要实时的场景不一定迫切的需要非常复杂的类型声明和解读.但工业场景随着视觉,雷达,AI,光学器件等复杂硬件的加入,有越来越需要复杂类型声明及解读的趋势;

09:双字指针和一个default缺省型的Char型指针显然是有区别的,而Char型指针无疑是最基本的,把它添加反射类型,属性,方法等机制后,类似于Object类型;

10:Smart子程序的功能引脚内部即使是指针类型,一般也应该是可以填入一个VDxx或者AC1,2,3的,但这个VDxx或AC1,2,3在这个引脚被扫到引用的时候应时时刻刻保持一个合法的指针值.

       这些呆板套路本身可以被熟练者直接忽略,不必考虑,但当你暂时没有太好的方法时,也可以简单的/批判性的/选择性的/套用.

S7-200Smart编程思路之一 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200 SMART

共有7539条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

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