PC-DMIS与上位机通信实战:串口采集与网口数据流处理
2026/7/10 9:28:27 网站建设 项目流程

CMM测量程序跑完之后,数据怎么出去?很多工厂的需求是把测量结果实时送到MES、SPC系统或者自研的上位机软件里做统计分析。PC-DMIS提供了几种数据输出方式,但很多新手只停留在导出报告阶段,不知道怎么做实时数据流。这篇文章把串口和网口两种通信方式都讲一遍,给完整可运行的代码示例。

一、PC-DMIS数据输出的几种方式

PC-DMIS原生支持的数据输出方式有:

1. 报告文件输出:导出PDF/RTF/TXT/CSV文件,再由外部程序读取。

2. DDE通信:老式的Windows进程间通信方式,只支持同机通信。

3. 串口通信(RS-232):通过COM口实时发送测量数据。

4. Socket通信(TCP/UDP):通过网络socket发送数据。

5. PC-DMIS .NET API:用C#或者其他.NET语言调用PC-DMIS对象模型,深度集成。

实际工程中,串口和Socket两种方式最常用。下面分别讲。

二、串口通信:简单直接的方案

适用场景:单台CMM和一个上位机一对一通信,距离短,数据量小。

PC-DMIS端配置

在PC-DMIS里用"设置选项→输出→串口"配置串口参数:波特率9600或115200、数据位8、停止位1、无校验。

然后在测量程序里用OUTPUT命令把数据发送到串口:

ASSIGN/V1 = HEIGHT_1.X OUTPUT/COM1: "MEASURED_HEIGHT=" + STR(V1) + ",NOMINAL=50,TOL=0.02"

这条命令会在测量到HEIGHT_1特征后,把实测值通过COM1发送出去。

上位机端(Python示例)

import serial import time # 配置串口参数,与PC-DMIS端一致 ser = serial.Serial( port='COM3', # 注意上位机端的COM号 baudrate=115200, bytesize=8, parity='N', stopbits=1, timeout=1 ) def parse_message(msg): """解析PC-DMIS发来的测量数据""" parts = msg.strip().split(',') result = {} for part in parts: if '=' in part: key, value = part.split('=', 1) result[key.strip()] = value.strip() return result print("等待PC-DMIS测量数据...") while True: if ser.in_waiting > 0: line = ser.readline().decode('utf-8', errors='ignore') if line: data = parse_message(line) print(f"收到数据: {data}") # 这里可以做SPC分析、写数据库、推送MES等 # save_to_db(data) # push_to_mes(data) time.sleep(0.01)

⚠️注意几个坑:
1. 串口号要对应。CMM机器上配的是COM1,但上位机收到的不一定是COM3,要看设备管理器。
2. 串口通信是同步的,PC-DMIS发送数据时如果上位机没在监听,数据会丢失。要做重发机制或者缓存机制。
3. 串口通信距离有限(标准RS-232大约15米),超过这个距离要用RS-485或者转网口。

三、Socket通信:网络化的方案

适用场景:多台CMM数据汇总到一个上位机,或者CMM和上位机分布在不同厂房。

PC-DMIS端配置

PC-DMIS支持通过Socket发送数据,配置方式是在"设置选项→输出→网络"里设置目标IP和端口。

测量程序里:

ASSIGN/V1 = CIRCLE_1.DIA OUTPUT/SOCKET:TCP:192.168.1.100:5000, "CIRCLE_1_DIAMETER=" + STR(V1)

上位机端(Python示例,TCP Server模式)

import socket import threading import json from datetime import datetime # 配置监听地址 HOST = '0.0.0.0' PORT = 5000 def handle_client(conn, addr): """处理单个CMM连接""" print(f"PC-DMIS连接建立: {addr}") buffer = '' while True: try: data = conn.recv(1024) if not data: break buffer += data.decode('utf-8', errors='ignore') # 按换行符分割消息 while '\n' in buffer: line, buffer = buffer.split('\n', 1) if line.strip(): process_message(line.strip(), addr) except ConnectionResetError: break conn.close() print(f"连接断开: {addr}") def process_message(msg, addr): """处理单条测量数据""" timestamp = datetime.now().isoformat() record = { 'source': f"{addr[0]}:{addr[1]}", 'timestamp': timestamp, 'raw': msg, 'parsed': parse_kv(msg) } print(f"[{timestamp}] {msg}") # 这里扩展业务逻辑:写数据库、SPC分析、推MES等 # db.insert(record) # spc.analyze(record) def parse_kv(msg): parts = msg.split(',') result = {} for p in parts: if '=' in p: k, v = p.split('=', 1) result[k.strip()] = v.strip() return result # 启动TCP Server server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind((HOST, PORT)) server.listen(5) print(f"监听 {HOST}:{PORT},等待PC-DMIS连接...") try: while True: conn, addr = server.accept() thread = threading.Thread(target=handle_client, args=(conn, addr)) thread.daemon = True thread.start() except KeyboardInterrupt: print("服务器关闭") server.close()

