首页 > 编程语言 >C#使用MX Component实现三菱PLC软元件数据采集的完整步骤(仿真)

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

时间:2024-05-06 11:55:05浏览次数:28  
标签:string C# Component System PLC using MX

前言

本文介绍了如何使用三菱提供的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演示

 

标签:string,C#,Component,System,PLC,using,MX
From: https://www.cnblogs.com/Jerry9521/p/18174620

相关文章

  • Oracle查询去掉小数后面无效0
    select50.00qty,trim(trailing'0'from50.00)qty0,to_char(50.00,'FM9999.999')qty1,trim(trailing'.'fromto_char(50.00,'FM9999.999'))qty2,rtrim(to_char(50.00,'fm9990.99'),'.')qty3f......
  • JavaScript-DOM简介
    JavaScript-DOM简介之前我们说过JavaScript有三部分组成ECMAscript,BOM,DOM,之前我们都在了解JavaScript的语法即ECMAScript,今天我们开始了解DOM(文档对象模型(DocumentobjectModel),操作网页上的元素的API)什么是DOMDOM:DocumentObjectModel,文档对象模型。DOM为文档提供了结......
  • Ubuntu多版本CUDA安装与切换(转载)
    https://qiyuan-z.github.io/2022/01/04/Ubuntu%E5%A4%9A%E7%89%88%E6%9C%ACcuda%E5%AE%89%E8%A3%85%E4%B8%8E%E5qiyuan-z.github.io /2022/01/04/Ubuntu%E5%A4%9A%E7%89%88%E6%9C%ACcuda%E5%AE%89%E8%A3%85%E4%B8%8E%E5%88%87%E6%8D%A2/Ubuntu多版本CUDA安装与切换2022/1/4......
  • JDBC相关
    什么是JDBC,为什么要使用JDBC?在web开发中,不可避免的地要使用数据库来存储和管理数据。为了在java语言中提供数据库访问的支持,Sun公司于1996年提供了一套访问数据的标准Java类库,即JDBC。JDBC,全称是JavaDatabaseConnectivity,它是一套统一的、基于Java语言的关系数据库编程接口......
  • c++
    namespace命名空间我们为了防止由于定义了多个函数名,导致可能函数名重复的问题,我们创建了命名空间,为的就是区分函数名重复的问题当我们要调用某个命名空间中的函数时,我们可以直接namespace::function来进行直接调用,同时可以存放变量名,函数,再一个命令空间.....同时假如命名空间......
  • 高级C语言5
    输出缓冲区:​ 当我们使用标准库的输出系列函数打印数据到屏幕,数据并不会立即显示到屏幕上,而先存储到一块内存中,我们把这块内存称为输出缓冲区,等满足相关条件后,再从缓冲区中显示到屏幕,相关条件有:1、从输出状态切换到输入状态。2、缓冲区满了,1k=1024个字节,系统会把缓冲区中所有数......
  • 如何把keil C51 和 keil MDK(ARM)安装在一起
    KeilC51与KeilMDK区别1:KeilC51,专门用于经典和扩展的8051mcu的开发工具,编译器是ANSICcompiler,包括C51Compiler,A51Assembler,LX51Linker2:KeilMDKMDK:MicrocontrollerDevelopmentKitKeilMDK-ARM专门用于开发基于ARM和Cortex-M的MCU,编译器是ARMCompiler,包括ARM......
  • Razavi - RF Microelectronics的笔记 - Differential Output Current
    Onpage400,example6.26,weareaskedtoanalyzeadouble-balancedcircuitonits\(IP_2\).Idon'tgetwheredoes(6.127)comefrom.Sincethere'snoexplanationon(6.127),Iguessthisequationisobvious.SoIreducetheproblemandtry......
  • BLDC 电机和 PMSM 的结构区别
    BLDC电机和PMSM的结构类似,其永磁体均置于转子,并被定义为同步电机。在同步电机中,转子与定子磁场同步,即转子的旋转速度与定子磁场相同。它们的主要区别在于其反电动势(反EMF)的形状。电机在旋转时充当发电机。也就是说,定子中产生感应电压,与电机的驱动电压反向。反电动势是电机的......
  • [转帖]Unnecessary GCLocker-initiated young GCs
    https://www.cnblogs.com/zhangshengdong/p/9196128.html DetailsType: BugResolution:FixedPriority: P3FixVersion/s:14AffectsVersion/s:7u60, 8, 8u20, 8u40, 9, 11, 13Component/s:hotspotLabels:8u20-defer-SQE-OK 8u20......