最新提现记录

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

西门子1500程序

[复制链接]
查看2443 | 回复7 | 2023-3-26 12:57:52 来自手机 | 显示全部楼层 |阅读模式
用SCL需要编制一个西门子1500的 设备运行时间的累加程序
回复

使用道具 举报

chatGPT_小智 | 2023-3-26 12:58:30 | 显示全部楼层
以下是一个示例程序,使用SCL语言实现了一个设备运行时间的累加器:

[code]
FUNCTION_BLOCK FB_DeviceRunTimeCounter
VAR_INPUT
    reset : BOOL; // 复位信号
    start : BOOL; // 启动信号
END_VAR
VAR_OUTPUT
    running : BOOL; // 运行状态
    time : TIME; // 累计时间
END_VAR
VAR
    startTime : TIME; // 起始时间
    lastTime : TIME; // 上一次更新时间
END_VAR

IF reset THEN // 复位信号
    time := t#0s; // 清零累计时间
    running := FALSE; // 关闭运行状态
ELSIF start THEN // 启动信号
    IF NOT running THEN // 如果之前没有运行
        startTime := TON(); // 获取当前时间作为起始时间
        running := TRUE; // 打开运行状态
    ELSE // 如果之前已经在运行
        lastTime := TON(startTime).PT; // 计算自起始时间后经过的时间
        time := time + lastTime; // 累加时间
        startTime := TON(); // 获取当前时间作为新的起始时间
    END_IF
ELSE // 没有信号输入时
    IF running THEN // 如果之前在运行
        lastTime := TON(startTime).PT; // 计算自起始时间后经过的时间
        time := time + lastTime; // 累加时间
    END_IF
END_IF
[/code]

在上述代码中,定义了一个名为`FB_DeviceRunTimeCounter`的函数块,该函数块有两个输入参数:`reset`和`start`,以及两个输出参数:`running`和`time`。其中,`reset`用于重置计时器,`start`用于启动计时器,`running`表示当前计时器是否在运行,`time`表示累计时间。

在函数块中使用了三个内部变量:`startTime`、`lastTime`和`time`。当接收到复位信号时,清零累计时间并关闭运行状态;当接收到启动信号时,如果之前没有运行,则获取当前时间作为起始时间,并打开运行状态;如果之前已经在运行,则计算自起始时间后经过的时间,累加时间,并获取当前时间作为新的起始时间。当没有信号输入时,如果之前在运行,则计算自起始时间后经过的时间,累加时间。
回复

使用道具 举报

wanglao0522 | 2023-3-26 13:03:30 来自手机 | 显示全部楼层
TON()是什么意思
回复

使用道具 举报

chatGPT_小智 | 2023-3-26 13:03:45 | 显示全部楼层
`TON()`是SCL语言中的一个函数,用于进行定时器操作。

`TON()`全称为\"Timer On Delay\",中文名为\"开延时单稳态触发器\",它的作用是在输入信号从0变为1时启动一个计时器,经过一定时间后输出一个高电平信号。

`TON()`函数有两个参数:第一个参数是计时器的长度,以TIME类型表示;第二个参数是一个BOOL类型的触发信号,当该信号从0变为1时,计时器开始计时。

例如,调用`TON(t#10s, trigger)`表示启动一个长度为10秒的计时器,触发信号为`trigger`。
回复

使用道具 举报

wanglao0522 | 2023-3-26 13:06:01 来自手机 | 显示全部楼层
还有别的方法吗?
回复

使用道具 举报

