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

用C#实现三菱PLC控制的那些事儿

自己用C#写的控制三菱FX5U PLC(三菱任何系列都通用,网口,串口都行)的上位机程序,PLC源程序也附上,是学习C#和三菱PLC通信的好例子,有对辅助继电器M,对单字,双子D的读写,IO的监控,报警的显示等功能,亲测可用(C#运动控制;C#与三菱PLC;上位机与PLC通讯)

最近在做一个关于三菱PLC的上位机控制项目,用的是C#写的,感觉还挺有意思的。今天就来分享一下我的开发经历,顺便把代码和思路都整理一下,希望能给同样在学习C#和三菱PLC通信的朋友们一些启发。

项目背景

这个项目主要是为了控制三菱FX5U PLC,当然,代码是通用的,支持三菱所有系列的PLC,无论是网口还是串口都可以用。上位机的功能包括监控PLC的输入输出状态、读写辅助继电器M、单字和双字D寄存器,还有报警显示等功能。

代码实现

先来看一下整个项目的结构,主要包括以下几个部分:

  1. PLC通信初始化
  2. 读取PLC数据
  3. 写入PLC数据
  4. 报警显示
  5. 监控界面
1. PLC通信初始化

这部分主要是设置PLC的连接参数,比如波特率、站号、设备号等等。代码如下:

