台达PLC与C#串口通信实时监控:XML配置监控地址,控件自动生成读写同步操作
台达plc与C#串口通信程序可同步读写操作实时监控。 监控地址通过xml文件配置控件自动生成。折腾工控通信的老铁们肯定都遇到过这问题——PLC和上位机要实时互传数据还得保证不卡顿。今天咱们就用C#和台达PLC的串口通信来盘一盘这个需求整点能同步读写还能动态配地址的骚操作。先上硬菜直接开搞串口通信核心代码SerialPort _serial new SerialPort(); _serial.PortName COM3; _serial.BaudRate 115200; _serial.DataBits 7; _serial.Parity Parity.Even; _serial.Open(); // 同步读写方法 public (bool success, byte[] data) SendAndWait(byte[] cmd, int timeout500) { using(var signal new ManualResetEvent(false)) { byte[] response null; _serial.DataReceived (s, e) { response ReadFromSerial(); signal.Set(); }; _serial.Write(cmd, 0, cmd.Length); return signal.WaitOne(timeout) ? (true, response) : (false, null); } }这段代码的亮点在ManualResetEvent这个同步神器相当于给异步操作加了刹车片。注意DataReceived事件里别直接操作UI控件后面咱们再说怎么优雅地更新界面。配置文件得玩点花活用XML动态配置监控点MonitorConfig Address Name温度1 AddrD100 Typeint/ Address Name压力 AddrD102 Typefloat/ Address Name运行状态 AddrM10 Typebool/ /MonitorConfig解析配置的代码要带点反射魔法var config XDocument.Load(AddressConfig.xml); var addresses config.Descendants(Address) .Select(x new { Name x.Attribute(Name).Value, Type Type.GetType($System.{x.Attribute(Type).Value}) }).ToList();这里用Linq解析XML比传统方法清爽不少Type.GetType那行实现了类型动态转换后面生成控件时会派上大用场。台达plc与C#串口通信程序可同步读写操作实时监控。 监控地址通过xml文件配置控件自动生成。界面控件自动生成才是重头戏看这段动态创建TextBox的代码flowLayoutPanel1.Controls.Clear(); foreach (var addr in addresses) { var textBox new TextBox { Tag addr, // 把配置对象藏在Tag里 Width 150, ReadOnly true }; flowLayoutPanel1.Controls.Add(textBox); }用FlowLayoutPanel比传统布局方便得多Tag属性藏着配置信息这点很关键。当数据更新时直接遍历控件就能找到对应项。实时监控要开个线程专门轮询Task.Run(() { while(true) { foreach(var box in flowLayoutPanel1.Controls.OfTypeTextBox()) { var addr (dynamic)box.Tag; var cmd BuildReadCommand(addr.Addr); var (success, data) SendAndWait(cmd); if(success) { box.Invoke((Action)(() { box.Text Convert.ChangeType(data, addr.Type).ToString(); })); } } Thread.Sleep(200); } });这里用dynamic类型避免写一堆类型判断Invoke确保跨线程更新UI安全。注意Sleep时间别太短台达PLC的串口响应速度扛不住疯狂轮询。遇到通信中断也别慌加个重连机制private void Timer_Elapsed(object sender, EventArgs e) { if(!_serial.IsOpen) { try { _serial.Open(); // 重连后自动恢复监控 } catch(Exception ex) { // 记日志或弹提示 } } }最后说个坑点台达PLC的浮点数格式是IEEE754但字节顺序可能和C#默认不同处理float类型时需要这样转换byte[] bytes {0x12, 0x34, 0x56, 0x78}; float value BitConverter.ToSingle(new byte[] { bytes[1], bytes[0], bytes[3], bytes[2] }, 0);这套方案在产线监控项目里跑了两年没掉过链子想要源码的老铁评论区吱一声。下次咱们可以聊聊如何用WPF绑定玩出更花哨的监控界面。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2497398.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!