scl语言写模拟量 (用scl语言写模拟量转换程序)

博途---使用SCL语言编写模拟量输出转换程序

一、模拟量输出(AO)转换公式介绍

由于PLC能识别到的数值是电压信号或者电流信号,不能直接将电压信号或者电流信号显示到HMI上,所以就需要一个公式进行转换,转换成现场实际的信号值。模拟量输出转换公式主要是为了将实数值转换成PLC可以识别的模拟量电压信号或者电流信号,

模拟量输出(AO)转换公式为:Iv = [(Ov - Osl)*(Ish - Isl)/(Osh - Osl)] + Isl;其中Iv是INT型的换算结果,Ov是换算对象,Osh是换算结果的高限,Osl是换算结果的低限,Ish是换算对象的高限,Isl是换算对象的低限。换算对象与换算结果的关系如图1所示。

scl语言写模拟量,用scl语言写模拟量转换程序

图1 换算关系图

二、模拟量输出(AO)转换程序编写思路

本程序主要用到输入点(Input)有4个,输出点(Output)有2个,中间变量(Static---静态临时变量)有4个;程序输入输出变量表如图2所示;本程序设计可以根据现场实际情况选择0-20mA信号或者4-20mA信号,通过公式可以将工程量进行换算,同时还可以将mA信号值进行换算进行显示;

不需要输入模拟量值的上限和下限,在程序内部已经将其集成进去,只需要判断现场信号是0-20mA还是4-20mA,选择对应的信号即可。

scl语言写模拟量,用scl语言写模拟量转换程序

图2 变量表

三、模拟量输出(AO)转换程序设计

本次程序设计使用了西门子博途最新的版本TIA-V18,本次程序继续使用SCL语言进行编写,程序总览如图3所示。

scl语言写模拟量,用scl语言写模拟量转换程序

图3 程序总览

经过之前的模拟量输入(AI)程序编写经验,本次程序设计更加精简,取消了上下限报警程序,文章结尾处也把程序的源代码附上。

本次程序设计简洁明了,当#Set_mA(毫安信号选择)为TURE时,选择的信号模式是0-20mA信号输出,0-20mA在西门子品牌的PLC里所对应的工程量是0-27648,所以将工程量上下限值分别设定为27648与0;同时需要将毫安信号值的上下限设定为对应的20mA与0mA;根据模拟量输出(AO)转换公式编写转换程序;由于计算出的值是REAL类型的数据,而西门子输出到AO通道的值只能说INT类型的数据,所以加入了一个数据转换函数“REAL_TO_INT”,此函数的功能可以将REAL类型的数据转换成INT类型的数据;计算结果存储到Out_Value中,计算的mA信号值结果储存到Out_mA中;其中工程量上下限与毫安值上下限的变量为中间变量,对功能块进行调用时不需要设定。

当#Set_mA(毫安信号选择)为FALSE时,选择的信号模式是4-20mA信号输出,4-20mA在西门子品牌的PLC里所对应的工程量是5530-27648,所以将工程量上下限值分别设定为27648与5530;同时需要将毫安信号值的上下限设定为对应的20mA与4mA;根据模拟量输出(AO)转换公式编写转换程序;

四、程序仿真

将编写好的模拟量输入转换功能块命名为S_RTI,在主程序里进行调用,建立一些数据类型,将所有的输入输出引脚进行连接,启动仿真进行测试。

将信号设定为0-20mA,设定的工程量上下限为100和0,设定三个设定值,分别是0,50,100,对三个值进行分别测试,观察对应的工程量输出值与mA信号。仿真如图4所示。

scl语言写模拟量,用scl语言写模拟量转换程序

scl语言写模拟量,用scl语言写模拟量转换程序

scl语言写模拟量,用scl语言写模拟量转换程序

图4 0-20mA仿真

将信号设定为4-20mA,设定的工程量上下限为100和0,设定三个模拟量输入值,分别是0,50,100,对三个值进行分别测试,观察对应的工程量输出值与mA信号。仿真如图5所示。

scl语言写模拟量,用scl语言写模拟量转换程序

scl语言写模拟量,用scl语言写模拟量转换程序

scl语言写模拟量,用scl语言写模拟量转换程序

图8 4-20mA仿真

根据仿真结果,计算结果相对来说很准确。

程序源代码如下:

IF #Set_mA THEN

//模拟量(0-20mA)输出转换公式,对应的模拟量上下限为0-27648

#Ish := 27648;

#Isl := 0;

#mA_Osh := 20.0;

#mA_Osl := 0.0;

#Out_Value := REAL_TO_INT((#In_Value - #Osl) * (#Ish - #Isl) / (#Osh - #Osl)) + #Isl;

#Out_mA := ((#mA_Osh - #mA_Osl) * (#Out_Value - #Isl) / (#Ish - #Isl)) + #mA_Osl;

ELSE

//模拟量(4-20mA)输出转换公式,对应的模拟量上下限为5530-27648

#Ish := 27648;

#Isl := 5530;

#mA_Osh := 20.0;

#mA_Osl := 4.0;

#Out_Value := REAL_TO_INT((#In_Value - #Osl) * (#Ish - #Isl) / (#Osh - #Osl)) + #Isl;

#Out_mA := ((#mA_Osh - #mA_Osl) * (#Out_Value - #Isl) / (#Ish - #Isl)) + #mA_Osl;

END_IF;

不足之处还望海涵,请各界大佬多多批评指教!

仅供参考!