chatGPT_小控 发表于 2023-3-31 21:40
好的,以下是一个采用LAD语言编写的西门子1500 PLC模拟量转化程序,包括工程量的输入值、范围报警和转换后 ...
请转化成SCL的语言并且在Input,Output等输入变量,方便多次调用
好的,以下是使用SCL语言编写的西门子1500 PLC模拟量转换程序,包括工程量的输入值、范围报警和转换后工程量值的输出。在主程序中可以多次调用该函数,方便实现模拟量的转换。FUNCTION_BLOCK AnalogConversionTITLE = \\\'Analog Conversion\\\'VERSION : INT := 1; // 版本号// 输入参数IN_PARA : REAL; // 实际的模拟量值LOW_LIMIT : REAL; // 工程量下限HIGH_LIMIT : REAL; // 工程量上限END_STRUCT;// 输出参数OUT_PARA : REAL; // 转化后的工程量值ALARM_HIGH_LIMIT : BOOL; // 若超出上限,则为真ALARM_LOW_LIMIT : BOOL; // 若低于下限,则为真END_FUNCTION_BLOCK// FB实现BEGIN // 限幅处理模拟量输入值,确保其在范围内 VAR_INPUT.rawValue := MAX(MIN(IN_PARA, 32767), 0); // 计算极差及上下限值 delta := HIGH_LIMIT - LOW_LIMIT; highLimit := HIGH_LIMIT - delta * 0.05; lowLimit := LOW_LIMIT + delta * 0.05; // 转换为工程量值并输出 engValue := (rawValue - 0) * delta / (32767 - 0) + LOW_LIMIT; OUT_PARA := engValue; // 检测是否超出上下限,并输出报警信号 IF engValue >= highLimit THEN ALARM_HIGH_LIMIT := TRUE; // 超出高限值,输出高限报警信号 ELSE ALARM_HIGH_LIMIT := FALSE; END_IF IF engValue <= lowLimit THEN ALARM_LOW_LIMIT := TRUE; // 低于低限值,输出低限报警信号 ELSE ALARM_LOW_LIMIT := FALSE; END_IFEND_FUNCTION_BLOCK在使用此程序之前,您需要根据您的实际情况修改参数 LOW_LIMIT、HIGH_LIMIT 和 量程范围。
chatGPT_小控 发表于 2023-3-31 21:44
好的,以下是使用SCL语言编写的西门子1500 PLC模拟量转换程序,包括工程量的输入值、范围报警和转换后工程 ...
请在10#的程序中加入工程量的上下限值
好的,以下是在10#程序中加入工程量上下限值的修改。请注意,输入参数中新增了LOWER_LIMIT和UPPER_LIMIT,用于设定工程量的上下限;输出参数中新增了ALARM_HIGH_LIMIT和ALARM_LOW_LIMIT,用于在工程量超出上下限时输出报警信号。同时,请根据实际情况修改相关参数值。FUNCTION_BLOCK AnalogConversion
TITLE = \'Analog Conversion\'
VERSION : INT := 1; // 版本号
// 输入参数
IN_PARA : STRUCT
AI : INT; // 模拟量通道IW数值
LOWER_LIMIT : REAL; // 工程量下限
UPPER_LIMIT : REAL; // 工程量上限
END_STRUCT;
// 输出参数
OUT_PARA : STRUCT
AO : REAL; // 浮点数工程量
ALARM_HIGH_LIMIT : BOOL; // 若超出上限,则为真
ALARM_LOW_LIMIT : BOOL; // 若低于下限,则为真
END_STRUCT;
VAR_INPUT
IN_PARA : IN_PARA;
END_VAR
VAR_OUTPUT
OUT_PARA : OUT_PARA;
END_VAR
VAR_TEMP
Temp : REAL; // 临时变量
END_VAR
VAR
delta : REAL; // 上下限差值
highLimit : REAL; // 工程量上限(考虑5%余量)
lowLimit : REAL; // 工程量下限(考虑5%余量)
engValue : REAL; // 工程量值
END_VAR
// FB实现
BEGIN
// 将IW数值进行归一化处理到0-1范围内
Temp := ((IN_PARA.AI - 0) / (32767 - 0));
// 计算极差及上下限值
delta := IN_PARA.UPPER_LIMIT - IN_PARA.LOWER_LIMIT;
highLimit := IN_PARA.UPPER_LIMIT - delta * 0.05;
lowLimit := IN_PARA.LOWER_LIMIT + delta * 0.05;
// 根据范围计算浮点数工程量
engValue := IN_PARA.LOWER_LIMIT + (Temp * delta);
OUT_PARA.AO := engValue;
// 检测是否超出上下限,并输出报警信号
IF engValue >= highLimit THEN
OUT_PARA.ALARM_HIGH_LIMIT := TRUE; // 超出高限值,输出高限报警信号
ELSE
OUT_PARA.ALARM_HIGH_LIMIT := FALSE;
END_IF
IF engValue <= lowLimit THEN
OUT_PARA.ALARM_LOW_LIMIT := TRUE; // 低于低限值,输出低限报警信号
ELSE
OUT_PARA.ALARM_LOW_LIMIT := FALSE;
END_IF
END_FUNCTION_BLOCK
chatGPT_小控 发表于 2023-3-31 21:47
好的,以下是在10#程序中加入工程量上下限值的修改。请注意,输入参数中新增了LOWER_LIMIT和UPPER_LIMIT, ...
把这个程序写在FB块中,不需要在DB块中建立变量,并且符合西门子博图SCL编程规范
好的,以下是符合西门子博图SCL编程规范的模拟量转化程序,直接写在FB块中,不需要在DB块中建立变量。请根据实际情况修改相关参数值。
FUNCTION_BLOCK AnalogConversion
TITLE = \'Analog Conversion\'
VERSION : INT := 1; // 版本号
// 输入参数
IN_PARA : STRUCT
AI : INT; // 模拟量通道IW数值
LOWER_LIMIT : REAL; // 工程量下限
UPPER_LIMIT : REAL; // 工程量上限
END_STRUCT;
// 输出参数
OUT_PARA : STRUCT
AO : REAL; // 浮点数工程量
ALARM_HIGH_LIMIT : BOOL; // 若超出上限,则为真
ALARM_LOW_LIMIT : BOOL; // 若低于下限,则为真
END_STRUCT;
VAR_TEMP
Temp : REAL; // 临时变量
delta : REAL; // 上下限差值
highLimit : REAL; // 工程量上限(考虑5%余量)
lowLimit : REAL; // 工程量下限(考虑5%余量)
engValue : REAL; // 工程量值
END_VAR
// FB实现
BEGIN
// 将IW数值进行归一化处理到0-1范围内
Temp := ((IN_PARA.AI - 0) / (32767 - 0));
// 计算极差及上下限值
delta := IN_PARA.UPPER_LIMIT - IN_PARA.LOWER_LIMIT;
highLimit := IN_PARA.UPPER_LIMIT - delta * 0.05;
lowLimit := IN_PARA.LOWER_LIMIT + delta * 0.05;
// 根据范围计算浮点数工程量
engValue := IN_PARA.LOWER_LIMIT + (Temp * delta);
OUT_PARA.AO := engValue;
// 检测是否超出上下限,并输出报警信号
IF engValue >= highLimit THEN
OUT_PARA.ALARM_HIGH_LIMIT := TRUE; // 超出高限值,输出高限报警信号
ELSE
OUT_PARA.ALARM_HIGH_LIMIT := FALSE;
END_IF
IF engValue <= lowLimit THEN
OUT_PARA.ALARM_LOW_LIMIT := TRUE; // 低于低限值,输出低限报警信号
ELSE
OUT_PARA.ALARM_LOW_LIMIT := FALSE;
END_IF
END_FUNCTION_BLOCK