温度线性化程序说明
一、 功能说明
此程序是在兼容原有的梯形图非线性转换函数和模拟量输出通道DA实际值转换函数(将模拟量输出通道标准化DA值转换为模拟量输出通道实际DA值)的基础上,在底层驱动实现温度线性化和模拟量输出通道DA实际值转换,用户可根据需要自行选择梯形图转换函数或是底层驱动转换程序。
二、 占用的资源
输入:模拟量输入通道实际AD值寄存器D5000-D5015
AD转换增益(PGA)设置寄存器D5032-D5047
环温补偿AD值寄存器D5098
模拟量输出通道标准化DA值寄存器D5048-D5063
底层驱动温度线性化选择开关S960-S975
底层驱动模拟量输出通道DA实际值转换选择开关S976-S991
输出:温度值输出寄存器D5016-D5031
模拟量输出通道实际DA值寄存器D5064-D5079
三、 程序流程说明
底层温度线性化是根据用户接入的传感器类型(任意分度的热电偶和PT100)或标准信号和模拟量AD值在底层驱动中进行一系列处理实现线性转换,得到温度。底层模拟量输出通道DA值实际化是在底层将模拟量输出通道标准化DA值进行线性处理,映射为实际DA值。
主要函数有如下:
DA_4000_FUN: 标准化DA值0-4000转换为实际DA值
TEMP_FUN: 温度线性化函数
以下函数均是温度线性化函数TEMP_FUN所调用的。
AD_4000_FUN: 实现AD值转换为0-4000值
FDIV_FUN: 实现Y=B+(X-D)*(A-B)/(C-D)函数
MAX_0_FLOAT: 实现通道的零点量程值读取并将其转化为浮点数
ENTEMP_FUN: 环温补偿函数
ENT_SEAR_TAB: 查环温表子程序
SEAR_TAB: 查热电偶非线性表子程序
READ_TAB: 实现读取非线性表格的头两个字:温度间隔和段数
1. 底层温度线性化程序说明
底层温度线性化程序流程如下:
1)将传递过来的实际参数AD值(M0,M1)通过调用系统函数FSDT2_L转换为浮点数FLOAT_M1
2)根据传递过来的实际参数通道号值(M2)和用户给定的分度号值(读至M15)在FLASH中进行零点量程的寻址,并同时将通道号M2值赋给M14
根据用户接入的传感器类型或标准信号,PGA设置寄存器(即分度号)有以下几种取值:
0:表示接入的是K分度热电偶
1:表示接入的是E分度热电偶
2:表示接入的是S分度热电偶
3:表示接入的是B分度热电偶
4:表示接入的是PT100热电阻
5:表示接入的是标准信号
即用户接入某一种传感器,则其对应的PGA设置寄存器即被赋对应的分度号值。
寻址到零点量程后,调用MAX_0_FLOAT函数,实现通道的AD零点量程值读取并将其转化为浮点数。
MAX_0_FLOAT函数占用资源:M0,M1,R7,FLOAT_M2,FLOAT_M3及系统函数FSDT2_L
3)调用AD_4000_FUN函数实现AD值规划为0-4000值。
MAX_0_FLOAT函数占用资源:M0-M11,FLOAT_M1-FLOAT_M4及系统函数FSDT2_L
然后根据分度号值判断接入的是否为标准信号,是则将0-4000值存入对应的温度值输出寄存器D5016-D5031并返回此温度转换函数调用处,不是则继续往下执行。
4)调用MAX_0_FLOAT函数,实现通道的mV零点量程值读取并将其转化为浮点数,调用FDIV_FUN函数,将0-4000值转化为对应的mV值。
FDIV_FUN函数占用资源:M0-M11,FLOAT_M1-FLOAT_M4及系统函数FABP_L,FDIV_L,FMUL_L
5)判断分度号,若接入的为B分度热电偶和PT100热电阻则转入流程6),其余热电偶继续往下执行。保护之前转换得到的mV值。然后调用ENTEMP_FUN函数进行环温补偿。读取环温AD值并将其转换为对应的mV值,再转换为对应的R值,调用ENT_SEAR_TAB函数,查环温表得到当前对应的环温,再查对应的分度号的热电偶非线性表,得到当前环温对应的mV值,将此mV值与之前保护的mV值相加得到总mV值。
6)根据分度号查对应的非线性表,按mV值索引。调用SEAR_TAB函数查非线性表子程序得到对应的温度。判断分度号,若接入的为B分度热电偶和PT100热电阻,则将得到的温度再加上起始温度(依次为60和-30)即为对应的温度。将温度存入对应的温度值输出寄存器D5016-D5031。返回此温度转换函数调用处。
2. 底层模拟量输出通道DA实际值转换程序说明
DA_4000_FUN: 标准化DA值0-4000转换为实际DA值
DA_4000_FUN程序流程如下:

