当前位置: 首页 > news >正文

基于C#实现与三菱FX系列PLC串口通信

一、通信协议核心要点

三菱PLC采用ASCII模式的专用协议,关键要素包括:

  1. 帧结构 STX(02H) + 命令码 + 地址 + 数据长度 + 数据 + 校验和 + ETX(03H)

  2. 校验方式 累加和取低2位十六进制(如校验和为0x0A+0x0B=0x15 → 校验码为15)

  3. 地址转换规则 位地址:Y737H→ ASCII码33 37 字地址:D04000H→ ASCII码34 30 30 30

  4. 指令集

    功能 指令码 示例
    写单个位 03H 02 30 37 30 37 03 30 36
    读单个字 04H 02 30 34 30 30 30 03 30 36
    写单个字 06H 02 30 34 30 30 30 00 64 03 30 36

二、C#实现代码(含完整类库)

1. 串口通信基类

public class MelsecPLC
{private SerialPort _serialPort;private const string STX = "\x02";private const string ETX = "\x03";public bool Connect(string portName, int baudRate = 9600, Parity parity = Parity.Even){try{_serialPort = new SerialPort(portName, baudRate, parity, 7, StopBits.One);_serialPort.DataReceived += SerialPort_DataReceived;_serialPort.Open();return true;}catch (Exception ex){Debug.WriteLine($"连接失败: {ex.Message}");return false;}}private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e){var buffer = new byte[_serialPort.BytesToRead];_serialPort.Read(buffer, 0, buffer.Length);ProcessResponse(buffer);}
}

2. 读写指令封装

public class MelsecPLC : MelsecPLC
{// 写单个位public bool WriteBit(string address, bool value){string cmd = $"{STX}30{StationNumber}{(value ? "03" : "02")}00{address}{ETX}";return SendCommand(cmd, new byte[] { 0x06 }); // 期望ACK响应}// 读单个字public ushort ReadWord(string address){string cmd = $"{STX}30{StationNumber}0400{address}{ETX}";var response = SendCommand(cmd);if (response.Length >= 6){byte[] data = { response[5], response[6] };return (ushort)(data[0] * 256 + data[1]);}return 0;}private byte[] SendCommand(string cmd, byte[] expectedAck = null){try{byte[] buffer = Encoding.ASCII.GetBytes(cmd);_serialPort.Write(buffer, 0, buffer.Length);// 等待响应(超时3秒)if (WaitForResponse(3000)){if (expectedAck != null && !_receivedData.Contains(expectedAck))throw new Exception("无效响应");return _receivedData;}return null;}catch (TimeoutException){Debug.WriteLine("通信超时");return null;}}
}

三、关键功能实现

1. 地址转换工具类

public static class AddressConverter
{// 位地址转PLC内部格式(如Y7→37H)public static string BitAddressToPLC(string address){string type = address[0].ToString().ToUpper();int num = int.Parse(address.Substring(1));return $"{(char)('3' + (type == "Y" ? 7 : 0))}{num:X2}";}// 十进制数转PLC字地址(如D0→4000H)public static string DecimalToWordAddress(int address){return (address * 2 + 4096).ToString("X4");}
}

2. 数据解析示例

private void ProcessResponse(byte[] data)
{if (data.Length < 3) return;// 校验和验证byte checksum = data.Skip(1).Take(data.Length - 3).Sum(b => (byte)b) % 256;if (checksum != data[data.Length - 2]){Debug.WriteLine("校验失败");return;}// 解析数据if (data[1] == 0x30 && data[2] == 0x34) // 读字响应{ushort value = (ushort)(data[5] * 256 + data[6]);OnDataReceived?.Invoke(this, new PLCDataEventArgs(value));}
}

四、完整使用示例

// 初始化连接
var plc = new MelsecPLC();
if (plc.Connect("COM3"))
{// 写入Y7置1plc.WriteBit("Y7", true);// 读取D0值ushort d0Value = plc.ReadWord(AddressConverter.DecimalToWordAddress(0));// 异常处理plc.DataError += (s, e) => {Debug.WriteLine($"错误代码:{e.ErrorCode},信息:{e.Message}");};
}

五、调试技巧与注意事项

  1. 串口调试工具

    使用PuttySecureCRT验证基础通信,设置参数:

    波特率:9600 | 数据位:7 | 停止位:1 | 校验:偶校验
    
  2. 抓包分析

    通过Wireshark捕获串口数据,验证指令格式是否正确:

    02 30 37 30 37 03 30 36  → 写Y7置1
    02 30 34 30 30 30 03 30 36 → 读D0
    
  3. 异常处理 超时重试机制:设置3次重试机会 自动重连:监控DataReceived事件频率

  4. 性能优化

    // 使用缓冲区减少GC压力
    private byte[] _buffer = new byte[1024];
    _serialPort.Read(_buffer, 0, _buffer.Length);
    

