前段时间做了一个S7-300之间(两个CPU均为315-2DP,一个AG10,一个AF03)的主从通讯的实验,遇到如下问题:
当在硬件组态中,在MS组态中,主站的O 100开始的20个字节对应从站的I 100开始的20个字节,同样从站的O100开始20个字节对主站I 100开始20个字节,并且将数据格式设置为UNIT,在这个时候,通讯没有任何问题,在主站中能读取和修改从站数据。
但是在MS组态中将主站O1000开始20个字节对应从站I1000开始的20个字节,格式同样为UNIT,而主站的I1000开始的20个字节对应从站的O1000开始的20个字节的时候,我在程序中编写了如下程序:
L MD0
T QD1000 (或者PQD1000) ///我的本意是想通过传送指令将主站数据写到从站中
这个时候程序居然无法下载,报错OB1不能被复制,并且同时主站CPU的SF亮(奇怪了我都没下载下去居然还报错!)
在从站中也编写了类似程序,也出现上述主站同样的现象。
没有办法,后来将数据格式改为“连续”,使用SFC14/SFC15读取从站数据,编程如下:
CALL SFC14
LADDER:W#16#3E8 ///从站I 1000开始
RECORD:P# M0.0 BYTE 20 ///20为通讯长度
RET_VAL;MW100
CALL SFC 15
LADDER:W#16#3E8
RECORD:P#M20.0 BYTE 20
RET_VAL:MW102
下载下去监视,返回值居然都是0,代表通讯建立已经成功。
但是我又在从站里写了:
L PIW1000
T MD0
L MD4
T PQW1000 还是报错误。
不知道为什么?
我知道PQW1000肯定超过的IO印象区的长度,事实上当IO超过200就不行。但是又不想浪费宝贵的IO资源当输入输出模板多了之后占用太多地址,又该怎么办?所以我觉得使用SFC14,SFC15读取从站数据是比较明智的。
我想问一下,如何在从站中将想要的数据写到通讯缓冲区内?
让大侠们见笑了!