数采数据生成教程

整个数采数据添加的闭环如下

  • 设备添加
  • 在大屏看板中添加设备
  • 点位添加
  • 点位数据生成

数采数据添加的前提是

1.设备添加

设备添加有两种方式通过网页添加和数据库添加,二选一即可

方式1 : 在页面上添加

新增设备的时候 下面的“网关设备名”必须填写,具体的网关设备名找数采工程师拿。

方式2:直接在数据库添加但一定要记得添加gateway_dev_name 也就是网关设备名

2.在大屏看板中添加设备

如果是真实数采他会自动添加,如果是需要造假数据,直接到machine_state表里面添加

machine_id 就是前面我们添加的设备,在machine表里面取他的id即可

state就是设备状态 1:离线 2:在线 3:故障 4:待机 5:停机 6:保养 7:维修

last_update就是设备状态变更时间

至于“设备编号”就是你在最前面添加的 网关设备名 他会自动调用

1.点位添加

直接在网页上添加,如果没有点位管理,记得添加权限

没有点位管理的入口时添加权限方式

权限名称 mes.machine.point_dic

路由 machine.point_dic.index

你也可以直接在数据库中添加

4.点位数据生成

可以手动在device_parameter_points 表里面添加数据,在设备实时数据看板里面,同一设备中,同一点位取的是他最后一条也就是最新的一条数据

这个也是一样,先找到你要造数据的那台设备的machine_id

然后就是 点位名point_name 最后就是 点位数据point_value

其他的可填可不填

上面是手动造数据的方法,下面是批量造数据的方法

需要执行sql

第一个 用与处理浮点型数据