六、扩展功能实现

1. 批量读写指令

public ushort[] ReadWords(string startAddr, int count)
{string cmd = $"{STX}30{StationNumber}0400{startAddr}{count:X2}{ETX}";var response = SendCommand(cmd);ushort[] result = new ushort[count];for(int i=0; i<count; i++){result[i] = (ushort)(response[5+2*i] * 256 + response[6+2*i]);}return result;
}

2. 自动重连机制

public async Task AutoReconnectAsync()
{while (!_isDisposed){if (!_serialPort.IsOpen){try{_serialPort.Open();Debug.WriteLine("自动重连成功");}catch (Exception ex){Debug.WriteLine($"重连失败: {ex.Message}");await Task.Delay(5000);}}await Task.Delay(1000);}
}

参考代码 上位机与三菱plc的串口通讯 www.youwenfan.com/contentcno/112223.html

七、推荐开发工具

工具名称 用途 下载地址
GX Works2 PLC程序编写与调试 三菱电机官网
HslCommunication 高级PLC通信库 GitHub
Serial Port Monitor 串口数据监控 NirSoft官网

八、项目结构建议

PLC_Communication/
├── MelsecPLC/              # 核心通信类
│   ├── MelsecPLC.cs       # 主类
│   └── AddressConverter.cs # 地址转换工具
├── TestApp/               # 测试程序
│   ├── MainForm.cs        # 主界面
│   └── PLCConfigForm.cs   # 参数配置界面
└── Resources/             # 配置文件└── plc_params.json    # PLC参数存储
http://www.zskr.cn/news/180196.html

相关文章:

  • SpringSecurity、Shiro和Sa-Token,哪个更好?
  • 技术日报|AI看板工具vibe-kanban登顶日增827星,语音合成Chatterbox强势回归第二
  • Miniconda环境下使用NVIDIA Nsight分析GPU性能
  • Miniconda环境激活脚本自动生成工具
  • WPF捕获程序报错记录日志
  • 2025年节能环保滤清器生产厂家权威推荐榜单:锅炉节能环保/重卡节能环保/半挂车节能环保/节能环保过滤器/龙邦节能环保助燃器源头厂家精选 - 品牌推荐官
  • Java中的基本数据类型有哪些?它们的大小是多少?
  • Chrome离线版本下载与免安装版本
  • 终极指南:如何用DeepLabCut实现AI姿势识别与动物行为分析
  • 一个典型的HTTP请求由以下几部分组成:
  • Betaflight竞速电调同步技术深度剖析
  • 百考通AI:学术写作全流程智能辅助的深度探索
  • ADS2011完整安装指南:从下载到配置全流程解析
  • 2025年防雷连接线夹厂家权威推荐榜单:铜绞线线夹/防雷接地线夹/黄铜线夹/打造全息餐厅酒店/接地线夹源头厂家精选 - 品牌推荐官
  • 前端 + AI 进阶 Day8 : 批量图片 AI 分析
  • 无名杀项目终极指南:15分钟从入门到精通
  • 纯手改AI率反而更高?硬核降AI实测指南:6款工具助你过关 - 老米_专讲AIGC率
  • 传统安全框架已经在AI攻击浪潮中全面失效,合规≠安全的底层逻辑与破局之路
  • 2026微信立减金回收,警惕三大认知误区 - 京顺回收
  • 2025年气象站设备厂家推荐榜:山东万象环境科技,农业/超声波/森林/便携式气象站全系供应 - 品牌推荐官
  • 三家主流妇产科副高培训测评:服务与课程深度解析 - 资讯焦点
  • http核心作用是什么?作用在参考模型中的哪一层?
  • Vivado使用实战:手把手实现FPGA流水灯项目
  • Miniconda环境健康检查脚本编写
  • 2025年酱菜瓶生产厂家实力推荐:徐州稳健玻璃制品有限公司,玻璃/六棱/高盖/圆柱酱菜瓶全系供应 - 品牌推荐官
  • 2025安全团队硬核清单:40款开源工具全覆盖,从攻防实战到前瞻防护
  • AI自主猎杀10分漏洞!CVE-2025-54322撕开全球网络设备防线,攻防格局迎颠覆性变革
  • 毕业焦虑?别慌!让AI工具成为你的“学术副驾”,高效搞定论文全流程
  • 主治医师考试培训机构综合实力与特色解析 - 资讯焦点
  • 图书在线阅读系统的设计与实现任务书