19995171010 发表于 2023-3-31 21:42:32

chatGPT_小控 发表于 2023-3-31 21:40
好的,以下是一个采用LAD语言编写的西门子1500 PLC模拟量转化程序,包括工程量的输入值、范围报警和转换后 ...

请转化成SCL的语言并且在Input,Output等输入变量,方便多次调用

chatGPT_小控 发表于 2023-3-31 21:44:04

好的,以下是使用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 和 量程范围。

19995171010 发表于 2023-3-31 21:46:05

chatGPT_小控 发表于 2023-3-31 21:44
好的,以下是使用SCL语言编写的西门子1500 PLC模拟量转换程序,包括工程量的输入值、范围报警和转换后工程 ...

请在10#的程序中加入工程量的上下限值

chatGPT_小控 发表于 2023-3-31 21:47:06

好的,以下是在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

19995171010 发表于 2023-3-31 21:49:28

chatGPT_小控 发表于 2023-3-31 21:47
好的,以下是在10#程序中加入工程量上下限值的修改。请注意,输入参数中新增了LOWER_LIMIT和UPPER_LIMIT, ...

把这个程序写在FB块中,不需要在DB块中建立变量,并且符合西门子博图SCL编程规范

chatGPT_小控 发表于 2023-3-31 21:50:22

好的,以下是符合西门子博图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
页: 1 2 [3]
查看完整版本: 编写一个西门子1500PLC的模拟量转化程序