public class PLCCommunication { private byte stationNumber = 1; // PLC站号 private byte deviceNumber = 1; // 设备号 private int baudRate = 19200; // 波特率 private string portName = "COM1"; // 串口名称 public void Initialize() { // 初始化串口 SerialPort serialPort = new SerialPort(); serialPort.PortName = portName; serialPort.BaudRate = baudRate; serialPort.Parity = Parity.None; serialPort.DataBits = 8; serialPort.StopBits = StopBits.One; serialPort.Open(); } }

这里需要注意的是,串口的配置参数需要根据实际的PLC设置来调整,比如波特率、站号等等。

2. 读取PLC数据

读取PLC的数据是通过Modbus协议实现的,这里主要用到了读取辅助继电器M和数据寄存器D的功能。代码如下:

public class DataReader { public byte[] ReadMRegister(int address) { // 读取M寄存器 byte[] request = new byte[6]; request[0] = 0x01; // 设备地址 request[1] = 0x01; // 功能码 request[2] = (byte)(address >> 8); // 地址高位 request[3] = (byte)(address & 0xFF); // 地址低位 request[4] = 0x00; // 数据长度高位 request[5] = 0x01; // 数据长度低位 return request; } public byte[] ReadDRegister(int address) { // 读取D寄存器 byte[] request = new byte[6]; request[0] = 0x01; // 设备地址 request[1] = 0x03; // 功能码 request[2] = (byte)(address >> 8); // 地址高位 request[3] = (byte)(address & 0xFF); // 地址低位 request[4] = 0x00; // 数据长度高位 request[5] = 0x02; // 数据长度低位 return request; } }

这里需要注意的是,读取M寄存器和D寄存器的功能码是不一样的,分别是0x01和0x03。

3. 写入PLC数据

写入PLC的数据也是通过Modbus协议实现的,这里主要用到了写入辅助继电器M和数据寄存器D的功能。代码如下:

public class DataWriter { public byte[] WriteMRegister(int address, bool value) { // 写入M寄存器 byte[] request = new byte[6]; request[0] = 0x01; // 设备地址 request[1] = 0x05; // 功能码 request[2] = (byte)(address >> 8); // 地址高位 request[3] = (byte)(address & 0xFF); // 地址低位 request[4] = value ? (byte)0xFF : (byte)0x00; // 数据 request[5] = 0x00; // 校验位 return request; } public byte[] WriteDRegister(int address, int value) { // 写入D寄存器 byte[] request = new byte[8]; request[0] = 0x01; // 设备地址 request[1] = 0x06; // 功能码 request[2] = (byte)(address >> 8); // 地址高位 request[3] = (byte)(address & 0xFF); // 地址低位 request[4] = (byte)(value >> 8); // 数据高位 request[5] = (byte)(value & 0xFF); // 数据低位 request[6] = (byte)(value >> 8); // 校验高位 request[7] = (byte)(value & 0xFF); // 校验低位 return request; } }

这里需要注意的是,写入M寄存器和D寄存器的功能码分别是0x05和0x06。

4. 报警显示

报警显示主要是通过监控PLC的状态来实现的,当检测到异常时,会在界面上显示报警信息。代码如下:

public class AlarmDisplay { public void ShowAlarm(string message) { // 显示报警信息 MessageBox.Show(message, "报警", MessageBoxButtons.OK, MessageBoxIcon.Error); } }

这里用的是Windows Forms的MessageBox来显示报警信息,当然也可以根据需要自定义报警界面。

5. 监控界面

监控界面主要是通过Windows Forms来实现的,界面上有各种控件,比如按钮、标签、文本框等等,用来显示PLC的状态和进行操作。代码如下:

public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void ReadButton_Click(object sender, EventArgs e) { // 读取PLC数据 DataReader dataReader = new DataReader(); byte[] mRegister = dataReader.ReadMRegister(0); byte[] dRegister = dataReader.ReadDRegister(0); // 更新界面 MRegisterTextBox.Text = BitConverter.ToString(mRegister); DRegisterTextBox.Text = BitConverter.ToString(dRegister); } private void WriteButton_Click(object sender, EventArgs e) { // 写入PLC数据 DataWriter dataWriter = new DataWriter(); dataWriter.WriteMRegister(0, true); dataWriter.WriteDRegister(0, 123); } }

这里需要注意的是,监控界面的控件需要根据实际需求来设计,比如添加更多的监控点或者操作按钮。

总结

通过这个项目,我学到了很多关于C#和三菱PLC通信的知识,也积累了一些开发经验。希望这篇博文能对大家有所帮助,如果有任何问题或者建议,欢迎在评论区留言交流。

自己用C#写的控制三菱FX5U PLC(三菱任何系列都通用,网口,串口都行)的上位机程序,PLC源程序也附上,是学习C#和三菱PLC通信的好例子,有对辅助继电器M,对单字,双子D的读写,IO的监控,报警的显示等功能,亲测可用(C#运动控制;C#与三菱PLC;上位机与PLC通讯)

http://www.jsqmd.com/news/619806/

相关文章:

  • Gurobi 10.0学术版安装指南:从校园网认证到JupyterLab实战配置
  • 基于 FastAPI + Vue 深度定制的全栈自动化执行引擎设计全解蚁
  • Axure RP 中文界面优化:从语言障碍到流畅设计的智能解决方案
  • IDEA集成开发技巧:利用Phi-3-mini优化Java项目结构与重构代码
  • 2026年江苏教师考编培训哪家好?首选南京苏程教育培训学校 - 小艾信息发布
  • Qwen3-14B效果实测:自动生成Ubuntu系统常见问题解决方案
  • 学习困难的情绪困扰解决方案是什么?
  • 2024年Node.js最佳实践终极指南:102个技巧提升应用性能与稳定性
  • EmulatorJS项目结构深度剖析:理解4.0版本完整重写的架构设计
  • MODIS积雪数据在农业水资源管理中的实战应用:以2000-2020年中国数据集为例
  • AI Coding 工程化革命,Superpowers 管流程,ui-ux-pro-max 管质感
  • ET框架多线程架构演进:从并发困境到纤程模型的性能突破
  • 【JavaScript高级编程】拆解函数流水线 上戏
  • [Linux][虚拟串口]x一个特殊的字节谙
  • JAVA-SSM学习1 Spring-IOCDIBean-上
  • CSL编辑器完全指南:5分钟打造你的专属文献引用样式 ✨
  • Knowledge-Graph项目揭秘:知识图谱与深度学习的完美结合
  • 高效实战:5个AKShare核心技巧实现金融数据分析自动化(2024专业版)
  • 2024年Node.js最佳实践终极指南:102个技巧提升你的后端开发水平
  • ESP32实战-LVGL音乐播放界面移植与优化指南
  • 告别FileZilla!用MobaXterm+Samba在泰山派RK3566上搭建Windows文件共享(保姆级教程)
  • Berlekamp–Massey 算法
  • 从API解析到本地化:LinkSwift如何重新定义网盘直链下载体验
  • Termius vs WindTerm:哪个更适合你的远程开发需求?(Ubuntu平台实测对比)
  • SCM-02-配置库管理报告
  • YOLOv8 ROS 2完整部署教程:让机器人拥有火眼金睛的终极指南
  • 离线环境安装elk及设置密码认证
  • M2LOrder WebUI实战:Gradio Blocks高级定制+多Tab情感分析工作台
  • 多动症早期识别是什么?运动干预在儿童注意力缺陷中的作用是什么?
  • SCM-01-配置管理计划