技术论坛

【不欲勿施】【S7-200 Smart开源标准化编程】之三------IO对象与动作及最新例程

作者 主题
奇侠

经验值: 8143
发帖数: 843
精华帖: 14
主题:【不欲勿施】【S7-200 Smart开源标准化编程】之三------IO对象与动作及最新例程


只看楼主 楼主 2021-11-22 11:55:35

【不欲勿施】【S7-200 Smart开源标准化编程】之基础----突破子程序的限制,让子程序像FB一样工作

https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1730780&b_id=64&s_id=0&num=88#anch


【不欲勿施】【S7-200 Smart开源标准化编程】之modbus rtu通信----单条msg指令多任务读轮询写优先

https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1731053&b_id=64&s_id=0&num=7#anch


简单说说我在标准化里IO对象的理解和分类:

1、数字IO:逻辑IO。PLC的物理数字输入输出,通过通信访问的数字输入输出。

2、模拟IO:PLC的物理模拟输入输出,通过通信访问的数值型输入输出。

3、脉冲IO:PLC的物理脉冲输入输出

4、数据IO:如:发送给机器人工作的程序号,与通信对象采集与被采集的不参与动作的IO

5、HMI IO:单独将HMI IO提出,是此对象应是一个集合,这样与上位的通信可以更有效率

再说说我在标准化里动作对象的理解和分类:

1、数字动作:就是1.0动作,如:接触器,电磁阀,开关型电动执行器等。针对数字动作创作了正**作对象程序,可以应对绝大多数数字动作,如电动机单向、双向,气缸,开关型电动阀等。不再对电动机电磁阀等分别建立程序。

2、模拟动作:根据数值大小控制执行器的运行状态。比如:变频器频率,比例阀开度等。

3、运动动作:如,位置,速度。

4、混合动作:如:根据模拟数值控制轮流工作的多个脉冲阀的工作数量,工作时间。

下面是最新程序的改进:

仅用一个全局指针变量用最少的计算量和程序量实现背景数据的索引,并且用AC3来实现,不再有V区全局变量,实现程序中无全局变量的要求。关于最后字节的获取,在OB1最后的程序段,绝对的画龙点睛。最新程序定时器增加了过程值,增加了单按钮控制启停的对象,还新增了正**作的设备对象及其它。

smart200标准化实践20211122.smart.zip






13478405725
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1732419&b_id=64&s_id=0&num=0

至圣

经验值: 16429
发帖数: 2402
精华帖: 0
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之三------IO对象与动作及最新例程


只看楼主 1楼 2021-11-22 12:29:33

谢谢分享!


开心每一天,懂得包容、感恩!
以下网友喜欢您的帖子:

  
至圣

经验值: 76239
发帖数: 19148
精华帖: 378
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之三------IO对象与动作及最新例程


只看楼主 2楼 2021-11-22 14:20:39

我认为只有布尔量与模拟量之分,楼主的概念教科书上没有,老师也没讲过。


请用标准的定义来解释,而不是又去搞一套,这说明你的理论基础不扎实。


Zane 注册自动化系统工程师 Always save before download
以下网友喜欢您的帖子:

  
至圣

经验值: 10685
发帖数: 1561
精华帖: 33
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之三------IO对象与动作及最新例程


只看楼主 3楼 2021-11-22 16:01:14

楼主的点睛之笔有赖于系统对V的编址,手册上有地方提到V区地址的编址了吗?


工控爱好者
以下网友喜欢您的帖子:

  
奇侠

经验值: 8143
发帖数: 843
精华帖: 14
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之三------IO对象与动作及最新例程


只看楼主 楼主 4楼 2021-11-22 16:12:32
以下是引用winter938在2021-11-22 16:01:14的发言 >3楼

楼主的点睛之笔有赖于系统对V的编址,手册上有地方提到V区地址的编址了吗?

没明白你的问题是要问啥


13478405725
以下网友喜欢您的帖子:

  
侠士

经验值: 1996
发帖数: 158
精华帖: 0
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之三------IO对象与动作及最新例程


只看楼主 5楼 2021-11-22 16:29:46

感觉很高明!


1:出售PLC控制柜成套,低压配电柜成套 2:出售点胶机,螺丝机,可定制。
以下网友喜欢您的帖子:

  
侠圣

