C#使用MX Component实现三菱PLC软元件数据采集的完整步骤(仿真)

mx,component,plc · 浏览次数 : 230

小编点评

**三菱 PLC 数据通信教程** **工具介绍** 本文介绍了如何在 GX Works2 中使用 MX Component插件实现对三菱 PLC软元件数据的读写、记录并进行测试的步骤,并重点介绍了易错点的配置步骤。 **软件版本:** * PLC 开发编程环境 GX Works2 * MX Component 软件工具 **步骤:** 1. **配置 GX Works2** * 创建工程 * 选择 PLC 型号 * 修改 PLC 参数 * 配置软元件设置 * 选择模拟开始 2. **配置 MX Component** * 安装软件 * 添加逻辑站号 * 选择 GX Simulator2 * 配置测试 3. **编写 C# 上位机程序** * 使用 ActUtlTypeLib 库读写设备值 * 创建线程读取设备值并显示结果 4. **测试连接** * 点击 "Comm" 按鈕连接到 PLC * 检查 "状态" 窗口中的连接状态 **易错点:** * **逻辑站号设置:**设置逻辑站号后,需要重新启动 GX Works2 和 MX Component。 * **设备地址:**设备地址通常为 "D0",但可以根据设备类型进行调整。 * **读取数据数量:**读取数据数量应根据设备类型进行调整。 **示例代码:** ```csharp using ActUtlTypeLib; 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; namespace MELSEC.MX.Test { public partial class Form1 : Form { private ActUtlType m_plc; public Form1() { InitializeComponent(); m_plc = new ActUtlType(); } private void Form1_Load(object sender, EventArgs e) { cmb_LogicalStationNumber.Items.Clear(); for (int i = 1; i <= 256; i++) { cmb_LogicalStationNumber.Items.Add(i.ToString()); } } private void btn_Comm_Click(object sender, EventArgs e) { try { int logNUM = Convert.ToInt16(cmb_LogicalStationNumber.Text); m_plc.ActLogicalStationNumber = logNUM; m_plc.ActPassword = ""; if (m_plc.Open() != 0) { btn_Comm.BackColor = Color.Gray; btn_Comm.Text = "未建立链接"; m_plc.Close(); m_plc = null; } else { btn_Comm.BackColor = Color.Green; btn_Comm.Text = "已连接"; } } catch (Exception ) { throw; } } private void btn_Read_Click(object sender, EventArgs e) { try { Thread thread = new Thread(() => { while (true) { txb_D0.Invoke(new Action(() => { txb_D0.Text = ReadDeviceValue("D0", 2)[0].ToString(); txb_D1.Text = ReadDeviceValue("D0", 2)[1].ToString(); txb_R100.Text = ReadDeviceValue("R100", 2)[0].ToString(); }); Thread.Sleep(1000); } }); thread.Start(); } catch (Exception ex) { MessageBox.Show(ex.Message, Name, MessageBoxButtons.OK, MessageBoxIcon.Error); } } private string ReadDeviceValue(string deviceName, int dataCount) { string result = ""; try { result = m_plc.ReadDeviceBlock2(deviceName, dataCount, out var arrDeviceValue); if (arrDeviceValue != null) { result = string.Join("\n", arrDeviceValue); } } catch (Exception ex) { MessageBox.Show(ex.Message, Name, MessageBoxButtons.OK, MessageBoxIcon.Error); return result; } return result; } } } ``` **总结:** 通过以上步骤,您可以使用 MX Component 在 GX Works2 中实现对三菱 PLC 的数据读写。

正文

前言

本文介绍了如何使用三菱提供的MX Component插件实现对三菱PLC软元件数据的读写,记录了使用计算机仿真,模拟PLC,直至完成测试的详细流程,并重点介绍了在这个过程中的易错点,供参考。

 

用到的软件:

1. PLC开发编程环境GX Works2,GX Works2下载链接 https://www.mitsubishielectric-fa.cn/site/file-software-detail?id=18

2.实现计算机与可编程控制器通信的软件工具MX Component,MX Component下载链接 https://www.mitsubishielectric-fa.cn/site/file-software-detail?id=27

 
配置流程:
1.GX Works2的配置流程:
(1)新建工程,选择PLC型号;

 (2)修改PLC参数,PLC文件设置=>使用一下文件=>命名,设置合适的容量大小,扩容为了后期测试时使用(该操作可选);

  (3)修改软元件设置,使用上一步骤中的扩容操作,三菱PLC设计上位机数据操作区一般选择D区,R区和W区亦可(该操作可选);

   (4)调试中选择=>模拟开始,出现Simulator窗口,Mode和RUN绿灯长亮即表示仿真正常;

 

2.MX Component配置流程:

(1)找到MX Component安装的对应软件,选择“Communication Setup Utility”,以管理员身份运行;

(2)添加Logical Station Number(通道号);(这里以99为例)

(3)由于本案例采用的是GX Works2仿真方案,选择GX Simulator2,选择CPU型号,下一步即可;

(4)选择描述,,以Test为例;

(5)配置完成后,进行测试,显示successful表示连接成功;连接成功后可以关掉该软件,不影响正常通讯;

 

3.C#上位机的程序测试:

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

namespace MELSEC.MX.Test
{
    public partial class Form1 : Form
    {
        private ActUtlType m_plc;
        public Form1()
        {
            InitializeComponent();
            m_plc = new ActUtlType();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            cmb_LogicalStationNumber.Items.Clear();
            for (int i = 1;i<=256;i++)
            {
                cmb_LogicalStationNumber.Items.Add(i.ToString());
            }
        }
        
