首页 > 其他分享 >设备数字化

设备数字化

时间:2024-01-13 19:34:48浏览次数:22  
标签:数字化 eqp date camera 172.19 path id 设备

五厂设备数字化

一、数据抓取相关

通用协议了解:QS、OPC、HTTP/HTTPS/TCP/UDP、websocket

1.相机数据获取

①BT相机

BT上料相机不良数据抓取.py

点击查看代码
import os
from datetime import datetime, timedelta
import pyodbc
import asyncio
import threading
import logging
import time
from concurrent.futures import ThreadPoolExecutor

shared_folders = [
    ('01A', '\\\\172.19.128.12\e\pic-A', '制造一部'),
    ('01B', '\\\\172.19.128.12\e\pic-B', '制造一部'),
    ('02A', '\\\\172.19.128.22\e\pic-A', '制造一部'),
    ('02B', '\\\\172.19.128.22\e\pic-B', '制造一部'),
    ('03A', '\\\\172.19.128.32\e\pic-A', '制造一部'),
    ('03B', '\\\\172.19.128.32\e\pic-B', '制造一部'),
    ('04A', '\\\\172.19.128.42\e\pic-A', '制造一部'),
    ('04B', '\\\\172.19.128.42\e\pic-B', '制造一部'),
    ('05A', '\\\\172.19.128.52\e\pic-A', '制造一部'),
    ('05B', '\\\\172.19.128.52\e\pic-B', '制造一部'),
    ('06A', '\\\\172.19.128.62\e\pic-a', '制造一部'),
    ('06B', '\\\\172.19.128.62\e\pic-b', '制造一部'),
    ('07A', '\\\\172.19.128.72\e\\210-a', '制造一部'),
    ('07B', '\\\\172.19.128.72\e\\210-b', '制造一部'),
    ('08A', '\\\\172.19.128.82\e\pic-a', '制造一部'),
    ('08B', '\\\\172.19.128.82\e\pic-b', '制造一部'),
    ('09A', '\\\\172.19.128.92\e\pic-a', '制造一部'),
    ('09B', '\\\\172.19.128.92\e\pic-b', '制造一部'),
    ('10A', '\\\\172.19.128.102\e\saveimage-a', '制造一部'),
    ('10B', '\\\\172.19.128.102\e\saveimage-b', '制造一部'),
    ('11A', '\\\\172.19.128.112\e\A-image', '制造二部'),
    ('11B', '\\\\172.19.128.112\e\B-image', '制造二部'),
    ('12A', '\\\\172.19.128.122\e\images-A', '制造二部'),
    ('12B', '\\\\172.19.128.122\e\images-B', '制造二部'),
    ('13A', '\\\\172.19.128.132\e\pic-a', '制造二部'),
    ('13B', '\\\\172.19.128.132\e\pic-b', '制造二部'),
    ('14A', '\\\\172.19.128.142\e\A-image', '制造二部'),
    ('14B', '\\\\172.19.128.142\e\B-image', '制造二部'),
    ('15A', '\\\\172.19.128.152\e\pic-a', '制造二部'),
    ('15B', '\\\\172.19.128.152\e\pic-b', '制造二部'),
    ('16A', '\\\\172.19.128.162\e\pic-a', '制造二部'),
    ('16B', '\\\\172.19.128.162\e\pic-b', '制造二部'),
    ('17A', '\\\\172.19.128.172\e\pic-a', '制造二部'),
    ('17B', '\\\\172.19.128.172\e\pic-b', '制造二部'),
    ('18A', '\\\\172.19.128.182\e\pic-a', '制造二部'),
    ('18B', '\\\\172.19.128.182\e\pic-b', '制造二部'),
    ('19A', '\\\\172.19.128.192\e\pic-a', '制造二部'),
    ('19B', '\\\\172.19.128.192\e\pic-b', '制造二部'),
    ('20A', '\\\\172.19.128.202\e\pic-a', '制造二部'),
    ('20B', '\\\\172.19.128.202\e\pic-b', '制造二部'),
]

logging.basicConfig(filename='btl_camera.log', level=logging.INFO,
                    format='%(asctime)s [%(levelname)s] - %(message)s')

# 数据库连接配置
server = '172.16.98.174'
database = 'Google'
username = 'temis'
password = 'Apple2023'

connection_string = f"DRIVER=ODBC Driver 17 for SQL Server;SERVER={server};DATABASE={database};UID={username};PWD={password}"
connection = pyodbc.connect(connection_string)
cursor = connection.cursor()