经验值: 2386
发帖数: 131
精华帖: 0
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之三------IO对象与动作及最新例程


只看楼主 6楼 2021-11-22 21:03:03

感谢分享!


 
以下网友喜欢您的帖子:

  
至圣

经验值: 67550
发帖数: 14784
精华帖: 100
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之三------IO对象与动作及最新例程


只看楼主 7楼 2021-11-22 22:04:18

最后为什么要6个F?不是4个吗?

ST60 V区30k,32767,是不是16#FFFF就够了?

你这样占住AC3,难怪要所有子程序都要留个空间。保护和恢复AC3 。

MOVD AC3 LDx

.......

MOVD LDx AC3

除非子程序不使用AC3。是不是?(AC不算全局变量吗?)

这个情景就好像我的程序,递归把8级子程序LD56都占住了。我是一次性占住所有层的56。其实,其实都是一样占用一样的资源。

@winter938.你说说。

还有一个事情想讨论一下。

你的程序用间接寻址,把V区的东西块移动到L区然后才运行。然后运行完毕把L搬回去V。是不是?

我的程序直接用间接寻址运行在V区。(你看过我程序没有?)

到底怎样会运行更快?有一个问题,我这样做法没法寻址到位。要位操作,一样要像你这样复制过来L区,然后后面复制回去。但是你的程序有另一个问题,L区没有V区大,bmov不完怎么办?难道分时读取到L然后分时运行?我的做法如果程序里面涉及到很多指针的话,……我的例子是为了表达意思,只写了一个加法指令代表任何用户程序。这里就一个变量所以一个指针。常规子程序2里面是两个变量,所以两个指针。当指针大于x个的时候L区放不下了……此时麻烦出现了。需要用很多运行时间去重新计算指针,把已有的指针覆盖掉。新指针填上去。被覆盖的指针后面还要用的话又再次计算指针。所以需要很多时间计算指针。

你觉得怎样?

另外,我知道运行L寻址要比运行V寻址更慢。acVMSQI运行速度一样。并不存在M更快。(是就最好了)要运行更快,最好是间接寻址块移动到一前段V区,然后就在这V区运行。运行完搬回去数据V区。


 
以下网友喜欢您的帖子:

  
至圣

经验值: 10685
发帖数: 1561
精华帖: 33
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之三------IO对象与动作及最新例程


只看楼主 8楼 2021-11-23 10:56:50

       在子程序中用*LDXX访问存储区虽然最终访问的是除单个位、 HC、L 或累加器的存储区,但我在想指令执行先必然要访问LDXX,然后再去访问它指向的存储区,老200的手册里有指令执行时间的说明,其明确指出访问L会有时间增加(比较MOVW 1 VW0和MOVW 1 LW0后者会有时间增加)。

       子程序中全部使用L区,包括用L区做指针间接访问其它存储区会给子程序的移植带来极大的好处,但缺点是L区太小了,只有通过指针间接访问的形式获得子程序的过程数据更大更久的存放区域(更久是指需要保存一次扫描以上的数据)。

        鉴于上述情况考虑到过程数据区要够大,访问速度要快还要移植性好我用了这么一种方法:在子程序中不用L区用V区符号编程子程序做成库并分配库存储区,子程序开始时先把其自身调用需要的过程数据从V区搬入库存储区,处理完毕再搬回去原过程数据存放的V区,多次子程序调用都分别对应有自己的过程数据区互不影响,但对于成库的子程序而言始终使用的是库存储区且是V区,因此速度快也可移植。再借助楼主他们对V区自主分配的技巧相信在子程序中不用L用库内存一样能实现子程序多次调用对V区的合理分配及使用。

        7楼芳季问的第二个是不是,回答是(楼主也是用的TEMP型的L区做过程数据临时存储,子程序末段把这些过程数据存入了每次调用分配的相应V区)。我前面的那种做法与你7楼最后的做法是一样的,并上机实测过且亲身体验到V比L快。不过是很久以前在老200上试验的,好像在哪个帖子里还提过这事。



工控爱好者
以下网友喜欢您的帖子:

  
至圣

经验值: 13021
发帖数: 1815
精华帖: 22
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之三------IO对象与动作及最新例程


只看楼主 9楼 2021-11-24 10:05:30

