ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

伺服压机控制系统架构:上位机与下位机功能边界拆解

伺服压机控制系统架构:上位机与下位机功能边界拆解 1. 伺服压机控制系统到底在控什么1.1 从一台压机的动作链条说起伺服压机这几年在精密装配、粉末成型、电池极片压制这些场景里铺得很快核心原因就一个它把传统液压机或气动压机那种“大概压到某个位置就行”的粗放模式换成了“位置、速度、压力三条曲线全程可编程”的精细模式。你给它一条压装曲线它就能按这条曲线走完整个行程并且在每一个毫秒级的时间点上告诉你当前的压力是多少、位置在哪、电机出力多大。这套东西拆开来看物理层面就是一台伺服电机或者伺服电机加减速机加丝杠的传动组合、一套压力传感器、一套位置编码器再加上一个能实时跑闭环算法的控制器。但真正决定这台压机好不好用、能不能压出合格品的是它上面跑的那套软件。软件架构分得清不清楚直接决定了你后面调试顺不顺手、换型快不快、出了问题好不好查。我见过不少项目机械部分做得挺扎实电机选型也留了余量但软件架构一塌糊涂——上位机把实时控制也揽过去了结果通信延迟一抖动压力曲线就出毛刺或者下位机把所有逻辑都吃进去上位机只当个显示屏换个压装配方要重新烧程序。这些都是架构没分好的典型症状。1.2 上位机与下位机的分工本质先把一个基本概念说清楚。伺服压机控制系统里的“上位机”和“下位机”不是按硬件形态分的而是按实时性责任和人机交互责任分的。下位机是那个直接跟电机驱动器、传感器打交道的角色。它跑的是硬实时任务周期通常在1毫秒甚至更短负责电流环、速度环、位置环的闭环计算负责急停响应负责限位保护。它的代码里不能有“等一等”“缓一缓”这种逻辑每一个扫描周期都必须确定性地完成。上位机是那个跟人打交道的角色。它负责配方管理、曲线编辑、数据记录、报表导出、权限管理、跟MES或数据库对接。它的实时性要求低得多几百毫秒的延迟人眼根本感觉不到但它对界面友好度、数据吞吐量、可扩展性的要求高得多。这两者之间的边界如果画错了后果很直接把实时任务放到上位机压装精度就废了把配方管理塞进下位机换型效率就废了。所以架构设计的第一步就是拿一把“实时性尺子”去量每一个功能模块量完了再决定它归谁管。1.3 为什么现在谈这个问题的特别多伺服压机早些年多是专用控制器方案一家供应商一套封闭系统你也不用操心架构买来就用。但现在情况变了一方面国产伺服驱动器和运动控制卡成熟了很多集成商开始自己搭系统另一方面产线柔性化要求越来越高一台压机可能要压十几种工件配方切换要跟MES联动数据要上传追溯。这些需求逼着大家把系统拆开来看哪些必须实时哪些可以异步哪些放边缘哪些上云端。再加上最近几年上位机开发工具链变化很快C#、Qt、LabVIEW各有各的生态下位机这边PLCopen、CODESYS、自研RTOS也在互相抢地盘。选型一多架构问题就浮到水面上了。我写这篇东西就是想把这几年在伺服压机项目里踩过的架构坑、总结的分层方法用能直接抄作业的方式讲清楚。2. 软件架构分层的核心逻辑与选型依据2.1 三层架构还是四层架构先看实时性梯度伺服压机控制系统的软件架构我习惯按实时性梯度来分层而不是按传统的“界面层-逻辑层-数据层”那种Web思维来分。因为这套系统的核心矛盾是实时性不是数据一致性。最底下是硬实时层跑在DSP、FPGA或者带RTOS的ARM上周期50微秒到1毫秒。这一层只管三件事电流环PID、PWM输出、编码器解码。它不关心你压的是什么工件也不关心配方号是多少它只执行上层下发的目标值。往上是软实时层跑在PLC或运动控制器上周期1毫秒到10毫秒。这一层负责位置环和速度环的闭环、压力闭环切换、多轴插补、急停逻辑、限位保护。它需要知道“现在执行的是第几段曲线”但不需要知道“这个工件是谁做的”。再往上是协调层跑在工控机或边缘控制器上周期10毫秒到100毫秒。这一层负责曲线插值、配方解析、模式切换、状态机管理、跟下位机的周期通信。它把上位机下发的“压装配方”翻译成下位机能理解的“目标位置序列”和“目标压力序列”。最上面是应用层就是通常说的上位机软件跑在Windows或Linux上周期不固定。它负责人机界面、数据存储、报表、权限、MES接口。这一层可以卡顿可以重启但不能影响下面三层的运行。这四层不是每套系统都必须全有。小型的单轴伺服压机可能把软实时层和协调层合并到同一个控制器里大型的多轴压装线可能把协调层独立成一台边缘服务器。但硬实时层和应用层永远不能合并这是底线。2.2 为什么不让上位机直接控电机我见过最离谱的方案是用C#写个上位机通过串口或以太网直接给伺服驱动器发位置指令中间没有独立的运动控制器。这种方案在实验室里跑Demo没问题一上产线就露馅。问题出在Windows和Linux都不是实时操作系统。Windows的线程调度精度在10到15毫秒左右遇到系统更新、杀毒软件扫描、网络中断延迟能飙到几百毫秒。你发一条“以50毫米每秒的速度走到100毫米位置”的指令驱动器收到了开始走但下一条“减速”指令因为系统卡顿晚了200毫秒才到电机就冲过头了。压装场景里冲过头意味着工件压裂或者模具损坏。所以上位机可以下发配方可以启动流程可以监控状态但绝对不能直接参与闭环控制。闭环必须在下位机里完成上位机只负责告诉下位机“从A点走到B点用这条曲线”然后下位机自己跑完跑完了告诉上位机“我到了压力峰值是12.3千牛”。2.3 通信协议选型EtherCAT、Profinet还是Modbus TCP上位机和下位机之间的通信协议直接决定了架构的响应能力和布线复杂度。我按实际项目经验给个选型对照协议典型周期适用场景硬件成本调试难度EtherCAT100微秒到1毫秒多轴同步、高精度压装中高中Profinet IRT250微秒到1毫秒西门子生态、产线集成高中高Modbus TCP5到20毫秒单轴、低速压装、监控低低CANopen1到5毫秒分布式小轴、车载场景低中串口自定义协议10到50毫秒老设备改造、简单控制极低低选型逻辑很简单看你的压装精度要求和轴数。单轴、压力精度要求±1%以内的Modbus TCP够用多轴同步、压力精度要求±0.5%以内的必须上EtherCAT或Profinet IRT。别为了省几百块钱的通信卡把整个系统的精度搭进去。还有一个容易忽略的点通信周期要和下位机的控制周期匹配。下位机跑1毫秒的控制周期你上位机用20毫秒的Modbus TCP去发指令那下位机有19个周期是在执行旧指令。对于慢速压装无所谓对于快速压装就是灾难。这时候要么提高通信速率要么在下位机里做指令缓冲和插值。2.4 下位机内部还要不要再分层要。下位机不是一坨代码它内部至少分三层驱动层、控制层、通信层。驱动层直接操作寄存器配置PWM频率、死区时间、编码器接口模式。这一层跟硬件绑定换一款驱动器就要重写。控制层跑PID算法、轨迹规划、状态机。这一层跟硬件无关可以跨平台复用。我习惯把PID参数、加减速曲线、限位阈值都做成可配置的参数存在EEPROM里换型时不用重新编译。通信层负责跟上位机和其他从站交换数据。这一层要处理协议解析、数据打包、超时重发。EtherCAT从站的通信层通常是芯片厂商提供的但你要自己写PDO映射和对象字典。这三层之间的接口要定义清楚。控制层只跟驱动层要“当前位置”和“当前压力”只给驱动层发“目标电流”通信层只跟控制层要“当前状态字”和“当前实际值”只给控制层发“目标位置”和“目标压力”。接口定好了换驱动器只改驱动层换协议只改通信层控制算法不动。3. 上位机与下位机的功能边界实操拆解3.1 下位机必须扛起来的五件事下位机的职责清单我按优先级排第一闭环控制。位置环、速度环、压力环的PID计算必须在下位机完成。压力环的切换逻辑——什么时候从位置模式切到压力模式什么时候切回来——也在下位机。这个切换点通常设在“位置到达目标值的95%”或者“压力达到设定值的80%”具体阈值要根据工件刚度和压装速度来调。第二安全逻辑。急停、超压保护、超位保护、跟随误差监控这些必须在下位机里硬线实现或者放在最高优先级任务里。急停响应时间要求小于10毫秒从上位机走一圈根本来不及。第三轨迹插值。上位机发过来的是“第1段到50毫米速度30毫米每秒第2段到52毫米速度5毫米每秒”这样的关键点下位机要在每个控制周期里算出当前应该在哪。直线插值最简单S形曲线插值能减少冲击但计算量大一些。我一般把插值放在下位机的1毫秒任务里用查表加线性插值的方式兼顾精度和速度。第四状态监控与报警。下位机每个周期都在采集实际位置、实际压力、电机电流、跟随误差。这些数据要实时判断是否超限超限了立刻报警并停机。报警信息要缓存起来等上位机来读。第五掉电保护。压装过程中掉电下位机要能在断电前把当前位置、当前段号、已压装数量写进非易失存储器。下次上电后上位机读出来决定是继续还是废弃。3.2 上位机该管好的六件事上位机的职责清单同样按优先级排第一配方管理。每个工件对应一套压装参数目标位置、目标压力、速度曲线、保压时间、压力上下限。这些参数存在数据库里操作工选工件号上位机把对应参数下发给下位机。配方要支持导入导出方便批量复制到多条产线。第二曲线编辑与预览。操作工需要在界面上拖拽关键点来编辑压装曲线编辑完了能预览整个行程的位置-时间、压力-时间、位置-压力曲线。这个功能用Qt或C#的图表控件都能做关键是编辑完要能一键下发。第三数据记录与追溯。每一次压装都要记录时间戳、工件号、配方号、实际位置曲线、实际压力曲线、峰值压力、最终位置、结果判定。数据量大的话曲线数据存二进制文件统计结果存数据库。追溯要求高的场景还要把曲线数据上传到MES。第四用户权限管理。操作工只能选配方、启动、停止工程师可以改配方、调PID管理员可以改系统参数、管理用户。权限分级用角色表实现每个操作前检查当前用户的权限位。第五设备状态总览。多台压机联网时上位机要能显示每台压机的当前状态运行中、待机、报警、离线。点击某台压机可以进入详细监控页面。这个功能用C#的WPF或者Qt的QML做都比较顺手。第六日志与诊断。通信超时、下位机报警、配方校验失败、数据库连接断开这些事件都要记日志。日志要分级别支持按时间、按关键字过滤。诊断页面要能显示通信统计发送帧数、接收帧数、错误帧数、平均响应时间。3.3 边界地带的三个灰色功能怎么分有三个功能放上位机和下位机都有道理我来说说我的分法。第一个是压力峰值判定。压装完成后系统要判断峰值压力是否在合格范围内。这个判定可以放在下位机做也可以放在上位机做。我的做法是下位机实时计算峰值压力压装结束后把峰值发给上位机上位机拿峰值跟配方里的上下限比较给出合格/不合格结论。为什么这么分因为峰值计算需要实时性但合格判定可能涉及更复杂的逻辑比如连续多件趋势分析放上位机更灵活。第二个是曲线平滑处理。上位机编辑的曲线可能有尖角直接下发会导致加速度突变。我通常在上位机做一次预平滑用滑动平均或者样条拟合然后把平滑后的关键点下发给下位机。下位机再做一次在线插值。这样既保证了曲线质量又不会给下位机增加太多计算负担。第三个是报警复位。报警产生在下位机但复位操作通常在上位机界面上点按钮。我的做法是下位机维护一个报警字每个bit对应一种报警上位机显示报警列表操作工点“复位”后上位机发一个复位命令字给下位机下位机收到后检查报警条件是否消失消失了才清报警字。这样避免了上位机误复位导致的安全问题。3.4 一个典型的任务分配表我把一个单轴伺服压机项目的任务分配整理成表你可以直接参考功能下位机上位机通信方式电流环PID执行不参与无位置环PID执行不参与无压力环PID执行不参与无轨迹插值执行不参与无配方存储缓存当前配方主存储下发/上传曲线编辑不参与执行无压装启动接收命令发送命令周期通信峰值压力计算执行不参与上传结果合格判定不参与执行无数据记录缓存最近N条主存储批量上传报警检测执行显示周期通信报警复位执行发送命令事件通信用户权限不参与执行无MES接口不参与执行无这张表的核心逻辑是跟电机和传感器直接相关的实时任务全在下位机跟人和数据库相关的非实时任务全在上位机中间用周期通信和事件通信连接。4. 实操过程与核心环节实现4.1 下位机控制周期的确定与任务划分下位机的控制周期不是拍脑袋定的要从压装精度反推。假设你的压装速度是50毫米每秒要求位置精度±0.01毫米那么每个控制周期内电机走过的距离不能超过精度值。50毫米每秒乘以控制周期T要小于0.01毫米算出来T要小于0.2毫秒。所以控制周期至少要做到200微秒。但实际项目中200微秒的控制周期对CPU压力很大。我通常的做法是电流环跑100微秒位置环和压力环跑500微秒轨迹插值跑1毫秒。这样既保证了电流响应速度又不会让CPU满载。任务划分用RTOS的任务调度器实现。电流环任务优先级最高位置环次之通信任务再次之状态监控任务最低。每个任务用独立的定时器触发任务之间用消息队列传递数据。共享数据用互斥锁保护但互斥锁的持有时间要尽可能短避免优先级反转。注意如果用的是带FPGA的控制器可以把电流环和编码器解码放到FPGA里做CPU只跑位置环和逻辑这样控制周期可以做到50微秒以内。4.2 上位机与下位机的通信帧设计通信帧的设计直接决定了系统的可靠性和可扩展性。我习惯用周期帧加事件帧的混合模式。周期帧每10毫秒发一次内容固定上位机发给下位机的是控制字启动、停止、复位、模式选择、目标位置、目标压力、目标速度下位机发给上位机的是状态字运行中、到位、报警、就绪、实际位置、实际压力、实际速度、当前段号、报警码。事件帧在特定事件发生时发送比如压装完成、报警产生、配方切换。事件帧的内容不固定用TLV格式类型-长度-值编码方便扩展。帧结构我一般这样定义// 周期帧结构固定长度 typedef struct { uint16_t header; // 帧头 0xAA55 uint8_t cmd; // 命令字 uint8_t status; // 状态字 int32_t target_pos; // 目标位置单位0.001mm int32_t target_press; // 目标压力单位0.001kN int32_t actual_pos; // 实际位置 int32_t actual_press; // 实际压力 uint16_t segment; // 当前段号 uint16_t alarm; // 报警码 uint16_t crc; // CRC16校验 } CyclicFrame;CRC校验必须加工业现场电磁干扰大没有校验的帧很容易出错。CRC16用Modbus多项式计算量小检错率高。4.3 压力闭环的切换逻辑实现压力闭环的切换是伺服压机控制里最微妙的部分。位置模式切压力模式切早了压装速度上不去切晚了压力超调。我一般用位置到达加压力阈值的双条件判断。具体逻辑在位置模式下每个控制周期检查当前位置是否大于目标位置的90%同时检查实际压力是否大于目标压力的70%。两个条件都满足时切换到压力模式。切换时把压力环的积分项初始化为当前电机出力对应的值避免积分饱和导致超调。// 压力闭环切换逻辑伪代码 if (control_mode POSITION_MODE) { if (actual_pos target_pos * 0.9 actual_press target_press * 0.7) { control_mode PRESSURE_MODE; pressure_pid.integral current_motor_output; // 积分项预置 } } else if (control_mode PRESSURE_MODE) { if (actual_press target_press * 1.05) { // 压力超调切回位置模式或者直接停机 control_mode POSITION_MODE; } }这个90%和70%的阈值不是固定的要根据工件刚度调整。工件硬阈值要提前工件软阈值要延后。我通常把这些阈值做成配方参数调试时在线修改。4.4 上位机配方管理的数据库设计上位机的配方管理用SQLite就够了单机场景不需要上MySQL或SQL Server。表结构我一般这样设计CREATE TABLE recipe ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE, workpiece_id TEXT, target_pos REAL, target_press REAL, speed_curve TEXT, -- JSON格式存储曲线关键点 hold_time INTEGER, -- 保压时间毫秒 press_upper REAL, -- 压力上限 press_lower REAL, -- 压力下限 create_time DATETIME, update_time DATETIME ); CREATE TABLE production_record ( id INTEGER PRIMARY KEY AUTOINCREMENT, recipe_id INTEGER, start_time DATETIME, end_time DATETIME, peak_press REAL, final_pos REAL, result INTEGER, -- 0合格 1不合格 curve_data BLOB, -- 压缩后的曲线数据 FOREIGN KEY(recipe_id) REFERENCES recipe(id) );曲线数据用JSON存关键点格式类似[{pos:0,speed:30},{pos:50,speed:5},{pos:52,speed:0}]。上位机解析后下发给下位机。生产记录的曲线数据用zlib压缩后存BLOB一条记录大概几KB存十万条也就几百MB。4.5 多台压机联网时的架构调整单台压机的架构是上位机直连下位机。多台压机联网时我建议加一层边缘网关。边缘网关跑在工控机上负责跟多台下位机通信把数据汇总后统一上传给中央上位机。这样做的好处是中央上位机不用直接跟几十台下位机打交道通信负载分散到多个网关网关可以做本地数据缓存网络中断时不丢数据网关可以做协议转换下位机用EtherCAT网关转成MQTT上传。网关跟下位机之间用EtherCAT或Modbus TCP网关跟中央上位机之间用MQTT或HTTP。网关的软件架构跟单台压机的上位机类似但界面可以简化主要做数据转发和缓存。提示网关的本地缓存至少要能存24小时的数据。我遇到过网络中断8小时的情况网关缓存写满了就开始丢数据后来把缓存扩到32GB才够用。5. 常见问题与排查技巧实录5.1 通信超时导致压装中断现象压装过程中上位机报“通信超时”下位机进入报警状态压装中止。排查思路先看是周期性的还是偶发的。周期性超时通常是通信周期设置太短或者网络负载太高。偶发超时通常是电磁干扰或者网线接触不良。解决方法把通信周期从5毫秒放宽到10毫秒试试检查网线是否用了屏蔽双绞线屏蔽层是否单端接地在下位机里加通信看门狗超时后保持当前状态而不是直接停机等通信恢复后继续。我踩过的坑有一次现场变频器跟伺服驱动器共用一条动力电缆桥架通信误码率飙升。后来把通信线单独走金属线槽跟动力线间距30厘米以上问题解决。5.2 压力曲线出现毛刺现象上位机显示的压装曲线在保压段出现周期性毛刺压力波动±5%以上。排查思路先看毛刺频率。如果毛刺频率跟通信周期一致说明是通信延迟导致的指令抖动。如果毛刺频率跟电机电流频率一致说明是PID参数太激进。解决方法通信导致的毛刺把压力环的积分时间加长或者在下位机里加指令低通滤波。PID导致的毛刺减小比例增益增大积分时间。我一般先把比例增益减半看毛刺是否消失然后慢慢加回去。注意压力环的PID参数跟液压系统完全不同。伺服压机的压力环响应快比例增益可以设得比较高但积分时间不能太短否则容易振荡。我常用的起始参数是比例增益0.5积分时间50毫秒微分时间0。5.3 配方下发后下位机不执行现象上位机显示配方下发成功但下位机收到后不启动压装。排查思路先看下位机的状态字是不是处于“未就绪”状态。再看配方参数是否超出下位机的允许范围比如目标位置超过了软限位。解决方法在下位机里加配方校验逻辑收到配方后先检查每个参数是否在允许范围内超出范围就返回错误码。上位机收到错误码后弹窗提示具体哪个参数有问题。我见过最隐蔽的问题是浮点数精度上位机用双精度下位机用单精度0.1毫米下发后变成0.0999999毫米刚好低于下位机的最小位置阈值导致不启动。后来统一用整数单位0.001毫米问题消失。5.4 常见问题速查表问题现象可能原因排查方法解决措施通信超时周期太短、干扰、网线问题看超时是否周期性放宽周期、屏蔽线、看门狗压力毛刺通信抖动、PID激进看毛刺频率低通滤波、调PID配方不执行参数超限、精度问题看状态字和错误码加校验、统一数据类型位置超调减速点太晚、增益太高看位置曲线提前减速、降增益报警不复位报警条件未消失看报警码先排除报警源再复位数据丢失缓存满、数据库锁看日志扩缓存、加重试多轴不同步通信周期不一致看各轴状态统一时钟、用EtherCAT上位机卡顿界面线程阻塞看CPU占用异步刷新、数据分页5.5 几个只有踩过才知道的坑第一个坑上位机的曲线预览和下位机的实际执行不一致。原因是上位机用浮点数插值下位机用定点数插值累积误差导致末端位置差了几十微米。后来统一用定点数上位机预览时也转成定点数算问题解决。第二个坑急停后重新上电下位机自动恢复运行。这是状态机设计缺陷。急停后下位机应该进入“急停锁定”状态必须上位机发复位命令才能退出。我在状态机里加了锁定状态上电后默认进入锁定必须手动复位。第三个坑多台压机共用一个上位机时通信线程互相阻塞。一台压机的通信超时导致整个上位机界面卡死。后来改成每台压机一个独立通信线程线程之间用消息队列通信界面线程只读队列不直接跟下位机打交道。第四个坑配方里的速度曲线关键点太多下位机插值计算超时。上位机编辑时允许拖拽任意多个点下位机1毫秒任务里算不过来。后来限制关键点最多20个上位机自动抽稀问题解决。6. 架构扩展与后续演进方向6.1 从单机到产线级架构的平滑过渡单台压机的架构跑通之后往产线级扩展时我建议保持下位机不变只改上位机和加网关。下位机的接口设计要预留扩展字段比如周期帧里留几个保留字节以后加新功能时不用改帧长度。产线级架构里每台压机的下位机还是跑自己的闭环网关负责跟多台下位机通信中央上位机负责整线调度。中央上位机跟网关之间用MQTT网关跟下位机之间用EtherCAT或Modbus TCP。这样单台压机出问题不会影响整线网关缓存也能保证数据不丢。6.2 边缘计算能帮上什么忙边缘网关除了做协议转换和缓存还能做本地质量判定。比如连续压装100件边缘网关可以实时计算峰值压力的均值和标准差发现趋势性偏移时提前报警而不是等出了不合格品才停线。这个计算量不大用Python或C#在网关上跑就行。再进一步边缘网关可以做预测性维护。采集电机电流的谐波分量、丝杠的振动信号用简单的FFT分析就能发现丝杠磨损或轴承故障的早期特征。这些数据不用上传到云端在网关本地分析就行响应更快也不占带宽。6.3 上位机技术栈的选型建议上位机开发工具的选择我按项目规模给建议单台压机、功能简单C# WinForm开发快资料多跟下位机通信库成熟。单台压机、界面要求高C# WPF或Qt QML图表控件丰富动画流畅。多台压机、Web访问Vue或React做前端Node.js或Python做后端通过WebSocket跟网关通信。快速原型、实验室LabVIEW图形化编程跟NI的实时机配合好但部署成本高。我个人的偏好是C# WPF加SQLite开发效率高部署简单一台工控机就能跑。Qt的优势是跨平台但Windows下的部署包比较大看项目需求取舍。6.4 下位机RTOS的选择下位机RTOS的选择面比较窄主流就那几个FreeRTOS免费资料多适合中低端ARM Cortex-M。RT-Thread国产中文资料多组件丰富适合快速开发。VxWorks贵但确定性最好适合高端多轴控制。Linux加PREEMPT_RT免费生态好但实时性比专用RTOS差一些适合对实时性要求不是极端高的场景。我一般用FreeRTOS或RT-Thread配合STM32H7或i.MX RT系列跑500微秒的控制周期没问题。如果要做100微秒以内的电流环还是得用DSP或FPGA。6.5 一个值得关注的趋势OPC UA over TSNOPC UA over TSN是工业通信的一个演进方向它把OPC UA的信息模型和TSN的确定性网络结合起来理论上可以用一条网线同时跑实时控制和非实时数据。目前芯片和协议栈还在成熟中但值得关注。如果以后伺服驱动器都支持TSN上位机和下位机的边界可能会重新定义——实时数据和非实时数据跑在同一张网上架构会更简洁。不过现阶段我建议还是保持上下位机分离的架构等TSN生态成熟了再迁移。迁移的时候下位机的控制逻辑不用动只改通信层就行。这也是为什么我一直强调下位机内部要分层——通信层独立换协议的时候只改这一层。我个人在实际项目中的体会是伺服压机控制系统的架构设计核心就一句话把实时性要求最高的部分放到最底层把跟人打交道的部分放到最上层中间用清晰的接口隔开。接口定义好了上下位机可以独立开发、独立测试、独立升级。我见过太多项目因为上下位机耦合太紧改一个界面功能要重新烧下位机程序调试效率极低。把边界画清楚后面省下来的时间远超前期设计花的时间。
返回列表