        private void btn_Comm_Click(object sender, EventArgs e)
        {
            try
            {
                int logNUM = Convert.ToInt16(cmb_LogicalStationNumber.Text);
                m_plc.ActLogicalStationNumber=logNUM;
                m_plc.ActPassword = "";
                if (m_plc.Open() != 0)
                {
                    btn_Comm.BackColor = Color.Gray;
                    btn_Comm.Text = "未建立链接";
                    m_plc.Close();
                    m_plc = null;
                }
                else
                {
                    btn_Comm.BackColor = Color.Green;
                    btn_Comm.Text = "已连接";
                }
            }
            catch (Exception )
            {
                throw;
            }
        }

        private void btn_Read_Click(object sender, EventArgs e)
        {
            try
            {
                Thread thread = new Thread(() =>
                {
                    while (true)
                    {
                        txb_D0.Invoke(new Action(() =>
                        {
                            txb_D0.Text = ReadDeviceValue("D0", 2)[0].ToString();
                            txb_D1.Text = ReadDeviceValue("D0", 2)[1].ToString();
                            txb_R100.Text = ReadDeviceValue("R100", 1)[0].ToString();
                            txb_W500.Text = ReadDeviceValue("W500", 1)[0].ToString();
                        }));
                        Thread.Sleep(300);
                    }
                });
                thread.IsBackground = true;
                thread.Start();
            }
            catch (Exception)
            {

                throw;
            }
        }

        private string[] ReadDeviceValue(string DeviceName,int NumberOfData)
        {
            int iReturnCode;
            short[] arrDeviceValue;
            string szDeviceName;
            string[] arrData= { };
            int iNumberOfData;
            try
            {
                szDeviceName = string.Join("\n", DeviceName);
                iNumberOfData = Convert.ToInt32(NumberOfData);
                arrDeviceValue = new short[iNumberOfData];
                iReturnCode = m_plc.ReadDeviceBlock2(szDeviceName, iNumberOfData, out arrDeviceValue[0]);
                if (iReturnCode == 0)
                {
                    arrData = new string[iNumberOfData];
                    for (int i = 0; i < iNumberOfData; i++)
                    {
                        arrData[i] = arrDeviceValue[i].ToString();
                    }
                    return arrData;
                }
                return arrData;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, Name, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return arrData;
            }
        }
    }
}

 Demo演示

 

与C#使用MX Component实现三菱PLC软元件数据采集的完整步骤(仿真)相似的内容:

C#使用MX Component实现三菱PLC软元件数据采集的完整步骤(仿真)

前言 本文介绍了如何使用三菱提供的MX Component插件实现对三菱PLC软元件数据的读写,记录了使用计算机仿真,模拟PLC,直至完成测试的详细流程,并重点介绍了在这个过程中的易错点,供参考。 用到的软件: 1. PLC开发编程环境GX Works2,GX Works2下载链接 https://

C# 使用模式匹配的好处,因为好用所以推荐~

类型检查和转换:当你需要检查对象是否为特定类型,并且希望在同一时间内将其转换为那个类型时,模式匹配提供了一种更简洁的方式来完成这一任务,避免了使用传统的as和is操作符后还需要进行额外的null检查。 复杂条件逻辑:在处理复杂的条件逻辑时,特别是涉及到多个条件和类型的情况下,使用模式匹配可以使代码更

【C++】使用ort推理yolov10

【C++】使用ort推理yolov10 前言:由于笔者是编导专业,想玩玩yolo模型,搜来搜去全是python,所以在学会之后写一篇文章帮助和笔者同样情况的人 环境 Windows 10 C++17 onnxruntime18.1(DML版本) opencv4.9 visual studio2022

C++使用gnuplot-cpp库绘制图像

最近想要对一些时变的变量进行可视化,搜索来搜索去选择了使用gnuplot这个工具。 sudo apt-get install gnuplot sudo apt-get install gnuplot-x11 # 使其支持linux终端 这样就安装完gnuplot了。接着可以在命令行中键入gnuplo

C#使用SendMessage进行进程间通讯

最近公司有个需求是,拖动文件到桌面图标上,自动打开文件。那么只需在OnStartup事件中通过StartupEventArgs获取文件名然后进行操作即可。操作之后发现当软件已经启动了(单例运行),那么将无法将参数传给业务层。原因是因为跨进程了,那么我们可以通过窗口句柄的方式来进行通讯。 1 publ

C# 使用openxml解析PPTX中的文本内容

前言 本文讨论的仅针对微软Office 2007以后的(OOXML定义)PowerPoint文档,Office 2007以前的用二进制格式定义的(ppt格式)文档不在本文讨论范围。 一、依赖类库 本文需要依赖两个免费的第三方类库:DocumentFormat.OpenXml和FreeSpire.Do

C#中使用CAS实现无锁算法

CAS 的基本概念 CAS(Compare-and-Swap)是一种多线程并发编程中常用的原子操作,用于实现多线程间的同步和互斥访问。 它操作通常包含三个参数:一个内存地址(通常是一个共享变量的地址)、期望的旧值和新值。 CompareAndSwap(内存地址,期望的旧值,新值) CAS 操作会比较

2.1 C/C++ 使用数组与指针

C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。

3.1 C/C++ 使用字符与指针

C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。

4.1 C/C++ 使用结构与指针

C/C++语言是一种通用的编程语言,具有高效、灵活和可移植等特点。C语言主要用于系统编程,如操作系统、编译器、数据库等;C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统、图形用户界面、嵌入式系统等。C/C++语言具有很高的效率和控制能力,但也需要开发人员自行管理内存等底层资源,对于初学者来说可能会有一定的难度。