Socket方案的优势:
• 一台上位机可以接收多台CMM的数据(每个连接独立线程)
• 跨厂房、跨地区都行,只要有网络
• 可以扩展为UDP广播模式,多个客户端同时接收数据
• 协议可以自定义,方便做复杂业务逻辑

四、PC-DMIS .NET API:深度集成方案

如果想做更复杂的集成(比如控制CMM启停、读取特征数据、修改测量程序),可以用PC-DMIS的.NET API。

C#示例(连接PC-DMIS实例并读取测量结果)

using PCDmisAutomation; class Program { static void Main() { // 连接到正在运行的PC-DMIS实例 var app = new PCDLRN.Application(); // 获取当前打开的零件程序 var partProgram = app.ActivePartProgram; // 读取所有特征 var features = partProgram.Features; foreach (var feature in features) { Console.WriteLine($"特征名: {feature.Name}"); Console.WriteLine($" 类型: {feature.Type}"); Console.WriteLine($" 实测值: X={feature.MeasuredX}, Y={feature.MeasuredY}, Z={feature.MeasuredZ}"); Console.WriteLine($" 偏差: {feature.Deviation}"); } // 注册测量完成事件 app.OnExecuteEnd += (sender, e) => { Console.WriteLine("测量程序执行完成"); // 触发数据采集和上传逻辑 }; } }

⚠️ 注意PC-DMIS .NET API需要购买相应的SDK授权,不是所有版本都支持。

五、数据格式建议

不管用哪种通信方式,建议数据格式统一用JSON。比PC-DMIS默认的key=value字符串更结构化,扩展性更好。

{ "machine_id": "CMM-001", "program_name": "BRACKET_V2", "part_serial": "SN20260707-001", "timestamp": "2026-07-07T15:30:22", "operator": "ZHANG", "features": [ { "name": "CIRCLE_1", "type": "CIRCLE", "measured": 25.0123, "nominal": 25.0000, "upper_tol": 0.020, "lower_tol": 0.000, "deviation": 0.0123, "status": "PASS" }, { "name": "PLANE_A", "type": "PLANE", "measured_flatness": 0.0085, "tolerance": 0.020, "status": "PASS" } ], "overall_status": "PASS" }

JSON格式直接入库到MongoDB、PostgreSQL都方便,前端展示也容易。

六、实战经验总结

场景推荐方案说明
单机短距离串口简单直接,成本低
多机或跨厂房Socket网络化,扩展性强
深度集成.NET API可控制CMM启停

通信方式选择:单机短距离选串口,多机或跨厂房选Socket,深度集成选.NET API。

数据完整性:通信过程中可能丢包或乱序,建议每条消息加序号和时间戳,上位机做去重和补发。

容错处理:CMM机器可能死机、上位机可能崩溃,两边都要有重连机制。Socket断开后PC-DMIS要能自动重连。

数据安全:如果走公网传输,建议加TLS加密,否则数据可能被截获篡改。

时钟同步:CMM机器和上位机要做NTP时钟同步,否则时间戳对不上,SPC分析会出错。

测试方法:先用PC-DMIS的模拟模式(不连真机)发送测试数据,验证通信链路稳定后再上产线。

七、写在最后

PC-DMIS的通信接口看起来复杂,实际把串口和Socket两种方式吃透,覆盖90%的工业场景需求了。剩下的10%可以用.NET API做深度定制。

如果对测量数据上云、对接MES有具体需求,欢迎到我们官网laiss.cn查看相关技术资料,或者直接联系我们的工程团队做方案咨询。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询