用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寄存器还有报警显示等功能。代码实现先来看一下整个项目的结构主要包括以下几个部分PLC通信初始化读取PLC数据写入PLC数据报警显示监控界面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通讯)