# 线程锁
db_lock = threading.Lock()

async_lock = asyncio.Lock()


def get_insert_update(dt, create_hours, eqp_id, camera_id, dept, qty, update_time, hour_key, wafer_type):
    try:
        with db_lock:
            # 查询数据库中的数据
            cursor.execute(
                "SELECT TOP 1 qty FROM eqp.btl_camera_data WHERE dt = ? AND create_hours = ? AND eqp_id = ? AND camera_id = ? AND dept = ? AND hour_key = ? AND wafer_type = ?",
                (dt, create_hours, eqp_id, camera_id, dept, hour_key, wafer_type))
            row = cursor.fetchone()

            data_changed = False

            # 检查是否需要插入或更新数据
            if row is None or qty != row.qty:
                if row is None:
                    # 插入新数据
                    insert_sql = f"INSERT INTO eqp.btl_camera_data (qty, update_time, dt, create_hours, eqp_id, camera_id, dept, hour_key, wafer_type) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"
                    cursor.execute(insert_sql,
                                   (qty, update_time, dt, create_hours, eqp_id, camera_id, dept, hour_key, wafer_type))
                    print(f'数据插入成功时间为{update_time}---->', dt, create_hours, eqp_id, camera_id, dept, qty,
                          hour_key, wafer_type)
                    data_changed = True
                else:
                    # 更新数据
                    if qty != row.qty:
                        update_sql = f"UPDATE eqp.btl_camera_data SET qty = ?, update_time = ? WHERE dt = ? AND create_hours = ? AND eqp_id = ? AND camera_id = ? AND dept = ? AND hour_key = ? AND wafer_type = ?"
                        cursor.execute(update_sql,
                                       (qty, update_time, dt, create_hours, eqp_id, camera_id, dept, hour_key,
                                        wafer_type))
                    print(f'数据更新成功时间为{update_time}---->', dt, create_hours, eqp_id, camera_id, dept, qty,
                          hour_key, wafer_type)
                    data_changed = True

            if data_changed:
                connection.commit()
            else:
                # print('数据未更新,无需重复插入或更新')
                pass
    except Exception as e:
        logging.error(f"{insert_sql}or{update_sql}插入数据库报错: {str(e)}")


# 处理拿到每条线每个班各个相机下每个时间段的不良数
def get_all_counts(all_counts, eqp_dept, eqp_id, date_folder):
    for eqp_id_inner, eqp_data in all_counts.items():
        for camera, category_data in eqp_data.items():
            for category, hourly_counts in category_data.items():
                for hour_key, count in hourly_counts.items():
                    dt = hour_key.split()[0]
                    create_hours = int(hour_key.split()[1].split(":")[0])
                    dept = eqp_dept
                    camera_id = camera
                    qty = count
                    update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                    wafer_type = category
                    # print(dt, create_hours, eqp_id_inner, camera_id, dept, qty, update_time, hour_key, wafer_type)
                    get_insert_update(dt, create_hours, eqp_id_inner, camera_id, dept, qty, update_time,
                                      hour_key,
                                      wafer_type)
    print(
        f'--------------------------------------<<{eqp_id}>> 在 <<{date_folder}>> 的文件夹数据处理完毕----------------------------------------')