根据传递过来的实际参数通道号值(M2),读取对应模拟量输出通道标准化DA值寄存器D5048-D5063的值并转换为浮点数,在FLASH中进行DA零点量程的寻址,调用MAX_0_FLOAT函数,实现通道的DA零点量程值读取并将其转化为浮点数。调用FDIV_FUN函数将标准化DA值0-4000转换为实际DA值,并将其存入对应的模拟量输出通道实际DA值寄存器D5064-D5079。返回此函数调用处。
四、 用户使用说明
1.底层温度线性化使用说明
用户可根据需要选择热电偶线性化函数或是底层驱动得到温度。选择热电偶线性化函数仍如原来一样实现,此处重点讲如何使用底层驱动线性化得到温度。用户使用底层驱动温度线性化程序得到某一通道的实际温度,只需闭合该通道对应的底层驱动温度线性化选择开关即可。
根据用户接入的传感器类型,PGA设置寄存器(即分度号)有以下几种取值:
0:表示接入的是K分度热电偶
1:表示接入的是E分度热电偶
2:表示接入的是S分度热电偶
3:表示接入的是B分度热电偶
4:表示接入的是PT100热电阻
5:表示接入的是标准信号
即用户接入某一种传感器,则其对应的PGA设置寄存器即被赋对应的分度号值。
用户使用底层驱动线性化得到某一通道的实际温度,只需闭合该通道对应的底层驱动温度线性化选择开关,并在梯形图中给该通道对应的PGA设置寄存器赋接入的传感器对应的分度号值,即可得到该通道对应的温度。
具体步骤如下:
1. 将任意分度的热电偶或PT100热电阻接入PLC
此处举例将E分度热电偶接入第二通道,K分度热电偶接入第四通道。
2. 用户在梯形图中编程,闭合对应的底层驱动温度线性化选择开关,并将分度号值赋给对应的通道PGA设置寄存器
第二通道对应的底层驱动温度线性化选择开关为S961
第四通道对应的底层驱动温度线性化选择开关为S963
E分度对应的分度号值为1,第二通道对应的PGA设置寄存器为D5033
K分度对应的分度号值为0,第四通道对应的PGA设置寄存器为D5035
则用户在梯形图中输入以下语句:
3.用户将梯形图程序写入PLC并运行PLC。
4. 用户在梯形图中监控其对应的温度值输出寄存器的值,即是对应通道的测量温度值。
监控界面如下:
做实验时,没有接入热电偶,而是以直流电位差计来模拟热电偶。因电位差计个数有限,在同一时间段只能接入一个通道。现以第四通道为例进行说明:
D5003中数据为第四通道的AD值, D5019为第四通道对应的温度值。D5098为环温补偿AD值,此时为316。电位差计输入2mV,此时对应的AD值为137。D5019中数值为609,因为温度输出寄存器中的值均由实际温度测量值扩大了10倍,所以实际温度测量值为609除以10,即实际温度测量值为60.9度。即模拟信号为2mV时,对应的实际温度测量值为60.9度。用户要对第四通道的温度值进行PID运算等任何处理,只需对D5019进行处理即可。
注意:若对应的分度号为5,则表示接入的是标准信号,温度值输出寄存器D5016-D5031存的是对应的AD值规划为0-4000的值。
用户要得到对应的测量温度值,只需简单的两条语句即可实现,较之在梯形图中使用热电偶线性化函数实现非线性转换,对用户来说,更简单更便捷。
2.底层模拟量输出通道DA实际值转换使用说明
用户可根据需要选择梯形图中线性化函数或是底层驱动线性化得到模拟量输出通道实际DA值。选择梯形图中线性化函数仍如原来一样实现,此处重点讲如何使用底层驱动线性化得到模拟量输出通道实际DA值。用户使用底层驱动线性化得到某一通道的实际DA值,只需闭合该通道对应的模拟量输出通道DA实际值转换选择开关即可。
例:用户对第四通道DA输出选择底层驱动线性化得到模拟量输出通道实际DA值,第四通道对应的底层驱动温度线性化选择开关为S979,则用户在梯形图中输入以下语句:
用户将梯形图程序写入PLC并运行PLC后,模拟量输出通道DA值已完成由标准值到实际值的转换,用户对标准化DA值改变,即可改变实际DA值,进而改变模拟量输出值。
但是若用户选择了底层DA值线性化得到实际DA值后,在同一台PLC上不能再使用梯形图线性化转换函数得到实际DA值,因为此时以D5600开始的零点量程寄存器均已被释放。
五、 移植说明
1.温度线性化程序移植
温度线性化程序的移植只需在USER_SCAN中调用TEMP_FUN函数。
该函数有两个入口参数:M0-M1
M2
移植时,首先需在初始化状态对各通道对应的选择开关进行清零,然后在SCAN中读取该通道对应的底层驱动温度线性化选择开关的状态,其对应的选择开关闭合后,调用TEMP_FUN函数,将某通道的模拟量输入AD值赋给M0-M1,对应的通道号(0-15)赋给M2即可。
2.模拟量输出通道DA实际值转换(DA值线性化)程序移植
模拟量输出通道DA实际值转换(DA值线性化)程序的移植只需在USER_SCAN中调用DA_4000_FUN函数。该函数无入口参数。
移植时,首先需在初始化状态对各通道对应的选择开关进行清零,然后在SCAN中读取该通道对应的模拟量输出通道DA实际值转换选择开关的状态,其对应的选择开关闭合后,调用DA_4000_FUN函数即可。