PC(上位机)与PLC串行通讯协议与串口DLL之 modbus rtu 协议(5)
Private Declare Function FCN16_xSetReset Lib \l node As Long, ByVal address As Long, ByVal Bit As Long) As Long
Private Declare Function ComTrue Lib \Private Declare Function MyBeep Lib \Private Declare Function CinBin Lib \ng) 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程序。当然也可在使用“End”语句前将串口关闭也是可以释放串口的。
3、VC语言环境开发说明
在VC环境下将modbus.dll、serialmodbus.slip(许可文件)复制到应用程序目录下(即将上述文件与编译后的可执行文件方入同一文件夹内);
在VC中使用DLL一般都是采用动态声明的方式,函数说明中给出的是Delphi的函数原型,在VC中声明时只要注意一下类型的对应即可
Delphi中的longint类型对应VC中的Long类型、Delphi中的Pchar对应VC中的char* 类型,下面给出主要函数的声明:
在工程主文件cpp中声明一个句柄:
HINSTANCE m_handle;
用来标识导入的动态链接库。
1)、导入动态链接库,如例所示:
m_handle =:: LoadLibrary(\
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* pFCN01)(long nport, long node, long address, long Count); typedef char* (CALLBACK* pFCN02)(long nport, long node, long address, long Count); typedef char* (CALLBACK* pFCN03)(long nport, long node, long address, long Count); typedef char* (CALLBACK* pFCN04)(long nport, long node, long address, long Count); typedef long (CALLBACK* pFCN05S)(long nport, long node, long address); typedef long (CALLBACK* pFCN05R)(long nport, long node, long address);
typedef long (CALLBACK* pFCN06)(long nport, long node, long address, char* Sendstr); typedef long (CALLBACK* pFCN15)(long nport, long node, long address, long Count, char* Sendstr);
typedef long (CALLBACK* pFCN16)(long nport, long node, long address, long Count, char* Sendstr);
typedef long (CALLBACK* pFCN16_xSet)(long nport, long node, long address, long Bit); typedef long (CALLBACK* pFCN16_xReset)(long nport, long node, long address, long Bit);
typedef long (CALLBACK* pFCN16_xSetReset)(long nport, long node, long address, long Bit);
typedef long (CALLBACK* pTrue)(long nport);
typedef char* (CALLBACK* pIntHex)(long Dcint,long Digits); typedef long (CALLBACK* pHexInt)( char* CHex);
typedef long (CALLBACK* pBin)( long Chex, long Start); 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* Ostr, char* Ckstr, Long Dcint); typedef long (CALLBACK* pBeep)( long SoundHz);
3)、声明并建立动态链接库中的函数与新函数名的对应关系,如下:
pOpen Copen = (pOpen)GetProcAddress(m_handle,\pClose Cclose = (pClose)GetProcAddress(m_handle,\pFCN01 CFCN01 = (pFCN01)GetProcAddress(m_handle,\pFCN02 CFCN02 = (pFCN02)GetProcAddress(m_handle,\pFCN03 CFCN03 = (pFCN03)GetProcAddress(m_handle,\pFCN04 CFCN04 = (pFCN04)GetProcAddress(m_handle,\
pFCN05S CFCN05S = (pFCN05S)GetProcAddress(m_handle,\pFCN05R CFCN05R = (pFCN05R)GetProcAddress(m_handle,\pFCN15 CFCN15 = (pFCN15)GetProcAddress(m_handle,\pFCN16 CFCN16 = (pFCN16)GetProcAddress(m_handle,\
pFCN16_xSet CFCN16_xSet = (pFCN16_xSet)GetProcAddress(m_handle,\\
pFCN16_xReset CFCN16_xReset = (pFCN16_xReset)GetProcAddress(m_handle,\16_xReset\
pFCN16_xSetReset CFCN16_xSetReset = (pFCN16_xSetReset)GetProcAddress(m_handle,\
pTrue Ctrue = (pTrue)GetProcAddress(m_handle,\
pIntHex Cinthex = (pIntHex)GetProcAddress(m_handle,\oHex\pHexInt Chexint = (pHexInt)GetProcAddress(m_handle,\oInt\pBin Cbin = (pBin)GetProcAddress(m_handle,\pLeft Cleft = (pLeft)GetProcAddress(m_handle,\
pRight Cright = (pRight)GetProcAddress(m_handle,\pMid Cmid= (pMid)GetProcAddress(m_handle,\pinstr Cinstr=(pinstr)GetProcAddress(m_handle,\
pTrue CBeep = (pBeep)GetProcAddress(m_handle,\
注:双引号中为动态链接库中的函数名。
4)、接下来就可以自由使用动态链接库中的函数了,如:
Copen(参数略); Cclose(参数略); CFCN01(参数略); CFCN02(参数略); CFCN03(参数略); CFCN04(参数略); CFCN05S(参数略); CFCN05R(参数略); CFCN15(参数略); CFCN16(参数略);
CFCN16_xSet(参数略); CFCN16_xReset(参数略);
CFCN16_xSetReset(参数略); Ctrue(参数略); Cinthex(参数略); Chexint(参数略); Cbin(参数略); Cleft(参数略); Cright(参数略); Cmid(参数略); Cinstr(参数略); CBeep(参数略);
注:函数中用到了char*型参数,这里介绍下char*与Cstring的相互转换的函数:
(1)char*->CString
char* sz; CString str;
str.Format(\可以用此函数将读取的值转成字符串
(2) CString -> char*
CString str;
char* sz = str.GetBuffer(0);//可将字符串转成char*给函数赋值
5)、当不再需要使用DLL时记得关闭串口及释放动态链接库,如:
关闭串口
if cTrue(1)==1 then {
cClose(1); } 6)、释放DLL
FreeLibrary(m_handle);
六、详细的DLL使用请参DEMO程序,相关DEMO程序和说明所使 …… 此处隐藏:3080字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [实用模板]第八章:法国“新浪潮”与“左岸派”
- [实用模板]2021年北京上半年临床医学检验技师生物
- [实用模板]SAP GUI 7.10客户端安装配置文档
- [实用模板]2001年临床执业医师资格考试综合笔试试
- [实用模板]36机场工作实用英语词汇总结
- [实用模板](一)社会保险稽核通知书
- [实用模板]安全教育主题班会材料
- [实用模板]濉溪县春季呼吸道传染病防控应急演练方
- [实用模板]长沙房地产市场周报(1.30-2.3)
- [实用模板]六年级数学上册典中点 - 图文
- [实用模板]C程序设计(红皮书)习题官方参考答案
- [实用模板]中国证监会第一届创业板发行审核委员会
- [实用模板]桥梁工程复习题
- [实用模板]2011学而思数学及答案
- [实用模板]初中病句修改专项练习
- [实用模板]监理学习知识1 - 图文
- [实用模板]小机灵杯四年级试题
- [实用模板]国贸专业毕业论文模板
- [实用模板]教育学概论考试练习题-判断题4
- [实用模板]2015届高考英语一轮复习精品资料(译林
- 00Nkmhe_市场营销学工商管理_电子商务_
- 事业单位考试法律常识
- 诚信教育实施方案
- 吉大小天鹅食品安全检测箱方案(高中低
- 房地产销售培训资料
- 高一地理必修1复习提纲
- 新概念英语第二册lesson_1_练习题
- 证券公司内部培训资料
- 小学英语时间介词专项练习
- 新世纪英语专业综合教程(第二版)第1册U
- 【新课标】浙教版最新2018年八年级数学
- 工程建设管理纲要
- 外研版 必修一Module 4 A Social Surve
- Adobe认证考试 AE复习资料
- 基于H.264AVC与AVS标准的帧内预测技术
- 《食品检验机构资质认定管理办法》(质
- ABB变频器培训课件
- (完整版)小学说明文阅读练习题及答案
- 深思洛克(SenseLock) 深思IV,深思4,深
- 弟子规全文带拼音




