WinForm虽然老,但工业现场还在用,简单直接,部署方便,西门子PLC的产线电脑端系统很多就是WinForm写的,上位机软件公司WinForm做PLC通讯,最大的问题是界面卡顿,通讯放主线程,一卡界面全冻,必须用多线程,这一步省不得时间,上位机开发早期BackgroundWorker,DoWork做通讯,ProgressChanged进度,Completed出结果,PLC上位机现在更多用Task,更灵活,await异步写起来舒服,异常处理也方便,新项目优先用Task,老老实实做不返工,上位机软件公司不管用哪种,通讯都不能在UI线程,S7通讯一次几十毫秒,点位多了几百毫秒,UI线程卡了界面就假死,千万别马虎,上位机开发跨线程更新UI是WinForm的经典问题,直接在后台线程改控件属性会抛"线程间操作无效"异常,这些细节别落下,
PLC上位机的多线程通讯
用Invoke同步会阻塞后台线程,BeginInvoke异步不阻塞,一般用BeginInvoke,上位机软件公司判断InvokeRequired,true就BeginInvoke,false直接操作,封装扩展方法,每个控件都调用,上位机开发更新频率要控制,别每个数据点都Invoke一次,攒一批数据一起更新,否则UI消息队列被塞满,界面反而卡,PLC上位机Timer选哪个?Forms.Timer在UI线程别放通讯,Timers.Timer在后台线程适合通讯,上位机软件公司System.Threading.Timer更轻量,回调在线程池,适合周期通讯,但要注意Dispose,
上位机开发的界面刷新
定时通讯别用Thread.Sleep,阻塞线程,用Timer或Task.Delay,Sleep线程干不了别的,PLC上位机DataGridView是WinForm常用表格,绑定DataTable或BindingList,数据变界面自动刷新,上位机软件公司数据量大DataGridView会卡,几千行还行,上万行开虚拟模式,处理CellValueNeeded,上位机开发虚拟模式只渲染可见行,性能提升明显,但所有数据要自己存,不能再用绑定,别嫌麻烦,真到现场你就明白这些话的分量,PLC上位机单元格格式化别在CellFormatting里做复杂操作,这个事件触发频繁,放复杂逻辑界面会卡,这都是基本功,
上位机软件公司的DataGridView
颜色标记在CellFormatting里做可以,但要简单,根据值判断颜色,别每次都new对象,上位机开发Chart实时曲线用Series.Points.AddXY,数据多了要移除旧点,否则内存涨,曲线也卡,PLC上位机移除旧点用RemoveAt(0),保留最近N个点,N别太大,几百个够看,多了反而看不清,把小事做扎实比啥都强,上位机软件公司Chart刷新频率别太高,一秒一次足够,太高了CPU占用高,曲线也看不出变化,切记,别抱侥幸心理觉得不会遇到,上位机开发实时数据存数据库和界面刷新分开,界面刷新用内存数据,数据库写入用后台批量,别每次刷新都写库,别等出事才想起来,
PLC上位机的实时曲线
日志用log4net或者NLog,别用MessageBox弹错误,生产环境弹窗会阻塞程序,没人点就一直卡着,上位机软件公司错误处理要细,通讯错误、数据错误、配置错误分别处理,给用户友好提示,后台记详细日志,别急,该花的功夫省不下来,上位机开发配置文件存数据库连接、PLC地址、刷新间隔,别写死代码里,改配置不用重新编译部署,心里有数,前期偷懒后期还债,PLC上位机部署要注意.NET Framework版本,老工控机可能是XP,只能用.NET 4.0以下,新系统用4.8没问题,上位机软件公司工控机性能一般,别装太多东西,开机自启动,异常自动重启,用Windows服务或者计划任务守护,出了问题不好查,
上位机开发的部署优化
双缓冲减少闪烁,设DoubleBuffered=true,Panel和DataGridView刷新不闪,PLC上位机全屏显示常用,FormBorderStyle设为None,WindowState设为Maximized,遮住任务栏,上位机软件公司快捷键和权限要做,操作工只能看不能改,工程师输入密码才能改参数,别让操作工误操作,都是细节,这都是踩坑换来的,上位机开发数据备份要做,数据库定时备份,重要数据存两份,工控机硬盘坏了不至于全丢,做项目就是这样,每个环节都有它的道理,PLC上位机赢式科技用WinForm做过很多产线项目,多线程通讯和界面优化都有成熟方案,运行稳定维护简单,
