回复:请叫1200PLC实现排队轮询,错位数据统计功能。

xuxiaoxue

  • 帖子

    1115
  • 精华

    0
  • 被关注

    2

论坛等级:至圣

注册时间:2017-11-27

钻石 钻石 如何晋级?

发布于 2025-08-15 15:40:42

3楼

// DB_TempData - 温度数据存储数据块

// 结构:10个物品 × 10个位置的温度数据矩阵


STRUCT

    // 温度数据矩阵 [物品编号][位置编号]

    TemperatureMatrix : ARRAY[1..10, 1..10] OF REAL;

    

    // 当前正在处理的物品编号

    CurrentProduct : INT := 1;

    

    // 当前位置编号

    CurrentPosition : INT := 1;

    

    // 温度传感器原始值

    SensorValues : ARRAY[1..10] OF REAL;

    

    // 系统状态标志

    SystemReady : BOOL := FALSE;

    DataUpdated : BOOL := FALSE;

END_STRUCT

    

// FB_CollectTemperatureData - 温度数据采集功能块

// 功能:读取10个温度传感器,更新对应物品的温度矩阵


VAR_INPUT

    // 传感器输入地址

    SensorInputs : ARRAY[1..10] OF INT; // 假设连接到AI模块的地址

END_VAR


VAR_OUTPUT

    // 温度数据矩阵

    TempMatrix : ARRAY[1..10, 1..10] OF REAL;

    DataValid : BOOL;

END_VAR


VAR_TEMP

    i : INT;

    rawValue : INT;

    tempValue : REAL;

END_VAR


// 读取10个温度传感器值

FOR i := 1 TO 10 DO

    // 读取AI模块原始值(假设0-27648对应-50-150°C)

    rawValue := PIW[SensorInputs[i]];

    

    // 转换为温度值 (-50到150°C)

    tempValue := (rawValue / 27648.0) * 200.0 - 50.0;

    

    // 存储到当前物品的对应位置

    // CurrentProduct和CurrentPosition从同步DB中获取

    TempMatrix[DB_ProductSync.CurrentProduct, i] := tempValue;

END_FOR


// 设置数据有效标志

DataValid := TRUE;


// 触发数据更新标志

DB_TempData.DataUpdated := TRUE;

    

// FB_SyncProductPosition - 物品位置同步功能块

// 功能:控制物品位置切换,每20秒更新一次位置


VAR_INPUT

    // 定时时间(20秒)

    IntervalTime : TIME := T#20S;

END_VAR


VAR_OUTPUT

    CurrentProduct : INT := 1;

    CurrentPosition : INT := 1;

    PositionChanged : BOOL := FALSE;

END_VAR


VAR

    // 定时器

    PositionTimer : TON;

END_VAR


// 启动定时器

PositionTimer(IN := TRUE, PT := IntervalTime);


// 定时时间到,更新位置

IF PositionTimer.Q THEN

    // 重置定时器

    PositionTimer(IN := FALSE);

    

    // 更新当前位置

    CurrentPosition := CurrentPosition + 1;

    

    // 位置超过10则循环,并更新当前物品

    IF CurrentPosition > 10 THEN

        CurrentPosition := 1;

        CurrentProduct := CurrentProduct + 1;

        

        // 物品超过10则循环(新物品进入,覆盖最旧的)

        IF CurrentProduct > 10 THEN

            CurrentProduct := 1;

        END_IF;

    END_IF;

    

    // 设置位置变化标志

    PositionChanged := TRUE;

    

    // 重启定时器

    PositionTimer(IN := TRUE);

ELSE

    PositionChanged := FALSE;

END_IF;


// 更新全局DB中的当前位置和物品编号

DB_TempData.CurrentProduct := CurrentProduct;

DB_TempData.CurrentPosition := CurrentPosition;

    


努力向上
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1200系列

共有15118条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。