讨论:提高PLC程序运行速度的编程方法 点击:5674 | 回复:49



如火

    
  • 精华:172帖
  • 求助:0帖
  • 帖子:803帖 | 5249回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2007-08-10 15:01:00
楼主
1:根据工程实际需求,进行功能块规划,编写子程序
在 PLC中 ,子程序是为一些特定的控制目的编制的相对独立的程序。执行子程序调用指令CALL等,如果条件不满足子程序调用时,程序的扫描就仅在主程序中进行,不再去扫描这段子程序,这样就减少了不必要的扫描时间。

2:用字或双字数据传送给DO点方法来控制输出
在 PLC的应用中通常都会有大量的输出控制,用字或双字数据传送给DO点方法来控制输出可以提高速度,只要根据实际应用的要求,合理分配输出地址,变换控制输出控制字,可以大大减少PLC程序执行的步数,从而加快PLC的程序运行速度。

3:脉冲触发SET、RESET
PLC中,使用SET指令只执行一次即可,不必每次扫描都执行这个指令,很适合与脉冲输出(PLS/PLF)指令配合使用。有些工程人员忽视了这个问题,使用了常规的方法来驱动SET指令,无意中增加了PLC程序扫描运行时间

4:避免了类型转换,方法如下: 以S7-200为例,它的内存格式与我们常用的 PC 机正好相反,它是高字在前,低字在后的。所以我们可以将字变量放在后两个字节,在程序初始化时将前两个字节清零(程序的其它地方不得使用这两个字节)。    如我们定义符号时将字变量定义在 VW2,同时保持 VW0 的值为零。则程序中可以用 VW2 以字型访问该变量,同时也可以 VD0 以双字型访问,避免了类型转换。    为了避免使用时混淆,最好以明确的符号定义来区分字类型和双字类型。在此强烈推荐类匈牙利命名法:以前缀指示变量类型,用首字母大写的有意义的英文单词的组合作变量名。本人习惯用以下缀:    b ---- 字节型变量(byte)    w ---- 字型变量(word)    d ---- 双字变量(double)    r ---- 实型变量(real)    f ---- 位变量(flag)    btn --- 自复位按钮式输入(button)    sw ---- 切换开关或自锁按钮输入(switch)    sig --- 传感器、编码等电平信号输入(signal)    rly --- 输出继电器位(relay)    ……    当然,这个根据个人习惯来,没有定则,主要是利于自己区分。    假如有一个字类型变量名为 VarName,为使用前面的转换技巧,我们可以这样定义:    wVarName ---- VW2    dVarName ---- VD0    在程序初始化时将 VW0 清零(如果是不需要记忆的变量,直接将 dVarName 清零也可)或者在数据块中将 VW0 设置为零。则以后需要以字类型访问变量时就用 wVarName,需要以双字类型访问变量时就用 dVarName。完全不需要类型转换。    本方法可以极大的减少程序语句数,使程序更简洁、可读性更好,由于不需要做耗时的类型转换,程序运行效率也得到提高。且数学运算量越大,效率提高越明显。       缺点是要多占用两字节的内存,以后程序中不能使用 VW0。但 S7-200 的 RAM 空间很大,一般是用不完的,以 226 为例,有多达 10K 的 RAM,偶从来没有超过 1K。 这些 RAM 都是花钱买来的,不用白不用,不用也是浪费了。    同理,如果有字节型变量经常需要与字类型变量相互转换,让字节变量占用一个字的内存宽度浪费一个字节,避免类型转换。 不断更新中...欢迎大家补充讨论。



鸡蛋饼...

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 315回
  • 年度积分:0
  • 历史总积分:414
  • 注册:2003年8月26日
发表于:2007-08-24 10:35:00
21楼
同意,程序多了就要考虑扫描周期了。以三菱Q02为例,程序到了12000步以上,再多用一些特殊指令(如NDIS,DABIN等)的话就容易出问题。



对一些加减乘除运算如温度压力转换等,可以在转换条件前加定时器触发,以减少运算次数,缩短扫描周期。

1233211234567

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 6回
  • 年度积分:0
  • 历史总积分:73
  • 注册:2007年6月19日
发表于:2007-08-24 11:24:00
22楼
感谢楼主!!

221313

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 893回
  • 年度积分:0
  • 历史总积分:1132
  • 注册:2007年8月23日
发表于:2007-08-24 16:12:00
23楼
支持

透明黑洞

  • 精华:0帖
  • 求助:0帖
  • 帖子:2帖 | 19回
  • 年度积分:0
  • 历史总积分:62
  • 注册:2007年8月25日
发表于:2007-08-25 16:33:00
24楼
众说风云,子程序到底扫不扫描呢?能不能给个明确的说法。

ShowFine

  • 精华:1帖
  • 求助:1帖
  • 帖子:57帖 | 753回
  • 年度积分:0
  • 历史总积分:1671
  • 注册:2003年10月29日
发表于:2007-08-25 18:36:00
25楼
子程序扫不扫描是你自己的事情, 和你的编程有关。 一般我是不让它扫描的, 但是如果你想通过子程序得到一个BR位的状态以便反应子程序是否正确执行,那么你必须让子程序执行,只不过将条件做在子程序的开关,如果条件不成立,那么直接跳转到子程序的结尾,并给出BR信号, 以此减少扫描时间。

晓寒清

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 3回
  • 年度积分:0
  • 历史总积分:12
  • 注册:2007年8月19日
发表于:2007-08-25 18:44:00
26楼
我觉得节约时间不一定只从这些方面考虑,还有从编程的角度将程序进行优化,把程序本身做修改也可以实现,一点点不成熟的意见

