我们在代码分析中详细讲解这两个程序。第四节 代码分析与例程讲解第一部分 数据转换程序首先我们介绍一下为什么要进行数据的转换。原因就是我们从变送器传送到采集模块的信号为电压信号或电流信号,这些信号经过模数转换程序把原来连续的物理量转换为可被PLC内存存储的离散的数字量。内存中的数字量的形式也不是我们平常使用的格式,内存中一般为16位的二进制数据,而我们在显示设备上需要的是十进制的数值。所以就必须通过转换程序把二进制数值转换为我们需要的十进制数值。下面我们结合代码介绍数据转换程序一、PLC模拟量模块转换程序1、程序代码TITLE=PLC模块数据转换程序Network 1 // 采样 :这段代码主要作用是把16位(一个字)的数据转换为实数类型的数据,并且启动计数器和累加器LD SM0.0ITD LW0, LD26 //16整数转换为32位整数DTR LD26, LD30 //32位整数转换为实数+R LD30, LD12 //启动累加器INCW LW16 //启动计数器Network 2 // 滤波与转换:这段代码通过一系列运算进行数据滤波,并且将数值转换为可读性很好// 的十进制数据。同时累加器与计数器归零便于下一次采集使用。LDW>= LW16, LW6 //比较当前采样次数是否等于预制采样次数ITD LW6, LD42DTR LD42, LD46 //将采样次数有16位整数转换位32位实数MOVR LD12, LD18/R LD46, LD18 //求出采样平均值MOVR 0.0, LD12 //清空累加器MOVW +0, LW16 //清空计数器-R 6400.0, LD18*R LD8, LD18 //转换为十进制数值+R LD2, LD18 //修正Network 3 LD SM0.0MOVR LD18, LD22 //输出Network 4 LD SM0.0 //返回主程序CRET我们可以注意到,这里所使用的内存全部是L内存的。我们这样做的目的是想把这段程序作为一个可以被其他程序使用的子程序,所以使用的是局部变量。子程序容易移动;我们可以单独挑出一个功能,并将其复制至其他程序中,而无需或很少需要重复操作。注释:V内存的使用限制子程序的可移植性,因为一个程序的V内存地址赋值可能与另一个程序中的赋值发生冲突。相反,将局部变量表用于所有地址赋值的子程序却很容易移动,因为不必担心会出现编址冲突。(详细说明参照西门子公司编程工具帮助文件)2、变量说明
输入:需要转换的采集量(16位整数)修正值:对转换后的数据做修正(实数)采样次数:采样的次数(16位整数)比例值:通过另外一个子程序计算出来的数值(实数)累加器:一个临时存储累加值的内存(实数)计数器:一个临时存储当前采样次数的地址(16位整数)Temp_hits_av:临时存储输出值的地址(实数)输出:我们需要的结果(实数) |
3、求比例值的子程序程序代码:TITLE=求比例值的子程序Network 1 // 根据实际值的上下限和 PLC采集值的上下限,计算出实际值与采集值的比例LD SM0.0MOVR LD0, LD20-R LD4, LD20 //实际值上限减去实际值下限,求出差值1MOVR LD8, LD24-R LD12, LD24 //采集值上限减去采集值下限,求出差值2MOVR LD20, LD16/R LD24, LD16 //差值1除以差值2求出比例值Network 2 LD SM0.0CRET &nbs