功能块里除法求余数 点击:3002 | 回复:8



人生路上

    
  • 精华:0帖
  • 求助:6帖
  • 帖子:25帖 | 123回
  • 年度积分:1
  • 历史总积分:560
  • 注册:2002年4月14日
发表于:2014-05-14 15:36:41
楼主

用ISPsoft2.04写程序,在功能块里想用除法里的余数,应该怎样的处理,谢谢!




人生路上

  • 精华:0帖
  • 求助:6帖
  • 帖子:25帖 | 123回
  • 年度积分:1
  • 历史总积分:560
  • 注册:2002年4月14日
发表于:2014-05-16 10:14:03
1楼

怎么没有人来帮忙呢,是我说的不够明白么

用ISPsoft2.04写程序,PLC为ES2的,想用功能块写个子程序,调用方便,省去很多重复的程序,想在功能块里面全部用局部变量来做,但是变量可以定义字,或者双字,两个数相除之后得到商和余数,商应该为一个字的变量符合,但是余数就找不到了,要用到这个余数应该去那里找呢

人生路上

  • 精华:0帖
  • 求助:6帖
  • 帖子:25帖 | 123回
  • 年度积分:1
  • 历史总积分:560
  • 注册:2002年4月14日
发表于:2014-05-16 10:16:56
2楼

如果实在不行只有用寄存器了做了

ljbcompany

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 1289回
  • 年度积分:0
  • 历史总积分:5847
  • 注册:2011年4月24日
发表于:2014-05-17 08:23:10
3楼

计算机编程里,有mod函数可以取余的!而在PLC中,(D)DIV指令的结果本身也保留余数(这在手册中可以查到)。

信息保密

  • 精华:0帖
  • 求助:1帖
  • 帖子:3帖 | 69回
  • 年度积分:0
  • 历史总积分:320
  • 注册:2012年6月21日
发表于:2014-05-17 11:48:15
4楼

就是模运算,楼上的正确。至于你用的软件 实现的方法只能自己查手册。

cgy112

  • 精华:0帖
  • 求助:3帖
  • 帖子:7帖 | 48回
  • 年度积分:0
  • 历史总积分:261
  • 注册:2010年4月28日
发表于:2014-05-17 15:22:33
5楼

QQ270387061,我给你发功能块,验证注明  功能块

第五纪冰川

  • 精华:3帖
  • 求助:5帖
  • 帖子:37帖 | 4224回
  • 年度积分:3
  • 历史总积分:12263
  • 注册:2005年2月18日
发表于:2014-05-17 21:25:37
6楼

你在定义局部变量的时候这样:

被除数      自动分配

除数          自动分配

商              自动分配

余数           自动分配


定义的时候,要么全部是16位单字,要么全部是32位双字。商和余数的定义不能隔开,并且保持前后关系。这样编译后这两个变量就自动排列,特别注意编译后一定要查看这两个变量是否顺序排列。如果不是,就必须手动调整内存地址分配。

下图中就是编译系统自动分配的地址,商后面紧跟着余数。仿真结果一目了然。

特别提醒,如果变量定义中有16位或32位乘除法,定义结果变量的时候,一定要在后面紧跟着定义一个占位变量,否则跟在后面的变量就会遭殃了,会被修改。我最开始用的时候没注意这个问题,以为编译系统可以自己搞定,就果可是让我吃够了苦头。不知道现在新版本ISP有没有修改这个问题,不过我认为也很不好修改,编译系统怎么知道我是否想要余数呢。反正我从1.1开始,吃够了苦头,打了技术支持N次电话,很多次他们也还没有发现,然后下一次升级就改了。现在2.04好太多了,用起来也顺手了。

不过最要命的是,回去用WPL居然然有点搞不懂了,老PLC又不被ISP支持,晕!!!!

所以现在我一般都转成32位浮点数,省得出些错误搞得一头雾水,反正台达现在的PLC也足够快,几千步的程序数毫秒。

提醒一下,如果你只是单纯的需要经常用到除法,千万不要搞个块,直接在程序中用指令。台达的块编译时是宏替代,会给内存和程序增加麻烦。

不信,你这样去看。用ISP编译一个程序,下载执行码到PLC,然后用WPL上载程序,你再看看,那可不是一般的高档!!!

我记得坛子上有个帖子,专门比较各个厂家PLC编译系统内存分配的问题,结果好像只有AB的最好,最糟糕的是三菱,台达学的是三菱,还没有青出于蓝!!!

不知道为何,子程序不支持变量传递。

不过,可以自己定义全局变量,调用子程序前把局部变量传递给全局变量。在子程序中运算完毕,再通过全局变量传递给调用程序,调用程序中把存储结果的全局变量在传给局部变量。这样就可以不用功能块,而用子程序来完成。最大的好处是,程序指令编译后占用小,内存分配比功能块占用小。



人生路上

  • 精华:0帖
  • 求助:6帖
  • 帖子:25帖 | 123回
  • 年度积分:1
  • 历史总积分:560
  • 注册:2002年4月14日
发表于:2014-05-19 14:59:10
7楼

谢谢,第五纪冰川写的好详细,好有深度,不只是解决了问题,还学习了好多知识

自动化交流

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 183回
  • 年度积分:0
  • 历史总积分:76
  • 注册:2014年6月09日
发表于:2014-06-09 10:17:29
8楼

定义的时候,要么全部是16位单字,要么全部是32位双字。商和余数的定义不能隔开,并且保持前后关系。这样编译后这两个变量就自动排列,特别注意编译后一定要查看这两个变量是否顺序排列。如果不是,就必须手动调整内存地址分配。



热门招聘
相关主题

官方公众号

智造工程师