用 Lazarus 开发 OPC Client 1 (关于字符集)

其实很早就打算在Lazarus里面做一个,要么在实际应用中时间太紧需要使用OPC了就用Delphi的程序改改,也就用了。

到了FPC3.0之后也就lazarus1.6以后,其核心对UTF8的全面支持,导致Delphi的很多程序都不能直接转移到Lazarus里面。明知山有虎偏向虎山行,OPC里面会大量用到PWideChar和OleVariant这是难点,本身技术上倒不是,但与Lazarus的融合就存在很多不不确定性。

OPC客户端的构建流程很简单

  1. 建立ActiveX服务器的引用
  2. 通过服务器接口的“组管理器”——构建组
  3. 通过组的条“目管理器”在该组添加“条目”,也就是工业领域说的“标签”——Tag
  4. 现在可以Read/Write读写标签了
  5. 如果希望效率,OPC提供的托管方式,也就是常常翻译为“订阅”的方法。以组为单位构建“订阅”。
  6. 如果成功将实现 OnChange 、AsyncRead、AsyncWrite (异步读写)。

期间每一步都要注意资源的释放!而且每一步又都要与字符串打交道,注意COM内部大量使用WideString,但微软的大师在设计自然是会大量用到指针的,所以PWideChar与FPC的String的交互就成了主要任务。关键问题字符串,不彻底解决就算构建成功也不能正常显示,更何况由于Lazarus的内部转换,基本就是构建不成功。

RTL,LCL默认都是UTF8这是有优势的,但很难驾驭,这也导致很多lazarus1.2x之前的很多解决方案失效,比如SysToUTF8和UTF8ToSys,跟踪发现

function UTF8ToSys(const s: string): string;
begin
  {$IFDEF UTF8_RTL}
  Result:=s;
  {$ELSE}
  if NeedRTLAnsi and (not IsASCII(s)) then
    Result:=UTF8ToAnsi(s)
  else
    Result:=s;
  {$ENDIF}
end;
注意这里面的条件编译{$IFDEF UTF8_RTL} 

导致这些过程\函数\方法有时候“生效”有时候“无效”主要是条件编译{$IFDEF UTF8_RTL}的作用,其实上次发的博文提到的FPC 3.0 增加-dDisableUTF8RTL项目编译选项,使参数保存在本项目里面。当配置完毕以上语句就可以执行到{$ELSE} 部分了。

整个现象这个让我懊恼了好久好久,总是不能明确结果,导致Lazarus程序字符串输出不能达到预期的效果,用了好多方法,甚至怀疑是否真的该放弃当时自己写的UTF8转换单元,使用系统自带功能的判断。幸好手头有两个项目一个有这个参数一个没有,结果导致截然不同的效果,当然有一个能准确实现设计意图否则也就不会去分析了——庆幸。最后还是看了[Lazarus] UTF8 RTL for Windows才想起。

方向明确了之后,要解决问题自然就是找出具体的办法处理字符串。

我们对待POleChar通常的解决办法是 PWchar(WideString(XXXstring));在Lazarus里面小工程例子项目没有问题,大了,也就是资源使用比较多也许到用的时候早就释放了。就必须用到StringToOleStr(XXXstring)了。

整合后得到如下过程函数

function UTF8StrToOleStr(const Source: UTF8String): PWideChar;
var
  vS: string;
begin
  vS     := UTF8ToSys(Source);
  // Result := POleStr(WideString(vS));
  Result := StringToOleStr(vS);
  if Result = nil then
    Result := ‘‘;
end;

function OleStrToUTF8Str(const Source: PWideChar): UTF8String;
var
  vS: string;
begin
  if Source = nil then
    Result := ‘‘
  else
    WideCharToStrVar(Source, vS);
  Result := SysToUTF8(vS);
end;

现在记性太不好了,做个记录。

时间: 2024-08-02 19:09:11

用 Lazarus 开发 OPC Client 1 (关于字符集)的相关文章

用 Lazarus 开发 OPC Client 2 (关于Lazarus 编译器)

Lazarus 其实现在是一个很好的编辑环境了,代码提示和格式化功能都可以较好的工作.甚至可以认为在编辑编辑上部分功能优于DELPHI,但毕竟小众不太完备. Lazarus开发DLL同Delphi一样方便,但在编译过程中可能会出现Delphi中从来不可能遇见的问题,报"XXXXXX.pas(22,1) Error: Undefined symbol: WSRegisterXXXXXX"之类的信息,如下图: 解决的办法就是在程序(库文件)声明引用的地方加入"Interfaces

