前一阵帮老用户看一段程序,程序大概的意思是通过PROFIBUS-DP读出驱动PEK的参数,大家都知道读写PEW参数的通信区只有四个字输入和四个字输出,发一帧读写请求报文,得到参数值或是否该参数写成功信息,由于读写多个参数,所以需要做轮询程序,即发一帧请求,如果应答,使用指针指向下一个请求发送区,并将接收的数据存储于DB中,直到下一个请求数据区为零,再次重新轮询,这样周而复始的读写参数。程序使用STL指针编写,测试时有问题,又不想看不易看懂的指针程序,犹豫半天自己重新编吧,按照格式一点点编写,一些无关紧要的程序复制过来,完成后下载并监控,又有问题了,发现接收的数据区有冲突了,第一帧接收的数据跑到第二帧去了,肯定异步通信判断有问题,麻烦了,不能使用断点,这样的问题解决起来通常办法是自己想,想了一天,没有想出出错的地方,又画一下流程图,好像也没有错误,只好将程序放到OB35中,5秒钟循环,慢慢看,突然发现有一段复制的程序有问题,参考下图(复制粘贴下面链接查看):http://www.ad.siemens.com.cn/club/bbs/upload/634564282234171250.jpg
程序是这样的,如果发送的请求数据(读写的参数号)MW2与接收的响应数据(相同的参数号是否返回)MW4相同,异或结果为0,M1.1为1,触发指针指向下一帧报文,如果不一样M1.1为0,开始认为条件还缺少,再加上MW12(请求的数组号)与MW14(返回的数组号)比较,通常都读写数组的第一个参数,监控的时候发现MW2与MW4相同的时候,M1.1为1,有时不相同的时候也为1,这样数据区就乱了,难道是异步通信问题?后来改为熟悉的比较指令:
A(
L MW 2
L MW 4
==I
)
A(
L MW 12
L MW 14
==I
)
= M 1.1
下装后程序没有问题了。后来发现了前面的指令问题所在,真是复制一条语句耽误太多的时间,以后还是使用自己熟悉的语句编程。不知大家有没有看出?