尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

伺服压机控制系统架构:上位机与下位机分工及Modbus通信实战

伺服压机控制系统架构:上位机与下位机分工及Modbus通信实战 1. 伺服压机控制系统架构总览1.1 为什么伺服压机需要上位机与下位机分工伺服压机在工业现场干的活说白了就是用伺服电机精确控制压头的位移、速度和压力把工件压到指定位置或者压到指定力值。这个过程中位置精度经常要求到0.01mm级别压力控制精度要求到满量程的千分之几响应周期通常在毫秒级。这种活如果让一台普通工控机或者PC直接去干基本没戏——操作系统调度抖动、通信延迟、多任务抢占随便一个环节都能让压装曲线变成一团乱麻。所以行业里普遍的做法是拆成两层下位机负责硬实时控制跑在PLC、运动控制器或者专用伺服驱动器上直接管电机使能、位置环、速度环、力矩环以及高速IO的采集和输出上位机负责参数配置、工艺配方管理、曲线显示、数据存储、MES对接、报警记录这些非实时或者弱实时的活。两者之间通过通信链路交换数据常见的就是Modbus RTU、Modbus TCP、EtherCAT、Profinet、CANopen这些。这个分工的核心逻辑就一句话让快的归快让慢的归慢。下位机不需要花哨的界面它要的是确定性上位机不需要硬实时它要的是灵活性和可扩展性。把这两者混在一起要么实时性保不住要么界面卡成幻灯片。1.2 上位机与下位机的职责边界划分职责边界这件事我在实际项目里踩过不少坑。刚开始做的时候总想把逻辑判断都塞到上位机觉得改起来方便结果通信一抖动压装动作就出问题。后来慢慢总结出一套划分原则基本能覆盖大多数伺服压机场景。下位机该管的事伺服电机的使能、急停、限位保护位置环、速度环、力矩环的闭环控制压装过程中的高速数据采集比如每1ms采一次位置和压力多段压装曲线的执行快下、慢下、保压、回程与安全回路相关的硬线信号处理通信断线时的本地安全策略比如保持当前位置或者缓回原点上位机该管的事工艺配方的编辑、存储、下发压装曲线的实时显示和历史回放生产数据统计、SPC分析、报表导出用户权限管理、操作日志记录与MES、ERP等上层系统的数据对接多台压机的集中监控边界划清楚之后通信协议的设计就有了依据。下位机只暴露必要的寄存器或者对象字典上位机通过读写这些寄存器来间接控制。千万不要让上位机直接去控制电机换向或者修改PID参数这些必须由下位机在本地闭环里完成。1.3 常见架构风格对比与选型建议伺服压机控制系统的软件架构常见的有三种风格各有各的适用场景。架构风格典型实现优点缺点适用场景单体式下位机跑全部逻辑上位机只做HMI实时性最好通信简单扩展性差配方管理弱单机设备工艺固定分层式下位机管控制上位机管数据职责清晰扩展性好通信协议设计复杂大多数伺服压机微服务式多个上位机服务分别管配方、曲线、MES灵活可独立部署部署复杂调试麻烦大型产线多机协同我个人的经验是90%的伺服压机项目用分层式就够了。微服务式听起来高级但现场维护成本高除非是几十台压机联线的汽车零部件产线否则没必要。单体式适合那种工艺十年不变的老设备改造但新项目不建议。选型的时候还要考虑通信方式。Modbus RTU成本低但速率上不去适合数据量小的场景Modbus TCP速率快一些但实时性还是不如EtherCAT。如果压装曲线要求每0.5ms采一个点那必须上EtherCAT或者Profinet IRTModbus根本扛不住。2. 下位机核心功能与实现细节2.1 伺服控制环路的软件实现下位机的核心就是伺服控制环路。伺服压机通常需要三环控制电流环、速度环、位置环。电流环在驱动器内部跑周期通常是几十微秒速度环和位置环可以在驱动器里跑也可以在运动控制器里跑周期一般是1ms或者更短。软件实现上位置环的输出是速度指令速度环的输出是电流指令。对于压装应用还需要一个压力环通过压力传感器反馈来调整位置或者速度。压力环的周期可以比位置环慢一些5ms到10ms都行因为压力传感器的响应本身就没那么快。代码层面下位机通常用IEC 61131-3的ST语言或者C语言写。ST语言可读性好适合逻辑复杂的工艺段C语言效率高适合对周期要求极严的场合。我见过不少项目用ST写主体逻辑用C写底层驱动和通信中断两者通过共享内存或者函数接口交互。一个典型的压装循环下位机的执行流程是这样的收到上位机下发的配方号和启动命令检查安全条件急停、限位、气压等伺服使能切换到位置模式快下到接近工件的位置速度模式力矩限幅切换到压力控制或者位置控制慢速压入到达目标位置或者目标压力后保压计时保压结束切换到位置模式回程伺服下使能上报结果给上位机这个流程里第4步到第6步是核心也是下位机软件最需要打磨的地方。快下转慢下的切换点如果设不好要么撞工件要么节拍太长。保压阶段的压力波动如果控制不住压装质量就不稳定。2.2 实时数据采集与曲线生成压装曲线的质量直接决定了工艺分析的可信度。下位机采集数据的周期我一般建议不低于1kHz也就是每1ms采一个点。如果压装过程只有200ms那也就200个点数据量不大但足够看出曲线的细节。采集的数据通常包括时间戳、位置、速度、压力、力矩、电机电流。这些数据在下位机里先缓存在环形缓冲区里等压装结束后再打包上传给上位机。不要一边压装一边往上传通信抖动会影响实时性。环形缓冲区的大小要算好。假设1kHz采集压装周期最长5秒那就是5000个点。每个点如果存6个float就是120KB。下位机的RAM一般够用但如果是低端PLC可能就要压缩一下比如位置和压力用int32时间戳用相对值。曲线生成的时候上位机拿到的是原始点需要做滤波和插值。滤波用滑动平均或者低通滤波都行看噪声情况。插值主要是为了显示平滑但分析的时候一定要用原始数据插值后的数据只能看不能用来算指标。2.3 通信协议栈的选型与配置下位机的通信协议栈Modbus RTU和Modbus TCP是最常见的。Modbus RTU跑在RS485上接线简单成本低但速率一般就115200bps传大数据量吃力。Modbus TCP跑以太网速率快但协议栈本身有开销实时性不如EtherCAT。如果只是传配方和结果数据Modbus RTU完全够用。如果要传实时曲线建议用Modbus TCP或者直接上EtherCAT。我做过一个项目压装曲线要求每0.5ms采一个点用Modbus TCP传上位机显示的时候明显卡顿后来换成EtherCAT才流畅。Modbus的寄存器映射要提前规划好。输入寄存器放只读数据比如当前位置、当前压力、状态字保持寄存器放可读写数据比如目标位置、目标压力、配方号线圈放开关量比如启动、停止、复位。映射表一旦定下来就不要随便改不然上位机那边要跟着改容易出错。注意Modbus RTU的帧间隔要严格遵守3.5个字符时间否则从站可能不响应。用C#写上位机的时候SerialPort的ReadTimeout和WriteTimeout要设好不然通信断了都不知道。2.4 安全逻辑与故障处理下位机的安全逻辑是最后一道防线。急停信号必须硬线接入下位机不能通过通信传。通信断了急停还能用急停断了通信再好也没用。故障处理要分等级。一级故障比如急停、超程、伺服报警立即停机切断伺服使能上报上位机二级故障比如通信超时、压力传感器断线先尝试恢复恢复不了再停机三级故障比如曲线偏差大只记录报警不停机但要在结果里标记。通信断线的时候下位机要有本地策略。我一般设成保持当前位置3秒然后缓回安全位置。如果3秒内通信恢复就继续执行恢复不了就回原点等上位机重新连接。这个策略要在下位机里写死不能依赖上位机。3. 上位机软件架构与功能模块3.1 上位机技术栈选型C#、Qt还是LabVIEW上位机的技术栈选型主要看团队背景和项目需求。C# WPF是工业上位机的主流开发效率高界面好看Modbus库也成熟。Qt C适合跨平台性能好但开发周期长。LabVIEW适合测试测量场景图形化编程但大型项目维护起来费劲。我个人的偏好是C# WPF Modbus库。C#的异步编程模型很适合通信场景async/await写起来清爽。WPF的数据绑定和MVVM模式做实时曲线显示很方便。Modbus库用NModbus或者EasyModbus都行NModbus更灵活EasyModbus更简单。如果项目要求跨平台那就Qt。Qt的QModbus模块虽然不如NModbus成熟但基本功能都有。LabVIEW的话如果团队里有人熟悉做快速原型可以但正式项目我还是建议用C#或者Qt。数据库方面SQLite适合单机SQL Server或者MySQL适合多机联网。配方和结果数据量不大SQLite完全够用。如果要和MES对接那就上SQL Server方便做数据同步。3.2 通信层设计与Modbus封装通信层是上位机的核心模块设计好坏直接影响稳定性和可维护性。我一般把通信层分成三层物理层、协议层、业务层。物理层管串口或者网口的打开、关闭、参数配置。协议层管Modbus帧的组装和解析。业务层管具体的数据读写比如读配方、写目标位置、读曲线数据。C#里封装Modbus我习惯用接口加实现的方式。先定义一个IModbusService接口包含ReadHoldingRegisters、WriteSingleRegister、ReadInputRegisters这些方法。然后分别实现ModbusRtuService和ModbusTcpService。业务层只依赖接口不依赖具体实现这样切换通信方式的时候不用改业务代码。public interface IModbusService { Taskushort[] ReadHoldingRegistersAsync(byte slaveId, ushort startAddress, ushort count); Task WriteSingleRegisterAsync(byte slaveId, ushort address, ushort value); Taskbool[] ReadCoilsAsync(byte slaveId, ushort startAddress, ushort count); Task WriteSingleCoilAsync(byte slaveId, ushort address, bool value); }串口通信的时候读写要加锁不然多线程同时操作会出问题。Modbus RTU的帧间隔也要注意两次请求之间至少隔3.5个字符时间。115200bps下一个字符大概87微秒3.5个字符就是300微秒左右。实际写代码的时候我一般加5ms的延时保险一点。Modbus TCP的话注意事务标识符要递增单元标识符在TCP里其实用不上但很多设备还是要求填。连接超时和读写超时要设好不然网络断了程序会卡死。3.3 配方管理与工艺参数下发配方管理是上位机最常用的功能。一个配方通常包含配方号、配方名、快下速度、慢下速度、目标位置、目标压力、保压时间、回程速度、力矩限幅这些参数。配方存在数据库里界面上用DataGrid显示支持增删改查。下发配方的时候先写参数到保持寄存器再写配方号最后写启动命令。顺序不能乱不然下位机可能用旧参数执行。参数下发要做校验。比如目标位置不能超过行程范围目标压力不能超过传感器量程保压时间不能为负。校验不通过就弹窗提示不要直接下发。配方切换的时候如果压机正在运行要先停止再切换。不要在线切换配方除非下位机支持动态参数更新而且你确认过安全性。3.4 实时曲线显示与数据存储实时曲线显示是上位机最考验性能的地方。压装过程中下位机每1ms采一个点上位机要实时显示。如果直接用WPF的Polyline几千个点一刷界面就卡了。我的做法是用DrawingVisual或者WriteableBitmap自己画曲线。数据来了之后先存到缓冲区然后用一个定时器比如50ms刷新一次界面。刷新的时候只画可见区域超出范围的点不画。数据存储分两级内存缓存和数据库持久化。压装过程中数据先存内存压装结束后再批量写入数据库。不要一边压装一边写数据库IO操作会影响实时性。曲线数据存的时候原始点要存滤波后的点可以存也可以不存。原始点是分析的基础滤波后的点只是显示用。如果存储空间紧张可以只存原始点显示的时候再滤波。3.5 报警记录与用户权限管理报警记录要分活动报警和历史报警。活动报警实时显示历史报警存数据库。报警内容要包含时间、报警码、报警描述、报警等级、确认状态。用户权限一般分三级操作员只能看和启动工艺员可以改配方管理员可以改系统参数和用户管理。权限控制要在上位机做但关键操作下位机也要校验防止上位机被绕过。操作日志要记录谁在什么时候做了什么操作。比如“张三在2024-01-01 10:00:00修改了配方001的目标压力从5kN改为6kN”。日志存数据库支持按时间、用户、操作类型查询。4. 上位机与下位机通信实战4.1 Modbus寄存器映射表设计寄存器映射表是上下位机之间的契约设计好了事半功倍。我一般按功能分块区块地址范围类型说明状态区0x0000-0x00FF输入寄存器当前位置、压力、状态字、报警码控制区0x1000-0x10FF保持寄存器目标位置、目标压力、配方号、命令字配方区0x2000-0x2FFF保持寄存器配方参数每个配方占32个寄存器曲线区0x3000-0x3FFF输入寄存器曲线数据环形缓冲区线圈区0x0000-0x00FF线圈启动、停止、复位、急停复位状态字用位定义比如bit0表示伺服使能bit1表示运行中bit2表示报警bit3表示到位。上位机读一个寄存器就能知道下位机的大致状态不用读一堆寄存器。命令字也用位定义比如bit0表示启动bit1表示停止bit2表示复位。上位机写命令字的时候先写1下位机执行后清0这样避免重复执行。4.2 通信时序与握手协议通信时序要设计好不然会出现命令丢了或者重复执行的问题。我一般用请求-应答-确认三步握手。上位机写命令字比如启动下位机收到后执行执行完把命令字清0同时把状态字里的“命令已执行”位置1。上位机轮询状态字看到“命令已执行”位为1就把命令字清0同时把“命令已执行”位清0。这样一轮握手完成。如果上位机写了命令字但下位机没反应超时后上位机要重发。重发次数一般设3次3次都没反应就报通信故障。轮询周期要合理。状态区可以100ms轮询一次曲线区可以500ms轮询一次配方区只在需要的时候读写。不要把所有寄存器都放在一个轮询周期里那样通信负载太大。4.3 通信异常处理与重连机制通信异常是常态处理好了系统就稳。常见的异常有超时、校验错误、从站异常码、连接断开。超时的话先重试重试3次还不行就报故障。校验错误一般是干扰或者波特率不对检查接线和参数。从站异常码要看Modbus协议文档比如异常码02表示非法数据地址说明寄存器映射表对不上。连接断开的话上位机要自动重连。重连间隔可以设1秒、2秒、5秒递增避免频繁重连把网络搞崩。重连成功后要重新同步状态比如读一遍状态区和配方区。实操心得串口通信的时候USB转RS485转换器很容易出问题。我遇到过转换器驱动不稳定跑几个小时就断一次。后来换成带光电隔离的工业级转换器就稳了。另外RS485的A/B线不要接反接反了通信不上但设备不会坏就是收不到数据。4.4 多台压机集中监控的实现多台压机集中监控上位机要同时和多个下位机通信。如果用Modbus RTU一个串口只能接一台多台就要多个串口或者用RS485总线。RS485总线的话轮询要快不然每台压机的响应时间会很长。我的做法是每台压机一个通信线程线程之间独立互不影响。一台断了其他台还能正常监控。数据汇总到一个全局的数据中心界面从数据中心读数据。如果是Modbus TCP那就简单了每台压机一个IP上位机开多个TCP连接就行。但要注意连接数限制有些下位机的TCP连接数有限比如最多4个那就要规划好。集中监控的界面一般用大屏显示每台压机一个卡片显示状态、当前曲线、报警信息。点击卡片可以进入单机详情页。数据存储的时候要带上压机编号方便查询。5. 常见问题与排查技巧实录5.1 通信不稳定问题排查通信不稳定是最常见的问题表现就是数据时有时无或者偶尔报校验错误。排查思路如下检查物理层接线是否牢固A/B线是否接反屏蔽线是否接地。RS485的屏蔽层要单端接地两端接地会形成地环路反而引入干扰。检查波特率上下位机的波特率、数据位、停止位、校验位必须一致。115200bps下线缆长度不要超过50米再长就要降波特率。检查终端电阻RS485总线两端要接120欧姆终端电阻中间设备不要接。没有终端电阻信号反射会导致通信错误。检查电源下位机和上位机如果不在同一个电源系统地电位差可能导致通信芯片损坏。用隔离型转换器可以解决。检查软件串口打开后如果长时间不通信有些转换器会进入休眠。可以定时发心跳包保持连接。Modbus TCP的话检查网络是否通IP是否冲突防火墙是否拦了502端口。用ping和telnet测试一下。5.2 曲线数据丢点与时间戳对齐曲线数据丢点一般是下位机采集周期和通信周期不匹配。下位机1ms采一个点上位机500ms读一次一次读500个点。如果下位机的缓冲区只有400个点的空间那就会丢100个点。解决办法是加大下位机的缓冲区或者提高上位机的读取频率。我一般把缓冲区设成采集周期的2倍以上比如1ms采集缓冲区至少2000个点。时间戳对齐的话下位机的时间戳是相对时间从压装开始算。上位机收到数据后用本地时间加上相对时间得到绝对时间。但上下位机的时钟可能有偏差所以时间戳只用相对值不要用绝对值。5.3 配方下发失败与参数校验配方下发失败常见原因有寄存器地址不对、数据类型不匹配、下位机拒绝写入。寄存器地址不对检查映射表。数据类型不匹配比如下位机是int16上位机发的是float那就要做转换。下位机拒绝写入一般是参数超范围或者下位机处于运行状态不允许改参数。参数校验要在上位机做一遍下位机再做一遍。上位机校验是为了用户体验下位机校验是为了安全。两边的校验规则要一致不然会出现上位机认为合法、下位机认为非法的情况。5.4 上位机卡顿与界面刷新优化上位机卡顿一般是界面刷新太频繁或者数据处理太耗时。优化思路减少刷新频率曲线显示50ms刷一次就够了不用每来一个点就刷。异步处理通信和数据处理放在后台线程界面线程只负责显示。数据分页历史曲线查询的时候不要一次查几万个点分页查每页1000个点。使用虚拟化DataGrid显示大量数据的时候开启虚拟化只渲染可见行。避免频繁GCC#里不要频繁创建大对象比如每次刷新都new一个Brush应该复用。WPF的话可以用CompositionTarget.Rendering事件来驱动刷新比DispatcherTimer更平滑。但要注意这个事件触发频率很高里面不要做耗时操作。5.5 常见问题速查表现象可能原因排查方法解决措施通信超时接线松动、波特率不对、终端电阻缺失检查接线、核对参数、测量电阻重新接线、统一参数、加终端电阻校验错误干扰、地电位差、线缆过长检查屏蔽、测量地电位、缩短线缆加隔离、单端接地、降波特率曲线丢点缓冲区太小、读取太慢检查缓冲区大小、提高读取频率加大缓冲区、优化读取逻辑配方下发失败地址错、类型错、参数超范围核对映射表、检查数据类型、校验参数修正映射、转换类型、限制范围上位机卡顿刷新太频繁、数据处理耗时降低刷新率、异步处理、分页查询优化刷新逻辑、后台线程处理伺服报警过载、超程、编码器故障查看驱动器报警码、检查机械排除机械故障、复位报警最后再分享一个小技巧调试Modbus通信的时候我习惯用Modbus Poll和Modbus Slave先模拟一遍。Modbus Poll当主站Modbus Slave当从站把寄存器映射表跑通再去连真实设备。这样能排除很多协议层面的问题省得在设备上瞎折腾。另外Modbus校验码在线计算工具也很好用手动算CRC16容易出错用工具算一下对比一下报文很快就能定位问题。
返回列表