2026/1/11 13:58:00
网站建设
项目流程
永康网站优化,网站公司网站开发,手机软件app下载,哈尔滨最新通知定制C#上位机#xff0c;与各种第三方设备通讯#xff0c;例
如#xff1a;西门子PLC#xff0c;三菱PLC#xff0c;汇川PLC#xff0c;各种仪表#xff0c;可以支持各种通讯MODBUS #xff0c;串口#xff0c;TCP等工业自动化领域最让人头疼的就是设备联调。不同品牌…定制C#上位机与各种第三方设备通讯例 如西门子PLC三菱PLC汇川PLC各种仪表可以支持各种通讯MODBUS 串口TCP等工业自动化领域最让人头疼的就是设备联调。不同品牌的PLC、仪表各有各的脾气就像家里来了七八个不同国家的外国友人你说英语他比划手语这时候就得有个万能翻译——用C#写上位机就是个好选择。先看最简单的Modbus TCP通讯。咱们用NModbus这个库三行代码就能摸到设备脉搏var factory new ModbusFactory(); using var master factory.CreateMasterTcpConnection(192.168.1.10); ushort[] registers master.ReadHoldingRegisters(1, 0, 10);这段代码里藏着几个魔鬼细节stationId1对应PLC的站号就像找人得先知道对方工位号ReadHoldingRegisters的第二个参数是寄存器地址偏移量很多新手在这里栽跟头以为直接填40001这样的地址。遇到串口设备也别慌System.IO.Ports自带Buffusing var port new SerialPort(COM3, 9600, Parity.None, 8, StopBits.One); port.Open(); port.Write(new byte[] { 0x01, 0x03, 0x00, 0x00, 0x00, 0x02 }, 0, 6);注意这里波特率要和设备参数对得上就像蓝牙配对得两边同时长按。曾经有个项目因为停止位设成Two导致乱码排查了两天发现是硬件手册印错了参数。对付三菱PLC的MC协议得用点野路子。他们的协议文档像天书不如直接抓包分析byte[] cmd { 0x50, 0x00, 0x00, 0xFF, 0xFF, 0x03, 0x00, 0x0C, 0x00, 0x0A, 0x01, 0x04, 0x00, 0x00, 0x00, 0xA8, 0x00, 0x00 }; socket.Send(cmd); var buffer new byte[256]; socket.Receive(buffer);这个十六进制数组其实是二进制指令的肉身0x01代表读操作0x04对应D寄存器。当年我逆向这个协议时发现他们校验码算法居然是把所有字节相加取末两位比想象中简单粗暴。西门子S7协议更是个磨人的小妖精推荐用S7.Net这个库var plc new Plc(CpuType.S71200, 192.168.0.1, 0, 2); plc.Open(); var result (ushort)plc.Read(DB1.DBW4);注意CpuType要选对型号S7-1200和S7-1500的通讯方式有细微差别。有个项目因为没设置正确的机架号和槽号死活连不上最后发现对方PLC组态时改了插槽位置。异步通讯是必须掌握的技巧别让UI线程卡成PPTasync Taskfloat ReadPressureAsync() { return await Task.Run(() modbusMaster.ReadInputRegisters(1, 300, 1)[0] / 10f); }这里用Task.Run把阻塞操作扔到线程池记得除10操作要放在主线程防止跨线程访问控件。曾经有个老工程师坚持用BackgroundWorker结果代码写得像千层饼。最后说个血泪教训一定要做心跳检测有次现场设备半夜断线没重连第二天整个生产线停了半小时。后来加了心跳机制Timer heartbeatTimer new Timer(_ { if (!plc.IsConnected) { Logger.Warning(PLC失联尝试重连...); plc.Reconnect(); } }, null, 0, 5000);每5秒轻拍设备肩膀问句还在吗比事后救火强得多。不同设备的重连策略要区分像欧姆龙PLC连续重试三次失败就得等十分钟不然会触发保护机制。