Eplan 进程通讯操作Eplan---1

尝试了用离线程序做, dll文件正常加载进去了, api的方法等等无法正常使用(因为没有找到Eplan的实例), 最后选择了进程通讯的方式做的.

我使用的工具

IDE:Visual Studio 2019
框架:.net framework 4.7.2
需要下载个运行时(做离线程序的时候,需要)
在这里插入图片描述

目录

说明,创建一个控制台程序(console)

程序结构

在这里插入图片描述

调用cmd.exe打开Eplan

文件名CMD.cs

using System;
using System.Diagnostics;
using System.Threading.Tasks;

namespace EplConsole
{
    public class CMD: IDisposable
    {
        private Process process;
        private string  _errMsg;//报警信息

        public string  ErrMsg
        {
            get { return _errMsg; }
            set { _errMsg = value; }
        }
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="appName">传入cmd.exe</param>
        public CMD(string appName)
        {
            try
            {
                process = new Process();
                process.StartInfo.FileName = appName;
                process.StartInfo.RedirectStandardError = true;
                process.StartInfo.RedirectStandardInput = true;
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.CreateNoWindow = true;
            }
            catch(Exception ex)
            {
                _errMsg = ex.Message;
            }
        }
        public void Run()
        {
            process.Start();
        }
        /// <summary>
        /// 执行方法
        /// </summary>
        /// <param name="excute">填cmd窗口执行操作</param>
        /// <returns></returns>
        public string Excute(string excute)
        {
            try
            {
                process.StandardInput.WriteLine(excute);
                process.StandardInput.AutoFlush = true;
                process.StandardInput.Close();
                return process.StandardOutput.ReadToEnd();
            }
            catch(Exception ex)
            {
                _errMsg = ex.Message;
            }
            return _errMsg;
        }

        public void Dispose()
        {
            process.Close();
            process.Kill();
        }
    }
}

上面的代码是对进程类的封装 , 下面的代码示例化上面的类并使用他的执行方法 , 运行eplan软件 (用eplan.exe路径 , 不知道怎么给他传参 , 有会的可以下方评论 . )
下面代码是Program.cs中的一个方法

static void OpenEpl(object o)
        {
            CMD cMD = new CMD("cmd.exe");
            cMD.Run();
            cMD.Excute("start \"start\" \"C:\\Program Files\\EPLAN\\Electric P8\\2023.0.3\\Bin\\W3u.exe\"");
            cMD.Dispose();
        }

调用cmd.exe执行tasklist查看进程PID

这段代码同上面一样
是Program.cs中的一个方法

public string SearchPID(string appName)
        {
            CMD cMD = new CMD(appName);
            cMD.Run();
            return cMD.Excute("tasklist /FI \"IMAGENAME eq EPLAN.exe\"");
        }

调用cmd.exe执行netstat查看通讯信息

Program.cs中的一个方法

public string SearchNetPort(string appName)
        {
            CMD cMD = new CMD(appName);
            cMD.Run();
            return cMD.Excute("netstat -ao");
        }

