西门子工业支持中心,以专业共创价值!
登录后可享:
还没有账号?
登录后可查看消息记录
登录后可查看收藏记录
登录后可查看历史记录
热搜词:1847工业学习平台售前选型启停和调速
西门子官方商城
扫码分享好友 任选多种好礼
最近在论坛学习(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在这个引脚被扫到引用的时候应时时刻刻保持一个合法的指针值.
这些呆板套路本身可以被熟练者直接忽略,不必考虑,但当你暂时没有太好的方法时,也可以简单的/批判性的/选择性的/套用.
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1775999&b_id=64&s_id=0&num=0&myreply=0&pno=0&af=0&c_floor=&GoWeb=0
套路慢慢,也有技术含量,杠杆的。
总结的不错,学习
哥们。是慢慢还是漫漫还是满满?你打错字没有?
指针的指针很烧脑。
停留在字面上的编程思路
感觉你这帖子是照着我的程序写出来的,呵呵
PPT性质的工作?关于编程?
好像是上头交待的工作吧?
楼主你别管呵呵那个人,你有金刚护体,别毁了金身。
这些都是根据以前个人帖子的简单总结,你写的内容还行,但都没一个上锁的,而且对我基本没新意和太多借鉴的,而我以前的帖子全都过了一年上锁了,孰先孰后,一目了然吧。以前我是跟着Zane斑竹以及938/yanxiao/芳工等学的。
引用5楼详细内容:
等你能够把
单条msg指令多任务读轮询写优先掉站跳过掉站恢复
可重复调用的modbus rtu子程序实现,再出来吹牛吧
看过你7月1号帖子的程序,知道你什么水平,别跟大佬学在字面上谈编程思想。
引用10楼详细内容:
7月1号的贴子只是简单开胃菜而且是最简单可用的。你的贴子内容:地址就是数字,接口只有一个参数,子程序像FB都是借鉴版主,看雪001等,以及本人的一些贴子而且还没有出处引用,你可以看看时间节点以及贴子内容重复度和查重度然后基于实时和事实说话;做个简单到不能再简单的关于ModbusRTU时序和空间趋于最优的所谓轮询还是要做的......。
引用11楼详细内容:
看帖子结点有什么用,芳大侠在十年前就有相关编程思想,可是成熟的程序没有发出来过。其它的大佬也都一样,你和他们一样字面编程而以。
你在我的程序里,哪里能看得出我引用了别人的程序,别人有像我一样发出来程序吗?
你7月1号的程序太烂,我都不好意思说。在自己帖子里总结别人程序里的编程技巧吗?
楼主,鉴于你在此方面没什么建树,就别发这种吹牛帖了,在此方面退引江湖吧,省得乱评我的程序惹人烦。
我说一句啊
@不欲勿施13478405725
单条msg指令多任务读轮询写优先掉站跳过掉站恢复,是一种编程方案,但不见得是最好的解决方案呢,至少写优先我觉得就是没必要,这是我的观点。
但这不影响你的贴子被别人点赞是吗.
楼主也就是自己做的一个字面总结,人家在讲自己的东西,没有针对别人,我看没什么不妥的地方,如果你认为有错误当然可以指出,他的例程你觉得不好,也可以指出,就事论事对吧,没必要这么怼人家是吧?
呵呵.兄弟你确实是个人才,你的文学/数学/编程等功底不一定高过我,但你的搞笑和兜售的功底绝对超过我.你的帖子质量还是不错的,这是不争的事实,但没太多新意和不可绕过性.
面对一个简单健壮最适合用全局变量编程的PLC,天天在你自己的帖子里聒噪面向对象/标准化/,你自己不觉得很好笑,脱离工作规则束缚,在论坛里简单自由的谈点稍微新点的心得体会不好吗.
你有看到我在帖子里大讲或者兜售没用的面向对象,标准化字眼吗?你说我只有空讲:难道你真的看过或者看懂了我的哪些最简单的例程比如:布尔量矩阵的刷新/结尾杂谈/延长输出/以及PID/PWM分辨率放大输出......
我的标准结尾是:带着批判性观点随便看看吧,不一定对,更不一定有用!
呵呵.兄弟你确实是个人才,你的帖子质量还是不错的,这是不争的事实,但没太多新意和不可绕过性.
面对一个简单健壮最适合用全局变量编程的PLC,天天在你自己的帖子里聒噪面向对象/标准化/,你自己不觉得很好笑,脱离工作规则束缚,在论坛里简单自由的谈点稍微创新点的心得体会不好吗.
引用14楼详细内容:
没太多新意和不可绕过性.
给你半个月时间,让你绕过我的程序,实现一个子程序单条msg指令多任务读轮询写优先掉站跳过掉站恢复
要求:更换两条指令就可重复调用。
我悬赏一万人民币。
路过看看,,,,学习。
“你光有想法有什么用,十年白过。看了你全部的历史帖子,精华不少,一个分享帖都没有。你若当时着手做,现在就没我什么事了”
看看。我不知道你从哪里来。但可能没多久也没有你什么事了。
你踩了一些大家都不很明朗的禁区。如果我十年前做了你想做的事……可能现在是没有我什么事了。
你要承认,大家都要承认。什么是排他性。能够触及排他性的不会过多讨论。
什么叫点到即止。你以为是武侠小说才有的剧情吗?
剑宗;气宗,解释一下?
点而不止,怨气太重。
我为什么要搞得没有你什么事呢?我不排他。你却非常排他。
你知道我在说你就可以了。其他人应该不知道的。
我承认那是我说的,如何?按兵不动是自己的选择与他人无关不是吗?可为啥还要说出自己十年前就些想法而不动呢,是为了证明自已早就有想法吗?
总结性的发言呀。
分享
收藏
有帮助
1. 文件大小:上传文件的大小请限制在1M以内。
2. 文件格式:请不要上传.exe文件,系统支持的格式有:.jpg, .jpeg, .pdf, .gif, .zip, .rar, .doc,.docx, .xls,.xlsx, .ppt, .mp3, .wma, .wmv .asf, .avi, .bmp, .png, .txt, .7z
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
密码至少8位,包含大、小写字母,数字和符号至少三种。
允许邮箱和手机接收来自支持中心网站的信息
我已同意《支持中心网站注册协议和隐私政策》
微信登录扫码一键登录
验证码登录
密码登录
二维码失效点击重试
打开微信扫一扫,快速登录/注册
未注册手机验证后自动登录,注册即代表同意《支持中心网站注册协议和隐私政策》
短信登录
登录