def process_folders(eqp_id, eqp_path, eqp_dept):
    # 遍历文件夹
    while True:
        eqp_dir = os.path.join(eqp_path, "Original")

        # 获取当前日期和过去三天的日期
        current_date = datetime.now().date()
        recent_dates = [current_date - timedelta(days=i) for i in range(4)]
        # recent_dates = [current_date - timedelta(days=3)]
        # print(recent_dates)

        date_folders = [f for f in os.listdir(eqp_dir) if os.path.isdir(os.path.join(eqp_dir, f))]

        for date_folder in date_folders:

            # 检查日期是否在最近三天内
            if datetime.strptime(date_folder, "%Y%m%d").date() in recent_dates:
                date_folder_path = os.path.join(eqp_dir, date_folder)
                # print(date_folder_path)  # \\172.19.128.82\pic-a\Original\20231126
                all_counts = {eqp_id: {}}

                # 初始化计数
                try:
                    for hk in os.listdir(date_folder_path):
                        # 创建一个嵌套字典用于存储每个小时的图片数量
                        all_counts[eqp_id][hk] = {}
                        try:
                            fail_path = os.path.join(os.path.join(date_folder_path, hk), 'Fail')
                            for category in os.listdir(fail_path):
                                category_folder_path = os.path.join(fail_path, category)
                                hourly_counts = {}

                                # 遍历类别文件夹中的每个 BMP 文件
                                try:
                                    for root, dirs, files in os.walk(category_folder_path):
                                        for file in files:
                                            if file.endswith('.BMP'):
                                                # 从文件路径中提取信息
                                                modification_time = os.path.getmtime(os.path.join(root, file))
                                                modification_datetime = datetime.fromtimestamp(modification_time)
                                                hour_key = modification_datetime.strftime("%Y-%m-%d %H")

                                                if hour_key not in hourly_counts:
                                                    hourly_counts[hour_key] = 0

                                                hourly_counts[hour_key] += 1

                                                # 将相机的小时计数添加到所有计数中
                                                all_counts[eqp_id][hk][category] = hourly_counts

                                except Exception as e:
                                    print(f"{eqp_id}处理不良分类目录 {category_folder_path} 时出现错误: {str(e)}")
                                    logging.error(
                                        f"{eqp_id}处理不良分类目录 {category_folder_path} 时出现错误: {str(e)}")
                                    continue
                        except Exception as e:
                            print(f"{eqp_id}处理Fail目录 {fail_path} 时出现错误: {str(e)}")
                            logging.error(f"{eqp_id}处理Fail目录 {fail_path} 时出现错误: {str(e)}")
                            continue
                except Exception as e:
                    print(f"{eqp_id}处理日期目录 {date_folder_path} 时出现错误: {str(e)}")
                    logging.error(f"{eqp_id}处理日期目录 {date_folder_path} 时出现错误: {str(e)}")
                    continue

                # print(all_counts) # 这里是能拿到一个班的各个相机各个时间段的数量
                get_all_counts(all_counts, eqp_dept, eqp_id, date_folder)

        print(
            f'-------------------------------------------------------------><<<{eqp_id}>>>在时间段内处理完毕, 等待下一个时间段继续处理!!<------------------------------------------------------------------------')
        time.sleep(600)


from concurrent.futures import ThreadPoolExecutor, as_completed
from tqdm import tqdm


def main():
    with ThreadPoolExecutor(max_workers=100) as executor:
        futures = []
        for eqp_id, eqp_path, eqp_dept in shared_folders:
            futures.append((eqp_id, executor.submit(process_folders, eqp_id, eqp_path, eqp_dept)))

        for eqp_id, future in as_completed(futures, key=lambda x: x[1]):
            try:
                future.result()
            except Exception as e:
                print(f"Error processing {eqp_id}: {str(e)}")


if __name__ == "__main__":
    main()
点击查看代码
import os
from datetime import datetime, timedelta
import pyodbc
import asyncio
import threading
import logging
import time
from concurrent.futures import ThreadPoolExecutor

shared_folders = [
    ('BTU01', '\\\\172.19.128.17\e\SaveImg', '制造一部'),
    ('BTU02', '\\\\172.19.128.27\e\SaveImg', '制造一部'),
    ('BTU03', '\\\\172.19.128.37\e\SaveImg', '制造一部'),
    ('BTU04', '\\\\172.19.128.47\e\SaveImg', '制造一部'),
    ('BTU05', '\\\\172.19.128.57\e\SaveImg', '制造一部'),
    ('BTU06', '\\\\172.19.128.67\e\SaveImg', '制造一部'),
    ('BTU07', '\\\\172.19.128.77\e\SaveImg', '制造一部'),
    ('BTU08', '\\\\172.19.128.87\e\SaveImg', '制造一部'),
    ('BTU09', '\\\\172.19.128.97\e\SaveImg', '制造一部'),
    ('BTU10', '\\\\172.19.128.107\e\SaveImg', '制造一部'),
    ('BTU11', '\\\\172.19.128.117\e\SaveImg', '制造二部'),
    ('BTU12', '\\\\172.19.128.127\e\SaveImg', '制造二部'),
    ('BTU13', '\\\\172.19.128.137\e\SaveImg', '制造二部'),
    ('BTU14', '\\\\172.19.128.147\e\SaveImg', '制造二部'),
    ('BTU15', '\\\\172.19.128.157\e\SaveImg', '制造二部'),
    ('BTU16', '\\\\172.19.128.167\e\SaveImg', '制造二部'),
    ('BTU17', '\\\\172.19.128.177\e\SaveImg', '制造二部'),
    ('BTU18', '\\\\172.19.128.187\e\SaveImg', '制造二部'),
    ('BTU19', '\\\\172.19.128.197\e\SaveImg', '制造二部'),
    ('BTU20', '\\\\172.19.128.207\e\SaveImg', '制造二部'),
]