楼上大侠说的有一定道理,L区可能稍慢于V区.但时间可能主要消耗在参数的传来传去,规范的子程序要用L区(或者开辟一片公用的临时V区)涉及到参数的复制进来,再复制出去,平白无故的多了参数的来回复制,即使你没写一句逻辑算法代码,参数的传递时间都占大头.

因此V区比L区稍快,只有在最高全局的单一一个程序段且不涉及很多的参数传递时才能看出来一点,一旦涉及子程序的接口参数传递(比如把V区传公共V区,再把公共V区传给V区),这时用L或者V做公共缓存容器的优势基本不是太明显.

比如之前的帖子参数传来传去占用时序80us;全改成全局变量不传参数占用时序50us左右.

以前看shine的帖子说L区对中断堆栈的保护也是有讲究的. 

因此用L区做公共缓存容器还是可行的.

至于L区太小,表面上看好像确实太小好像是60byte左右,但个人觉得L不是太小而是太大了反而让不熟悉的人用的不太好,其实组织的好的话可能只要两个指针八个字节的L区就基本够用了.

准备传给L区的V区的数据结构要压缩在60字节以内,比如前56个字节是值类型或者引用指针类型,但最后留四个字节的引用类型以备随时扩展到其它二级栈区域,以及显示声明实例化时再为这个二级栈分配堆空间就可以了.

200的底层固件很自由灵活,实时响应时序也不错,大部分代码只用全局变量满天飞基本也可以了.


 
以下网友喜欢您的帖子:

  
侠客

经验值: 709
发帖数: 31
精华帖: 0
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之三------IO对象与动作及最新例程


只看楼主 10楼 2021-11-24 10:21:45

感谢分享,可以看


 
以下网友喜欢您的帖子:

  
游侠

经验值: 326
发帖数: 26
精华帖: 0
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之三------IO对象与动作及最新例程


只看楼主 11楼 2021-11-24 10:26:50

谢谢分享!


 
以下网友喜欢您的帖子:

  
奇侠

经验值: 8143
发帖数: 843
精华帖: 14
回复:【不欲勿施】【S7-200 Smart开源标准化编程】之三------IO对象与动作及最新例程


只看楼主 楼主 12楼 2021-11-25 15:08:26
以下是引用芳季在2021-11-22 22:04:18的发言 >7楼

最后为什么要6个F?不是4个吗?

ST60 V区30k,32767,是不是16#FFFF就够了?

你这样占住AC3,难怪要所有子程序都要留个空间。保护和恢复AC3 。

MOVD AC3 LDx

.......

MOVD LDx AC3

除非子程序不使用AC3。是不是?(AC不算全局变量吗?)

这个情景就好像我的程序,递归把8级子程序LD56都占住了。我是一次性占住所有层的56。其实,其实都是一样占用一样的资源。

@winter938.你说说。

还有一个事情想讨论一下。

你的程序用间接寻址,把V区的东西块移动到L区然后才运行。然后运行完毕把L搬回去V。是不是?

我的程序直接用间接寻址运行在V区。(你看过我程序没有?)

到底怎样会运行更快?有一个问题,我这样做法没法寻址到位。要位操作,一样要像你这样复制过来L区,然后后面复制回去。但是你的程序有另一个问题,L区没有V区大,bmov不完怎么办?难道分时读取到L然后分时运行?我的做法如果程序里面涉及到很多指针的话,……我的例子是为了表达意思,只写了一个加法指令代表任何用户程序。这里就一个变量所以一个指针。常规子程序2里面是两个变量,所以两个指针。当指针大于x个的时候L区放不下了……此时麻烦出现了。需要用很多运行时间去重新计算指针,把已有的指针覆盖掉。新指针填上去。被覆盖的指针后面还要用的话又再次计算指针。所以需要很多时间计算指针。

你觉得怎样?

另外,我知道运行L寻址要比运行V寻址更慢。acVMSQI运行速度一样。并不存在M更快。(是就最好了)要运行更快,最好是间接寻址块移动到一前段V区,然后就在这V区运行。运行完搬回去数据V区。

你说的对4个F就可以解决问题,不过,说不准未来出大容量的PLC呢


13478405725
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
【不欲勿施】【S7-200 Smart开源标准化编程】之三------IO对象与动作及最新例程
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。