Eplan类(否则连接Eplan,执行Eplan的Action

后期的代码刚开始测试 , 功能加哪还没想好 ; 等下章文章确定 .

using Eplan.EplApi.RemoteClient;
using Eplan.EplApi.Remoting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EplConsole.EplOperations
{
    public class EplClientConn : IDisposable
    {
        EplanRemoteClient m_pClient;
        public string ClientResult;//Eplan反馈信息

        private static readonly Lazy<EplClientConn> lazy = new Lazy<EplClientConn>(() => new EplClientConn());

        public static EplClientConn Instance { get { return lazy.Value; } }
        
        private EplClientConn() 
        {
            m_pClient = new EplanRemoteClient();
        }
        /// <summary>
        /// 连接Eplan
        /// </summary>
        /// <param name="netPort"></param>
        public void EplConn(string netPort)
        {
            m_pClient.Connect("localhost", netPort);
        }
        /// <summary>
        /// 发送指令给Eplan
        /// </summary>
        /// <param name="excute"></param>
        /// <returns></returns>
        public bool EplAction(string excute)
        {
            bool excuteResult = m_pClient.ExecuteAction(excute);
            m_pClient.ResponseArrivedFromEplanServer += OnResponseArrivedHandler;//Eplan信息反馈委托
            return excuteResult;
        }



        public void Dispose()
        {
            m_pClient.Disconnect();
            m_pClient.Dispose();
        }
        //委托方法
        static void OnResponseArrivedHandler(EplanResponse response)
        { //Handle Server response.
            Instance.ClientResult = response.Message;
        }
    }
}

整体代码

Program.cs代码

using Eplan.EplApi.RemoteClient;
using Eplan.EplApi.Remoting;
using EplConsole.EplOperations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;

namespace EplConsole
{
    class Program
    {
            static void Main(string[] args)
        {
            //全局变量
            Program program = new Program();
            string strPtr = "1";
            string srcStr = "1";
            string pattern = "1";
            string netPort = "1";
            //后期更新变量会在这增加


            MatchCollection matchs;
            Match match;
            mainStart:
            Console.WriteLine("你希望从第几步开始,请输入以下数字;退出输入Esc-->按回车");
            Console.WriteLine("1,打开Eplan软件");
            Console.WriteLine("2,查看EplanPID");
            Console.WriteLine("3,查看Eplan通讯Port;;;需要先执行第二步,才能正确执行");
            Console.WriteLine("4,开始Eplan的操作");
            switch (Console.ReadLine())
            {
                //"1,打开Eplan软件"
                case "1":
                    ThreadPool.QueueUserWorkItem(OpenEpl);//用线程池调用,防止卡线程
                    break;
                //"2,查看EplanPID"
                case "2":
                    srcStr = program.SearchPID("cmd.exe");
                    //Console.WriteLine(srcStr);
                    pattern = @"(\w+\.\w+)\s*(\d+)\s{1}\w+";//运用正则表达式,找出进程PID值
                    matchs = Regex.Matches(srcStr, pattern);
                    match = matchs[0];
                    Console.WriteLine("是否显示全部:Y--->显示全部;;;N--->不显示全部");
                    if (Console.ReadLine()=="y"|| Console.ReadLine() == "Y")
                    {
                        foreach (Match match1 in matchs)
                        {
                            Console.WriteLine(match1.Value);
                        }
                    }
                    else
                    {
                        strPtr = match.Groups[2].Value;
                        Console.WriteLine("进程名:" + match.Groups[1].Value + "进程PID:" + strPtr);
                    }
                    break;
                //"3,查看Eplan通讯Port;;;需要先执行第二步,才能正确执行"
                case "3":
                    srcStr = program.SearchNetPort("cmd.exe");
                    Console.WriteLine(srcStr);
                    //@"\w+\s*\d+.\d+.\d+.\d+:\d+\s*(\w+:\d)\s*\w+\s*" + strPtr;
                    pattern = @"\w+\s*\d+.\d+.\d+.\d+:(\d+)\s*\w+:\d\s*\w+\s*" + strPtr;//用正则表达式找出进程通讯值
                    matchs = Regex.Matches(srcStr, pattern);
                    match = matchs[0];
                    netPort = match.Groups[1].Value;
                    Console.WriteLine("是否显示全部:Y--->显示全部;;;N--->不显示全部");
                    if (Console.ReadLine() == "y" || Console.ReadLine() == "Y")
                    {
                        foreach (Match item in matchs)
                        {
                            Console.WriteLine(item.Value);
                        }
                    }
                    else
                    {
                        Console.WriteLine("App通讯端口:" + netPort);
                    }
                    break;
                //"4,连接Eplan,进行进程间通讯,并实现操作"    
                case "4":
                    EplClientConn eplClientConn = program.ConnEpl(netPort);
                EplOperate:
                    Console.WriteLine("输入Eplan Action");
                    program.EplAction(Console.ReadLine());
                    Console.WriteLine(program.eplClientConn.ClientResult);
                    Console.WriteLine("输入Esc退回到首选项,其他值继续");
                    if (Console.ReadLine() == "Esc")
                    {
                        program.DispEpl();
                        goto mainStart;
                    }
                    goto EplOperate;
                    break;
                default:
                    GC.Collect();
                    break;
                    
            }

            
            Console.WriteLine("退出按Esc键;继续按任意键");
            if(Console.ReadKey().Key!=ConsoleKey.Escape)
                goto mainStart;

        }
        /// <summary>
        /// 1.打开Eplan
        /// </summary>
        /// <param name="o"></param>
        static void OpenEpl(object o)
        {
            CMD cMD = new CMD("cmd.exe");
            cMD.Run();
            cMD.Excute("start \"start\" \"C:\\Program Files\\EPLAN\\Electric P8\\2023.0.3\\Bin\\W3u.exe\"");
            cMD.Dispose();
        }
        /// <summary>
        /// 2.查看Eplan PID
        /// </summary>
        /// <param name="appName"></param>
        public string SearchPID(string appName)
        {
            CMD cMD = new CMD(appName);
            cMD.Run();
            return cMD.Excute("tasklist /FI \"IMAGENAME eq EPLAN.exe\"");
            
        }
        /// <summary>
        /// 3.查找App通讯端口
        /// </summary>
        /// <param name="appName"></param>
        /// <returns></returns>
        public string SearchNetPort(string appName)
        {
            CMD cMD = new CMD(appName);
            cMD.Run();
            return cMD.Excute("netstat -ao");
        }
        /// <summary>
        /// 4.连接Eplan
        /// </summary>
        /// <param name="netPort"></param>
        /// <returns></returns>
        public EplClientConn ConnEpl(string netPort)
        {
            
            eplClientConn = EplClientConn.Instance;
            eplClientConn.EplConn(netPort);
            return eplClientConn;
        }
        EplClientConn eplClientConn;
        string EplPath = "ProjectOpen /Project:\"C:\\Users\\Public\\EPLAN\\Data\\项目\\Company name\\EplApiTest1.elk\"";
        public void EplAction(string excute)
        {
            eplClientConn.EplAction(excute);
        }
        /// <summary>
        /// 回收Eplan
        /// </summary>
        /// <param name="eplClientConn"></param>
        public void DispEpl()
        {
            eplClientConn.Dispose();
        }
    }
}

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值