me:用博图FB块的编写一个模拟量转换程序
me:用博图FB的编写一个模拟量转换程序1.要求使用scl语言
2.要求有量程上限、下限设置,
3.要求高高限、高限、低限、低低限报警和报警输出
4.要求符合博图编程规范
me:用博图FB的编写一个模拟量转换程序
1.要求使用scl语言
2.要求有量程上限、下限设置,
3.要求高高限、高限、低限、低低限报警和报警输出
4.要求符合博图编程规范 下面是一个示例程序,用于模拟量转换。请注意,此程序仅供参考,实际应用需要根据具体需求进行修改和优化。
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
页:
[1]