221313

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 893回
  • 年度积分:0
  • 历史总积分:1132
  • 注册:2007年8月23日
发表于:2007-08-26 20:03:00
27楼
不错!好注意,支持

czl123

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 143回
  • 年度积分:0
  • 历史总积分:197
  • 注册:2005年10月28日
发表于:2007-08-27 21:02:00
28楼

acbbli

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 36回
  • 年度积分:0
  • 历史总积分:140
  • 注册:2004年12月15日
发表于:2007-08-28 09:34:00
29楼
我来解释一下第三点。
SET RSET指令只要条件满足,就把目标置为On Off。所以,执行一次就可以满足置位了。比如第一次扫描,条件满足,职为On了。第二次扫描,虽然条件不满足。但目标“继电器”仍为On,直到被RSET后。
所以说,编程时通过其它指令,让SET RSET执行一次就行了。

晓流

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 58回
  • 年度积分:0
  • 历史总积分:76
  • 注册:2003年4月26日
发表于:2007-08-28 10:51:00
30楼
找来台达PLC试了一下,使用CJ和CALL指令后监控扫描周期确实缩短了不少。谢谢了!

221313

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 893回
  • 年度积分:0
  • 历史总积分:1132
  • 注册:2007年8月23日
发表于:2007-08-30 16:40:00
31楼
  支持楼主!

曾勇

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 90回
  • 年度积分:0
  • 历史总积分:235
  • 注册:2006年11月16日
发表于:2007-09-14 18:27:00
32楼

风蓝

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 16回
  • 年度积分:0
  • 历史总积分:22
  • 注册:2006年10月05日
发表于:2007-09-18 09:54:00
33楼
不错....实际上是快一点的

如火

  • 精华:172帖
  • 求助:0帖
  • 帖子:803帖 | 5249回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2007-09-26 10:16:00
34楼
添加一个:
4:避免了类型转换,方法如下:
   以S7-200为例,它的内存格式与我们常用的 PC 机正好相反,它是高字在前,低字在后的。所以我们可以将字变量放在后两个字节,在程序初始化时将前两个字节清零(程序的其它地方不得使用这两个字节)。
  如我们定义符号时将字变量定义在 VW2,同时保持 VW0 的值为零。则程序中可以用 VW2 以字型访问该变量,同时也可以 VD0 以双字型访问,避免了类型转换。
  为了避免使用时混淆,最好以明确的符号定义来区分字类型和双字类型。在此强烈推荐类匈牙利命名法:以前缀指示变量类型,用首字母大写的有意义的英文单词的组合作变量名。本人习惯用以下缀:
     b ---- 字节型变量(byte)
     w ---- 字型变量(word)
     d ---- 双字变量(double)
     r ---- 实型变量(real)
     f ---- 位变量(flag)
     btn --- 自复位按钮式输入(button)
     sw ---- 切换开关或自锁按钮输入(switch)
     sig --- 传感器、编码等电平信号输入(signal)
     rly --- 输出继电器位(relay)
     ……
  当然,这个根据个人习惯来,没有定则,主要是利于自己区分。
  假如有一个字类型变量名为 VarName,为使用前面的转换技巧,我们可以这样定义:
     wVarName ---- VW2
     dVarName ---- VD0
  在程序初始化时将 VW0 清零(如果是不需要记忆的变量,直接将 dVarName 清零也可)或者在数据块中将 VW0 设置为零。则以后需要以字类型访问变量时就用 wVarName,需要以双字类型访问变量时就用 dVarName。完全不需要类型转换。
  本方法可以极大的减少程序语句数,使程序更简洁、可读性更好,由于不需要做耗时的类型转换,程序运行效率也得到提高。且数学运算量越大,效率提高越明显。
    
  缺点是要多占用两字节的内存,以后程序中不能使用 VW0。但 S7-200 的 RAM 空间很大,一般是用不完的,以 226 为例,有多达 10K 的 RAM,偶从来没有超过 1K。 这些 RAM 都是花钱买来的,不用白不用,不用也是浪费了。
  同理,如果有字节型变量经常需要与字类型变量相互转换,让字节变量占用一个字的内存宽度浪费一个字节,避免类型转换。

西门子工业自动化

  • 精华:0帖
  • 求助:1帖
  • 帖子:29帖 | 117回
  • 年度积分:0
  • 历史总积分:213
  • 注册:2004年4月09日
发表于:2007-09-26 10:30:00
35楼
现在的cpu处理速度已经足够快了,意义已经不大了.就象现在编程你还会太在意内存吗

jinlong

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 57回
  • 年度积分:0
  • 历史总积分:175
  • 注册:2006年12月18日
发表于:2007-09-26 21:05:00
36楼
不错,收藏

啊戒

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 5回
  • 年度积分:0
  • 历史总积分:11
  • 注册:2007年9月28日
发表于:2007-09-28 19:50:00
37楼
对,

glw5555

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 4回
  • 年度积分:0
  • 历史总积分:7
  • 注册:2004年7月10日
发表于:2007-11-01 11:27:00
38楼
期待更新

liudonlia

  • 精华:1帖
  • 求助:0帖
  • 帖子:6帖 | 27回
  • 年度积分:0
  • 历史总积分:119
  • 注册:2003年11月11日
发表于:2007-11-02 13:27:00
39楼
不错,顶一下

  • 精华:0帖
  • 求助:0帖
  • 帖子:9帖 | 651回
  • 年度积分:0
  • 历史总积分:1862
  • 注册:2005年6月12日
发表于:2007-11-06 19:02:00
40楼
我也试试

热门招聘
相关主题

官方公众号

智造工程师