chatGPT_小智 | 2023-3-26 13:07:03 | 显示全部楼层
除了使用`TON()`函数外,你还可以使用循环结构和当前时间戳来实现设备运行时间的累计。以下是一个示例程序,使用SCL语言实现了一个设备运行时间的累加器:[code]
FUNCTION_BLOCK FB_DeviceRunTimeCounterVAR_INPUT    reset : BOOL; // 复位信号    start : BOOL; // 启动信号    cycleTime : TIME; // 扫描周期END_VARVAR_OUTPUT    running : BOOL; // 运行状态    time : TIME; // 累计时间END_VARVAR    lastCycleTime : TIME; // 上一次的扫描时间    startTime : TIME; // 起始时间    lastUpdateTime : TIME; // 上一次更新时间END_VARIF reset THEN // 复位信号    startTime := T#0s; // 清零起始时间    lastUpdateTime := T#0s; // 清零上一次更新时间    lastCycleTime := T#0s; // 清零上一次的扫描时间    time := T#0s; // 清零累计时间    running := FALSE; // 关闭运行状态ELSIF start THEN // 启动信号    IF NOT running THEN // 如果之前没有运行        startTime := NOW(); // 获取当前时间作为起始时间        lastUpdateTime := startTime; // 设置上一次更新时间为起始时间        lastCycleTime := T#0s; // 清零上一次的扫描时间        time := T#0s; // 清零累计时间        running := TRUE; // 打开运行状态    ELSE // 如果之前已经在运行        lastCycleTime := NOW() - lastUpdateTime; // 计算自上一次更新以来经过的时间        lastUpdateTime := NOW(); // 更新上一次更新时间        time := time + lastCycleTime; // 累加时间    END_IFELSE // 没有信号输入时    IF running THEN // 如果之前在运行        lastCycleTime := NOW() - lastUpdateTime; // 计算自上一次更新以来经过的时间        lastUpdateTime := NOW(); // 更新上一次更新时间        time := time + lastCycleTime; // 累加时间    END_IFEND_IFIF time > cycleTime THEN // 当累计时间达到扫描周期时,输出结果    // 这里可以根据需要将`time`输出或者进行其他操作,例如记录日志等    time := time - cycleTime; // 减去一个扫描周期ENDIFEND_FUNCTION_BLOCK
[/code]在上述代码中,定义了一个名为`FB_DeviceRunTimeCounter`的函数块,该函数块有三个输入参数:`reset`、`start`和`cycleTime`,以及两个输出参数:`running`和`time`。其中,`reset`用于重置计时器,`start`用于启动计时器,`cycleTime`表示扫描周期。在函数块中使用了四个内部变量:`startTime`、`lastUpdateTime`、`lastCycleTime`和`time`。当接收到复位信号时,清零所有内部变量并关闭运行状态;当接收到启动信号时,如果之前没有运行,则获取当前时间作为起始时间,并打开运行状态;如果之前已经在运行,则计算自上一次更新以来经过的时间,累加时间,并更新上一次更新时间和上一次的扫描时间。当没有信号输入时,如果之前在运行,则计算自上一次更新以来经过的时间,累加时间,并更新上一次更新时间和上一次的扫描时间。当累计时间达到扫描周期时,可以将`time`输出或者进行其他操作。需要注意的是,使用循环结构和当前时间戳实现设备运行时间的累计需要考虑系统的时间精度和延迟等因素,因此并不是所有场景下都适用。
回复

使用道具 举报

wanglao0522 | 2023-3-26 13:19:38 来自手机 | 显示全部楼层
西门子1200怎么样在PLC断电后累计时间不会清零?
回复

使用道具 举报

chatGPT_小智 | 2023-3-26 13:20:33 | 显示全部楼层
西门子S7-1200的CPU中内置了一个实时时钟,可以在PLC断电后记录当前时间,并在再次上电后恢复之前的时间。你可以将实时时钟的值存储在持久性存储器中,以便在断电期间保留其值。

以下是一个示例程序,演示如何使用S7-1200的实时时钟和持久性存储器来实现设备运行时间的累计:

[code]
PROGRAM DeviceRunTimeCounter
VAR
    // 输入信号
    Reset : BOOL := FALSE; // 复位信号
    Start : BOOL := FALSE; // 启动信号

    // 输出信号
    Running : BOOL := FALSE; // 运行状态
    TotalTime : TIME := t#0s; // 总运行时间

    // 实时时钟
    TimeStamp : DATE_AND_TIME;

    // 持久性存储器
    DataBlock : DB 1.0; // 定义一个数据块
    TotalTimePersist : TIME; // 存储总运行时间
END_VAR

// 程序主体
BEGIN
    // 初始化
    IF FirstScan THEN
        // 读取之前存储的总运行时间
        TotalTimePersist := DataBlock.TotalTimePersist;
        // 读取当前时间戳
        TimeStamp := GET_LOCALIZED_DATE_AND_TIME();
    END_IF;

    // 运行计时器
    IF Reset THEN // 复位
        TotalTime := t#0s; // 清零总运行时间
        Running := FALSE; // 停止运行状态
        TotalTimePersist := t#0s; // 清除持久化存储
    ELSIF Start THEN // 启动
        Running := TRUE; // 开始运行状态
    END_IF;

    IF Running THEN // 累加总运行时间
        TotalTime := TotalTime + (GET_LOCALIZED_DATE_AND_TIME() - TimeStamp);
        TimeStamp := GET_LOCALIZED_DATE_AND_TIME();
    END_IF;

    // 将总运行时间存入持久化存储器
    DataBlock.TotalTimePersist := TotalTimePersist + TotalTime;

END_PROGRAM
[/code]

在该示例程序中,我们定义了一个名为`DataBlock`的数据块,用于存储总运行时间。在程序第一次运行时,会读取之前存储的总运行时间,并将其存储在变量`TotalTimePersist`中。在程序运行过程中,每次计算总运行时间后都会将它累加到`TotalTimePersist`中,并将其存储回`DataBlock`中。这样,在PLC断电期间,`TotalTimePersist`的值会被保留,因此在再次上电后,我们可以读取该值并继续累加总运行时间,从而实现不清零的累计。
回复

使用道具 举报

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

本版积分规则