您现在所在的是:

电工技术

回帖:2个,阅读:1184 [上一页] [1] [下一页]
1229
wjun7610
文章数:138
年度积分:50
历史总积分:1229
注册时间:2004/6/19
发站内信
发表于:2007/9/21 20:03:00
#0楼

四、Delphi、VB、VC语言环境的开发使用说明

1、Delphi语言环境开发说明

在Delphi环境下将omron.dll、omron.slip(许可文件)复制到应用程序目录下(即将上述文件与编译后的可执行文件方入同一文件夹内);

在工程文件的主程序窗体(pas)文件中声明:

Function ComOpen(nport,BaudRate,DataBits,Parity,StopBits:longint;User:Pchar):longint;stdcall;External''''''''''''''''omron.dll'''''''''''''''';
Function ComClose(nport:longint):longint;stdcall;External''''''''''''''''omron.dll'''''''''''''''';
Function ComWR(nport,node,address,Count:longint;Order:pchar):Pchar;stdcall; External''''''''''''''''omron.dll'''''''''''''''';
Function ComWW(nport,node,address:longint;Sendstr,Order:pchar):Longint;stdcall;External''''''''''''''''omron.dll'''''''''''''''';
Function ComMM(nport,node:Longint):Pchar;stdcall;External''''''''''''''''omron.dll'''''''''''''''';
Function ComMS(nport,node:Longint):Longint;stdcall;External''''''''''''''''omron.dll'''''''''''''''';
Function ComSC(nport,node,State:longint):Longint;stdcall;External''''''''''''''''omron.dll'''''''''''''''';
Function ComTS(nport,node:longint):Longint;stdcall;External''''''''''''''''omron.dll'''''''''''''''';
Function ComFBitset(nport,node,address,Bit:longint;Order:pchar):Longint;stdcall;External''''''''''''''''omron.dll'''''''''''''''';
Function ComFBitreset(nport,node,address,Bit:longint;Order:pchar):Longint;stdcall;External''''''''''''''''omron.dll'''''''''''''''';
Function ComFRSset(nport,node,address:longint;Sendstr,Order:pchar):Longint;stdcall;External''''''''''''''''omron.dll'''''''''''''''';
Function ComFCancel(nport,node:longint):Longint;stdcall;External''''''''''''''''omron.dll'''''''''''''''';
Function ComSet(nport,node,address,Bit:longint;Order:pchar):Longint;stdcall;External''''''''''''''''omron.dll'''''''''''''''';
Function ComReset(nport,node,address,Bit:longint;Order:pchar):Longint;stdcall;External''''''''''''''''omron.dll'''''''''''''''';
Function ComTrue(nport:longint):longint;stdcall;External''''''''''''''''omron.dll'''''''''''''''';
Function CinBin(CHex:Pchar;Start:longint):longint;stdcall; External''''''''''''''''omron.dll'''''''''''''''';

其它附加函数Delphi有实用函数,建议用Delphi自带函数,如需使用声明参上例;

声明后可以在程序中使用这些函数,附加函数置中除ComTrue、CinBin外Delphi系统自带有类似功能函数。通信时必须先使用ComOpen函数打开串口,在串口打开后可以有效操作相关函数,为确保通信可在程序运行开始时打开串口,程序关闭前关闭串口。应用程序关闭之前请务必将关闭所有串口,如串口未关闭前关闭系统将抛出异常。确保应用程序在关闭释放前关闭打开的串口。解决方法,在form的OnDestroy事件中加入如下语句:
if ComTrue(1)=1 then ComClose(1);
在Delphi中给中给DLL中的函数传pchar值问题,参考下例:
procedure TForm_omron.ButtonDsendClick(Sender: TObject);
Var
 i,k,l:longint;
 sendText,Order:pchar;
 sendstr,Orderstr:string;
begin
 i:=strtoint(Rightstr(Comboxcom.Text,1));
 if (SendEdit.Enabled) and (comTrue(i)=1) then
 begin
   k:=strtoint(DaddressW.Text);
   case ComDwrite.ItemIndex of
     0: Orderstr:=''''''''''''''''WR'''''''''''''''';
     1: Orderstr:=''''''''''''''''WL'''''''''''''''';
     2: Orderstr:=''''''''''''''''WH'''''''''''''''';
     3: Orderstr:=''''''''''''''''WJ'''''''''''''''';
     4: Orderstr:=''''''''''''''''WD'''''''''''''''';
   end;
   l:=length(SendEdit.Text) div 4;
   l:=l*4;
   sendstr:=leftstr(SendEdit.Text,l);        //以字为单位多余省略,4个字符串为一个字
   try
     sendText:=strAlloc(200);
     sendText:=strPCopy(sendText,sendstr);
     Order:=strAlloc(4);
     Order:=strPCopy(Order,Orderstr);
     if ComWW(i,0,k,SendText,Order)=1 then  SendEdit.Enabled:=False;   //写各区值
   finally
     StrDispose(sendText);
     StrDispose(Order);
   end;
 end;
end;
建议采用strPCopy():string型转换到Pchar型,straps():Pchar型转换到string型,不推荐使用直接转换法。

