尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Delphi 12.3下基于dOPC实现OPC DA客户端开发实践

Delphi 12.3下基于dOPC实现OPC DA客户端开发实践 简介本资源是面向Delphi中高级开发者的专业级OPC客户端开发套件专为在Delphi 12.3环境下构建工业自动化数据采集、设备监控与系统集成应用而设计。它完整封装了OPC UA、OPC DA、OPC XML-DA及OPC Events等协议的客户端通信能力显著降低工业通信模块的开发门槛与调试成本。压缩包共1345个文件含152个核心Pas源码、142个DFM界面设计文件、388个DCU编译单元、61个DPR工程入口及22个可执行示例程序辅以BMP图标资源、HTML帮助文档与CHM手册总大小51.31MB结构清晰、开箱即用。已有129人下载学习适用于需深度定制OPC交互逻辑、适配私有服务器或嵌入HMI系统的项目场景提供全源代码意味着开发者可直接剖析通信机制、扩展安全策略如X.509证书支持、优化数据订阅模型并复用TdOPCUAClient、TdOPCDAClient等可视化组件快速搭建监控界面。 搞工业上位机开发的兄弟十有八九都跟OPC打过交道。不管你是要对接西门子、施耐德的PLC还是接组态王、KEPServer这类网关只要想把现场数据拿到自己的Delphi程序里最后都会落到一个绕不开的选择上用什么组件去跟OPC服务器通信。我这些年折腾过不少方案最早用OPC Automation接口自己包装一遍代码写起来又啰嗦又难维护后来换成Kassl的dOPC Client Toolkit 5.29 Full Source版本才算是把这块彻底理顺了。今天就把这套控件包的完整使用流程、踩坑记录和工程化经验整理出来给准备在Delphi 12.3里做OPC客户端的朋友做个参考。这套工具包本质上是一组VCL控件封装了OPC DAData Access规范的客户端逻辑。Kassl这家德国公司专门做OPC开发包dOPC Client Toolkit在他们产品线里属于非常成熟的一代产品。网上能找到的dOPC版本数量不少但带Full Source的完整源码版本相对稀缺。有源码和没源码在工控项目里差别非常大现场连不上服务器、读取数据总是不稳定的时候你可以直接把断点下到对应的源码里看看到底是哪个环节出了问题。这种能力在遇到设备厂家甩锅、OPC服务器行为诡异的时候基本上就是救命稻草。文章后面我会重点讲几个实际项目中容易翻车的操作以及我是怎么结合源码把问题定位出来的。1. 项目背景与定位为什么工业上位机开发绕不开OPC1.1 工业现场通信的现实问题先聊个背景。工业现场的自动化设备五花八门PLC品牌有西门子、罗克韦尔、三菱、欧姆龙还有各种DCS、仪表、变频器、智能电表。每家的通信协议基本都不一样有的用Modbus RTU有的用Profinet有的走EtherNet/IP有的走串口自定义协议。如果每接一个设备就写一套驱动上位机软件不仅代码量爆炸后期维护更是灾难一出。OPCOLE for Process Control就是来解决这个问题的。它基于Windows的COM/DCOM技术定义了一套统一的数据访问接口。设备厂商提供一个OPC服务器把底层的各种协议转换成标准的OPC接口上位机软件只需要开发一个OPC客户端就能跟任意支持OPC的设备通信。相当于把一对多的协议适配问题变成了标准接口对接标准接口的问题。OPC规范本身有多个分支OPC DA处理实时数据OPC HDA处理历史数据OPC AE处理报警事件。现在主流的趋势是OPC UA它跨平台、更安全但在存量项目里尤其是Windows环境下的老车间OPC DA依然是绝对主力。dOPC Client Toolkit 5.29主要支持的就是OPC DA 2.0和3.0规范同时对HDA也有一定的支持。1.2 Kassl dOPC Client Toolkit 是什么Kassl的dOPC Client Toolkit简单说就是给Delphi和CBuilder开发者用的一套OPC DA客户端控件。它把OPC规范里的连接管理、组管理、项管理、数据读写、订阅回调这些繁琐的COM接口调用封装成了可视化的VCL组件。你不需要懂COM的细节不需要自己声明一堆看不懂的接口和方法拖几个控件、设几个属性、写几行代码就能实现一个功能完整的OPC客户端。5.29这个版本在功能上已经非常稳定支持OPC DA 2.05和3.0规范包含以下这些核心能力支持同步读取和异步读取两种模式。支持订阅模式订阅模式下服务器主动推送数据变化。支持多项批量读取和写入。支持Good/Bad/Uncertain质量戳判断。支持浏览服务器上的所有点位OPC Item。源码完整开放可以深入修改底层逻辑。Delphi 12.3是目前较新的Delphi版本很多人担心老控件装不上。实际上dOPC这套源码包的基础架构并没有严重依赖老式语法稍微调整一下编译选项在12.3里完全可以跑起来。我下面的安装方法就是基于Delphi 12.3完整操作的照做就行。1.3 谁适合用这套控件如果你属于下面这几类人那这篇文章的内容对你直接有用工控上位机工程师需要快速实现OPC DA客户端连接KEPServer、Matrikon、InTouch等常见服务器。做设备数据采集的Delphi程序员需要在MES、SCADA系统里集成实时数据采集功能或者做设备状态监控程序。对OPC协议细节感兴趣的开发者想通过阅读完整源码彻底搞懂OPC DA的客户端实现原理学习COM接口调用、回调机制、变体类型处理的代码写法。反过来如果你是纯跨平台开发需要跑在Linux或macOS上那OPC DA这套基于COM的技术本身就不适配了应该考虑OPC UA这个后面会有一小节专门聊选型。2. 环境准备与安装指南Delphi 12.3下把这套控件跑起来2.1 Delphi 12.3对老版本控件的兼容性真相先说说Delphi 12.3。这个版本属于RAD Studio 12系列的一个更新版本编译器是Win64和Win32都有IDE界面大体延续了12.x的风格。老控件装不装得上主要取决于几个因素源码里有没有用已经废弃的语法比如老式Object Pascal的某些写法有没有依赖过时的第三方单元以及包文件.dpk能不能正常编译。我拿到dOPC 5.29的源码包后先在虚拟机上试了一遍。第一次编译确实报了错但报的不是语法错误而是找不到某个单元。原因是源码里默认引用了VCL的一些工具单元而Delphi 12.3的默认单元作用域里没有把这些路径加进来。解决办法很简单在Library Path里把源码目录和Source目录都加上。这个问题在Delphi老版本里其实也存在只不过12.3的默认路径清理更干净暴露得更明显。还有一点要注意Delphi 12.3自带了若干包把第三方目录隔离得比较严格如果你之前装过旧版本的dOPC或者其他OPC控件最好先在IDE里卸载干净再装新的否则经常出现Unit xxx was compiled with a different version of yyy这种经典报错。这个报错一出现基本上就是包版本冲突跟控件本身没关系。2.2 安装流程与源码编译顺序整个安装过程我总结成下面这几步照着做就行解压源码包。拿到dOPC Client Toolkit 5.29 Full Source.7z之后先解压到一个干净的目录比如D:\Components\dOPC\。注意路径里最好不要有空格和中文Delphi的编译器和路径里的中文偶尔会闹情绪。检查目录结构。解压后通常包含Source源码、Packages运行时包和设计时包、Demos示例工程、Docs帮助文档这几个子目录。先打开Packages目录看看里面有哪些.dpk文件确认包的顺序。dOPC这类控件一般分两步先编译运行时包Runtime Package再编译设计时包Design Package设计时包是给IDE工具栏显示组件用的。添加Library Path。在Delphi IDE里打开Tools Options Language Delphi Library在Library path里添加源码目录。不要只加根目录要把Source子目录也加上。这一步非常关键不加的话编译包的时候一报找不到xxx.dcu基本都是路径没配好。我习惯把Source子目录、Source\Common之类的子目录全部加进去宁可加多也不要漏。编译运行时包。在项目管理器里打开dOPCRuntime.dpk具体名字以实际包为准选择Release配置然后编译。编译成功后会生成.bpl文件放在系统能识别的路径下或者Delphi的BPL输出目录里。安装设计时包。再打开dOPCDesign.dpk这种设计时包在项目管理器里右键选择InstallDelphi会把它安装到IDE的组件面板中。安装成功后组件面板上会出现dOPC相关的选项卡里面就是可以拖拽的那几个控件。编译Demos验证。打开一个示例工程试着编译运行一下。如果Demo能正常运行说明整个安装没问题。注意安装时如果遇到Cannot load package xxx或者Class not found这类问题不要急着找源码的事先检查是不是运行时包没装好、或者BPL输出目录没加到系统Path里。Windows下BPL默认是在SysWow64或者IDE的Bin目录里但有时候你改了输出路径就会导致包找不到。2.3 核心组件快速认识dOPC控件包里的组件数量不算多但每一个都有明确的职责。安装好之后在组件面板上你会看到类似dOPC Client的选项卡常用的核心组件有这几个TGDOPCClient核心连接组件负责管理OPC服务器的连接、组和项。绝大部分操作都从这个组件发起。TGDOPCGroup组组件用于把同一刷新频率的点位放在同一个组里管理。如果你手里有一批点位需要按不同的周期读取用多个组会更灵活。TGDOpcItem表示单个OPC Item点位承载Item名称、数据类型、初始值、质量戳这些信息。TGDOPCSubscription订阅组件封装了异步订阅模式的回调逻辑做实时变化推送用。TGDOPCDataSet/TGDOPCClientDataset历史数据相关的数据集组件把OPC HDA数据封装成类似数据库数据集的形式方便和DB组件联动。初次接触的人最容易混淆的是TGDOPCClient和TGDOPCGroup。打个比方TGDOPCClient相当于一个工厂的门禁系统负责登记进出的人和车辆TGDOPCGroup相当于你给不同车间划的片区每个片区有自己的管理规则和巡检频率。所以连接其实是由Client发起的而读写操作都是落在Group和Item层面的。3. 项目实战从零实现一个OPC DA客户端3.1 连接服务器Connect之前要准备什么无论用哪个OPC控件连接服务器都是第一步。dOPC里连接之前你需要先设置两个关键属性ComputerName和ServerName。ComputerNameOPC服务器所在的机器名或IP地址。如果服务器就在本机也可以设为localhost。ServerNameOPC服务器的ProgID。比如KEPServer的ProgID是KEPware.KEPServerEx.V6Matrikon OPC仿真服务器是Matrikon.OPC.Simulation.1。设置好这两个属性调用Connect方法即可// 连接OPC服务器 GDOPCClient1.ComputerName : 192.168.0.10; GDOPCClient1.ServerName : KEPware.KEPServerEx.V6; try GDOPCClient1.Connect; if GDOPCClient1.Connected then Memo1.Lines.Add(连接成功) else Memo1.Lines.Add(连接失败); except on E: Exception do Memo1.Lines.Add(连接异常: E.Message); end;实操经验连接失败的原因往往比功能代码本身更值得排查。常见的有三种服务器没启动、DCOM权限不对、服务器名ProgID拼写有误。前两个问题后面会单独展开细聊第三个问题尤其容易在从文档里复制服务器名时出错我遇到过好几次ProgID里的大小写和下划线跟实际不符的情况导致连接一直不成功。所以真正写代码之前最好先在客户端机器上用OPC自带的客户端工具比如Matrikon OPC Explorer试一下能不能连上服务器先排除服务器侧的配置问题。另外要说一句连接是耗时操作尤其是走DCOM访问远程服务器时经常要卡几秒钟。如果程序在主线程里执行Connect界面会短暂假死。项目里建议把连接过程放到后台线程里执行连接成功后再通过消息或Synchronize回调到主线程更新界面状态。这里还有一个容易被忽略的点OPC服务器连接是有会话概念的网络闪断、服务器重启都会导致连接断开所以重连机制是必须的。dOPC里通常要配合OnDisconnect事件做自动重连的逻辑而不是只关心首次连接。3.2 读取实时数据的两种方式同步读取与异步订阅读数据是OPC客户端的基本功dOPC提供了两种读取方式选择依据是应用场景。同步读取适用于读取频率要求不高、点位不多的情况。它的逻辑是发个请求过去等服务器返回结果。var Value: Variant; Quality: TGDOPCQuality; Timestamp: TDateTime; begin // 同步读取一个点位 GDOPCClient1.ReadItem(Channel1.Device1.Tag1, Value, Quality, Timestamp); if Quality gdopcQualGood then Memo1.Lines.Add(读取值: VarToStr(Value)) else Memo1.Lines.Add(数据质量异常, 质量码 IntToStr(Quality)); end;这段代码里有个关键点Quality gdopcQualGood。OPC数据的质量戳不是随便传着好看的它表示这个数值是否可信。点位质量一般分为Good192、Uncertain64、Bad0等几个等级如果质量不是Good数值直接拿去用很容易出事。我在现场遇到过传感器信号漂移的情况读取到的数值本身看起来正常但质量戳已经变成了Uncertain或Bad如果代码里没做质量判断下游控制逻辑就拿着错误的数值去做判断了这是很危险的。所以只要是读取数据质量判断不能省。异步订阅才是工业监控界面常用的大杀器。它的逻辑是客户端告诉服务器我对这几个点位感兴趣数据有变化就主动告诉我服务器一旦发现点位值变化就回调客户端的事件方法。这样客户端不需要轮询极大降低了网络和CPU开销。dOPC里的异步订阅是通过AddItem OnDataChange事件实现的。示例代码如下procedure TForm1.FormCreate(Sender: TObject); begin GDOPCClient1.Connected : True; // 添加感兴趣的项 GDOPCClient1.AddItem(Channel1.Device1.Tag1); GDOPCClient1.AddItem(Channel1.Device1.Tag2); end; // 异步回调数据变化时触发 procedure TForm1.GDOPCClient1DataChange(Sender: TObject; ItemName: string; Value: Variant; Quality: TGDOPCQuality; Timestamp: TDateTime); begin if Quality gdopcQualGood then begin // 回调在主线程还是工作线程取决于控件的线程模型 // 这里要注意UI更新的线程安全问题 TThread.Synchronize(nil, procedure begin Edit1.Text : VarToStr(Value); end); end; end;实操心得异步回调的模式下有一种非常隐蔽的问题回调并不一定发生在主线程。不同OPC服务器、不同DCOM配置下回调线程的上下文可能不一样。如果在回调里直接操作VCL控件偶尔会报Canvas does not allow drawing或者直接崩掉。最稳妥的做法是回调里只做数据缓存通过TThread.Synchronize或发Windows消息的方式更新界面避免在未知线程里直接碰UI。我早年没有注意这一点写了一个数据采集程序跑了一整天后随机崩溃查了好久才发现是回调线程直接刷新了界面。3.3 写操作下发控制指令读写对称是OPC的基本能力。dOPC里写操作同样是针对Item的指定点位名和值直接写var Value: Variant; ErrorCode: Integer; begin Value : 1; // 写入的值类型必须与服务器端点位类型匹配 ErrorCode : GDOPCClient1.WriteItem(Channel1.Device1.StartButton, Value); if ErrorCode 0 then Memo1.Lines.Add(写入成功) else Memo1.Lines.Add(写入失败, 错误码 IntToStr(ErrorCode)); end;写操作有几个容易踩的坑这里提醒一下数据类型匹配。OPC服务器上的点位是BOOL还是INT还是REAL决定了你要赋什么样类型的Variant。如果把一个字符串值写在数字点位服务器会直接拒绝错误码通常是一个COM HRESULT值不是0。所以写代码前先确认点位类型或者用服务器浏览功能查类型。写操作的时机。很多设备不允许在运行状态下随意写入控制字尤其是PLC的启停信号。上位机软件在发写入指令前一定要在界面上做二次确认同时在逻辑里做安全互锁。这块是设备安全事故的高发区写出去了就收不回来责任全是你的。写入结果不绝对等于设备执行结果。WriteItem返回0只代表服务器接受了写入请求并不代表设备真的执行了这个指令。真正确认写入成功需要再读一次点位或者依赖设备内部的状态反馈机制。3.4 断开连接与资源释放的细节很多人写OPC代码连接、读写都很顺利却忘记了断开和释放。实际上这个环节出问题后果比你想的严重——程序退出时如果不断开与OPC服务器的会话服务器端会积累大量死连接时间一长服务器性能下降甚至拒绝新客户端接入。在dOPC里断开连接很简单if GDOPCClient1.Connected then GDOPCClient1.Disconnect;但光调用Disconnect还不够。如果你的程序用了多个Group、多个Subscription建议先把订阅停掉再释放Group最后才断开Client连接。顺序反了偶尔会触发访问冲突或者回调里操作已释放对象的错误。还有一个细节OPC连接是基于COM的COM的引用计数管理是否严格直接影响客户端程序的稳定性。dOPC作为封装控件已经处理了大部分逻辑但如果你用源码包自己改了版本特别注意不要在事件回调里释放容器对象否则COM引用计数错乱程序会在某个不可预知的地方崩溃而且复现还特别难。4. 常见问题与排查技巧实录4.1 DCOM配置本地能连远程不行的元凶这是OPC DA开发里最经典的老大难问题。本地调试一切正常程序部署到另一台机器之后连接远程OPC服务器总是报拒绝访问错误码0x80070005或者类未注册。99%的情况是DCOM权限配置的问题不是代码的问题。OPC DA基于DCOM远程调用本质上跨机器权限控制需要给OPC服务器和客户端配置DCOM权限。标准的配置步骤是在服务器机器上运行dcomcnfg打开组件服务。找到计算机下的我的电脑进入属性的COM安全选项卡。在访问权限里给Everyone或指定用户赋予本地访问和远程访问权限。在启动和激活权限里同样加对应权限。找到OPC服务器组件的具体项比如KEPServer对应组件在属性的标识选项卡里把身份设置为指定用户并输入一个有权限的Windows账号密码。还有一个和权限并列的坑Windows防火墙。OPC DA的DCOM通信默认使用动态端口防火墙一旦拦截远程调用直接超时。要么在防火墙里给OPC服务器程序进程和dcomcnfg.exe加白名单要么用静态端口配置固定OPC通信端口范围。现场实施时我一般建议把OPC服务器机器和客户端机器加入同一个域或者工作组并统一防火墙策略否则每装一台新机器都要调一遍权限相当消耗时间。注意DCOM配置涉及的是Windows系统级安全设置在客户现场操作前最好先跟IT或系统管理员确认不要自作主张改动生产服务器的安全配置避免引发安全审查问题。4.2 异步回调不触发的经典原因很多人在使用异步订阅时遇到过这种诡异情况点位值明明在变程序里OnDataChange事件却一次都不触发。排查思路大概是下面几个方向检查是否调用了AddItem。没有添加感兴趣的项回调自然无数据可推。新手最容易在这里漏步骤。检查Quality是否等于Bad。回调事件是数据变化通知但如果点位质量已经是Bad并保持Bad服务器可能不再推送变化因为状态没变化。这不是bug而是OPC DA的语义逻辑。检查Group的UpdateRate设置。异步订阅默认有更新周期。如果周期设置得特别长比如几万毫秒那你看起来就像不触发。现场调试时先把这个周期设小一点比如100~250ms。检查回调线程是否阻塞。如果回调里执行了耗时的数据库操作、网络请求一来会拖慢后续回调二来可能导致并发回调堆积最后程序卡死。记得回调里只做最轻量级的逻辑。还有一个比较隐蔽的现象从服务器端看数据变化是变化超过死区才会推送。很多OPC服务器在Group或者Item级别有死区设置默认值可能是0也可能是1%。如果这个值设大了比如10%那点位从10变成10.5就不会推送看起来就像回调失灵。开发阶段自己搭测试环境时可以在服务器端把死区调成0排除这个干扰因素。4.3 32位与64位环境下的位数匹配问题Delphi 12.3默认既能编译32位程序也能编译64位程序。但OPC DA服务器这边情况就没那么统一了。很多老的OPC服务器只提供32位版本比如某些老款设备自带的OPC服务或者厂家的老驱动。你的上位机程序如果编译成了64位去连一个32位的OPC服务器很可能会报类未注册或没有可用的OPC服务器。解决思路有两种最省事的办法把上位机程序编译成32位版本因为32位进程可以连32位OPC服务器也可以连部分64位服务器视服务器实现而定。如果你必须用64位程序那就得给OPC服务器找一个64位的代理或桥接工具。市面上有专门的OPC DA到OPC UA的网关软件把老设备的OPC DA接口转换成OPC UA接口然后客户端走OPC UA这样就能绕开位数限制。这种方式我实际项目里用过稳定性还可以但会多一层硬件或软件的中间节点排查链路会更复杂。还有一点要注意Windows系统有SysWOW64目录机制很多OPC服务器的COM组件注册位置在32位注册表视图里。用Delphi写程序时连接这种服务器不能设置错了位数否则看起来组件已经注册但程序一直找不到。最简单的检验方法是用系统自带的regedit分别查看32位和64位注册表视图检查CLSID是否都被正确注册。4.4 利用完整源码进行问题定位的实战经验既然文章标题里带着Full Source那这块就多说一点。dOPC的源码开放最大的价值不是让你去改开源这是一款商业授权控件源码商用注意授权条款而是让你在调试时能够像调试自己的代码一样看到控件内部每一步做了什么。举个例子有一次我在客户现场遇到一个奇怪的现象客户端读取某个点位一直超时但用第三方OPC客户端工具读同一个点位却是正常的。这时我把断点下到dOPC源码的ReadItem内部执行路径一路单步跟踪发现它内部在一次读取操作中竟然创建了某个COM对象但忘记释放导致下一次读取时COM对象被复用、引用了已释放的接口。找到根因后我在自己代码里给那个点位单独建立一个独立的Group就绕开了这个问题。这种排查方法没有源码的控件根本做不到。你只能对着黑盒猜或者花大量时间反查调用链。所以我每次在自己的团队里培训新人时都强调拿到带源码的控件不要只把它当黑盒用遇到疑难杂症果断打开源码Debug这比加一堆日志高效得多。5. 实操心得与选型建议5.1 dOPC Client Toolkit 和 OPC UA 怎么选随着OPC UA的普及很多人在新项目里会纠结是继续用OPC DA那套老技术还是直接上OPC UA。我个人建议按下面的维度来评估因素使用dOPC Client ToolkitOPC DA使用OPC UA存量设备兼容好老设备老驱动基本都支持DA要确认老设备是否支持UA很多老设备需要网关转换跨平台需求不支持DA依赖COM/DCOMWindows原生跨平台Linux/嵌入式也能用部署复杂度在Windows下也要配置DCOM权限网络穿透和权限模型都更现代部署相对简单技术栈熟悉度用Delphi做Win32/Win64客户端非常顺需要UaExpert等调试工具学习曲线稍陡新项目推荐度如果Windows上位机且设备层全是DA服务器依然可用新项目、新建系统强烈建议直接上UA说到底OPC DA技术在存量市场里还有大量应用短期内不会消失。如果项目受限于现场设备只能对接OPC DA服务器那么dOPC这套工具包的价值就实实在在摆在这里。如果是从零开始做一个全新工厂的数据平台我建议优先评估OPC UA方案毕竟它不依赖DCOM安全性和跨平台能力都要好很多。5.2 把OPC通信封装成独立数据访问层在我做过的上位机项目里有一个习惯坚持了很久不把OPC控件的调用直接散落在窗体代码里而是单独封装一个数据访问层Data Access Layer。所有连接管理、读写、订阅、日志记录都收敛在几个单元里窗体只跟这个数据访问层打交道。这样做的好处非常直接换控件时不用改界面代码。我在一个老项目里就完整经历过从OPC Automation换到dOPC的过程因为界面层完全不知道底层用的是什么控件切换大概只花了大半天时间如果把控件引用直接散落在各个窗体那这次切换可能得按周计算。业务逻辑和通信细节解耦。界面只关心数据值不用关心连接状态、重连策略、数据质量判断等等。日志和监控更容易统一做。所有读写动作都经过同一个入口统一记录操作日志出问题的时候可以回溯整个时间线。5.3 稳定运行的优化建议最后再分享几条让OPC通信程序长期稳定运行的经验合理设置异步订阅的UpdateRate和死区。参数不是越小越好。更新周期太短、死区设成0在大数据量场景下服务器和客户端都会被消息风暴淹没程序最后卡成一团。一般建议现场根据点位数量和数据实时性要求把更新周期设在100~500ms之间死区设在0.5%~1%之间再观察实际效果逐步调整。建立超时和重试机制。OPC底层是COM/DCOM网络抖动、服务器繁忙都会导致单次读写超时。如果没有超时机制程序会在一个失败调用上卡很久。建议把OPC读写放到后台线程并给每个操作包一层超时控制超时后记录日志并触发重连流程。定时检查连接状态。可以在程序里起一个定时器每隔10~30秒调用一下GetServerState或者执行一个轻量的读操作。如果连续几次失败就自动执行断开重连。这样即使服务器夜间重启过第二天操作工来上班时程序也能自动恢复不需要人工干预。做好运行日志。现场不听话的程序最终都要靠日志来定位。我在代码里会给每个重要操作连接、断开、读写失败、重连成功都打上时间戳日志日志文件按天滚动保留30天。这套机制帮我排掉过很多偶发问题。个人经验上我用dOPC这套控件完成过十几个工厂车间的数据采集项目有连续跑了几年没重启过的采集程序也踩过DCOM权限、64位位数、回调线程各种深坑。现在回想起来当初选Full Source版本绝对是一个正确的决定——很多在普通控件下不可能定位的问题因为有了源码最终都能在底层调用链里找到答案。如果你正在评估Delphi环境下的OPC客户端方案这套控件和今天记录的这些实践应该能帮你少走不少弯路。代码已经写好、断点已经准备好剩下的就靠你在现场慢慢打磨了。本文还有配套的精品资源点击获取
返回列表