logging.basicConfig(filename='btu_camera.log', level=logging.INFO,
                    format='%(asctime)s [%(levelname)s] - %(message)s')

# 数据库连接配置
server = '172.16.98.174'
database = 'Google'
username = 'temis'
password = 'Apple2023'

connection_string = f"DRIVER=ODBC Driver 17 for SQL Server;SERVER={server};DATABASE={database};UID={username};PWD={password}"
connection = pyodbc.connect(connection_string)
cursor = connection.cursor()

# 线程锁
db_lock = threading.Lock()

async_lock = asyncio.Lock()


def get_insert_update(dt, create_hours, eqp_id, camera_id, dept, qty, update_time, hour_key, wafer_type):
    try:
        with db_lock:
            # 查询数据库中的数据
            cursor.execute(
                "SELECT TOP 1 qty FROM eqp.btu_camera_data WHERE dt = ? AND create_hours = ? AND eqp_id = ? AND camera_id = ? AND dept = ? AND hour_key = ? AND wafer_type = ?",
                (dt, create_hours, eqp_id, camera_id, dept, hour_key, wafer_type))
            row = cursor.fetchone()

            data_changed = False

            # 检查是否需要插入或更新数据
            if row is None or qty != row.qty:
                if row is None:
                    # 插入新数据
                    insert_sql = f"INSERT INTO eqp.btu_camera_data (qty, update_time, dt, create_hours, eqp_id, camera_id, dept, hour_key, wafer_type) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"
                    cursor.execute(insert_sql,
                                   (qty, update_time, dt, create_hours, eqp_id, camera_id, dept, hour_key, wafer_type))
                    print(f'数据插入成功时间为{update_time}---->', dt, create_hours, eqp_id, camera_id, dept, qty,
                          hour_key, wafer_type)
                    data_changed = True
                else:
                    # 更新数据
                    if qty != row.qty:
                        update_sql = f"UPDATE eqp.btu_camera_data SET qty = ?, update_time = ? WHERE dt = ? AND create_hours = ? AND eqp_id = ? AND camera_id = ? AND dept = ? AND hour_key = ? AND wafer_type = ?"
                        cursor.execute(update_sql,
                                       (qty, update_time, dt, create_hours, eqp_id, camera_id, dept, hour_key,
                                        wafer_type))
                    print(f'数据更新成功时间为{update_time}---->', dt, create_hours, eqp_id, camera_id, dept, qty,
                          hour_key, wafer_type)
                    data_changed = True

            if data_changed:
                connection.commit()
            else:
                # print('数据未更新,无需重复插入或更新')
                pass
    except Exception as e:
        logging.error(f"{insert_sql}or{update_sql}插入数据库报错: {str(e)}")


# 处理拿到每条线每个班各个相机下每个时间段的不良数
def get_all_counts(all_counts, eqp_dept, eqp_id, date_folder):
    for eqp_id_inner, eqp_data in all_counts.items():
        for camera, camera_data in eqp_data.items():
            if camera_data:
                for hour_key, count in camera_data.items():
                    dt = hour_key.split()[0]
                    create_hours = int(hour_key.split()[1].split(":")[0])
                    dept = eqp_dept
                    camera_id = camera
                    qty = count
                    update_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
                    wafer_type = 'NG片'
                    # print(dt, create_hours, eqp_id_inner, camera_id, dept, qty, update_time, hour_key, wafer_type)
                    get_insert_update(dt, create_hours, eqp_id_inner, camera_id, dept, qty, update_time, hour_key, wafer_type)

    print(
        f'--------------------------------------<<{eqp_id}>> 在 <<{date_folder}>> 的文件夹数据处理完毕----------------------------------------')


