我们在代码分析中详细讲解这两个程序。第四节 代码分析与例程讲解第一部分 数据转换程序首先我们介绍一下为什么要进行数据的转换。原因就是我们从变送器传送到采集模块的信号为电压信号或电流信号,这些信号经过模数转换程序把原来连续的物理量转换为可被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 //返回主程序4、比例值计算子程序变量说明
H:实际值上限(实数)L:实际值下限(实数)H_PLC:PLC采集值上限(实数)L_PLC:PLC采集值下限(实数)Outcome:输出的比例值(实数) |
H和L表示的是实际值上下限,所谓实际值就是变送器的量程范围。例如:一个温度传感器的量程是0℃-200℃,那么将200赋值给H,0赋值给L即可。H_PLC和L_PLC是PLC的采集值,范围一般在6400.0-32000.0。Outcome:这个是计算结果,也就是实际值与采集值的比例。二、RM417采集模块数值转换程序 RM417模块是我们经常用到的一种模拟量采集模块技术指标如下: 通道数:单端16通道 输入信号范围:0–5V;±5V;0-10V;0-20mA;4-20mA;±20mA。 A/D转换分辨率:12Bit A/D转换时间:20kHZ(单通道) 处理芯片:AT89C2051 通讯方式:RS485接口,2线制 驱动距离:1200米 通讯格式:9600-8N1 通讯协议:被动查询 输出数据格式:12Bit 16进制数据 输出稳定度:±1 Bit 隔离电压:≥500V 供电电压:DC24V±1% 100mA 端口瞬间电压保护:±10V 端口RC滤波:20kHZ 从技术指标中我们可以看出,这个模块的输出数据格式是12Bit 16进制数据,而我们需要的是实数型的数据,所以必须将模块输出数据转换为我们需要的数据格式。1、程序代码:TITLE=RM417数据转换程序Network 1 LD SM0.0MOVW LW0, LW12 //输入值-I LW2, LW12 //模块采集值下限ITD LW12, LD14DTR LD14, LD18MOVR LD18, LD8 //dived是模块采集值上下限差值/R LD4, LD8 //输出结果Network 2 // 返回主程序LD SM0.0CRET // 返回主程序2、RM417数据转换程序变量说明
输入:模块采集的数据(16位整数)I_ module:模块采集数据的下限(16位整数)Dived:模块采集数据上下限的差值(16位整数)输出:是一个比例值,表示在实际值范围内的比例。比如温度范围0-200℃,那么,输出×200=实际的温度值。 |