简单C#窗体与汇川PLC模拟MODBUS TCP

一、PLC设置

1.PLC版本

2.模拟PLC

PLC模拟时默认IP地址为:127.0.0.1

二、C#

1.安装依赖

2.C#建立PL连接

using引用

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Net.Sockets;
using System.Net;
using EasyModbus;

1.UI页面

2.C#程序

        #region  验证IP地址格式的辅助方法
        private bool IsValidIPAddress(string ipAddress)
        {
            try
            {
                var ip = IPAddress.Parse(ipAddress);
                return ip.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork;
            }
            catch
            {
                return false;
            }
        }
        #endregion

        #region  建立连接
        private void btnConnect_Click(object sender, EventArgs e)
        {
            // 验证IP地址格式
            if (!IsValidIPAddress(txtIpAddress.Text))
            {
                MessageBox.Show("请输入有效的IP地址。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            try
            {
                // 使用用户输入的IP地址和预设的端口号创建ModbusClient实例
                _modbusClient = new ModbusClient(txtIpAddress.Text, DefaultModbusPort);
                _modbusClient.Connect();
                // 检查连接状态并更新UI
                if (_modbusClient.Connected)
                {
                    MessageBox.Show("成功连接到PLC");
                }
                else
                {
                    MessageBox.Show("连接失败。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (SocketException ex)
            {
                // 处理网络异常
                MessageBox.Show($"网络错误: {ex.Message}", "网络错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (ArgumentNullException ex)
            {
                // 处理空引用异常
                MessageBox.Show($"参数错误: {ex.Message}", "参数错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                // 捕获其他所有异常
                MessageBox.Show($"连接过程中发生未知错误: {ex.Message}", "未知错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        #endregion

        #region  断开连接
        private void btnDisconnect_Click(object sender, EventArgs e)
        {
            if (_modbusClient != null && _modbusClient.Connected)
            {
                _modbusClient.Disconnect();
                MessageBox.Show("已断开与PLC的连接。");
            }
            else
            {
                MessageBox.Show("尚未连接到任何设备。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
        #endregion

3.写入读取D100

1.UI页面

2.C#程序

        #region  写D100入值
        private void BtnWriteToD100_Click(object sender, EventArgs e)
        {
            if (_modbusClient == null || !_modbusClient.Connected)
            {
                MessageBox.Show("请先连接到PLC。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            try
            {
                int valueToWrite = Convert.ToInt32(txtValueToWrite.Text);
                _modbusClient.WriteSingleRegister(100, valueToWrite); // 注意:100 是 Modbus 地址,对应 D100 寄存器
                MessageBox.Show("成功写入值到D100寄存器。");
            }
            catch (FormatException)
            {
                MessageBox.Show("输入的值无效,请输入一个整数。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"写入过程中发生未知错误: {ex.Message}", "未知错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        #endregion

        #region  读D100取值
        private void BtnReadFromD100_Click(object sender, EventArgs e)
        {
            if (_modbusClient == null || !_modbusClient.Connected)
            {
                MessageBox.Show("请先连接到PLC。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            try
            {
                int[] registers =  _modbusClient.ReadHoldingRegisters(100, 1);              
                if (registers.Length > 0)
                {
                    int value = registers[0];
                    lblD100Value.Text = $"D100 的值: {value}";
                }
                else
                {
                    MessageBox.Show("未能读取到寄存器的值。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"读取过程中发生未知错误: {ex.Message}", "未知错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }
        #endregion

4.写入读取M100 

1.UI页面

2.C#程序

        #region  写M100入值
        private void BtnWriteToM100_Click(object sender, EventArgs e)
        {
            if (_modbusClient == null || !_modbusClient.Connected)
            {
                MessageBox.Show("请先连接到PLC。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            try
            {
                bool valueToWrite = Convert.ToBoolean(txtValueToWrite1.Text);
                _modbusClient.WriteSingleCoil(100, valueToWrite); // 注意:100 是 Modbus 地址,对应 M100 线圈
                MessageBox.Show("成功写入值到M100线圈。");
            }
            catch (FormatException)
            {
                MessageBox.Show("输入的值无效,请输入一个布尔值(true 或 false)。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"写入过程中发生未知错误: {ex.Message}", "未知错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        #endregion

        #region  读M100入值
        private void BtnReadFromM100_Click(object sender, EventArgs e)
        {
            if (_modbusClient == null || !_modbusClient.Connected)
            {
                MessageBox.Show("请先连接到PLC。", "信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            try
            {
                bool[] coils = _modbusClient.ReadCoils(100, 1); // 100 是 Modbus 地址,对应 M100 寄存器
                if (coils.Length > 0)
                {
                    bool value = coils[0];
                    txtValueFromM100.Text = $"M100 的值: {value}";
                    MessageBox.Show($"成功读取M100寄存器的值: {value}。");
                }
                else
                {
                    MessageBox.Show("没有读取到有效的寄存器值。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show($"读取过程中发生未知错误: {ex.Message}", "未知错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        #endregion

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个使用C#编写的基于Modbus TCP协议的上位与三菱PLC通信程序的示例: ```csharp using System; using System.Net; using System.Net.Sockets; namespace ModbusTCP { class Program { static void Main(string[] args) { IPAddress ipAddress = IPAddress.Parse("192.168.1.1"); // PLC的IP地址 int port = 502; // Modbus TCP协议的默认端口号 TcpClient client = new TcpClient(); client.Connect(ipAddress, port); NetworkStream stream = client.GetStream(); byte[] txData = new byte[] { 0x00, 0x01, 0x00, 0x00, 0x00, 0x06, 0x01, 0x03, 0x00, 0x64, 0x00, 0x02 }; // 读取地址为0x64的2个寄存器的指令 stream.Write(txData, 0, txData.Length); byte[] rxData = new byte[1024]; int bytesRead = stream.Read(rxData, 0, rxData.Length); ushort[] data = new ushort[2]; for (int i = 0; i < 2; i++) { data[i] = (ushort)(rxData[9 + i * 2] << 8 | rxData[10 + i * 2]); } Console.WriteLine("读取到的数据为:" + string.Join(",", data)); stream.Close(); client.Close(); } } } ``` 在上面的示例中,我们使用了TcpClient类来建立与PLC的连接,并通过NetworkStream类发送和接收数据。我们发送了一个读取地址为0x64的2个寄存器的指令,然后从接收到的数据中提取了这两个寄存器的值,并将其打印到控制台上。 当然,实际应用中还需要考虑异常处理、数据类型转换、多个寄存器的读写等情况。但是,这个示例应该可以帮助你了解如何使用C#编写基于Modbus TCP协议的上位与三菱PLC通信程序。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值