def process_folders(eqp_id, eqp_path, eqp_dept):
    # 遍历文件夹
    while True:
        eqp_dir = eqp_path

        # 获取当前日期和过去三天的日期
        current_date = datetime.now().date()
        recent_dates = [current_date - timedelta(days=i) for i in range(3)]
        # recent_dates = [current_date - timedelta(days=3)]
        # print(recent_dates)

        date_folders = [f for f in os.listdir(eqp_dir) if os.path.isdir(os.path.join(eqp_dir, f))]

        for date_folder in date_folders:
            # 检查日期是否在最近三天内
            if datetime.strptime(date_folder, "%Y年%m月%d日").date() in recent_dates:
                date_folder_path = os.path.join(eqp_dir, date_folder)
                # print(date_folder_path)  # \\172.19.128.17\e\SaveImg\2023年12月02日
                all_counts = {eqp_id: {}}

                # 初始化计数
                try:
                    for camera in os.listdir(date_folder_path):
                        # 创建一个嵌套字典用于存储每个小时的图片数量
                        all_counts[eqp_id][camera] = {}
                        camera_folder_path = os.path.join(date_folder_path, camera)
                        hourly_counts = {}

                        # 遍历类别文件夹中的每个 BMP 文件
                        try:
                            if camera_folder_path.endswith('NG'):
                                for root, dirs, files in os.walk(camera_folder_path):
                                    for file in files:
                                        if file.endswith('.jpg'):
                                            # 从文件路径中提取信息
                                            modification_time = os.path.getmtime(os.path.join(root, file))
                                            modification_datetime = datetime.fromtimestamp(modification_time)
                                            hour_key = modification_datetime.strftime("%Y-%m-%d %H")

                                            if hour_key not in hourly_counts:
                                                hourly_counts[hour_key] = 0

                                            hourly_counts[hour_key] += 1

                                            # 将相机的小时计数添加到所有计数中
                                            all_counts[eqp_id][camera] = hourly_counts

                        except Exception as e:
                            print(f"{eqp_id}处理相机目录 {camera_folder_path} 时出现错误: {str(e)}")
                            logging.error(
                                f"{eqp_id}处理相机目录 {camera_folder_path} 时出现错误: {str(e)}")
                            continue

                except Exception as e:
                    print(f"{eqp_id}处理日期目录 {date_folder_path} 时出现错误: {str(e)}")
                    logging.error(f"{eqp_id}处理日期目录 {date_folder_path} 时出现错误: {str(e)}")
                    continue

                # print(all_counts, eqp_dept, eqp_id, date_folder)  # 这里是能拿到一个班的各个相机各个时间段的数量
                get_all_counts(all_counts, eqp_dept, eqp_id, date_folder)

        print(
            f'-------------------------------------------------------------><<<{eqp_id}>>>在时间段内处理完毕, 等待下一个时间段继续处理!!<------------------------------------------------------------------------')
        time.sleep(600)


from concurrent.futures import ThreadPoolExecutor, as_completed
from tqdm import tqdm


def main():
    with ThreadPoolExecutor(max_workers=100) as executor:
        futures = []
        for eqp_id, eqp_path, eqp_dept in shared_folders:
            futures.append((eqp_id, executor.submit(process_folders, eqp_id, eqp_path, eqp_dept)))

        for eqp_id, future in as_completed(futures, key=lambda x: x[1]):
            try:
                future.result()
            except Exception as e:
                print(f"Error processing {eqp_id}: {str(e)}")


if __name__ == "__main__":
    main()

②HF相机

③PL相机

二、报表相关

1.湿制程

2.高温制程

3.镀膜制程

4.金属化制程

5.综合制程

三、大屏看板相关

1.湿制程

2.高温制程

3.镀膜制程

4.金属化制程

5.综合制程

四、系统相关

需求新增

  • SE破片追溯报表修改
  • 包装机看板增加每小时CT产量和包装机产量对比+工控机Excel不良NG类型片数
时间 产品名称 磕伤是否检出 长断片是否检出 夹断片是否检出 遮挡是否检出 漏浆是否检出 整形不齐是否检出
2024/01/11 08:00:21:8908 产品1_11_PC40000IJ9 1 0 0 0 0 0
2024/01/11 08:01:08:0911 产品2_11_PC40000II3 1 0 0 0 0 0
2024/01/11 08:01:19:1393 产品3_11_PC40000IIS 0 0 0 1 0 0
  • 金属化制程看板报警页面+不分一二部分白夜班状态管理页
  • BTL过检率看板展示+湿制程故障历史

标签:数字化,eqp,date,camera,172.19,path,id,设备
From: https://www.cnblogs.com/fuminer/p/17962801

