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) ,NOMINAL50,TOL0.02这条命令会在测量到HEIGHT_1特征后把实测值通过COM1发送出去。上位机端Python示例import serial import time # 配置串口参数与PC-DMIS端一致 ser serial.Serial( portCOM3, # 注意上位机端的COM号 baudrate115200, bytesize8, parityN, stopbits1, timeout1 ) 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, errorsignore) 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(fPC-DMIS连接建立: {addr}) buffer while True: try: data conn.recv(1024) if not data: break buffer data.decode(utf-8, errorsignore) # 按换行符分割消息 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(targethandle_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默认的keyvalue字符串更结构化扩展性更好。{ 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查看相关技术资料或者直接联系我们的工程团队做方案咨询。