用 Lazarus 开发 OPC Client 3 (关于接口/Interface)

Delphi/Lazarus 里面有个概念就是接口,这个概念在很多语言里面也都存在,而且发扬,dot Net 就是这样. 提到接口自然而然就想到COM.DCOM.OLE.ActiveX等相关知识,不错,确实可以应用于这些环境,而且Delphi/Lazarus中的Interface功能强大到不仅实现微软基于COM的技术,在Linux或其他系统下Interface的设计理念和方法一样可用.这里我们仅仅记录一下在Windows下的心得. Delphi/Lazarus下面向对象设计中多态.继承.封装利用

《连载 | 物联网框架ServerSuperIO教程》- 18.集成OPC Client,及使用步骤。附:3.5 发布与更新说明。

1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架ServerSuperIO教程>2.服务实例的配置参数说明 <连载 | 物联网框架ServerSuperIO教程>- 3.设备驱动介绍 <连载 | 物联网框架ServerSuperIO教程>-4.如开发一套设备驱动,同时支持串口和网络通讯. <连载 | 物联网框架ServerSupe

《物联网框架ServerSuperIO教程》-19.设备驱动和OPC Client支持mysql、oracle、sqlite、sqlserver的持久化。v3.6.4版本发布

19.设备驱动和OPC Client支持mysql.oracle.sqlite.sqlserver的持久化 19.1     概述 ServerSuperIO支持设备驱动和OPC Client采集的数据信息按标签集合写入mysql.oracle.sqlserver和sqlite数据库.现在还支持写入实时数据库,例如:edna.golden和corert等.同时支持实时数据库和关系数据库主要考虑项目环境和支撑的能力. 本质上还是统一继承IDataPersistence接口,然后扩展完成的操作.如果

关于OPC Client 编写2

最近在搞到一个OPC动态库OPCAutomation.dll,该动态库在http://www.kepware.com/可下载,下面介绍如何用C#进行OPC Client开发. 1.新建C#应用程序,命名为OPC Client,将OPCAutomation.dll引用,如图. using OPCAutomation; 2. 定义OPC的三个接口类OPCServer类.OPCGroup类和OPCItem类: OPCServer KepServer; OPCGroups KepGroups; OPCG

C#开发OPC客户端

第一个随笔,使用了OPEN Live Write,作为客户端.最近使用c#开发一个小软件,主要功能是OPC客户端.以后会开发各类别的协议,作为,协议的转发栈. 因为我本人是搞自动化的,所以搞自动化小伙伴像我这样喜欢编程的可能有,但是一般是逻辑思维强,但是底子相对还是弱的. 1,C# 开发OPC的准备工作 软件:VS2019; DLL:C:\Program Files (x86)\Common Files\MatrikonOPC\Common\OPCDAAuto.dll 并且将其拷贝到C:\Win

OPC Server开发的几大境界

OPC server的开发相对OPC client 更加困难,OPC server 的开发主要应用COM技术,主要应用书籍为潘爱民写的<COM入门和应用>,大量的技术有很大的可重用性,在开发完一个程序后,基本上所有的东东都可以被重用,并且重新发布. 开发方式有三种: 1.简单的:就是应用已经有的如DDE to OPC 或串口 to OPC,modbus to  OPC等软件把您的设备变成相关的OPC服务器.方法简单实用,费用合理快速,让你马上搭上OPC的快车.主要缺陷:你的设备必需是标准设备或

用C#开发基于自动化接口的OPC客户端

OPC全称是Object Linking and Embedding(OLE) for Process Control,它的出现为基于Windows的应用程序和现场过程控制应用建立了桥梁.OPC作为一整套接口.属性和方法的协议标准集,与具体的开发语言没有关系. 1.OPC客户端接口方式 开发OPC客户端程序,其访问接口方式有多种,根据官方提供的资料大约有如下几种方式: 使用OPCNetAPI,需要用到OPCNetAPI.dll,OPCNetAPI.Com.dll 使用自动化接口,需要用到OPCD

[发布]SuperIO v2.2.5 集成OPC服务端和OPC客户端

SuperIO 下载:本站下载 百度网盘 1.修复串口号大于等于10的时候导致IO未知状态. 2.优化RunIODevice(io)函数内部处理流程,二次开发可以重载这个接口. 3.优化IO接收数据,提高运行效率. 4.优化OPC服务器端操作类库. 5.在Demo增加OPC服务端和OPC客户端事例源代码. [SuperIO教程]10.集成OPC Server和OPC Client插件服务 介绍 OPC服务端 OPC客户端 作者QQ:504547114 交流QQ群:54256083 官方网址:ht