相关文章

  • Java使用modbus4j通过串口modbus-rtu协议 连接设备 demo
    前言项目中需要使用串口来连接操控烟雾报警器且只能使用modbus-rtu协议在找了一堆资料后终于成功了在此呈上代码和资料链接【ModBus】modbus之modbus4j的使用和流程原理解析(5)-CSDN博客使用modbus4j通过串口解析modbus协议(java)_javamodbus4j-CSDN博客 串口通讯需要使用modbus4j......
  • 源码开发实战:连锁餐饮数字化转型中的点餐小程序
    如今,商家通过引入点餐小程序,不仅可以提高服务速度,还能够增加用户粘性,实现数字化运营的目标。为了实现这一愿景,源码开发成为一种高效的手段。 一、技术选型在开发点餐小程序时,选择合适的技术是关键一环,结合小程序开发框架,实现了前后端分离,提高了开发效率。此外,数据库采用了高性能的......
  • Microsoft 365 新功能速递:为Microsoft Entra ID中的设备绑定密钥(更改为FIDO2和Windows
    51CTO博客链接:https://blog.51cto.com/u_13637423从2024年2月中旬开始,除了现有的FIDO2安全密钥支持外,MicrosoftEntraID还将支持存储在计算机和移动设备上的设备绑定密钥,作为预览中的身份验证方法。这使您的用户能够使用现有设备执行防钓鱼身份验证。我们将扩展现有的FIDO2身份验......
  • 晶振频率测试仪、晶振测试频率计、晶振测试设备、晶体测试仪
    石英晶体振荡器又名石英谐振器,简称晶振,是利用石英晶体(二氧化硅的结晶体)的压电效应制成的一种谐振器件,它的基本构成大致是:从一块石英晶体上按一定方位角切下薄片(简称为晶片,它可以是正方形、矩形或圆形等),在它的两个对应面上涂敷银层作为电极,在每个电极上各焊一根引线接到管脚上,再加上......
  • SYN5305型晶振测试仪、晶振测试设备、晶体测试仪、无源晶振测试常用仪器
    负载电容(Load Capacitance)CL:在电路中跨接晶振两端总的外界有效电容;要等于或接近晶振数据手册给出的数值才能使晶振按照预期工作;比较通常使用的24MHz晶振负载电容是20pF静态电容C0:以石英晶片为介电材料和两个电极之间的电容;很多晶振规格里是<3pF的;SYN5305型晶振测试仪集合有源和......
  • CJO赋能金融机构数字化财富管理转型
    神策数据作为国内数字化客户经营软件提供商,一直关注数字化领域,并立足大数据分析及营销科技的技术与实践前沿,围绕 “客户旅程编排(CustomerJourneyOrchestration,CJO)” 的产品理念,构建了客户数据引擎、客户旅程分析引擎、客户旅程优化引擎三大引擎,赋能企业的数字化客户经营。CJO如......
  • 金融科技革命:数字化如何塑造未来经济_光点科技
    当今世界,数字化不仅是一种趋势,更是深刻重塑经济和金融领域的关键力量。在这个过程中,金融科技(FinTech)崭露头角,成为革命性变化的代名词。以下是数字化技术在经济和金融领域的几个关键应用,它们正在逐步展现出其长远的影响力。移动支付的全球普及移动支付系统如ApplePay、Alipay和WeC......
  • 分布式设备数据云平台通过组态监控实现智能管理
    组态系统是指用来显示和控制机器设备或系统的用户界面。它通过以图形化的方式向操作员展示设备或系统的状态和信息,并提供便捷操作和管理控制的功能,在装备制造行业、环保水务行业、石油化工行业等得到广泛使用。 物通博联推出的分布式设备数据云平台支持以组态画面的形式来展示用户......
  • D35XB80-ASEMI工业自动化设备整流桥D35XB80
    编辑:llD35XB80-ASEMI工业自动化设备整流桥D35XB80型号:D35XB80品牌:ASEMI封装:GBJ-5(带康铜丝)平均正向整流电流(Id):35A最大反向击穿电压(VRM):800V产品引线数量:5产品内部芯片个数:4产品内部芯片尺寸:72MIL峰值正向漏电流:<10ua恢复时间:>2000ns正向浪涌电流:450A正向压降:1.05V恢复时间:工作结温:-55......
  • 叉车车载终端定制_基于联发科MT6762核心板的车载终端设备方案
    叉车车载终端的出现,为叉车车载场景带来了全新的管理方式。这款4英寸Android车载平板电脑搭载了高能低耗的8核ARM架构处理器和互动开放的Android12操作系统,算力强大,能够实现车辆的实时调度和全方位的监控管理。此外,丰富的通讯功能,包括Wi-Fi-5、4GLTE和蓝牙等,配合外部车载蘑菇天线,......