西门子PLC计算多台设备运行时间最短的设备
编写一个西门子1500PLC程序计算多台设备运行时间最短的设备的程序,信息如下1、编程软件为博图V15
2、用SCL语言编程
3、要符合西门子博图的编程规则
4、要分别计算多台设备的累计运行时间,然后进行比较。
5、时间格式是年-月-日-时-分-秒 下面是一个可能的解决方案,这是一个简单的示例程序,用于计算两个设备的累计运行时间并比较哪个设备更短。注意,你需要根据实际情况修改程序。
FUNCTION_BLOCK FB_Device_Time
TITLE = \'设备运行时间\'
VAR_INPUT
bReset : BOOL; // 重置计时器
bStart : BOOL; // 开始计时
bStop : BOOL; // 停止计时
nDeviceNumber : INT; // 设备编号
END_VAR
VAR_OUTPUT
nHours : INT; // 累计小时数
nMinutes : INT; // 累计分钟数
nSeconds : INT; // 累计秒数
END_VAR
VAR_IN_OUT
dElapsedTime : TIME; // 累计时间
dLastStartTime : DATE_AND_TIME := T#0S; // 上次开始计时时间
END_VAR
VAR_TEMP
nTempHours : INT; // 临时小时数
nTempMinutes : INT; // 临时分钟数
nTempSeconds : INT; // 临时秒数
dTimeDiff : TIME; // 时间差
bIsRunning : BOOL; // 设备是否在运行
END_VAR
// 初始化变量
dLastStartTime := T#0S;
dElapsedTime := T#0S;
// 判断设备是否在运行
bIsRunning := bStart AND NOT bStop;
// 计算时间差
IF bReset THEN // 如果正在重置计时器
dElapsedTime := T#0S;
ELSEIF bIsRunning THEN // 如果设备正在运行
IF dLastStartTime = T#0S THEN // 如果是第一次开始计时
dLastStartTime := DATE_AND_TIME_TO_TIME(TOD); // 记录当前时间
END_IF;
dTimeDiff := TIME_TO_DATE_AND_TIME(TOD) - dLastStartTime; // 计算时间差
dElapsedTime := dElapsedTime + dTimeDiff; // 累加时间差到累计时间
dLastStartTime := TIME_TO_DATE_AND_TIME(TOD); // 更新上次开始计时时间
END_IF;
// 将累计时间转换为小时、分钟、秒
nTempHours := WORD_TO_INT(dElapsedTime / T#1H);
dElapsedTime := dElapsedTime - (nTempHours * T#1H);
nTempMinutes := WORD_TO_INT(dElapsedTime / T#1M);
dElapsedTime := dElapsedTime - (nTempMinutes * T#1M);
nTempSeconds := WORD_TO_INT(dElapsedTime / T#1S);
// 输出结果
nHours := nTempHours;
nMinutes := nTempMinutes;
nSeconds := nTempSeconds;
你可以将上面的函数块复制到程序中,然后创建两个实例来分别计算每个设备的运行时间。然后,你可以使用比较指令(如 STL 的 `SMALL` 指令)来比较两个设备的累计运行时间,以确定哪个设备的运行时间更短。 上面的程序错误太多了,重写写一段吧。 好的,下面是一个更完整、更可靠的程序,可以计算多台设备的运行时间,并找出最短的设备。
FUNCTION_BLOCK FB_DeviceTime
TITLE = \'设备运行时间\'
VAR_INPUT
bReset : BOOL; // 重置计时器
bStart : BOOL; // 开始计时
bStop : BOOL; // 停止计时
nDeviceNumber : INT; // 设备编号
END_VAR
VAR_OUTPUT
nHours : INT; // 累计小时数
nMinutes : INT; // 累计分钟数
nSeconds : INT; // 累计秒数
END_VAR
VAR_IN_OUT
dElapsedTime : TIME; // 累计时间
dLastStartTime : DATE_AND_TIME := T#0S; // 上次开始计时时间
END_VAR
VAR_TEMP
bIsRunning : BOOL := FALSE; // 设备是否在运行
END_VAR
// 初始化变量
dLastStartTime := T#0S;
dElapsedTime := T#0S;
// 判断设备是否在运行
bIsRunning := bStart AND NOT bStop;
// 计算时间差
IF bReset THEN // 重置计时器
dElapsedTime := T#0S;
ELSEIF bIsRunning THEN // 设备正在运行
IF dLastStartTime = T#0S THEN // 如果是第一次开始计时
dLastStartTime := DATE_AND_TIME_TO_TIME(TOD);
END_IF;
dElapsedTime := dElapsedTime + (TIME_TO_DATE_AND_TIME(TOD) - dLastStartTime);
dLastStartTime := TIME_TO_DATE_AND_TIME(TOD);
END_IF;
// 将累计时间转换为小时、分钟、秒
nHours := WORD_TO_INT(dElapsedTime / T#1H);
dElapsedTime := dElapsedTime - (nHours * T#1H);
nMinutes := WORD_TO_INT(dElapsedTime / T#1M);
dElapsedTime := dElapsedTime - (nMinutes * T#1M);
nSeconds := WORD_TO_INT(dElapsedTime / T#1S);
END_FUNCTION_BLOCK
要计算多个设备的运行时间并找到最短的设备,你需要创建一个数组来存储每个设备的运行时间,并在主程序中使用循环来遍历所有设备。下面是一个示例程序来计算三个设备的运行时间,并找到其中运行时间最短的设备:
PROGRAM MAIN
VAR
aDevices : ARRAY OF FB_DeviceTime; // 数组,存储每个设备的运行时间
nDeviceMinRunTime : INT := -1; // 最短运行时间的设备编号
nMinRunTime : INT := 9999999; // 最短运行时间(初始值大于任何可能值)
i : INT; // 循环计数器
END_VAR
// 计算每个设备的运行时间
FOR i := 1 TO 3 DO
aDevices(bReset := FALSE, bStart := TRUE, bStop := FALSE, nDeviceNumber := i);
END_FOR
// 停止某个设备,仅用于测试
// aDevices(bReset := FALSE, bStart := FALSE, bStop := TRUE, nDeviceNumber := 2);
// 遍历所有设备,找到最短运行时间的设备
FOR i := 1 TO 3 DO
IF aDevices.nHours * 3600 + aDevices.nMinutes * 60 + aDevices.nSeconds < nMinRunTime THEN
nDeviceMinRunTime := i;
nMinRunTime := aDevices.nHours * 3600 + aDevices.nMinutes * 60 + aDevices.nSeconds;
END_IF
END_FOR
// 输出结果
IF nDeviceMinRunTime <> -1 THEN
PRINT \"Device \" + STRING(nDeviceMinRunTime) + \" has the shortest run time of \" +
STRING(nMinRunTime / 3600) + \" hours, \" + STRING((nMinRunTime MOD 3600) / 60) + \" minutes, and \" +
STRING(nMinRunTime MOD 60) + \" seconds.\";
ELSE
PRINT \"No devices running.\";
END_IF
// 计算某个设备的运行时间
// aDevices(bReset := FALSE, bStart := TRUE, bStop := FALSE, nDeviceNumber := 1);
END_PROGRAM
注意,在上面的示例程序中,我们将数组大小设置为3,即计算3个设备的运行时间。你需要根据实际情况修改数组大小,并在循环中遍历所有设备。此外,你还需要根据自己的需求调整输出结果。
页:
[1]