最新提现记录

  • 恭喜 admin 于 2023-6-6 15:17 成功提现 500元
  • 恭喜 admin 于 2023-5-3 09:45 成功提现 400元

me:用博图FB块的编写一个模拟量转换程序

[复制链接]
查看1891 | 回复2 | 2023-4-2 16:55:00 | 显示全部楼层 |阅读模式
me:用博图FB的编写一个模拟量转换程序
1.要求使用scl语言
2.要求有量程上限、下限设置,
3.要求高高限、高限、低限、低低限报警和报警输出
4.要求符合博图编程规范

回复

使用道具 举报

zygzs | 2023-4-2 16:56:00 | 显示全部楼层

me:用博图FB的编写一个模拟量转换程序
1.要求使用scl语言
2.要求有量程上限、下限设置,
3.要求高高限、高限、低限、低低限报警和报警输出
4.要求符合博图编程规范
回复

使用道具 举报

chatGPT_小柔 | 2023-4-2 16:56:34 | 显示全部楼层
下面是一个示例程序,用于模拟量转换。请注意,此程序仅供参考,实际应用需要根据具体需求进行修改和优化。

[code]
FUNCTION_BLOCK AnalogConversion
VAR_INPUT
    rawValue: REAL; //输入的原始模拟量
    maxRange: REAL := 100.0; //量程上限,默认为100
    minRange: REAL := 0.0; //量程下限,默认为0
    highHighLimit: REAL := 90.0; //高高限,默认为90
    highLimit: REAL := 80.0; //高限,默认为80
    lowLimit: REAL := 20.0; //低限,默认为20
    lowLowLimit: REAL := 10.0; //低低限,默认为10
END_VAR
VAR_OUTPUT
    convertedValue: REAL; //转换后的模拟量
    alarmOutput: BOOL; //报警输出信号(TRUE表示触发报警)
END_VAR
VAR
    alarmCount: INT := 0; //连续触发报警的次数
    alarmHoldTime: INT := 0; //报警保持时间计数器
    alarmHHLimitReached: BOOL := FALSE; //高高限是否已触发报警
    alarmHLimitReached: BOOL := FALSE; //高限是否已触发报警
    alarmLLimitReached: BOOL := FALSE; //低限是否已触发报警
    alarmLlLimitReached: BOOL := FALSE; //低低限是否已触发报警
END_VAR
VAR_TEMP
    scaledValue: REAL; //按比例缩放后的模拟量值
END_VAR

//初始化报警状态
IF rawValue > highHighLimit THEN
    alarmHHLimitReached := TRUE;
ELSIF rawValue > highLimit THEN
    alarmHLimitReached := TRUE;
ELSIF rawValue < lowLimit THEN
    alarmLLimitReached := TRUE;
ELSIF rawValue < lowLowLimit THEN
    alarmLlLimitReached := TRUE;
END_IF

//将原始模拟量按比例缩放到0-100的范围内
scaledValue := (rawValue - minRange) / (maxRange - minRange) * 100;

//判断报警状态
IF scaledValue > 100 THEN
    //超过范围上限
    convertedValue := maxRange;
    alarmOutput := TRUE;
    alarmCount := alarmCount + 1;
ELSIF scaledValue < 0 THEN
    //低于范围下限
    convertedValue := minRange;
    alarmOutput := TRUE;
    alarmCount := alarmCount + 1;
ELSE
    //在范围内
    convertedValue := scaledValue / 100 * (maxRange - minRange) + minRange;
   
    IF alarmHHLimitReached THEN
        //高高限已经触发报警
        IF scaledValue < highLimit THEN
            //报警解除
            alarmHHLimitReached := FALSE;
            alarmOutput := FALSE;
            alarmCount := 0;
            alarmHoldTime := 0;
        ELSE
            //保持报警输出
            alarmOutput := TRUE;
            alarmCount := alarmCount + 1;
            alarmHoldTime := alarmHoldTime + 1;
        END_IF
    ELSEIF alarmHLimitReached THEN
        //高限已经触发报警
        IF scaledValue < highLimit THEN
            //报警解除
            alarmHLimitReached := FALSE;
            alarmOutput := FALSE;
            alarmCount := 0;
            alarmHoldTime := 0;
        ELSEIF scaledValue > highHighLimit THEN
            //高高限触发报警
            alarmHHLimitReached := TRUE;
            alarmOutput := TRUE;
            alarmCount := alarmCount + 1;
            alarmHoldTime := alarmHoldTime + 1;
        ELSE
            //保持报警输出
            alarmOutput := TRUE;
            alarmCount := alarmCount + 1;
            alarmHoldTime := alarmHoldTime + 1;
        END_IF
    ELSEIF alarmLLimitReached THEN
        //低限已经触发报警
        IF scaledValue > lowLimit THEN
            //报警解除
            alarmLLimitReached := FALSE;
            alarmOutput := FALSE;
            alarmCount := 0;
            alarmHoldTime := 0;
        ELSEIF scaledValue < lowLowLimit THEN
            //低低限触发报警
            alarmLlLimitReached := TRUE;
            alarmOutput := TRUE;
            alarmCount := alarmCount + 1;
            alarmHoldTime := alarmHoldTime + 1;
        ELSE
            //保持报警输出
            alarmOutput := TRUE;
            alarmCount := alarmCount + 1;
            alarmHoldTime := alarmHoldTime + 1;
        END_IF
    ELSEIF alarmLlLimitReached THEN
        //低低限已经触发报警
        IF scaledValue > lowLimit THEN
            //报警解除
            alarmLlLimitReached := FALSE;
            alarmOutput := FALSE;
            alarmCount := 0;
            alarmHoldTime := 0;
        ELSE
            //保持报警输出
            alarmOutput := TRUE;
            alarmCount := alarmCount + 1;
            alarmHoldTime := alarmHoldTime + 1;
        END_IF
    ELSE
        //没有触发报警
        IF scaledValue > highHighLimit THEN
            //高高限触发报警
            alarmHHLimitReached := TRUE;
            alarmOutput := TRUE;
            alarmCount := 1;
            alarmHoldTime := 1;
        ELSIF scaledValue > highLimit THEN
            //高限触发报警
            alarmHLimitReached := TRUE;
            alarmOutput := TRUE;
            alarmCount := 1;
            alarmHoldTime := 1;
        ELSIF scaledValue < lowLowLimit THEN
            //低低限触发报警
            alarmLlLimitReached := TRUE;
            alarmOutput := TRUE;
            alarmCount := 1;
            alarmHoldTime := 1;
        ELSIF scaledValue < lowLimit THEN
            //低限触发报警
            alarmLLimitReached := TRUE;
            alarmOutput := TRUE;
            alarmCount := 1;
            alarmHoldTime := 1;
        ELSE
            //没有触发报警
            alarmOutput := FALSE;
            alarmCount := 0;
            alarmHoldTime := 0;
        END_IF
    END_IF
END_IF

//检查连续报警次数和持续时间
IF alarmCount >= 3 AND alarmHoldTime >= 5 THEN
    //连续触发报警超过3次且已持续5个扫描周期,认为报警已确认
    alarmOutput := TRUE;
ELSE
    alarmOutput := FALSE;
END_IF

END_FUNCTION_BLOCK
[/code]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则