技术论坛

 S7-200Smart编程思路之一

返回主题列表
作者 主题
holdkcsxyz
至圣

经验值: 13013
发帖数: 1814
精华帖: 22
楼主    2022-08-05 10:21:07
主题:S7-200Smart编程思路之一 精华帖 

在论坛学习(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在这个引脚被扫到引用的时候应时时刻刻保持一个合法的指针值.

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

0615317263
至圣

经验值: 19599
发帖数: 4274
精华帖: 2
1楼    2022-08-05 10:23:39
主题:回复:S7-200Smart子程序编程思路之一

套路慢慢,也有技术含量,杠杆的。

黑猫警长W
至圣

经验值: 18392
发帖数: 2409
精华帖: 1
2楼    2022-08-05 11:15:54
主题:回复:S7-200Smart子程序编程思路之一

总结的不错,学习

芳季
至圣

经验值: 67496
发帖数: 14773
精华帖: 100
3楼    2022-08-05 11:24:34
主题:回复:S7-200Smart子程序编程思路之一

哥们。是慢慢还是漫漫还是满满?你打错字没有?

指针的指针很烧脑。

不欲勿施
奇侠

经验值: 8133
发帖数: 843
精华帖: 14
4楼    2022-08-05 12:52:09
主题:回复:S7-200Smart子程序编程思路之一

停留在字面上的编程思路

13478405725
不欲勿施
奇侠

经验值: 8133
发帖数: 843
精华帖: 14
5楼    2022-08-05 13:06:49
主题:回复:S7-200Smart子程序编程思路之一

感觉你这帖子是照着我的程序写出来的,呵呵

13478405725
天芯
至圣

经验值: 18857
发帖数: 2106
精华帖: 0
6楼    2022-08-05 13:47:37
主题:回复:S7-200Smart子程序编程思路之一

PPT性质的工作?关于编程?

芳季
至圣

经验值: 67496
发帖数: 14773
精华帖: 100
7楼    2022-08-05 13:57:08
主题:回复:S7-200Smart子程序编程思路之一

好像是上头交待的工作吧?

楼主你别管呵呵那个人,你有金刚护体,别毁了金身。

holdkcsxyz
至圣

经验值: 13013
发帖数: 1814
精华帖: 22
10楼    2022-08-05 16:54:28
主题:回复:S7-200Smart子程序编程思路之一

这些都是根据以前个人帖子的简单总结,你写的内容还行,但都没一个上锁的,而且对我基本没新意和太多借鉴的,而我以前的帖子全都过了一年上锁了,孰先孰后,一目了然吧。以前我是跟着Zane斑竹以及938/yanxiao/芳工等学的。

不欲勿施
奇侠

经验值: 8133
发帖数: 843
精华帖: 14
11楼    2022-08-05 17:17:48
主题:回复:S7-200Smart子程序编程思路之一

等你能够把 

单条msg指令多任务读轮询写优先掉站跳过掉站恢复

可重复调用的modbus rtu子程序实现,再出来吹牛吧

看过你7月1号帖子的程序,知道你什么水平,别跟大佬学在字面上谈编程思想。

13478405725
holdkcsxyz
至圣

经验值: 13013
发帖数: 1814
精华帖: 22
12楼    2022-08-05 17:39:38
主题:回复:S7-200Smart子程序编程思路之一

7月1号的贴子只是简单开胃菜而且是最简单可用的。你的贴子内容:地址就是数字,接口只有一个参数,子程序像FB都是借鉴版主,看雪001等,以及本人的一些贴子而且还没有出处引用,你可以看看时间节点以及贴子内容重复度和查重度然后基于实时和事实说话;做个简单到不能再简单的关于ModbusRTU时序和空间趋于最优的所谓轮询还是要做的......。

不欲勿施
奇侠

经验值: 8133
发帖数: 843
精华帖: 14
13楼    2022-08-05 18:12:19
主题:回复:S7-200Smart子程序编程思路之一

看帖子结点有什么用,芳大侠在十年前就有相关编程思想,可是成熟的程序没有发出来过。其它的大佬也都一样,你和他们一样字面编程而以。

你在我的程序里,哪里能看得出我引用了别人的程序,别人有像我一样发出来程序吗?

你7月1号的程序太烂,我都不好意思说。在自己帖子里总结别人程序里的编程技巧吗?

13478405725
不欲勿施
奇侠

经验值: 8133
发帖数: 843
精华帖: 14
14楼    2022-08-05 18:28:10
主题:回复:S7-200Smart子程序编程思路之一

楼主,鉴于你在此方面没什么建树,就别发这种吹牛帖了,在此方面退引江湖吧,省得乱评我的程序惹人烦。

13478405725
Zane
至圣

经验值: 76091
发帖数: 19115
精华帖: 378
15楼    2022-08-05 18:44:15
主题:回复:S7-200Smart子程序编程思路之一

我说一句啊

@不欲勿施13478405725

单条msg指令多任务读轮询写优先掉站跳过掉站恢复,是一种编程方案,但不见得是最好的解决方案呢,至少写优先我觉得就是没必要,这是我的观点。


但这不影响你的贴子被别人点赞是吗.


楼主也就是自己做的一个字面总结,人家在讲自己的东西,没有针对别人,我看没什么不妥的地方,如果你认为有错误当然可以指出,他的例程你觉得不好,也可以指出,就事论事对吧,没必要这么怼人家是吧?



Zane 注册自动化系统工程师 Always save before download
holdkcsxyz
至圣

经验值: 13013
发帖数: 1814
精华帖: 22
16楼    2022-08-05 18:52:19
主题:回复:S7-200Smart子程序编程思路之一

呵呵.兄弟你确实是个人才,你的文学/数学/编程等功底不一定高过我,但你的搞笑和兜售的功底绝对超过我.你的帖子质量还是不错的,这是不争的事实,但没太多新意和不可绕过性.

面对一个简单健壮最适合用全局变量编程的PLC,天天在你自己的帖子里聒噪面向对象/标准化/,你自己不觉得很好笑,脱离工作规则束缚,在论坛里简单自由的谈点稍微新点的心得体会不好吗.

你有看到我在帖子里大讲或者兜售没用的面向对象,标准化字眼吗?你说我只有空讲:难道你真的看过或者看懂了我的哪些最简单的例程比如:布尔量矩阵的刷新/结尾杂谈/延长输出/以及PID/PWM分辨率放大输出......

我的标准结尾是:带着批判性观点随便看看吧,不一定对,更不一定有用!


不欲勿施
奇侠

经验值: 8133
发帖数: 843
精华帖: 14
17楼    2022-08-05 19:09:13
主题:回复:S7-200Smart子程序编程思路之一

没太多新意和不可绕过性.

给你半个月时间,让你绕过我的程序,实现一个子程序单条msg指令多任务读轮询写优先掉站跳过掉站恢复 

要求:更换两条指令就可重复调用。

我悬赏一万人民币。

13478405725
指路
侠圣

经验值: 3660
发帖数: 1093
精华帖: 4
18楼    2022-08-05 19:33:06
主题:回复:S7-200Smart子程序编程思路之一

路过看看,,,,学习。

天下工控是一家!
芳季
至圣

经验值: 67496
发帖数: 14773
精华帖: 100
19楼    2022-08-05 19:51:00
主题:回复:S7-200Smart子程序编程思路之一

“你光有想法有什么用,十年白过。看了你全部的历史帖子,精华不少,一个分享帖都没有。你若当时着手做,现在就没我什么事了”


看看。我不知道你从哪里来。但可能没多久也没有你什么事了。


你踩了一些大家都不很明朗的禁区。如果我十年前做了你想做的事……可能现在是没有我什么事了。


你要承认,大家都要承认。什么是排他性。能够触及排他性的不会过多讨论。


什么叫点到即止。你以为是武侠小说才有的剧情吗?


剑宗;气宗,解释一下?


点而不止,怨气太重。


我为什么要搞得没有你什么事呢?我不排他。你却非常排他。

你知道我在说你就可以了。其他人应该不知道的。

不欲勿施
奇侠

经验值: 8133
发帖数: 843
精华帖: 14
20楼    2022-08-05 20:13:52
主题:回复:S7-200Smart子程序编程思路之一

我承认那是我说的,如何?按兵不动是自己的选择与他人无关不是吗?可为啥还要说出自己十年前就些想法而不动呢,是为了证明自已早就有想法吗?

13478405725
holdkcsxyz
至圣

经验值: 13013
发帖数: 1814
精华帖: 22
24楼    2022-08-08 11:03:46
主题:回复:S7-200Smart子程序编程思路之一

1关于16个接口参数的限制芳工以及很多工程师以前的帖子有类似介绍

2正如你说的无限扩展IO口的困惑可能是编译器非智能化导致的.比如我在C里每个指针的长度都由宏定义编译确定了,因此子程序里面绝对不会出现Smart编译环境中具体固定数字(比如指针+4以及BLKMOVB+具体长度等操作)的指针偏移量,而是用Data_Ptr_Len=Length();=Sizeof(Data_Ptr)这些相对"智能"的编译方式.

3确实没太多实际用途,重要实时控制场合直接用工业PN等实时总线,个性消费交互性场合用PC编译器+PCIE扩展硬件以及USB/以太网/WIFI等接口就好

4指针对于个性化的自由编程还是必要的因为指针的本质就是数字化二进制,比如Linux_Kernel源码的实现方式基本都是用函数指针组别的用法,指针用法的自由有多少诟病就有多少赞美.

5如果想无限扩展显然指针除了传递必要的参数外还要多出许多多余的中间缓存性质的参数.

6一个子程序内部大概有公共变量/公共方法;私有变量/私有方法,接口越多耦合性越强,接口太多在编译器不太智能时以至于在调用子程序时为它分配外部数据接口的工作量有时比写个子程序还要复杂,因此这个要综合考虑不是越多越好.

7有人说C的函数指针是解耦对象关系的最佳利器,虽然不一定全对,但显然有点道理.




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