你在定义局部变量的时候这样:
被除数 自动分配
除数 自动分配
商 自动分配
余数 自动分配
定义的时候,要么全部是16位单字,要么全部是32位双字。商和余数的定义不能隔开,并且保持前后关系。这样编译后这两个变量就自动排列,特别注意编译后一定要查看这两个变量是否顺序排列。如果不是,就必须手动调整内存地址分配。
下图中就是编译系统自动分配的地址,商后面紧跟着余数。仿真结果一目了然。
特别提醒,如果变量定义中有16位或32位乘除法,定义结果变量的时候,一定要在后面紧跟着定义一个占位变量,否则跟在后面的变量就会遭殃了,会被修改。我最开始用的时候没注意这个问题,以为编译系统可以自己搞定,就果可是让我吃够了苦头。不知道现在新版本ISP有没有修改这个问题,不过我认为也很不好修改,编译系统怎么知道我是否想要余数呢。反正我从1.1开始,吃够了苦头,打了技术支持N次电话,很多次他们也还没有发现,然后下一次升级就改了。现在2.04好太多了,用起来也顺手了。
不过最要命的是,回去用WPL居然然有点搞不懂了,老PLC又不被ISP支持,晕!!!!
所以现在我一般都转成32位浮点数,省得出些错误搞得一头雾水,反正台达现在的PLC也足够快,几千步的程序数毫秒。
提醒一下,如果你只是单纯的需要经常用到除法,千万不要搞个块,直接在程序中用指令。台达的块编译时是宏替代,会给内存和程序增加麻烦。
不信,你这样去看。用ISP编译一个程序,下载执行码到PLC,然后用WPL上载程序,你再看看,那可不是一般的高档!!!
我记得坛子上有个帖子,专门比较各个厂家PLC编译系统内存分配的问题,结果好像只有AB的最好,最糟糕的是三菱,台达学的是三菱,还没有青出于蓝!!!
不知道为何,子程序不支持变量传递。
不过,可以自己定义全局变量,调用子程序前把局部变量传递给全局变量。在子程序中运算完毕,再通过全局变量传递给调用程序,调用程序中把存储结果的全局变量在传给局部变量。这样就可以不用功能块,而用子程序来完成。最大的好处是,程序指令编译后占用小,内存分配比功能块占用小。