回复:S7-200Smart子程序编程思路之二-分享最简单的ModbusRTU多参数读写

已锁定

holdkcsxyz

西门子1847工业学习平台

  • 帖子

    1560
  • 精华

    24
  • 被关注

    161

论坛等级:至圣

注册时间:2015-06-03

钻石 钻石 如何晋级?

发布于 2022-08-29 09:03:06

53楼

展开查看
以下是引用winter938在2022-08-28 21:47:00的发言 >52楼

       看了楼主49楼的程序,写得短小精悍很不错,可以通过在数据块添加通讯任务的相关的预置数据实现多站多任务的轮询,而无需改动程序。程序还实现了掉站跳过和恢复以及写任务数据变化时才执行通讯写任务从而提高了轮询的速度,是比较实用的程序。有几个问题请教一下楼主:

       1.全局时钟采用中断的方式获取个人觉得有些浪费中断资源,可否就在OB1中累加扫描周期时间即可?反正LD10也只是在Smart_MP子程序网络1中刷新一次没有中断方式获取的那种实时性。

       2.Ch_Write子程序网络9的比较及后面的累加指令是否多余?外循环由LW51确定循环次数,LD16在下一次调用此子程序时会初始化指向私有变量区的第一个V字节。另LB32在程序前段的输入和后段的输出似乎也无必要,是否在考虑其他逻辑添加需要而设置?

       3.子程序中TEMP型的L区个人觉得换做V区,方便符号编程和获得更大的数据存储空间,运算速度也快些,采用楼主往L 区的输入再输出的类似方式也可实现多次调用而互不影响。

       

谢谢几点建议都是合理的

1:确实可以用扫描周期来累加,串口通讯和OB1是异步的,除非把时钟刷新写在标号内部,而且为后续时间戳排序考虑:时钟也应该用一个绝对的时钟;

2:当前指针和结尾指针的大小比较确实多余,原因它是一个完整的同步循环;LB32不还回去也是没问题的,后续的找出#从变才写后再进行优先级排序,然后再进行时间戳排序可能会用到还回去;

3:正如您说的用V区作缓存,显然可以让两个子程序合并成一个,而不用担心L的60个Byte的限制,也会增加程序易读性,不会像例程一样打补丁再传函数首地址(这样的打补丁方式在C开发里面也是很常见的),打补丁全用间接寻址可读性降低很多.

(一)按照winter938建议1去掉定时中断,改为利用BGN_ITIME指令输出*#函数缓针用作定时器,并将子程序做成库

(二)按照winter938建议2取消了指针回指到第一个私有数据地址的逻辑和计算量

(三)完善以前没做的复位时序:

-----------------------------------------------------------------------------------------------------------

最终版

库存储区由VB6000调整到VB111编译后程序块减少300个字节左右,这可能和内存4K分页有关(类Linux),数据块也建议分配小号码的字节开头以节省数据块大小;增加#从变锁定保证下个快速写变化#从变才写能被捕捉到,不至于被错误的复位掉;变化的写任务没写成功,则重新置位#从变才写,等待下次恢复再写.

(一)主程序和状态图表

(二)数据块

(三)Smart_MP


(四)Ch_Write






评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200 SMART

共有8933条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

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

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

  • 分享

  • 只看
    楼主

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