上述可以详细参照DEMO程序。

2、VB语言环境开发说明

在VB环境下将omron.dll、omron.slip(许可文件)复制到应用程序目录下(即将上述文件与编译后的可执行文件方入同一文件夹内);

在工程文件中声明:

Private Declare Function ComOpen Lib "omron.dll" (ByVal nport As Long, ByVal BaudRate As Long,ByVal DataBits As Long,ByVal Parity As Long,ByVal StopBits As Long,ByVal User As String) As Long
Private Declare Function ComClose Lib "omron.dll" (ByVal nport As Long) As Long
Private Declare Function ComWR Lib "omron.dll" (ByVal nport As Long, ByVal node As Long,ByVal address As Long, ByVal Count As Long, ByVal Order As String) As String
Private Declare Function ComWW Lib "omron.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Sendstr As String, ByVal Order As String) As Long
Private Declare Function ComMM Lib "omron.dll" (ByVal nport As Long, ByVal node As Long) As String
Private Declare Function ComMS Lib "omron.dll" (ByVal nport As Long, ByVal node As Long) As Long
Private Declare Function ComSC Lib "omron.dll" (ByVal nport As Long, ByVal node As Long, ByVal State As Long) As Long
Private Declare Function ComTS Lib "omron.dll" (ByVal nport As Long, ByVal node As Long) As Long
Private Declare Function ComFBitset Lib "omron.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Bit as Long, ByVal Order As String) As Long
Private Declare Function ComFBitreset Lib "omron.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Bit as Long, ByVal Order As String) As Long
Private Declare Function ComFRSset Lib "omron.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Sendstr As String, ByVal Order As String) As Long
Private Declare Function ComFCancel Lib "omron.dll" (ByVal nport As Long, ByVal node As Long) As Long
Private Declare Function ComSet Lib "omron.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Bit as Long, ByVal Order As String) As Long
Private Declare Function ComReset Lib "omron.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Bit as Long, ByVal Order As String) As Long
Private Declare Function ComTrue Lib "omron.dll" (ByVal nport As Long) As Long
Private Declare Function CinBin Lib "omron.dll" (ByVal Chex As String, ByVal Start As Long) As Long

其它附加函数VB有实用函数,建议用VB自带函数,如需使用声明参上例;
做完上述声明后,便可以在程序中使用相关函数了。本DLL是串口通信库,通信时必须先使用ComOpen函数打开串口,在串口打开后可以有效操作相关函数,为保证通信可以在程序运行开始时打开串口,程序关闭前关闭串口。在应用程序关闭之前请务必将关闭所有串口,如您的程序串口未关闭前被关闭系统将抛出异常。当出现这样的异常请更改您的程序,确保应用程序在关闭释放前关闭打开的串口。
解决方法,在form的Unload事件中加入如下例:
If ComTrue(1)=1 then
 ComClose(1)
End if
为确保Unload事件有效执行程序中应使用“End”语句,而尽量使用“Unload”语句释放所有窗体,因使用“End”语句系统不会执行正常的窗体释放等事件而直接退出程序,如程序中有form1,form2两个窗体,则使用下面语句:
Unload  form1
Unload  form2
VB会在所有窗体关闭后释放所有占用资源。
上述可以详细参照DEMO程序。

3、VC语言环境开发说明
在VC环境下将omron.dll、omron.slip(许可文件)复制到应用程序目录下(即将上述文件与编译后的可执行文件方入同一文件夹内);

在工程主文件cpp中声明一个句柄:
HINSTANCE m_handle;
用来标识导入的动态链接库。

1)、导入动态链接库,如例所示:

  m_handle =:: LoadLibrary("omron.dll");

2)、按下例说明声明相关各个函数:

typedef long (CALLBACK* pOpen)(long nport, long BaudRate, long DataBits, long Parity, long StopBits, char* User);
typedef long (CALLBACK* pClose)(long nport);
typedef char* (CALLBACK* pWR)(long nport,long node, long address, long Count, char* Order);
typedef long (CALLBACK* pWW)(long nport,long node, long address, char* Sendstr, char* Order);
typedef char* (CALLBACK* pMM)(long nport,long node);
typedef long (CALLBACK* pMS)(long nport,long node);
typedef long (CALLBACK* pSC)(long nport,long node, long State);
typedef long (CALLBACK* pTS)(long nport,long node);
typedef long (CALLBACK* pFset)(long nport,long node, long address, long Bit, char* Order);
typedef long (CALLBACK* pFReset)(long nport,long node, long address, long Bit, char* Order);
typedef long (CALLBACK* pFRSset)(long nport,long node, long address, char* Sendstr, char* Order);
typedef long (CALLBACK* pFCancel)(long nport,long node);
typedef long (CALLBACK* pset)(long nport,long node, long address, long Bit, char* Order);
typedef long (CALLBACK* pReset)(long nport,long node, long address, long Bit, char* Order);
typedef long (CALLBACK* pTrue)(long nport);
typedef long (CALLBACK* pBin)( char* Chex, long Start);
typedef char* (CALLBACK* pIntHex)(long Cint,long Digits);
typedef long (CALLBACK* pHexInt)( char* CHex);
typedef char* (CALLBACK* pLeft)( char* Text, long Count);
typedef char* (CALLBACK* pRight)( char* Text, long Count);
typedef char* (CALLBACK* pMid)( char* Text, long  Start, long Count);
typedef long (CALLBACK* pinstr)( char* S, char* Substr);

