最近在把一个200PLC中的自定义库升级到200smart库过程中,遇到一些问题。在200PLC中,这个库使用正常,但在200SMART中使用会出现异常。
200PLC中设计了一个MCC控制通用子程序,MCC子程序中,调用了自已编写的上升沿、下降沿指令和定时器指令。定时器指令同时也调用了这个上升沿指令。程序调用顺序如下图:
图0 调用顺序
在200PLC中测试没有问题,最后封装成库,在OB1中调用这个库,使用正常。之后,在200SMART中,编写相同的MCC子程序,测试,也没有问题,最后封装成库,在OB1中调用,问题来了。
图1:MCC子程序,调用上升沿、下降沿子程序
图2:定时器S_ODTS子程序中,调用上升沿子程序
图3:OB1中测试MCC子程序,使用正常
图4:把MCC子程序封装成库
图5:调用封装好的MCC库,编译出错。提示MCC子程序和S_ODTS子程序中调用指令没有对应的子例程。
以为是200SMART中库文件封装有问题,于是又封装了一遍,再次调用库,还是报错。也不知道这个子例程是什么意思。于时,打开封装的库查看,原来是MCC和S_ODTS中调用的上升沿指令没有分配参数。
图6:rising_edge子程序形参没有分配参数
这就奇怪了,明明在封装之前,测试都是正常的,为什么封装之后调用,参数就没有了呢。思来想去,始终找不到原因。再分析出错信息,“子例程”,会不会是跟嵌套调用Rising_edge子程序2次有关,为什么Falling_edge调用了一次就没问题呢?难道要分配2个rising_edge?这不科学啊。
抱着试试看的心态,把 rising_edge封装成库,再放到随便一个子程序中,这时,程序块的库中,又多了一个rising_edge子程序,删除刚刚调用的rising_edge,再次编译,居然通过了。
图7:调用一个rising_edge库,编译通过
总结:
因为封装成库的MCC调用rising_edge子程序,嵌套深度为2 ,在200PLC中,使用正常。
在200SMART中,会提示调用子例程错误。
图8:200PLC与200SMART中调用MCC库对比
解决方法:把rising_edge封装成库,再次调用,目的是为了在程序块中增加一个rising_edge库。
图9:200SMART中再次调用rising_edge库