伺服压机控制系统架构:上位机与下位机职责划分及通信设计

发布时间:2026/10/3 12:19:21
伺服压机控制系统架构:上位机与下位机职责划分及通信设计 1. 伺服压机控制系统到底在控什么伺服压机这几年在装配、压装、成型这些工序里铺得很快原因不复杂传统液压机或者气动压机压力靠溢流阀、调压阀去“估”位置靠机械死挡块去“碰”过程曲线根本拿不到。伺服压机把执行机构换成了伺服电机加滚珠丝杠或者减速机压力和位置都变成了可编程、可采集、可闭环的量这才有了“压装曲线”“压力位移监控”这些玩法。但很多人第一次接触伺服压机项目容易把注意力全放在“选多大电机、配多大驱动器”上等电气都接完了才发现真正决定这套设备好不好用、能不能通过产线验收的是控制系统的软件架构怎么切分。说白了就是上位机与下位机各管什么这件事没想清楚后面就是无尽的扯皮上位机怪下位机响应慢下位机怪上位机指令发得太碎现场调试的人两头受气。我做过几个压装线的项目也帮别人收拾过烂摊子最常见的病根就一个把实时性要求高的闭环控制和逻辑调度、数据记录、人机交互全塞在一个控制器里或者反过来把本该下位机做的插补和压力闭环丢给上位机用轮询去凑。这两种做法短期能跑长期一定出问题。这篇文章我想把伺服压机控制系统的软件架构从头捋一遍重点讲清楚上位机和下位机的职责边界怎么划、通信层怎么设计、Modbus这类协议在什么位置用、以及实际调试中那些文档里不会写的坑。适合正在做压机项目、准备做压机项目或者手上有一套压机系统但总觉得哪里别扭的同行参考。不管你是写PLC的、写C#上位机的还是做整体方案设计的应该都能找到对得上的部分。2. 先搞清楚伺服压机的控制层级2.1 从物理结构看控制层级伺服压机的物理结构决定了控制层级这个顺序不能乱。最底下是执行层伺服电机、驱动器、压力传感器、位移传感器光栅尺或者编码器、还有各种限位和急停。往上一层是运动控制层负责把“压到50kN、停在位置30.00mm、保压2秒”这种工艺语言翻译成电机能执行的脉冲或者总线指令。再往上是逻辑与调度层管整个压装流程的时序、工位切换、报警处理。最上面是交互与数据层也就是操作工看到的界面和MES要的数据。这个层级对应到软件架构上就是典型的下位机加上位机结构。但“下位机”这个词在不同项目里指的东西不一样有的项目下位机就是一台PLC有的项目下位机是运动控制器加PLC组合还有的项目下位机是带运动控制功能的专用压机控制器。上位机也不一定是工控机可能是触摸屏、可能是边缘网关、也可能是直接跑在PC上的组态软件。2.2 为什么必须分层有人会问现在算力这么便宜为什么不能一台工控机全干了用C#写个上位机直接通过Modbus TCP去读写伺服驱动器的寄存器不就把下位机省了吗这个思路在慢速、低精度场合能跑但伺服压机不行。原因有三个。第一是实时性伺服压力闭环的控制周期通常在1ms甚至更短工控机跑Windows系统任务调度抖动随便就是几毫秒到几十毫秒这个抖动在压装曲线上就是明显的毛刺严重时直接导致压力超调。第二是确定性Windows下网络通信、内存回收、后台更新都可能打断控制循环而压装工艺对时序的要求是硬性的。第三是安全急停、超压保护、软限位这些必须由独立于操作系统的硬件逻辑来保证不能依赖一个可能蓝屏的PC。所以分层不是为了好看是物理规律和工程可靠性逼出来的。下位机负责“快而准”上位机负责“全而活”这个分工是伺服压机软件架构的第一原则。2.3 上位机与下位机的典型形态在实际项目里下位机的常见形态有几种。一种是PLC加运动控制模块比如用中型PLC带伺服轴压力闭环在PLC里用高速中断做。另一种是专用运动控制器比如基于Codesys或者类似平台的控制器运动控制和逻辑都在里面。还有一种是伺服驱动器自带压装功能块下位机只负责发指令和收结果。上位机的形态就更多了。最简单的是一块HMI触摸屏只做参数设置和状态显示。复杂一点的是工控机跑组态软件或者C#/Qt写的上位机做配方管理、曲线显示、数据存储、MES对接。再往上还有边缘计算网关做数据预处理和上云。不管形态怎么变职责划分的逻辑是一致的下位机管实时闭环和硬逻辑上位机管人机交互、配方、数据、调度。这条线划清楚了后面选型、写代码、调试都会顺很多。3. 下位机到底该管什么3.1 实时运动与压力闭环下位机的核心任务就一个把压装过程控制好。具体来说包括位置闭环、压力闭环、以及位置-压力切换控制。位置闭环相对简单伺服驱动器本身就能做下位机只需要发目标位置和速度驱动器内部完成电流环、速度环、位置环。但伺服压机的难点在于压力闭环。压力传感器信号进到下位机下位机要在一个控制周期内算出压力偏差然后输出速度或者力矩指令给驱动器。这个周期通常要求在1ms到4ms之间具体取决于压装工艺对压力波动的要求。我做过一个精密压装项目要求压力波动控制在满量程的0.5%以内控制周期最后定在1ms。这个周期下下位机的CPU负载已经到60%左右如果再把配方解析、曲线拟合、通信打包这些事塞进去负载直接爆掉。所以下位机的第一个职责边界就是只做实时控制不做非实时任务。压力闭环的实现方式也有讲究。常见的有PID加前馈前馈项根据位置或者速度来算用来补偿摩擦和惯性。还有的用模糊控制或者自适应控制但工业现场还是PID加前馈最稳参数好调出了问题好排查。3.2 硬逻辑与安全联锁下位机要处理的第二类事情是硬逻辑和安全联锁。急停信号、安全门开关、超压保护、软限位、驱动器使能、抱闸控制这些都必须在下位机里用硬件逻辑或者高速逻辑任务来处理。这里有个容易踩的坑有人把急停信号接到上位机上位机再通过通信告诉下位机停。这个链路太长了通信一旦卡顿急停就失效。正确的做法是急停直接切下位机的安全输入下位机在硬件层面切断伺服使能同时通过通信通知上位机显示报警。上位机只负责“知道”不负责“执行”。安全联锁的逻辑要尽量简单、直接、可验证。我见过一个项目安全逻辑写得极其复杂结果调试时发现一个中间变量在特定条件下没复位导致安全门开了机器还能动。后来把安全逻辑全部重写成独立的、不依赖任何工艺状态的安全程序块问题才解决。这个教训是安全逻辑要和工艺逻辑物理隔离不要共享状态变量。3.3 工艺时序与状态机下位机还要管工艺时序。一个完整的压装循环通常包括快下、慢下、探测、压装、保压、泄压、回程。每个阶段的位置、速度、压力、时间参数都不一样这些阶段的切换逻辑必须在下位机里用状态机来实现。状态机的好处是状态清晰、切换条件明确、容易排查问题。我习惯把压装过程拆成六到八个状态每个状态有进入条件、执行动作、退出条件、异常处理。状态机的代码要写得像流程图一样直白不要为了省几行代码把状态合并后面改工艺的时候会哭。这里有个经验状态机的状态数量宁多勿少。多一个状态调试时多一个观察点少一个状态出了问题就要在几个状态之间猜。我一般会把“等待压力建立”“压力保持”“压力释放”这些细分状态都单独列出来虽然代码长一点但现场调试效率高很多。3.4 与驱动器和传感器的接口下位机和驱动器之间的接口方式直接影响架构设计。常见的有三种脉冲加方向、模拟量加编码器反馈、总线通信。脉冲加方向最简单但压力闭环需要额外的模拟量输出和压力传感器输入接线多抗干扰能力差。模拟量方式响应快但精度受限于AD/DA位数和温漂。总线方式现在最主流EtherCAT、Profinet、CANopen都有用在伺服压机上的。总线方式接线少、信息量大、能读驱动器内部状态但对下位机的总线处理能力有要求。压力传感器的接口也要注意。应变式压力传感器输出的是毫伏级信号需要变送器放大到0-10V或者4-20mA。这个信号进下位机的模拟量输入模块采样率和分辨率要匹配控制周期。如果控制周期是1ms传感器和变送器的带宽至少要1kHz以上否则采样回来的压力值本身就是滞后的闭环效果肯定好不了。4. 上位机到底该管什么4.1 人机交互与参数管理上位机最直观的职责就是人机交互。操作工要设置压装参数、选择配方、启动停止、查看状态、处理报警这些都在上位机上完成。参数管理看起来简单其实有很多细节。压装参数通常包括快下位置、慢下位置、探测压力、压装速度、目标压力、目标位置、保压时间、泄压速度、回程位置等等。这些参数要按配方组织不同产品对应不同配方配方要能导入导出、能复制修改、能版本管理。我见过一个项目配方参数直接存在上位机的本地文件里结果操作工误删了文件整条线停了半天。后来改成配方存在下位机或者独立数据库里上位机只做展示和编辑问题才解决。所以配方的权威存储应该在下位机或者独立的数据服务里上位机是操作入口不是数据主人。4.2 曲线显示与数据记录伺服压机的核心价值之一就是压装曲线。压力-位移曲线、压力-时间曲线、速度-时间曲线这些曲线能直观反映压装过程是否正常。上位机要实时显示这些曲线还要能保存历史曲线供追溯。曲线显示的技术难点在于数据量和刷新率。如果下位机每1ms上传一个数据点一个3秒的压装过程就是3000个点上位机要实时画出来还要同时处理其他任务对UI框架有要求。常见的做法是下位机做数据缓冲按包上传上位机收到后先存再画画图用双缓冲或者硬件加速。数据记录要考虑存储格式和检索效率。我一般用SQLite或者轻量级时序数据库存曲线数据每条记录带时间戳、产品序列号、配方号、结果判定。这样MES要数据的时候可以直接查不用再解析二进制文件。4.3 配方与工艺调度上位机要管配方还要管工艺调度。比如一条线上有多台压机上位机要根据生产计划把不同配方下发到不同压机要协调上下料时序要收集每台压机的结果做整体判定。工艺调度这部分最容易出问题的地方是状态同步。上位机认为压机在“运行中”下位机可能已经因为报警停了上位机认为配方已经下发完成下位机可能还在解析。所以上位机和下位机之间要有一套清晰的状态同步机制不能靠“猜”。我的做法是下位机维护一个完整的状态字上位机定时读取同时下位机在状态变化时主动上报。上位机的界面显示以下位机的状态字为准上位机自己的操作按钮根据状态字使能或禁用。这样就不会出现上位机显示“运行中”但实际已经停机的尴尬。4.4 报警与事件管理报警管理是上位机的重要职责。下位机检测到异常后把报警码和相关信息传给上位机上位机负责显示、记录、提示处理建议。报警信息的设计要分层。第一层是报警码用于程序判断第二层是报警文本用于操作工阅读第三层是处理建议用于维护人员参考。这三层信息要一一对应不能只有报警码没有文本也不能只有文本没有码。我习惯在下位机里维护一个报警码表每个报警码对应一个结构体包含报警等级、报警文本、处理建议、是否自动复位。上位机启动时从下位机同步这个表这样报警信息统一由下位机管理上位机只负责展示。改报警文本的时候只改下位机一处不用两边同步。5. 通信层怎么设计才不背锅5.1 Modbus在伺服压机里的位置Modbus是伺服压机项目里出现频率很高的协议但它不是用来做实时控制的。Modbus RTU跑在RS485上典型波特率9600到115200一轮读写的时间在几毫秒到几十毫秒这个速度做压力闭环肯定不够。那Modbus用在哪通常用在三个地方。第一是下位机和上位机之间的非实时数据交换比如配方下发、状态上报、报警传输。第二是下位机和外围设备之间的通信比如和温控器、扫码枪、拧紧枪的通信。第三是设备之间的简单联锁比如压机和上下料机构的握手信号。我见过有人试图用Modbus TCP去读伺服驱动器的状态字来做闭环结果控制周期只能做到20ms压力曲线惨不忍睹。后来改成下位机本地读驱动器Modbus只用来传结果问题才解决。所以Modbus的定位是数据通道不是控制通道这个边界要守住。5.2 上位机与下位机的通信协议选型上位机和下位机之间的通信协议常见的有Modbus TCP、OPC UA、TCP自定义协议、以及各种现场总线。Modbus TCP的好处是简单、通用、调试工具多。Modbus Poll、Modbus Slave这些工具拿来就能用排查问题方便。缺点是功能有限大数据量传输效率低没有订阅机制只能轮询。OPC UA功能强有信息模型、有订阅、有安全机制适合和MES或者SCADA对接。但OPC UA的栈比较重下位机资源有限的时候跑不动而且调试比Modbus复杂。TCP自定义协议最灵活可以按需设计报文格式传输效率高。缺点是两边都要自己写解析代码调试工具要自己开发出了问题不好排查。我的经验是下位机和上位机之间用TCP自定义协议或者Modbus TCP下位机和MES之间用OPC UA或者数据库中间表。这样既保证了实时性又兼顾了标准化。5.3 数据映射与地址规划不管用什么协议数据映射和地址规划都是绕不过去的。Modbus有线圈、离散输入、输入寄存器、保持寄存器四种数据区每种都有地址范围。规划的时候要把下位机的数据按功能分区比如0x0000-0x00FF是状态字0x0100-0x01FF是控制字0x0200-0x02FF是配方参数0x0300-0x03FF是报警信息。地址规划要留余量不要算得刚刚好。我一般按实际需求的1.5倍到2倍预留地址空间后面加功能的时候不用重新规划。地址表要文档化最好用Excel维护包含地址、数据类型、读写权限、含义、单位、缩放因子。这个表是上位机和下位机开发人员的共同语言表不清楚两边一定对不上。这里有个坑不同设备的Modbus地址映射表不一定一样。同样是“目标压力”A品牌驱动器可能放在0x2000B品牌可能放在0x3000。做多品牌兼容的时候地址映射要可配置不能写死在代码里。5.4 通信异常处理与重连机制通信一定会出问题关键是怎么处理。常见的通信异常包括超时、校验错误、从站返回异常码、物理链路断开。上位机侧要有超时重试机制但不能无限重试。我一般设三次重试每次间隔100ms三次都失败就报通信故障同时把下位机状态标记为“未知”。界面上的数据要变灰或者显示“--”不能显示旧数据否则操作工会被误导。下位机侧要有通信看门狗。如果上位机超过一定时间没有发心跳下位机要判断上位机离线根据工艺要求决定是继续运行还是安全停机。对于压机这种设备我倾向于上位机离线时下位机完成当前循环后停机不要中途停避免压装到一半松开。重连机制要自动。通信恢复后上位机要重新同步状态和配方不能假设下位机还在原来的状态。我一般在上位机启动和重连后都做一次全量同步把关键状态和配方读一遍确保两边一致。6. 一套可落地的软件架构方案6.1 整体架构分层基于上面的分析我给出一套实际项目里用过的架构方案。这套方案跑过几条压装线稳定性还可以。下位机用支持运动控制的PLC或者专用控制器内部程序分四个任务层级。最高优先级是安全任务处理急停、超压、软限位周期1ms。第二优先级是运动控制任务处理位置闭环和压力闭环周期1ms。第三优先级是工艺状态机任务处理压装流程时序周期5ms。最低优先级是通信任务处理Modbus TCP或者自定义TCP周期20ms。上位机用C#或者Qt开发分三个线程。UI线程负责界面刷新和用户操作。通信线程负责和下位机交换数据维护连接状态。数据处理线程负责曲线存储、报警记录、MES对接。6.2 数据流与控制流数据流的方向要明确。控制流是上位机到下位机配方下发、启动停止、模式切换。数据流是下位机到上位机状态上报、曲线数据、报警信息、结果数据。控制流要短、要确认。上位机发一条控制指令下位机收到后执行并返回执行结果上位机根据结果更新界面。不要发完就不管也不要下位机执行了但上位机不知道。数据流要批量、要缓冲。下位机采集的曲线数据先存在本地缓冲区按固定长度打包上传上位机收到后先入队再处理。这样即使上位机短暂卡顿数据也不会丢。6.3 关键接口定义上位机和下位机之间的接口要文档化最好用表格定义清楚。下面是一个简化的接口表示例。地址名称类型读写含义备注0x0000StatusWordUINT16R下位机状态字位定义见附表0x0001AlarmCodeUINT16R当前报警码0表示无报警0x0010ControlWordUINT16W上位机控制字位定义见附表0x0020TargetPressureUINT16W目标压力单位0.1kN0x0021TargetPositionINT32W目标位置单位0.001mm0x0030CurrentPressureUINT16R当前压力单位0.1kN0x0031CurrentPositionINT32R当前位置单位0.001mm0x0040RecipeNumberUINT16W配方号1-9990x0100CurveDataARRAYR曲线数据区批量读取状态字和控制字的位定义也要文档化。比如状态字的bit0表示“就绪”bit1表示“运行中”bit2表示“报警”bit3表示“急停”。控制字的bit0表示“启动”bit1表示“停止”bit2表示“复位”。这些位定义一旦确定就不要轻易改改了要通知所有相关方。6.4 配方管理方案配方管理我推荐“下位机存储、上位机编辑”的模式。下位机里维护一个配方区每个配方有编号和参数列表。上位机从下位机读取配方列表操作工选择配方后上位机把配方参数下发到下位机的当前配方区下位机根据当前配方区执行。配方的导入导出在上位机做导出成CSV或者JSON文件方便备份和转移。配方版本管理可以在上位机做每次修改记录修改人、修改时间、修改内容但权威版本还是以下位机里的为准。6.5 曲线采集与存储方案曲线采集的关键是采样率和数据量。压力闭环周期1ms但曲线显示不需要1ms一个点可以每5ms或者10ms取一个点上传。这样3秒的压装过程是300到600个点上位机处理起来轻松很多。存储用SQLite就够了每条曲线存一条记录包含时间戳、产品序列号、配方号、曲线数据二进制或者JSON、结果判定。查询的时候按时间范围或者序列号查SQLite的性能完全够用。如果数据量特别大可以按月分表或者用轻量级时序数据库。7. 调试与排查实战记录7.1 压力闭环振荡的排查压力闭环振荡是最常见的问题。现象是压力在目标值附近来回波动幅度可能几个kN严重时直接触发超压报警。排查思路从三个方向入手。第一是控制参数PID的P太大或者I太小都会振荡先把I设为0只调P让系统稳定下来再加I。第二是传感器信号压力传感器的信号是否有干扰屏蔽线是否接地良好变送器输出是否稳定。第三是机械因素丝杠间隙、联轴器松动、导轨摩擦变化都会导致振荡。我遇到过一次振荡调PID怎么都调不好后来发现是压力传感器的屏蔽线没接信号上叠加了伺服驱动器的干扰。把屏蔽线接好振荡立刻消失。所以调闭环之前先确认信号质量信号不干净参数怎么调都是白搭。7.2 通信超时的排查通信超时也是高频问题。Modbus TCP超时先看物理链路网线、交换机、IP地址、子网掩码。然后看从站是否响应用Modbus Poll直接连下位机看能不能读到数据。如果Modbus Poll能读上位机读不到那就是上位机代码的问题检查单元标识符、寄存器地址、功能码是否正确。Modbus RTU超时先看波特率、数据位、停止位、校验位是否匹配。然后看终端电阻RS485总线两端要接120欧姆终端电阻不接的话长距离通信会反射。还要看总线拓扑手拉手连接不要星型分支。我见过一个项目Modbus RTU通信时好时坏后来发现是总线走了星型而且终端电阻只接了一端。改成手拉手加两端终端电阻后通信稳定了。所以RS485的物理层规范要严格遵守不要觉得能通就行。7.3 常见问题速查表现象可能原因排查方法解决措施压力振荡PID参数不当先P后I逐步调重新整定PID压力振荡传感器干扰检查屏蔽和接地屏蔽线单端接地压力偏差大传感器未校准用标准砝码校验重新校准位置不准编码器干扰检查编码器线用双绞屏蔽线通信超时物理链路问题用调试工具直连检查网线/终端电阻通信超时地址不匹配核对地址表修正地址上位机卡顿UI线程阻塞检查耗时操作移到后台线程曲线丢点缓冲区溢出检查缓冲大小增大缓冲或提高上传频率报警不显示报警码未映射核对报警码表补充映射配方下发失败通信中断检查连接状态重连后重新下发7.4 几个容易忽略的细节第一个细节是时间同步。上位机和下位机的时间要同步否则曲线时间戳和报警时间对不上追溯的时候很麻烦。可以用NTP也可以上位机定时下发时间。第二个细节是数据字节序。Modbus寄存器是16位的32位数据要拆成两个寄存器哪个是高字哪个是低字两边要约定好。我见过因为字节序不一致导致位置数据完全错误的案例。第三个细节是浮点数传输。Modbus本身不支持浮点数要用两个寄存器拼。IEEE 754格式两边都要按同样的方式解析。如果下位机是PLC上位机是C#要注意PLC的浮点数和C#的float是否一致。第四个细节是通信负载。Modbus TCP轮询频率不要太高100ms到200ms一轮就够了。轮询太快下位机的通信任务占用CPU影响控制任务。我一般把通信任务放在最低优先级确保不影响控制。8. 架构演进与扩展考虑8.1 从单机到产线的扩展单台压机的时候上位机直接连下位机就行。但产线上有多台压机还有上下料、检测、打标等设备架构就要扩展。常见的做法是加一层产线控制器或者边缘网关。每台压机的下位机通过Modbus TCP或者Profinet连到网关网关做数据汇聚和产线调度网关再和MES通信。这样每台压机的控制独立性不受影响产线层面的调度也灵活。网关的选型要注意协议转换能力。如果压机用Modbus TCPMES用OPC UA网关要能做协议转换。如果压机品牌多协议杂网关要支持多种协议。我一般选支持Modbus TCP、OPC UA、MQTT的网关覆盖面广一些。8.2 数据上云与远程运维现在很多项目要求数据上云做远程运维和数据分析。这个需求对架构的影响主要在通信层。下位机的数据先到上位机或者网关上位机做初步处理后通过MQTT或者HTTP上传到云平台。上传的数据包括设备状态、产量统计、报警统计、关键曲线特征值。原始曲线数据量大一般不上云存在本地需要的时候再调。远程运维要考虑安全。远程访问要经过认证和授权不能直接暴露下位机的通信端口。我一般用网关做反向代理云平台通过网关访问设备网关做访问控制和日志记录。8.3 架构的可维护性设计架构设计的时候要为维护考虑。几个原则配置和代码分离参数和逻辑分离通用功能和专用功能分离。配置和代码分离的意思是通信地址、超时时间、重试次数这些放在配置文件里改的时候不用重新编译。参数和逻辑分离的意思是配方参数、PID参数这些放在数据区里改的时候不用改程序。通用功能和专用功能分离的意思是通信、报警、配方管理这些做成通用模块压装工艺做成专用模块换产品的时候只改专用模块。这样设计的好处是现场调试的时候改配置和参数就行不用动程序。程序改动越少引入新问题的风险越小。8.4 未来可能的调整方向如果以后要支持更复杂的压装工艺比如多段压装、变速度压装、自适应压装下位机的状态机和闭环控制要能扩展。状态机要支持子状态和并行状态闭环控制要支持多段参数切换。如果以后要支持更多设备接入通信层要抽象。把Modbus、OPC UA、TCP自定义协议都封装成统一的接口上层业务逻辑不关心底层用什么协议。这样加新协议的时候只加一个实现类不改业务代码。如果以后要做预测性维护数据采集要更细。除了压力、位置、速度还要采集电流、温度、振动等信号。这些信号的采集频率和存储策略要提前规划不要等需要的时候发现数据没存。我个人在实际项目中的体会是伺服压机的软件架构没有绝对的标准答案但有一条底线实时控制必须在下位机数据管理和人机交互必须在上位机中间的通信层要简单可靠。守住这条底线剩下的就是根据项目规模、预算、团队技术栈去调整。架构不是越复杂越好是越合适越好。一个能稳定跑三年不出大问题的架构比一个技术上很先进但天天救火的架构有价值得多。