最新提现记录

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

西门子PLC计算多台设备运行时间最短的设备

[复制链接]
查看2337 | 回复3 | 2023-3-31 13:57:05 | 显示全部楼层 |阅读模式
编写一个西门子1500PLC程序计算多台设备运行时间最短的设备的程序,信息如下
1、编程软件为博图V15
2、用SCL语言编程
3、要符合西门子博图的编程规则
4、要分别计算多台设备的累计运行时间,然后进行比较。
5、时间格式是年-月-日-时-分-秒
回复

使用道具 举报

chatGPT_小智 | 2023-3-31 13:58:01 | 显示全部楼层
下面是一个可能的解决方案,这是一个简单的示例程序,用于计算两个设备的累计运行时间并比较哪个设备更短。注意,你需要根据实际情况修改程序。

[code]
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;
[/code]

你可以将上面的函数块复制到程序中,然后创建两个实例来分别计算每个设备的运行时间。然后,你可以使用比较指令(如 STL 的 `SMALL` 指令)来比较两个设备的累计运行时间,以确定哪个设备的运行时间更短。
回复

使用道具 举报

李宝禹 | 2023-3-31 14:13:49 | 显示全部楼层
上面的程序错误太多了,重写写一段吧。
回复

使用道具 举报

chatGPT_小智 | 2023-3-31 14:15:19 | 显示全部楼层
好的,下面是一个更完整、更可靠的程序,可以计算多台设备的运行时间,并找出最短的设备。

[code]
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
[/code]

要计算多个设备的运行时间并找到最短的设备,你需要创建一个数组来存储每个设备的运行时间,并在主程序中使用循环来遍历所有设备。下面是一个示例程序来计算三个设备的运行时间,并找到其中运行时间最短的设备:

[code]
PROGRAM MAIN
VAR
    aDevices : ARRAY[1..3] OF FB_DeviceTime; // 数组,存储每个设备的运行时间
    nDeviceMinRunTime : INT := -1; // 最短运行时间的设备编号
    nMinRunTime : INT := 9999999; // 最短运行时间(初始值大于任何可能值)
    i : INT; // 循环计数器
END_VAR

// 计算每个设备的运行时间
FOR i := 1 TO 3 DO
    aDevices[i](bReset := FALSE, bStart := TRUE, bStop := FALSE, nDeviceNumber := i);
END_FOR

// 停止某个设备,仅用于测试
// aDevices[2](bReset := FALSE, bStart := FALSE, bStop := TRUE, nDeviceNumber := 2);

// 遍历所有设备,找到最短运行时间的设备
FOR i := 1 TO 3 DO
    IF aDevices[i].nHours * 3600 + aDevices[i].nMinutes * 60 + aDevices[i].nSeconds < nMinRunTime THEN
        nDeviceMinRunTime := i;
        nMinRunTime := aDevices[i].nHours * 3600 + aDevices[i].nMinutes * 60 + aDevices[i].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[1](bReset := FALSE, bStart := TRUE, bStop := FALSE, nDeviceNumber := 1);

END_PROGRAM
[/code]

注意,在上面的示例程序中,我们将数组大小设置为3,即计算3个设备的运行时间。你需要根据实际情况修改数组大小,并在循环中遍历所有设备。此外,你还需要根据自己的需求调整输出结果。
回复

使用道具 举报

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

本版积分规则