ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

EPLAN二次开发实战:从API调用到定制化界面完整指南

EPLAN二次开发实战:从API调用到定制化界面完整指南 EPLAN二次开发这事圈子里有个很有意思的现象电气工程师看着一堆重复性操作骂了三年也没想起来自己写个脚本反而是被Excel宏毒打过的半吊子程序员一进EPLAN就能玩出花来。刚接触EPLAN二次开发那会儿我的感受是——这工具的API架构比想象中干净但资料是真的少官方文档像谜语人论坛上的案例穿插着各种版本新手礼。这篇文章就打算把从API调用到定制化界面这条路完整走一遍用实际项目里最常遇到的场景做例子把我踩过的坑、验证过的写法、怀疑过的版本问题都说清楚。1. 为什么电气工程师需要给EPLAN开外挂先别急着打开Visual Studio搞明白为什么要动这个工具比怎么写API重要得多。EPLAN作为电气设计领域的主流平台它的原生操作逻辑是以人机交互为核心的点选、拖拽、右键菜单、属性对话框。这种设计对初学者友好但对重复性工作一点都不友好。1.1 日常设计中最折磨人的三类反复劳动我在数个实际项目里统计过电气设计岗位的时间分配大概是真正画原理图和柜内布局的时间不到一半剩下的时间全在处理批量修改、跨页核对、跨系统数据搬运。批量改属性1000多个端子排的编号规则变了或者整套图纸的项目名、页名、设备标识符需要按客户新格式重排。手动改到凌晨三点眼睛看花了还容易漏。跨系统搬运设计完的BOM表要导到ERP元器件清单要跟采购系统核对部件编号要和物料管理系统匹配。EPLAN自带的数据导出功能能用但每次导出的字段顺序、格式转换都要重新配置效率很低。规范性检查图纸画完要逐页查有没有用错符号库、端子连接有没有悬空、中断点是否成对出现。靠肉眼检查一整套200页的图纸简直是用生命在测试眼力。这几类场景有个共同点操作规则是明确的过程是重复的但数据量大到超出人力的合理范围。这正是API接口发挥优势的主场。1.2 二次开发能做什么、不能做什么我见过有人还没搞懂EPLAN对象模型就立项做全自动出图系统折腾三个月最后连中间继电器都画不利索。作为过来人建议先建立正确的预期——能做的事批量读写元件属性、页属性、项目属性遍历项目结构页、设备、连接、端子排、PLC地址等自动生成报表部件汇总表、端子连接图、电缆图表等一键导入导出外部数据Excel、CSV、数据库自定义命令按钮、菜单、工具栏甚至嵌入独立操作面板不该强行做的事替代人工进行复杂的布局规划比如自动摆放柜内元件位置EPLAN对象模型对坐标控制不友好完全脱离EPLAN规则引擎的跨页连线连接关系是EPLAN计算出来的硬写API去创建跨页连线后续维护成本极高实时双向同步多用户协同编辑EPLAN的并发锁机制不是为API层实时交互设计的判断一个需求到底该不该用二次开发去解决我有个很朴素的标准手动完成一次需要3分钟一个月要重复5次以上规则完全固定那么写脚本就值。如果规则经常变或者需要大量主观判断老老实实改图纸更快。2. 动手前必须搞清楚的API架构与适用边界EPLAN的二次开发接口从架构上可以分成两大类脚本Script和插件Add-in。很多初学者一上来就想写插件实际上80%的日常工作用脚本就够插件适合做完整的产品化工具。2.1 脚本与插件的真面目脚本本质上是一段可以被EPLAN解析执行的C#代码通过EPLAN内置的脚本管理直接加载运行不需要编译成DLL。它的特点是快、乱、适合自己做小工具——写起来快但管理和复用性差。插件则需要编译成.NET程序集通过EPLAN的加载机制挂载能做菜单、能做窗体、能封装业务逻辑适合团队使用或对外发布。用一个不太准确但很形象的类比脚本是现场临时接的照明线插件是预埋在墙里的标准电路。临时用用效果明显但要考虑长期运维、多机部署必须走标准化的做法。2.2 核心对象模型搞懂这几个角色就入门了整个EPLAN API的对象层级一句话总结就是Application → Project → Pages(页) → 子对象设备、连接、端子等。刚接触时不需要死记每个类先理清几个角色角色常用接口/类作用应用程序入口IEplanApplication访问当前运行的EPLAN实例获取项目集合项目对象IEplanProject代表当前打开的一个项目操作页、设备、属性都从它入手项目结构ProjectStructure访问页名、标识符、高层代号、位置代号等结构信息对象查找器DMObjectsFinder在项目中按类型、ID快速查找对象比如找所有端子排属性操作StorableObject所有可存储属性对象的基类读写属性靠它页与图框Page/PageClient按页名定位、操作图纸页设备与连接Eplan.EplApi.DataModel下的各类设备端子、电缆、连接符号、中断点等图形化数据再强调一个新手经常会晕的点EPLAN.API的对象模型不是所有属性都能直接访问。有些属性是计算属性比如连接的长度、设备的坐标这些需要调用特定方法去触发计算直接读写会失败或返回默认值。2.3 API的边界哪些数据模型没有开放EPLAN是一个封装程度很高的商业软件出于自身设计理念有一部分内部机制并没有通过API对外暴露。我实际踩过坑的包括某些动态报表如自动生成的目录的明细行只能导出不能逐行修改设备坐标的赋值只对部分类型有效宏变量、窗口宏的处理方式不同原理图绘图逻辑比如智能连接、自动断线没有公开API做自动画图的梦想可以收一收了知道自己能调什么、不能调什么比记住一堆API更重要。先花一晚上把EPLAN API Help文档的目录过一遍比翻一周论坛都顶用。3. 开发环境搭建从零到跑通第一个脚本不管最终是走脚本还是插件路线工具链都是一致的。这里分享一下我验证过的环境搭配以及几个容易在起步阶段卡人的问题。3.1 环境版本匹配表EPLAN API基于.NET Framework对C#语言版本不挑但这几个版本对应关系必须记住否则会出现明明代码没错但就是不认的玄学问题。EPLAN版本推荐Visual Studio.NET FrameworkAPI程序集EPLAN 2.7VS2015/2017/20194.6.x / 4.7.xEPLAN.Scripting.dllEPLAN 2.9VS2019/20224.7.2 / 4.8EPLAN.Scripting.dllEPLAN Platform 2022VS2019/20224.8EPLAN.Scripting.dllEPLAN Platform 2024VS20224.8EPLAN.Scripting.dll我自己常用的是2.9和2022两个版本生产环境用2.9老项目多开发新工具用2022。只要API程序集版本一致代码在两个版本间基本能平滑迁移。3.2 添加引用的正确姿势在VS里新建一个类库(.NET Framework)项目目标框架选4.7.2或4.8然后右键引用→添加引用→浏览找到EPLAN安装目录下的EPLAN.Scripting.dll通常位于C:\Program Files\EPLAN\Platform\2.9.x\Bin\。注意必须添加这几个核心程序集EPLAN.Scripting.dll、EPLAN.EplApi.DataModel.dll、EPLAN.EplApi.ApplicationClient.dll缺哪个后面编译必报错。所有引用选复制本地 False因为目标机器上EPLAN自己带了这些库复制过去反而容易冲突。目标平台推荐AnyCPU或者x64。EPLAN新版是64位进程如果项目配成x86加载会直接崩试图加载格式不正确的程序集。3.3 新手第一段代码列出所有页名跑通这个Demo就算入门了。逻辑很简单连接当前EPLAN实例 → 获取所有打开项目 → 遍历第几个项目的页。using System; using Eplan.EplApi.ApplicationFramework; using Eplan.EplApi.DataModel; public static class FirstDemo { public static void Main() { // 1. 获取当前EPLAN实例 CommandLineInterpreter oCLI new CommandLineInterpreter(); Application oApp oCLI.Application; // 2. 获取所有已打开项目 ProjectManager oProjectManager oApp.ProjectManager; Project[] oProjects oProjectManager.GetOpenedProjects(); if (oProjects.Length 0) { Console.WriteLine(当前没有打开任何EPLAN项目); return; } // 3. 遍历第一个项目的所有页 Project oProject oProjects[0]; Page[] oPages oProject.Pages; foreach (Page oPage in oPages) { Console.WriteLine(页名: oPage.PageName); } } }这段代码在EPLAN脚本编译器中可以直接跑在VS里就需要用插件方式挂载。既然是Demo直接在EPLAN里打开脚本→运行脚本选这个.cs文件就行输出会在系统→消息里显示。3.4 调试的心法别用MessageBox轰炸很多新手写EPLAN脚本一遇到问题就弹MessageBox弹到机器卡死。养成用日志输出的习惯写一个简单的Log()方法把关键步骤、对象数量、属性值追加到本地TXT文件。这样既可以排查问题也可以在非交互环境下比如批处理跑几千页图纸记录执行轨迹。插件模式下用VS调试→附加到进程选中EPLAN.exe下断点单步调试。这是排查复杂逻辑的最佳途径比到处弹窗强一百倍。4. 核心实操API调用的底层逻辑与三层架构学会Demo只是敲门砖真到写一个实用工具时最大的挑战不是某个API怎么用而是整个工具怎么组织。我建议所有人从第一行业务代码开始就坚持表现层、业务层、数据层分离的三层架构哪怕工具再小也别把所有逻辑堆在按钮事件里。4.1 一定要分层的理由EPLAN的API调用有个特点每次调用都是跨进程边界甚至跨.NET AppDomain的操作开销不小。如果你在界面上直接遍历3000个设备、每次查询都实时调用API工具会慢到让你怀疑人生。分层之后数据层一次性把相关对象和属性抓取到内存业务层做判断和处理再到数据层把修改批量写回。这样既能保证响应速度也让后续维护变得容易——EPLAN版本升级导致API变动时只需要改数据层而不是满屏找oDevice.Properties。4.2 批量修改属性的标准套路用一个最经典的需求做例子把当前项目中所有端子排的功能定义文本加上统一前缀。直接上代码重点看注释里的设计意图。public static void BatchUpdateTerminalMarkings(Project project, string prefix) { // 数据层一次性取回所有端子排 DMObjectsFinder finder project.DMObjectsFinder; // 用类型过滤高效获取对象 Terminals[] terminals finder.GetTerminals(false, true); Console.WriteLine($共找到端子排 {terminals.Length} 组); // 业务层批量处理 foreach (Terminals terminalGroup in terminals) { Terminal[] terminalsInGroup terminalGroup.GetTerminals(); foreach (Terminal terminal in terminalsInGroup) { // 检查属性是否可写 if (!terminal.IsModifiable()) { Console.WriteLine($端子 {terminal.VisibleName} 属性锁定跳过); continue; } // 读写属性前必须用Properties对象复位 Properties props terminal.Properties; string currentMarking props[Properties.Terminal.FUNCTIONTEXT] as string; if (!string.IsNullOrEmpty(currentMarking) !currentMarking.StartsWith(prefix)) { props[Properties.Terminal.FUNCTIONTEXT] prefix currentMarking; Console.WriteLine($已修改: {terminal.VisibleName}); } } } // 重要统一写回 project.Commit(); }几个关键点GetTerminals(false, true)的两个布尔参数第一个表示是否包含未放置的端子第二个表示是否递归查找子项目。项目有多级结构时参数传错会导致漏对象。IsModifiable()的检查必须做。EPLAN项目有人工锁定、版本控制锁定、工作区锁定等多重机制跳过检查直接写运行时直接抛异常。修改所有对象后最后只需调用一次project.Commit()批量提交。EPLAN的API是事务型设计好多小改动攒着最后统一提交性能提升极其明显。4.3 巡检时常用的只读探测技巧有时候不用改图纸只是想快速统计项目里有多少个中断点没有配对。这种场景不需要Commit也不需要修改属性纯粹是读数据。读数据的API调用也是跨进程的所以一定要一次拿回本地统计。Project project GetOpenedProject(); int totalInterruptionPoints 0; int unpairedPoints 0; foreach (Page page in project.Pages) { // 通过页上的图形对象获取中断点 foreach (InterruptionPoint ipt in page.InterruptionPoints) { totalInterruptionPoints; // 中断点是否配对可以通过连接属性判断 if (!HasPairedInterruptionPoint(ipt)) { unpairedPoints; Console.WriteLine($未配对中断点: {ipt.VisibleName}位于页 {page.PageName}); } } } Console.WriteLine($总计 {totalInterruptionPoints} 个中断点未配对 {unpairedPoints} 个);注意页面遍历时不要用project.Pages一次又一次地获取它是动态数组每次调用都会触发全项目页列表重建。先在外部存好Page[] pages数组再遍历能省掉几秒到几十秒的等待。4.4 用属性ID而不是中文名去读写EPLAN对象的属性分两类系统属性必须有ID和用户自定义属性通常用字符串Key。新手最容易犯的错是凭界面上的中文名称去找API里的属性名结果踩半天坑发现API里的名称完全是另一套。比如在界面里看功能定义这个属性API里它是Properties.Terminal.FUNCTIONTEXT一个静态枚举值。再比如部件的订货编号API里是Properties.ARTICLE.ORDERNO。项目中要用什么属性先到EPLAN的API文档里查对应的静态属性ID别自己猜字符串。EPLAN还支持一种自由属性Free properties这类属性在API里要通过Properties.Set方法按自定义GUID和ID读写上手难度又高一点。初次接触不建议碰等常规属性玩顺了再研究。5. 定制化界面从功能脚本到像样的工具界面程序逻辑跑通了但只有黑黢黢的控制台输出同事用起来还是会嫌弃。定制化界面是EPLAN二次开发最出彩、也最显功力的部分。我的经验是别急着上复杂窗体先把菜单和命令注册搞明白。5.1 第一步注册命令并绑定到工具栏插件的核心不是窗体而是命令。EPLAN通过命令Action把功能暴露给用户。命令可以绑定到菜单、工具栏、快捷键统一走一套注册机制。public class MyPlugin : IEplAddIn { public void OnRegister(ref IEplAddInContext context) { // 注册命令把类名和动作关联 Command cmd new Command(MyProject.BatchUpdateTerminal); cmd.Name 批量更新端子标记; cmd.InvokeMethod OnExecute; // 指定触发时调用的方法名 cmd.MenuName 我的工具; // 主菜单名 cmd.MenuItem 批量更新端子标记; // 菜单项名称 context.AddCommand(cmd); } public void OnUnregister(ref IEplAddInContext context) { // 反注册清理 } public void OnExecute() { // 弹出业务界面 BatchUpdateForm form new BatchUpdateForm(); form.ShowDialog(); } }这段代码编译成DLL后放入EPLAN的Bin目录或者通过选项→设置→用户→接口→插件指定目录重启EPLAN就会自动加载。5.2 做一个能干的WinForms工具栏EPLAN允许通过DockWindow把WinForms面板嵌入到主界面右侧或底部。这里有个技巧先做浮动模态对话框验证功能再升级成Dockable窗口。模态对话框调试简单直面用户Dockable窗口嵌入主界面后视觉统一但布局管理、状态刷新都要额外处理。public partial class DataSyncPanel : Form { private Project currentProject; public DataSyncPanel() { InitializeComponent(); LoadDataFromEplan(); } private void LoadDataFromEplan() { // 从EPLAN获取当前打开的项目可通过ApplicationClient Application app new Application(); ProjectManager pm app.ProjectManager; Project[] projects pm.GetOpenedProjects(); if (projects.Length 0) return; currentProject projects[0]; lblProjectName.Text currentProject.ProjectName; comboBoxArticleType.Items.Clear(); comboBoxArticleType.Items.Add(全部); comboBoxArticleType.Items.Add(端子); comboBoxArticleType.Items.Add(电缆); comboBoxArticleType.Items.Add(断路器); } private void btnExportBom_Click(object sender, EventArgs e) { // 业务层组装数据导出Excel ListArticleData bomList BllServices.CollectArticles(currentProject, comboBoxArticleType.SelectedItem?.ToString()); ExcelExporter.Export(bomList, saveFileDialog1.FileName); } }在OnExecute()里直接ShowDialog()这个窗体即可。部署时把生成的DLL和依赖的第三方库比如NPOI用于导出Excel一起放在插件目录。5.3 设计界面时的选型对比交互形态优点缺点适用场景纯菜单命令开发快无UI维护成本一次性任务无法批量配置简单的批处理脚本模态对话框职责聚焦流程清晰一次只能做一件事单业务操作如单次导入Dockable面板常驻界面状态保持开发复杂需处理刷新数据看板、持续操作工作台独立EXE外部工具完全脱离EPLAN版本限制需要额外处理与EPLAN的通信与外部系统集成我在实际项目中超过80%的定制工具做到模态对话框这一步就足够好用了。Dockable面板听起来高级但维护成本高除非团队有专职二次开发人员否则不建议一上来就铺开。6. 真实项目里的坑与排查链路这部分算是压箱底的经验了。EPLAN二次开发最大的特点是官网文档少、社区资源散、闭源导致排查困难。遇到问题很多人第一反应是去群里问但指望别人远程帮你调试不现实。学会系统的排查链路比背代码更重要。6.1 踩坑场景加载DLL时报试图加载格式不正确的程序集这个报错我很熟悉第一次遇到是在64位EPLAN 2.9里加载了一个按AnyCPU编译的插件结果一加载就崩。排查过程先确认EPLAN进程位数。任务管理器→详细信息→EPLAN.exe如果是64位2.9及以后版本几乎都是64位那DLL的Platform Target必须带x64兼容。检查VS项目属性→生成→目标平台如果选的是x86或Any CPU首选32位改掉。排查被引用的第三方库是否符合x64——比如一个第三方DLL是32位的也会导致整体加载失败。实际上这个问题最简单的方式是任何插件项目都标注目标平台x64。这样从根上避免。6.2 排查链路一键导出功能偶尔成功、偶尔失败另一个很经典的坑导出BOM按钮小项目能用大项目就报错或导出不全。排查链路是这样的第一步定位是不是对象没拿全。大项目里设备数量多全量遍历时如果把对象一次性放进一个List内存占用大还可能因为EPLAN内部对象池限制导致部分对象返回null。第二步检查GetArticles()这类API的布尔参数。它的某些重载带recursive参数小项目里层级浅看不出问题多级项目结构下漏一堆儿子设备。第三步打开EPLAN自己的日志。EPLAN内部有详细的日志机制在系统→消息里能看到不少跟API调用相关的异常堆栈。很多人只知道出弹窗却不知道日志里已经写了报错原因。6.3 性能瓶颈的优化思路处理几千个对象的批量操作时EPLAN API的表现会明显下降。优化思路按优先级排序尽可能减少跨进程API调用次数。比如对每个设备的10个属性做读写合理做法是先取对象、一次性读入判断完毕再写回而不是读一个属性调一次API。利用in-memory数据缓存。把整个项目的设备列表缓存到本地List所有业务判断走本地数据最后统一提交。关闭屏幕刷新。跨进程操作期间EPLAN会自动重绘页面。调用ActionProtect类或把屏幕更新选项临时关闭重绘工作全砍掉。分页分批处理。2000页的项目脚本跑起来界面会卡死。改成逐页处理并在日志里打印进度用户体验真的会好一个档次。6.4 版本升级带来的API变更坑EPLAN的API在不同Platform版本间对象模型总体稳定但细微处经常有Breaking Changes。比如2.7时代非常常用的Project.PageProperties到2.9就变了用法。我之前维护一个工具从2.9迁到2022版本时光Properties枚举的改名就改了两个通宵。应对策略建立一个API兼容层。不要直接在业务代码里裸调Project.Pages、Properties.Terminal.FUNCTIONTEXT而是封装成自己的EplanRepository类未来版本升级只改这个类。严格锁定开发版本。明确告诉团队这个工具目标是2.9 SP1别拿着2022的环境开发然后丢到2.7上跑然后来问我为什么崩。7. 项目落地后的三点切实建议工具写出来了同事说挺好用但没过两周就没人用了——这事我经历过太多次。回想一下问题往往不是出在技术而是出在工具和人的工作流没衔接上。第一把工具打包成安装程序而不是发源码。EPLAN插件的部署方式其实很轻只需要把DLL放进指定目录写一个注册表项或配置文件就行。啥也别多写做个联网的自动更新把新版本推到同事们的机器上。第二为每类工具写一页纸的操作手册。别嫌啰嗦重点写输入什么格式的Excel、输出什么结果、出现什么报错说明哪里有问题。这门手艺传授给现场工程师他们用得顺手了工具才能真正存活下来。第三跟电气设计团队坐在一起做需求拆解。二次开发不是我写代码你等着用的交付模式而是要把大家日常最花时间的活儿摸清楚——有人卡在导ERP有人卡在改标号有人天天核对中断点分清楚优先级再做工具投入产出比天差地别。做EPLAN二次开发这些年最大的感受是API本身并不难真正难的是把电气设计规范翻译成机器可执行的逻辑。每一次批量改动本质都是在跟EPLAN的设计哲学对话。搞明白了这套哲学工具自然就顺手了。
返回列表