发现博途与STEP7的一点不同地方我有一个用STEP7编写的S7-300的程序,将他移植成博途V13的项目后编译发现了两者的编译器有点不同,不知道我的理解是否正确,写上来请大家指正一下。
1. 在FB中定义了某一个Output的BOOL类型变量,在程序中使用了他的常开触点,在STEP7中对于BOOL变量 这样做是允许的(对于别的如定义为real的Output变量则不允许。),在博途中编译时会产生警告: 实参的声明 Output 不符合形参的声明 Input 这样不被允许的话,只有多建立 Static 变量了
2. 在定义 DB1.DBW0为一个WORD变量,在STEP7中可以不定义而直接使用 DB1.DBX0.0;在博途中定义了DB1.DBW0为一个WORD变量,在使用 DB1.DBX0.0 这个地址的时候,编译会产生警告,“该地址不能通过变量进行分配 ” 而我的程序中这样的使用是无法避免的,该如何处理?忽视警告?
3. 在STEP7中犯了一个错误,在定义某共享数据块的时候不小心将某一变量地址如DB2.DBW0 定义成INT变量,而在程序中的其他地方使用了 DB2.DBX0.0等,这样在STEP7中没有编译错误,在PLC中执行时貌似也没有发生错误;在博途中编译时产生了警告,还没有去验证执行情况。
这两种编译器,哪种更合理呢?
---------后者更合理一些吧,我认为.
-----------1我记得博途是从V12版以后才会编译检测output变量的使用。我也就此时咨询过他们,给出的回复是直接在程序里使用output变量,它是个不确定的值,存在风险,所以才提示警告,所以此时要用InOut类型或者给OutPut参数连接一个变量,然后在程序内使用该变量(我们以前的习惯就是output懒得连接变量,然后直接在程序内使用 背景DB.output)。
2、推荐使用“优化的块”,此时可以用Splice的方式访问字的位。 当然如果你一定要用绝对地址,且需要访问字的位,那么也没问题。 就忽略该警告好了。 再或者你用AT功能访问位。
3、显然后者更合理,它会提示风险。 如果确实是你需要这样访问,那么你就忽略它。
-----------AT功能访问位?
那么我想问下AT功能是什么,能否给介绍一下,最好有样例~谢谢
----------谢谢各位关注!
在相关的链接中大概明白了Splice和AT是怎么回事,但是为什么我在那本12000多页的说明书里搜索不到Splice ?
继续说说不同点吧,当然大家都有发现,我只是想谈谈自己的感觉。
4.STEP7中可以在程序中对某一地址进行交叉引用的查询,也可以在一个表中对所有的M I T C DB 等多个区进行交叉引用的查询,这样在做地址规划的时候可以很方便的去查看哪些地址还未使用,而在博途中貌似就没有那么方便了,M区还可以显示交叉引用,DB区没有找到,只能在程序中针对某个变量去交叉引用,是我方法不对吗?
5.关于在线监控,在STEP7中很容易看到PLC中有哪些功能块,数据块等,在博途中就不一样,他是通过显示离线与在线是否相同来表示,下载程序的时候没有选择,所有在线离线不同的程序块全部一起下载了,如果在线有的程序块离线没有,下载程序后那么在线的程序块也会消失。博途这样也有他的好处,但是总有那么说不出的感觉。
6.在STEP7中LAD 和 STL 可以相互切换,博途中只能将 STL的程序段拷到 LAD 的编程环境中,反之则不能
-----------应该也可以用,符号寻址 “myword"%X1 ,类似格式 来利用变量中的位
-----------7. 今天说一下关于 SCL 中关于间接寻址的不同之处。
在STEP7中 间接寻址比较方便,如 S:=DB_NO.DW[X]; // DB_NO (BLOCK_DB) 为 DB块号, X 为指针地址,是个变量。麻烦的就是有些需要格式转换。
在TIA的 S7-1500的间接寻址,我就搞得有点懵了。
先把DB块的间接寻址弄出来了 #S := #DBNO.%DBW20; // DBNO(DB_ANY) 为 DB块号, DBW20 为地址。
接下来要把 DBW20替换为变量就不知道怎么弄了。 #S := #DBNO.#X; 这个 X定义了好几种数据类型都会报错,没辙了,那就再想想别的办法吧。
那上万页的手册告诉我可以用 PEEK,好吧,这个也可以弄一弄,#S := PEEK_WORD(area:=16#84,dbNumber:=#DBNO,byteOffset:=#X) ; 这个弄出来后问题又来了, PEEK后面的数据类型 除了 WORD,BOOL和默认的 BYTE外,定义为 INT,REAL等常用的数据类型都会报错,这是几个意思? byteOffset 这个 “byte” 也是改不了的啊。
我现在的目的就是想知道:#S := #DBNO.#X; // (S:REAL DBNO为DB块号, X是地址变量) 在1500的 SCL程序中,该如何表达。
请大家指点指点我的疑问,谢谢!
---------------------"DB_GVL".RES_Word0 := PEEK_WORD(area:=16#84, dbNumber:="DB_GVL".RES_DInt0, byteOffset:="DB_GVL".RES_DInt1);
以上,是我在软件里写的,编译没有任何问题啊。
另外,针对你列出的数据类型INT和REAL,不用纠结。 INT占用16位,所以直接用PEEK_WORD, REAL占用32位,所以直接用PEEK_DWORD。 回到S7-300里,间接寻址的时候,也不会去管数据类型啊,而只是管数据占用存储器的位数,相等就可以了。
|