CREATE DEFINER=`root`@`%` PROCEDURE `generate_device_data_precision_float`(
    IN p_machine_id INT,
    IN p_point_name VARCHAR(100),
    IN p_base_value DECIMAL(10,2),
    IN p_float_range DECIMAL(10,2),
    IN p_start_datetime DATETIME,
    IN p_end_datetime DATETIME
)
BEGIN
    DECLARE v_current_date DATE;
    DECLARE v_days_count INT DEFAULT 0;
    DECLARE v_day_index INT DEFAULT 0;
    DECLARE v_record_index INT;
    DECLARE v_random_datetime DATETIME;
    DECLARE v_next_id BIGINT;
    DECLARE v_random_seconds INT;
    DECLARE v_random_value DECIMAL(10,2);
    DECLARE v_min_value DECIMAL(10,2);
    DECLARE v_max_value DECIMAL(10,2);
    DECLARE v_start_date DATE;
    DECLARE v_end_date DATE;
    DECLARE v_start_seconds INT;
    DECLARE v_end_seconds INT;
    DECLARE v_total_seconds INT;
    DECLARE v_total_records INT DEFAULT 0;
    
    -- 获取下一个可用的ID
    SELECT COALESCE(MAX(id), 0) + 1 INTO v_next_id FROM device_parameter_points;
    
    -- 计算数值范围
    SET v_min_value = p_base_value;
    SET v_max_value = p_base_value + p_float_range;
    
    -- 提取日期部分和秒数部分
    SET v_start_date = DATE(p_start_datetime);
    SET v_end_date = DATE(p_end_datetime);
    SET v_start_seconds = TIME_TO_SEC(TIME(p_start_datetime));
    SET v_end_seconds = TIME_TO_SEC(TIME(p_end_datetime));
    
    -- 计算总天数
    SET v_days_count = DATEDIFF(v_end_date, v_start_date);
    
    -- 主循环:遍历每一天
    WHILE v_day_index <= v_days_count DO
        SET v_current_date = DATE_ADD(v_start_date, INTERVAL v_day_index DAY);
        SET v_record_index = 1;
        
        -- 内循环:每天生成50条记录
        WHILE v_record_index <= 50 DO
            -- 处理第一天和最后一天的边界时间
            IF v_day_index = 0 THEN
                -- 第一天:从指定的开始时间到23:59:59
                SET v_total_seconds = 86400 - v_start_seconds;
                IF v_total_seconds > 0 THEN
                    SET v_random_seconds = v_start_seconds + FLOOR(RAND() * v_total_seconds);
                ELSE
                    SET v_random_seconds = v_start_seconds;
                END IF;
            ELSEIF v_day_index = v_days_count THEN
                -- 最后一天:从00:00:00到指定的结束时间
                IF v_end_seconds > 0 THEN
                    SET v_random_seconds = FLOOR(RAND() * v_end_seconds);
                ELSE
                    SET v_random_seconds = 0;
                END IF;
            ELSE
                -- 中间天数:全天24小时
                SET v_random_seconds = FLOOR(RAND() * 86400);
            END IF;
            
            -- 生成随机时间
            SET v_random_datetime = TIMESTAMPADD(SECOND, v_random_seconds, v_current_date);
            
            -- 确保时间在指定范围内(边界检查)
            IF v_random_datetime >= p_start_datetime AND v_random_datetime <= p_end_datetime THEN
                -- 生成随机数值(在基础值到基础值+浮动范围内)
                SET v_random_value = p_base_value + (RAND() * p_float_range);
                
                -- 插入数据
                INSERT INTO device_parameter_points (
                    id,
                    machine_id, 
                    point_name, 
                    point_value, 
                    stamp, 
                    unit, 
                    created_at, 
                    updated_at
                ) VALUES (
                    v_next_id,
                    p_machine_id, 
                    p_point_name, 
                    v_random_value,     -- 使用随机生成的值
                    v_random_datetime,  -- stamp字段使用随机生成的时间
                    '', 
                    v_random_datetime,  -- created_at也使用相同的时间戳
                    v_random_datetime   -- updated_at也使用相同的时间戳
                );
                
                SET v_next_id = v_next_id + 1;
                SET v_record_index = v_record_index + 1;
                SET v_total_records = v_total_records + 1;
            END IF;
        END WHILE;
        
        SET v_day_index = v_day_index + 1;
    END WHILE;
    
    -- 返回成功信息
    SELECT CONCAT(
        '成功为机器 ', p_machine_id, 
        ' 的数据点 ''', p_point_name, 
        ''' 插入了 ', v_total_records, 
        ' 条记录,', 
        '基础值: ', p_base_value, 
        ', 浮动范围: +', p_float_range,
        ', 数值范围: ', ROUND(v_min_value, 2), ' - ', ROUND(v_max_value, 2),
        ', 时间范围: ', 
        DATE_FORMAT(p_start_datetime, '%Y-%m-%d %H:%i:%s'), 
        ' 到 ', 
        DATE_FORMAT(p_end_datetime, '%Y-%m-%d %H:%i:%s')
    ) AS result;
    
END

第二个用与处理整形数据

CREATE DEFINER=`root`@`%` PROCEDURE `generate_device_data_precision_int`(
    IN p_machine_id INT,
    IN p_point_name VARCHAR(100),
    IN p_base_value INT,
    IN p_float_range INT,
    IN p_start_datetime DATETIME,
    IN p_end_datetime DATETIME
)
BEGIN
    DECLARE v_current_date DATE;
    DECLARE v_days_count INT DEFAULT 0;
    DECLARE v_day_index INT DEFAULT 0;
    DECLARE v_record_index INT;
    DECLARE v_random_datetime DATETIME;
    DECLARE v_next_id BIGINT;
    DECLARE v_random_seconds INT;
    DECLARE v_random_value INT;
    DECLARE v_min_value INT;
    DECLARE v_max_value INT;
    DECLARE v_start_date DATE;
    DECLARE v_end_date DATE;
    DECLARE v_start_seconds INT;
    DECLARE v_end_seconds INT;
    DECLARE v_total_seconds INT;
    DECLARE v_total_records INT DEFAULT 0;
    
    -- 获取下一个可用的ID
    SELECT COALESCE(MAX(id), 0) + 1 INTO v_next_id FROM device_parameter_points;
    
    -- 计算数值范围
    SET v_min_value = p_base_value;
    SET v_max_value = p_base_value + p_float_range;
    
    -- 提取日期部分和秒数部分
    SET v_start_date = DATE(p_start_datetime);
    SET v_end_date = DATE(p_end_datetime);
    SET v_start_seconds = TIME_TO_SEC(TIME(p_start_datetime));
    SET v_end_seconds = TIME_TO_SEC(TIME(p_end_datetime));
    
    -- 计算总天数
    SET v_days_count = DATEDIFF(v_end_date, v_start_date);
    
    -- 主循环:遍历每一天
    WHILE v_day_index <= v_days_count DO
        SET v_current_date = DATE_ADD(v_start_date, INTERVAL v_day_index DAY);
        SET v_record_index = 1;
        
        -- 内循环:每天生成50条记录
        WHILE v_record_index <= 50 DO
            -- 处理第一天和最后一天的边界时间
            IF v_day_index = 0 THEN
                -- 第一天:从指定的开始时间到23:59:59
                SET v_total_seconds = 86400 - v_start_seconds;
                IF v_total_seconds > 0 THEN
                    SET v_random_seconds = v_start_seconds + FLOOR(RAND() * v_total_seconds);
                ELSE
                    SET v_random_seconds = v_start_seconds;
                END IF;
            ELSEIF v_day_index = v_days_count THEN
                -- 最后一天:从00:00:00到指定的结束时间
                IF v_end_seconds > 0 THEN
                    SET v_random_seconds = FLOOR(RAND() * v_end_seconds);
                ELSE
                    SET v_random_seconds = 0;
                END IF;
            ELSE
                -- 中间天数:全天24小时
                SET v_random_seconds = FLOOR(RAND() * 86400);
            END IF;
            
            -- 生成随机时间
            SET v_random_datetime = TIMESTAMPADD(SECOND, v_random_seconds, v_current_date);
            
            -- 确保时间在指定范围内(边界检查)
            IF v_random_datetime >= p_start_datetime AND v_random_datetime <= p_end_datetime THEN
                -- 生成随机数值(在基础值到基础值+浮动范围内)
                SET v_random_value = p_base_value + FLOOR(RAND() * p_float_range);
                
                -- 插入数据
                INSERT INTO device_parameter_points (
                    id,
                    machine_id, 
                    point_name, 
                    point_value, 
                    stamp, 
                    unit, 
                    created_at, 
                    updated_at
                ) VALUES (
                    v_next_id,
                    p_machine_id, 
                    p_point_name, 
                    v_random_value,     -- 使用随机生成的值
                    v_random_datetime,  -- stamp字段使用随机生成的时间
                    '', 
                    v_random_datetime,  -- created_at也使用相同的时间戳
                    v_random_datetime   -- updated_at也使用相同的时间戳
                );
                
                SET v_next_id = v_next_id + 1;
                SET v_record_index = v_record_index + 1;
                SET v_total_records = v_total_records + 1;
            END IF;
        END WHILE;
        
        SET v_day_index = v_day_index + 1;
    END WHILE;
    
    -- 返回成功信息
    SELECT CONCAT(
        '成功为机器 ', p_machine_id, 
        ' 的数据点 ''', p_point_name, 
        ''' 插入了 ', v_total_records, 
        ' 条记录,', 
        '基础值: ', p_base_value, 
        ', 浮动范围: +', p_float_range,
        ', 数值范围: ', ROUND(v_min_value, 2), ' - ', ROUND(v_max_value, 2),
        ', 时间范围: ', 
        DATE_FORMAT(p_start_datetime, '%Y-%m-%d %H:%i:%s'), 
        ' 到 ', 
        DATE_FORMAT(p_end_datetime, '%Y-%m-%d %H:%i:%s')
    ) AS result;
    
END

执行方法

-- 设备id 1:点位DI2 :值35.0,浮动5.0,数值范围35.0-40.0,起止时间,采集的值有小数
设备id 就是machine表的machine_id

CALL generate_device_data_precision_float(1, 'DI2', 35.0, 5.0, '2025-07-25 08:30:00', '2025-08-25 12:45:00');
这代表着你批量生成的是设备id为1,点位为DI2 且带有小数的数据日期是2025-07-25 08:30:00到 2025-08-25 12:45:00,而且值不会低于35.0 最高不超过40.0   如果你想保持这个值一直是35.0 那么可以把浮动值5.0改成0.0 这样生成的数据就一直是35.0

CALL generate_device_data_precision_float(1, 'DI2', 35.0, -5.0, '2025-07-25 08:30:00', '2025-08-25 12:45:00');
这代表着你批量生成的是带有小数的数据,而且值不会低于30.0 最高不超过35.0



-- 设备id 2:点位DI2 : 值10,浮动5,数值范围10-15,起止时间,采集的值为整型

CALL generate_device_data_precision_int(2, 'DI2', 10, 5, '2025-07-25 08:30:00', '2025-08-25 12:45:00');
这代表你生成的是设备id为2  点位为DI2  最低值为 整形10 最高值为整形15的数据

CALL generate_device_data_precision_int(2, 'DI2', 10, -5, '2025-07-25 08:30:00', '2025-08-25 12:45:00');
这代表你生成的是设备id为2  点位为DI2  最低值为 整形5 最高值为整形10的数据

如果是本地执行的时候发现没权限可以修改一下权限将主机改成%

解决方法

评论

发表回复