现有要编写这样一段程序,一件产品在两个工位(各有一个PLC)分别测试,需要将第一站测试参数捆绑产品序列号打包发送给第二站;第二站根据产品序列号从一站传输的数据中匹配得出该序列号相对应的一站测试数据,然后捆绑两站总的测试参数.
我的思路是两站都创建一个‘序列号+参数’的列表,然后进行数据传输和匹配,但是我不知道怎样编写数据捆绑和匹配截取的程序,想请教有相关经验的前辈大师指点一二,不胜感激!
最佳答案
1、需要根据工艺要求自己编制一个查表的程序,该表为一个数据块DB。
现举例说明怎样查表。有这样一张表:
‘序列号+参数’,DBW0中为序列号0,DBW2中为序列号0的参数1,DBW4中为序列号0的参数2;DBW6中为序列号1,DBW8中为序列号1的参数1,DBW10中为序列号1的参数2;DBW12中为序列号0.......。
2、为查表需要详细指针间接寻址编程方法:
根据上述举例的表中的数据排列的规律及数据块DB的存储特性,序列号0的首址为0,序列号1的首址为6,序列号2的首址为12,.......。根据此规律可得出,序列号乘以6就是该序列号在表中(DB)的首址。
3、例如要查序列号1的数据:
OPN DB 20 //打开DB 20
L MW10//序列号存储在MW10中
L 6
*I //序列号乘以6,结果是一个 32 位整数。
SLD3 // 32 位整数再左移3位,形成地址指针数据格式。
T MD12//形成的地址指针数据格式存入 MD12。
3、为什么要 32 位整数再左移3位?
目的是形成地址指针数据格式。
【地址指针AR的格式】:
地址寄存器是专门用于寻址的一个特殊指针区域,西门子的地址寄存器共有两个:AR1和AR2,每个32位。
AR:的格式
0000 0000 0000 0BBB BBBB BBBB BBBB BXXX
其0-2bit,指定bit位,3-18bit指定byte字节。其第31bit固定为0。
上述例子中,例如序列号1乘以6结果为6,再左移3位为:
0000 0000 0000 0000 0000 0000 0011 0000
根据地址指针AR的格式,此时AR为6.0。
4、有了指针AR的数据,即可编写:
LAR1 MD12 / 将MD12内容送入指针AR1中,初始读指针。
L DBW [AR1,P#0.0] //按读指针指示的地址读数据。即取序列号。
......
L DBW [AR1,P#2.0] //取该序列号的参数1。
......
L DBW [AR1,P#4.0] //取该序列号的参数2。
5、【指针偏移运算法则】 :
在寄存器寻址指针 [AR1/2,P#byte.bit] 这种结构中,P#byte.bit如何参与运算,得出最终的地址呢?
运算的法则是:AR1和P#中的数值,按照BYTE位和BIT位分类相加。BIT位相加按八进制规则运算,而BYTE位相加,则按照十进制规则运算。
6、上述程序只是举例说明。查表的编程基础需要掌握指针的格式及变址寻址的方法,请系统看看下述相关资料:
、《关于S7-300和S7-400指针寻址的说明与例程》:
http://www.ad.siemens.com.cn/download/searchResult.aspx?searchText=F0215
、《step7编程之地址概念详解》连接:
http://wenku.baidu.com/view/b2b4d3375a8102d276a22fd3.html
或
http://www.chinakong.com/rencai/disp.asp?id=1633&leibie=4
、《西门子STL间接寻址常问问题集》
http://www.ad.siemens.com.cn/download/docMessage.aspx?
ID=6175&loginID=&srno=&sendtime=
提问者对于答案的评价:
非常感谢阿鸣大师,程序这块我在想想.
感觉指针编程很强大,但是我平时很少用到,所以始终摸不透彻,尴尬...
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc347530.html