博途---使用SCL语言编写模拟量输出转换程序
一、模拟量输出(AO)转换公式介绍
由于PLC能识别到的数值是电压信号或者电流信号,不能直接将电压信号或者电流信号显示到HMI上,所以就需要一个公式进行转换,转换成现场实际的信号值。模拟量输出转换公式主要是为了将实数值转换成PLC可以识别的模拟量电压信号或者电流信号,
模拟量输出(AO)转换公式为:Iv = [(Ov - Osl)*(Ish - Isl)/(Osh - Osl)] + Isl;其中Iv是INT型的换算结果,Ov是换算对象,Osh是换算结果的高限,Osl是换算结果的低限,Ish是换算对象的高限,Isl是换算对象的低限。换算对象与换算结果的关系如图1所示。

图1 换算关系图
二、模拟量输出(AO)转换程序编写思路
本程序主要用到输入点(Input)有4个,输出点(Output)有2个,中间变量(Static---静态临时变量)有4个;程序输入输出变量表如图2所示;本程序设计可以根据现场实际情况选择0-20mA信号或者4-20mA信号,通过公式可以将工程量进行换算,同时还可以将mA信号值进行换算进行显示;
不需要输入模拟量值的上限和下限,在程序内部已经将其集成进去,只需要判断现场信号是0-20mA还是4-20mA,选择对应的信号即可。

图2 变量表
三、模拟量输出(AO)转换程序设计
本次程序设计使用了西门子博途最新的版本TIA-V18,本次程序继续使用SCL语言进行编写,程序总览如图3所示。

图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所示。



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



图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;
不足之处还望海涵,请各界大佬多多批评指教!
仅供参考!