3)、声明并建立动态链接库中的函数与新函数名的对应关系,如下:

pOpen CMOpen = (pOpen)GetProcAddress(m_handle,"ComOpen");
pClose CMClose = (pClose)GetProcAddress(m_handle,"ComClose");
pWR CMWR = (pWR)GetProcAddress(m_handle,"ComWR");
pWW CMWW = (pWW)GetProcAddress(m_handle,"ComWW");
pMM CMMM = (pMM)GetProcAddress(m_handle,"ComMM");
pMS CMMS = (pMS)GetProcAddress(m_handle,"ComMS");
pSC CMSC = (pSC)GetProcAddress(m_handle,"ComSC");
pTS CMTS = (pTS)GetProcAddress(m_handle,"ComTS");
pFset CMFset = (pFset)GetProcAddress(m_handle,"ComFBitset");
pFReset CMFReset = (pFReset)GetProcAddress(m_handle,"ComFBitreset");
pFRSset CMFRSset = (pFRSset)GetProcAddress(m_handle,"ComFRSset");
pFCancel CMFCancel = (pFCancel)GetProcAddress(m_handle,"ComFCancel");
pset CMSet = (pset)GetProcAddress(m_handle,"ComSet");
pReset CMReset = (pReset)GetProcAddress(m_handle,"ComReset");
pTrue CMTrue = (pTrue)GetProcAddress(m_handle," ComTrue");
pIntHex CMIntHex = (pIntHex)GetProcAddress(m_handle," CIntToHex");
pHexInt CMHexInt = (pHexInt)GetProcAddress(m_handle," CHexToInt");
pBin CMBin = (pBin)GetProcAddress(m_handle," CinBin");
pLeft CMLeft = (pLeft)GetProcAddress(m_handle," CLeftStr");
pRight CMRight = (pRight)GetProcAddress(m_handle," CRightStr");
pMid CMMid= (pMid)GetProcAddress(m_handle," CMidStr");
pinstr CMinstr=(pinstr)GetProcAddress(m_handle," CinStr");

注:双引号中为动态链接库中的函数名。

4)、接下来就可以自由使用动态链接库中的函数了,如:

CMOpen(参数略);
CMClose(参数略);
CMWR(参数略);
CMWW(参数略);
CMMM(参数略);
CMMS(参数略);
CMSC(参数略);
CMTS(参数略);
CMFset(参数略);
CMFReset(参数略);
CMFRSset(参数略);
CMFCancel(参数略);
CMSet(参数略);
CMReset(参数略);
CMTrue(参数略);
CMIntHex(参数略);
CMHexInt(参数略);
CMBin(参数略);
CMLeft(参数略);
CMRight(参数略);
CMMid(参数略);
CMinstr(参数略);

注:函数中用到了char*型参数,这里介绍下char*与Cstring的相互转换的函数:
1)char*->CString
char* sz;
CString str;
str.Format("%s",sz);  //可以用此函数将读取得值转成字符串
2) CString -> char*
CString str;
char* sz = str.GetBuffer(0);//可将字符串转成char*给函数赋值

5)、当不再需要使用DLL时记得关闭串口及释放动态链接库,如:

关闭串口
if CMTrue(1)==1 then
{
 CMClose(1);
}

6)、释放DLL

FreeLibrary(m_handle);

注:对于各位使用VC及其他开发环境的朋友,我表示歉意因为我不太使用这类软件所以就不再写DEMO程序了,VC的参照上述声明我做过测试是可以使用你的,其他开发环境我没有测试不能保证您可以使用。

作者:  wjun7610
QQ:    157610979
Email: wjun7610@yahoo.com.cn
淘宝店:http://shop34821629.taobao.com

Delphi DEMO程序VB DEMO程序


[此贴子已经被作者于2007-9-23 23:22:06编辑过]
2826
流客
文章数:794
年度积分:50
历史总积分:2826
注册时间:2005/8/28
发站内信
发表于:2007/9/22 0:38:00
#1楼
Host Link通信协议在编程手册上都是公开的.做此东西没什么意义.
1229
wjun7610
文章数:138
年度积分:50
历史总积分:1229
注册时间:2004/6/19
发站内信
发表于:2007/9/22 12:08:00
#2楼
当然是做的给人用的,稳定的东西才会有人用啊。公开的如果把握不好也不一定能有效实现我是要为不愿意在协议上打转的工控朋友提供方便。如果什么都自己做那要产品做什么?
电视原理也是公开的,也不见大家自己买元件自己生产?用成熟的产品可以节约成本的,拿来主意不一定是贬义词!!!


[此贴子已经被作者于2007-9-22 12:11:32编辑过]

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2024 Gkong.com, All Rights Reserved

62.4004