组态王软件驱动程序开发
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
组态王驱动开发包
用户手册
北京亚控科技发展有限公司
1. 版权
本开发包版权属于北京亚控科技发展有限公司,任何组织、团体、个人,未经亚控公司允许,不得擅自拷贝,使用,对于购买本开发包的组织、团体、个人,只能内部使用,不得擅自泄漏给第三方。
2. 概述
本开发包采用微软标准的COM组件技术,采用该技术,在创建接口时,可以创建多个互相独立对象,每个对象都可以拥有自己的变量。
最后的结果是一个DLL文件。
接口中的各函数,是被组态王的两个应用程序---TouchExplorer.exe和TouchVew.exe调用的。
如果这两个应用程序都不启动,函数中的代码将永远没有机会执行。
组态王的驱动程序是组态王和硬件设备连接的桥梁,本开发包用于开发组态王的驱动程序。
只要拥有硬件的通讯协议,即可以使用本开发包开发组态王的驱动程序。
本开发包只能使用VC++开发。
3. 开发包3.0修订目的
a)通用版和嵌入版统一到一套代码中,通用版和嵌入版实现同步更新。
b)生成设备类,为多设备型号驱动提供解决方法。
c)详尽、稳健的基类代码。
d)完善的功能与向导。
e)规范各类帮助函数。
f)规范编码格式、统一使用英文版。
g)修改部分功能的实现方法。
4. 开发包使用
我们提供一个开发向导工具“DriverToolKit3.0.0.0.exe”,使用这个工具,能够自动地生成驱动代码框架。
运行工具,如下图:
请在下页输入您的目标文件夹
点击“安装”,开发包即安装完成。
使用开发包向导创建驱动的过程:
(1)启动Visual 2003。
(2)新建一个工程,“项目类型”选择“Visual C++项目”,“模板”选择“KingView Wizard”,在下面的编辑框中输入工程的名字以及存储路径,点击“确定”。
(3)这个创建向导分3页,第一页是“概述”,显示的是默认的设置信息,如果您不需要改变这些,直接点击“确定”即可成功的创建驱动框架。
(4)第二页是“驱动类型和编译选项”,包含如下部分:
驱动类型:
o串口驱动(适用于查询式设备)
这个类型,是我们一般常用的,适合于普通的上位查询,设备应答的通讯
类型。
o串口驱动(适用于实时上发数据的设备,非重叠IO)
这种方式,适用于下位设备实时上发数据的情况,驱动中需要创建一个线
程来监视串口事件的通讯类型,采用非重叠IO方式。
o串口驱动(适用于实时上发数据的设备,重叠IO,WinCE不支持)
这种方式,同上一种,也是适用于下位设备实时上发数据的情况,驱动中
需要创建一个线程来监视串口的通讯类型。
与前一种不同的是:采用了重
叠IO方式。
我们不推荐使用这种方式,因为WINCE系统不支持这种方式,
使用这种方式开发的驱动,将不能在WINCE系统的嵌入式设备中运行。
o以太网驱动(TCP服务器端)
这是针对于TCP方式通讯的驱动,适用于设备为客户端,组态王为
Server,组态王查询,设备应答的通讯类型。
如果遇到设备主动实时上发
数据的情况,驱动中提供了相应的函数,可以直接调用函数,启动线程来
监听网络事件。
o以太网驱动(TCP客户端)
这是TCP方式通讯客户端的驱动,适用于组态王查询、设备应答的通讯类
型。
这种方式需要驱动主动去连接设备。
如果遇到设备主动实时上发数据
的情况,驱动中提供了相应的函数,可以直接调用函数,启动线程来监听
网络事件。
o以太网驱动(UDP服务器端)
目前还没有实现,参考TCP方式,代码中需要改动的地方有标注。
o以太网驱动(UDP客户端)
目前还没有实现,参考TCP方式,代码中需要改动的地方有标注。
设备名称:
默认的设备名称是“Name1”,可以自由填写,但须注意应该与设备列表中的设备名称保持一致。
尝试连接类型:
当组态王与设备通讯失败了,组态王会周期性的尝试与设备通讯,这个过程,我们称之为“尝试连接”。
尝试连接,目前准备了如下几种类型:
o永远为True,常用于板卡驱动。
o程序员自由定义,常用于网络通讯或实时上发数据的设备。
o使用“PACKET”进行通讯,适用于普通的驱动。
(5)第三页是“驱动基本信息”,包含如下条目:
驱动基本信息
o驱动名称
o版本
o描述
o程序员
o项目经理
这些信息将被自动保存到历史文件(History.txt)中,同时也是保存在工程的ReadMe文件中,可以随工程浏览。
其他支持:
o USB 通讯
o ADO 数据库操作
(6)点击“确定”后,将完成驱动工程的创建工作。
5. 工程转换工具
我们要求通用版和嵌入版使用同一套代码,做到通用版和嵌入版驱动实现同步更新,这就需要一个工具来将通用版工程文件转换为嵌入版工程文件。
同时,考虑到有的开发者习惯使用Visual Studio 98进行开发编译,我们也要有一个工具来将Visual Studio 2003的工程文件转换成Visual Studio 98的工程文件。
我们提供一个转换工具kvdriver(包含3个文件,kvdriver.exe, vc7tovc6.exe,vc7toevc.exe),使用这个工具,可以根据Visual Studio 2003的工程文件,创建成Visual Studio 98和EVC的工程文件,开发者可以在不同的开发环境间自由选择。
驱动开发包安装完成后,这个工具存放在目录KingViewDriver下。
在使用的时候,可以把这个工具放在系统文件夹C:\WINDOWS\system32中,这样可以在命令行中输入“kvdriver”,然后把需要转换的Visual Studio 2003工程文件拖动过来运行即可,如下所示:
6. 驱动信息结构
所有的结构都定义在文件“Data类型.h”中。
_DevAddr
该结构定义了设备地址格式.
类型def struct _DevAddr
{
UINT nDevAddr;
TCHAR sDevAddr[MAX_DEV_LEN];
}DEVADDR, * PDEVADDR;
成员:
sDevAddr:
用户在组态王中输入的原地址格式字符串。
nDevAddr:
实际转换后的设备地址数字.
ComDevice
这是串口设置信息的结构体.
struct ComDevice
{
short nFlag;
WORD deviceKind;
TCHAR deviceName[32];
int baudRate;
short dataBits;
short stopBits;
short parity;
short timeOut;
short failTimes;
short retryInterval;
short isRs232;
};
成员:
nFlag:
串口标志,目前没有用到.
DeviceKind:
设备类型,'1'代表串口设备
DeviceName:
逻辑名称 =={COM1,COM2...}
BaudRate:
波特率,范围是从 110到256000。
DataBits:
数据位
StopBits:
停止位.
TimeOut:超时,单位是毫秒
FailTimes:失败次数
RetryInterval:尝试间隔
isRs232:通讯模式,'1'代表RS232, '2'代表RS422, '3'代表RS485. PLCVAR
该结构定义了用户变量的属性.
类型def struct var
{
WORD wVarID;
WORD wVarType;
TCHAR szVarName[32];
short nDeviceIndex;
short nUnitNo;
DEVADDR *pDevAddr;
TCHAR *pszRegName;
short nRegType;
short nSubType;
short nSubType1;
short nSubType2;
short nNo;
short nDataType;
short nAccessMode;
long nFrequency;
long nTimerCount;
CWinThread* pComThread;
DDEValue maxRaw;
DDEValue minRaw;
short bConvertion;
short isBad;
short isUnvalid;
}PLCVAR, * PPLCVAR;
成员:
wvarID:变量ID
wVarType:变量类型,为如下几种:
Bit, byte, int, uint, BCD, long, float, longbcd, string szVarName:变量名
nDeviceIndex:设备索引
nUnitNo:设备地址单元
pDevAddr:设备地址
pszRegName:寄存器名称
nRegType;寄存器类型
nSub Type:
nSub Type1:
nSub Type2:
子类型,没有用到,如在驱动中有其他需要,可以自己定义使用。
nNo:寄存器通道
nData Type:数据类型
nAccessMode:读写属性
nFrequency:采集频率
nTimerCount:超时次数
pComThread:通讯线程
maxRaw:最大原始值
minRaw:最小原始值
PACKET
该结构定义了通讯包的属性
类型def struct Packet
{
short nDeviceIndex;
short nUnitNo;
DEVADDR * pDevAddr;
TCHAR * pszDevName;
TCHAR *pszRegName;
short nRegType;
short nSubType;
short nSubType1;
short nSubType2;
int nStartNo;
int nEndNo;
short nPacketType;
CPtrList varList;
}PACKET,* PPACKET;
成员:
nDeviceIndex:设备索引
nUnitNo:设备地址单元
pDevAddr:设备地址结构指针
pszDevName:设备地址
nRegType:寄存器类型
nSubType:
nSubType1:
nSubType2:子类型,没有用到,自己可以使用nStartNo:开始通道
nEndNo:结束通道
nPacketType:包读写类型
VarList:变量列表,存储ID_NO和ID_NO2两种类型变量ID_NO
该结构定义了老的接口的变量
类型def struct IdNo
{
WORD wVarId;
WORD wNo;
WORD wDataType;
BYTE Special[4];
PlcValue plcValue;
}ID_NO;
成员:
wVarId:变量ID
wNo:通道
wDataType:数据类型
Special:目前没有使用
plcValue:PLCVAR结构体指针
ID_NO2
该结构定义了新的接口的变量
类型def struct IdNo2
{
WORD wVarId;
WORD wNo;
WORD wData Type;
PlcValue plcValue;
BYTE Special[4];
WORD wQualities;
ftTimeStamps;
}ID_NO2;
成员:
wVarId:变量ID
wNo:通道
wDataType:数据类型
Special:目前没有用到
plcValue:PLCVAR结构体指针
wQualities:质量戳,0xc0代表GOOD, 0代表BAD.
ftTimeStamps:
时间戳,在驱动中一般设置当前的时间
DEVICE_INFO
该结构定义了设备信息
类型def struct deviceinfo
{
TCHAR sDeviceName[32];
}DEVICE_INFO;
成员:
SDeviceName:
设备名称,最大允许长度是32,使用TCHAR字符
REG_INFO
该结构定义了寄存器信息
类型def struct reginfo
{
TCHAR sRegName[8];
int nLowIndex;
int nUpperIndex;
WORD wDataType;
int nData;
}REG_INFO;
成员:
sRegName:寄存器名称
nLowIndex:开始通道
nUpperIndex:结束通道
7. 接口函数
7.1 接口描述
组态王与驱动交互,包括2个COM接口: IprotocolImp(老接口) 和IProtocolImp2(新接口)
IProtocolImp::StrToDevAddr
XProtocolImp::StrToDevAddr(const TCHAR* str, LPVOID lpDevAddr)
类型:Public
目的:实现对地址输入的整理,判断用户输入的地址是否合法,并将地址的数值传给组态王,如果必要,也可以将地址以字符串的形式传给组态王。
返回值:成功返回TRUE,否则返回FALSE
参数
Str:[in] 用户输入的地址字符串
lpDevAddr:[in,out] 用于保存地址信息的结构
XProtocolImp::GetRegisters
XProtocolImp::GetRegisters(const TCHAR* szDeviceName,
LPVOID * ppRegs, int *pRegNum)
类型:Public
目的:得到由szDeviceName确定的寄存器的名字和个数
返回值;成功返回TRUE,否则返回FALSE
参数
szDeviceName
[in] 设备的唯一名字
ppReg
[out] 返回寄存器信息的指针数组的指针。
如果szDeviceName无效,则返回
NULL。
pRegNum
[out] 返回寄存器的个数,如果szDeviceName无效,则返回0。
XProtocolImp::ConvertUserConfigToVar
XProtocolImp:: ConvertUserConfigToVar( LPVOID lpDbItemItem, LPVOID lpVar)
类型
Public
目的
将用户的配置字符串转换为组态王变量结构
返回值
WORD:如果转换成功则返回0,否则返回非零的错误代码
参数
lpDbItem
[in] 指向结构MiniDbItem的指针
lpVar
[in,out] 指向结构PLCV AR的指针,返回变量就存放在这里XProtocolImp::AddVarToPacket
XProtocolImp:: AddVarToPacket( LPVOID lpVar, int nVarAccessType, LPVOID lpPacket)
类型
Public
目的
确认变量是否能够与一个包里的其他变量一起进行采集,以进行变量的打包, 如果可以加入,返回TRUE并修改包的起止地址;否则返回FALSE。
返回值
BOOL:FALSE表示不能打包,否则能
参数
lpVar
[in] 变量指针
nVarAccessType
[in] 读写方式
lpPacket
[out] 包指针
XProtocolImp::OpenComDevice
XProtocolImp::OpenComDevice( int nDeviceType, LPVOID lpInitData)
类型
Public
目的
初始化通讯设备如:(串口或板卡等)
返回值
BOOL:成功则返回TRUE,否则返回FALSE
参数
nDevice Type
[in] 设备类型
lpInitData
[in] 一个指向COMM_CONFIG结构的指针
XProtocolImp::InitialDevice
XProtocolImp::InitialDevice(const TCHAR* pDeviceName, int nUnitAddr, LPVOID lpDevAddr)
类型
Public
目的
初始化设备,设置该设备的初始化状态
返回值
BOOL:如果szDeviceName有效,则返回TRUE,否则返回FALSE。
参数
pDeviceName
[in] 设备的唯一名字
nUnitAddr
[in] 设备地址
lpDevAddr
[in] 应将此参数转换为结构--- PDEV ADDR。
此结构详情参阅DATA类型.H文件。
XProtocolImp::ProcessPacket
XProtocolImp:: ProcessPacket(LPVOID lpPacket)
类型
Public
目的
根据协议及包状态信息进行相应的处理,例如进行读写处理,如果读成功则把数据写入pPac->varList。
返回值
BOOL:如果成功,返回TRUE,否则,返回FALSE。
lpPacket
[In, out] 包指针
XProtocolImp::CloseComDevice
XProtocolImp::CloseComDevice()
类型:Public
目的:关闭该通讯设备
返回值
BOOL:成功则返回TRUE,否则返回FALSE。
参数
Null
XProtocolImp::TryConnect
XProtocolImp::TryConnect(const TCHAR* pDeviceName, int nUnitAddr, LPVOID lpDevAddr)
类型:Public
目的:与地址为UnitAddr的设备尝试进行通讯,用于故障侦探及恢复尝试。
返回值
尝试通讯成功返回TRUE,否则返回FALSE。
参数
pDeviceName
[in] 设备的唯一名字
nUnitAddr
[in] 需要进行故障侦探及恢复尝试的设备的地址。
lpDevAddr
[in] 应将此参数转换为结构--- PDEV ADDR。
此结构详情参阅 DA TA类型.H文件。
备注
当 "ProcessPacket" 失败后, "TryConnect"将被组态王调用2次,如果仍然失败,则该接口将按设定的尝试连接间隔被组态王调用。
XProtocolImp::GetLastError
XProtocolImp::GetLastError()
类型
Public
目的
返回最近一次的错误信息。
返回值
将最近一次的错误信息。
参数
无
XProtocolImp2::GetTrans
XProtocolImp2::GetTrans( LPVOID* pHcomm)
类型
Public
目的
获取驱动打开的设备句柄,以便其他设备可以使用此句柄。
返回值
成功返回TRUE,否则返回FALSE。
参数
lpHcomm
[out] 接受设备句柄的指针
XProtocolImp2::SetTrans
XProtocolImp2::SetTrans( LPVOID* pHcomm )
类型:Public
目的:将其他驱动打开的设备句柄传递给驱动。
返回值:成功返回TRUE,否则返回FALSE。
参数
lpHcomm
[in] 其他驱动打开的设备句柄。
XProtocolImp2::ProcessPacket2
XProtocolImp2:: ProcessPacket2(LPVOID lpPacket)
类型
Public
目的
根据协议及包状态信息进行相应的处理,例如进行读写处理,如果读成功则把数据写入pPac->varList。
返回值
BOOL:如果成功,返回TRUE,否则,返回FALSE。
参数
lpPacket
[in,out] 包指针
7.2 接口函数的调用
7.2.1开发环境
7.2.1.1 新建设备
在向导页输入地址字符串时,程序加载驱动,并调用驱动的StrToDevAddr
当向导页转向下一页,也就是点击下一步时,组态王会调用StrDevToAddr,并将用户输入传递给驱动。
驱动的功能是进行地址转换,具体解释参见StrDevToAddr。
7.2.1.2 新建变量
用户在变量字典里面点击新建变量时,会弹出如下建立变量的对话
框,
若用户有不是驱动使用域填写有误或者有相关的域(包括驱动使用域)没有填写,组态王将会给出相应的提示,即组态王不调用驱动,直接给出错误提示。
当用户点击连接设备完成设备连接或者在设备组合框中选定设备时,组态王会调用GetRegisters,组态王会将设备名称传递给驱动,由驱动返回给组态王寄存器列表。
具体解释参见GetRegisters。
所有用户必填域填写完毕,切换TAB页或者确定变量时,组态王会调用ConvertUserConfigToVar. 由驱动进行变量校验。
组态王会将驱动域的输入作为MiniDbItem传递给驱动,ConvertUserConfigToVar将结果返回在组态王建立的变量PLCV AR中。
具体解释见ConvertUserConfigToV ar。
7.2.1.3 串口设备测试
若用户使用的设备是串口设备,可以方便的使用串口设备测试工具进行测试.用户进入测试设备对话框,如下图所示:
当用户进入此对话框时,组态王立刻调用GetRegisters获取设备可以使用的寄存器列表。
当用户点击添加或者加入变量时,组态王立刻调用ConvertUserConfigToVar进行变量
校验。
当用户点击读取,组态王就开始变量采集。
所有采集步骤与运行环境一致,只是这儿测试只是测试一个设备,而运行环境采集定义的所有的设备。
7.2.2. 运行环境
以下步骤为特殊目的时,组态王对于每个设备都会调用一次此函数。
7.2.2.1校验设备地址
调用StrToDevAddr,对用户输入的地址字符串进行转换.若StrToDevAddr返回TRUE,转7.2.2.2. 否则组态王提示用户地址格式不对,同时中止此设备的采集,不影响使用同一驱动的其他设备。
7.2.2.2 打开设备
调用OpenComDevice,若是串口设备,则驱动应在此中进行串口初始化.若不是串口驱动,驱动可以在此中完成一次性的初始化工作。
若OpenComDevice返回TRUE,组态王会在信息窗口提示打开设备成功,并给出成功的设备名称,同时转7.2.2.3。
否则组态王会在信息窗口提示打开设备失败,认为设备存在问题,若是串口设备,此串口下连接的所有设备都不能通信,
若是其他类型设备,则此种设备全部不能通信。
OpenComDevice的参数由用户配置。
7.2.2.3 设备初始化
调用InitialDevice,对设备进行初始化.若InitialDevice返回TRUE,转7.2.2.4.否则组态王在信息提示用户设备初始化失败,同时中止此设备的采集,不影响使用同一驱动的其他设备。
7.2.2.4 变量校验
调用ConvertUserConfigToVar对所有变量进行变量校验。
若一个设备使用的所有变量都成功,转7.2.2.5。
若某一个设备中有一个变量校验失败,则组态王会在信息窗口提示变量校验无效,同时组态王会中止此设备的采集。
7.2.2.5 变量打包
调用AddVarToPacket对变量进行打包处理.对于属于同一驱动的所有变量进行打包处理,当所有变量打包完成,7.2.2.6。
7.2.2.6 设备通信
调用ProcessPacket2进行设备通信,若返回TRUE,则释放7.2.2.5中建立的PACKET,同时进行下一个PACKET处理.当按照刷新频率全部处理完毕,转7.2.2.5重新打包通信.若返回FALSE,则转7.2.2.7。
7.2.2.7 尝试恢复设备通信
调用TryConnect进行设备尝试恢复,若返回TRUE,则返回7.2.2.6进行正常通信处理。
若返回失败组态王会再次调用TryConnect,若仍然返回FALSE,组态王认为设备失败,会中止设备采集一段时间,在定义设备时设置。
7.2.2.8 关闭设备
调用CloseComDevice关闭设备,若CloseComDevice返回FALSE或者迟迟不能完成关闭设备动作,将大大影响组态王的退出速度,甚至可能阻止组态王退出。
8 程序结构
程序包含如下几个主要的类:
驱动工程类 (Cpro):
实现2个接口: IprotocolImp 和 IprotocolImp2。
设备类 (CDev):
实现COM接口, 包括2个类,设备基类和设备子类。
通讯类 (CCom):
实现串口,网卡等的通讯,开发包向导会根据您的设置,自动地产生串口通讯类 (CSerialCom) 或者网络通讯类 (CNetCom), 您也可以根据需要添加USB 通讯类(CUSBCom)。
调试信息类 (CDebug):
该类实现各种调试信息在组态王信息窗口中的输出,比如错误信息,接口信息,数据信息等。
帮助函数(CHelper):
提供了一系列您在开发驱动过程中可能会用到的功能函数。
数据桢校验类 (CCheck):
提供了在开发中会遇到的各种校验函数,包括和校验、异或校验、循环冗余校验等。
类的调用与继承关系,如下图:
8.1 驱动工程类 (CPro)
该类实现2个接口: IprotocolImp 和 IprotocolImp2。
关于接口函数目的,见“7.1”节。
8.2 设备类 (CDev)
实现COM接口,包含2个类,设备基类(CDevBase)和设备子类(CDev)。
类CDevBase是所有设备子类的父类。
属性:
m_szDevKind:设备类型.
m_pSerialCom:串口通讯类指针
m_pCheck:校验类指针
m_pPro:工程类指针
操作:
GetRegisters
BOOL CDev::GetRegisters( LPVOID *ppReg, int *pRegNum ) 类型
Public
目的
得到由szDeviceName确定的寄存器的名字和个数。
返回值
成功返回TRUE,否则返回FALSE。
参数
ppReg
[out] 返回寄存器信息的指针数组的指针。
pRegNum
[out] 返回寄存器的个数。
GetDevices
BOOL CDev::GetDevices(LPVOID *ppDevice, int *pDeviceNum) 类型:Public
目的:得到设备的名字和个数。
返回值:成功返回TRUE,否则返回FALSE。
参数:ppDevice
[out] 返回设备列表信息的指针。
pDeviceNum:[out] 返回设备的个数。
ConvertUserConfigToVar
WORD CDev::ConvertUserConfigToVar( LPVOID lpDbItemItem, LPVOID lpVar)
类型:Public
目的:将用户的配置字符串转换为组态王变量结构
返回值:WORD:如果转换成功则返回0,否则返回非零的错误代码。
参数
lpDbItem:[in] 指向结构MiniDbItem的指针。
lpVar:[in,out] 指向结构PLCVAR的指针,返回变量就存放在这里。
AddVarToPacket
BOOL CDev::AddVarToPacket( LPVOID lpVar, int nVarAccessType, LPVOID lpPacket)
类型
Public
目的
确认变量是否能够与一个包里的其他变量一起进行采集,以进行变量的打包, 如果可以加入,返回TRUE并修改包的起止地址;否则返回FALSE。
返回值
BOOL:FALSE表示不能打包,否则能。
参数
lpVar
[in] 变量指针
nVarAccessType
[in] 读写方式
lpPacket
[int] 包指针
ProcessPacket2
BOOL CDev::ProcessPacket2( LPVOID lpPacket )
类型
Public
目的
根据协议及包状态信息进行相应的处理,例如进行读写处理,如果读成功则把数据写入pPac->varList。
(在新接口中调用)。
返回值
BOOL:如果成功,返回TRUE,否则,返回FALSE。
参数
lpPacket
[in,out] 包指针。
TryConnect
BOOL CDev::TryConnect ( const TCHAR* szDeviceName, int iUnitAddr, LPVOID lpDevAddr )
类型
Public
目的
与地址为UnitAddr的设备尝试进行通讯,用于故障侦探及恢复尝试。
返回值
尝试通讯成功返回TRUE,否则返回FALSE。
参数
pDeviceName
[in] 设备的唯一名字。
nUnitAddr
[in] 需要进行故障侦探及恢复尝试的设备的地址。
lpDevAddr
[in] 应将此参数转换为结构--- PDEVADDR。
此结构详情参阅 DATATYPE.H文件。
备注
当 "ProcessPacket" 失败后, "TryConnect"将被组态王调用2次,如果仍然失败,则该接口将按设定的尝试连接间隔被组态王调用。
StrToDevAddr
BOOL CDevBase::StrToDevAddr(const TCHAR* str, LPVOID lpDevAddr)
类型:Public
目的:实现对地址输入的整理,判断用户输入的地址是否合法,并将地址的数值传给组态王,如果必要,也可以将地址以字符串的形式传给组态王。
返回值:成功返回TRUE,否则返回FALSE。
参数
str
[in] 用户输入的地址字符串。
lpDevAddr
[in,out] 用于保存地址信息的结构。
SetProPtr
void CDevBase::SetProPtr(CProject16Pro* pPro)
类型
Public
目的
设置工程类的指针。
返回值
Null
参数
pPro
[in] 工程类的指针。
GetSendTimes
int CDevName1::GetSendTimes(PPACKET pPac)
类型
Public
获取与设备一次交互的次数。
返回值
一个整型数据。
参数
pPac
[in,out] 包指针
GetSendString
BOOL CDev::GetSendString(PPACKET pPac,int& iLen, int& iRecLen, int iTimes)
类型
Public
目的
根据协议组合成发送桢。
返回值
成功返回TRUE,否则返回FALSE。
参数
pPac
[in,out] 指向PACKET结构的指针。
iLen
[out] 发送数据的长度。
iRecLen
[out] 需要接收的数据的长度。
iTimes
[in] 在一次发送过程中调用的次序。
Transmission
BOOL CDev::Transmission (int iLen, int iExpectedLen, int& iRecLen) 类型
Public
目的
通讯处理函数。
返回值
成功返回TRUE,否则返回FALSE。
参数
iLen
[in] 数据的长度
iExpectedLen
[in,out] 期望接收到数据的长度。
iRecLen
[in,out] 实际接收到数据的长度。
GetFirstFrame
BOOL CDev::GetFirstFrame (int nbyteRead, int nExpectedLen, BYTE chFrameHead)
类型
目的
获取第一个正确的数据桢。
返回值
成功返回TURE,否则,返回FALSE。
参数
nbyteRead
[in] 实际接收到的数据的长度。
iExpectedLen
[in] 期望接收到的数据的长度。
chFrameHead
[in] 第一个正确数据桢的位置。
PreProcessData
BOOL CDev::PreProcessData (PPACKET pPac, int nbyteRead ,int nExpectedLen, int iTimes)
类型
Public
目的
检查接收的数据。
返回值
成功返回TURE,否则,返回FALSE。
参数
pPac
[in,out] 包指针。
nbyteRead
[in] 实际接收到的数据长度。
iExpectedLen
[in] 期望接收到的数据长度。
SendDataToKingView
BOOL CDev::SendDataToKingView(PPACKET pPac, int iLen)
类型
Public
目的
向组态王传送数据。
返回值
成功返回TRUE,否则,返回FALSE。
参数
pPac
[in,out] 包指针。
iLen
[Out] 接收到的数据长度。
8.3 通讯类 (CCom)
实现串口,网卡等的通讯,开发包向导会根据您的设置,自动地产生串口通讯类
(CSerialCom)或者网络通讯类(CNetCom), 您也可以根据需要添加USB通讯类(CUSBCom)。
如下是串口通讯类(CSerialCom)结构:
8.3.1串口通讯类 CSerialCom
属性:
DWORD m_dwTimeOut;
通讯超时变量
HANDLE m_hComm;
串口句柄
bool bUseModem;
是否使用MODEM
操作:
OpenCom
BOOL OpenCom(const ComDevice& InitData) ;
类型
Public
目的
打开串口。
返回值
成功返回TRUE,否则返回FALSE。
参数
pcc
[in] ComDevice 结构指针
CloseCom
BOOL CloseCom();
类型
Public
目的
关闭串口
返回值
成功返回TRUE,否则返回FALSE。
参数
Null
ReOpenCom
BOOL ReOpenCom();
类型
Public
目的
重新打开串口。
返回值
成功返回TRUE,否则返回FALSE。
参数
Null
PhysicalSend
BOOL PhysicalSend(BYTE*pbBuf, DWORD dwWriteLen);
类型
Public
目的
向串口发送一数据桢。
返回值
成功返回TRUE,否则返回FALSE。
参数
pbBuf
[in] 发送数据缓冲区指针
dwWriteLen
[in] 发送数据长度
PhysicalReceive
BOOL PhysicalReceive(BYTE*pbBuf,int iStart, int& iBytesRead);
类型
Public
目的
从串口接收数据。
返回值
成功返回TRUE,否则返回FALSE。
参数
pbBuf
[in] 接收缓冲区指针
iBytesRead
[in] 接收到的数据长度
8.4 调试信息类 (CDebug)
该类实现各种调试信息在组态王信息窗口中的输出,比如错误信息,接口信息,数据信息等。
目前提供了如下信息输出标志:
/IMP_MSG // 输出接口函数
/FUN_MSG // 输出功能函数
/DATA_MSG // 输出发送接收数据
/ERR_MSG // 输出错误信息
/USER_MSG // 输出用户定义信息
/ALL_MSG // 输出所有信息
当用户在设备地址处,输入如上信息,将会在组态王信息窗口中输出相应的信息。
例如,输入1 /ALL_MSG
在组态王信息窗口中显示:
信息格式:
时间精确时钟计数信息
属性:
static bool bShowIMPMsg;
输出接口信息标志
static bool bShowERRMsg;
输出错误信息标志
static bool bShowFUNMsg;
输出功能函数标志
static bool bShowDATAMsg;
输出发送接收数据标志
static bool bShowUSERMsg;
输出自定义信息标志
static bool bShowALLMsg;
输出所有信息标志
Operations:
ShowImpMessage
void CDebug::ShowImpMessage(TCHAR* szMessage)
类型
Public
目的
输出接口信息标志。
返回值
Null
参数
szMessage
[in] 显示信息
ShowErroMessage
void CDebug::ShowErroMessage(TCHAR* szMessage)类型
Public
目的
输出错误信息。
返回值
Null
参数
szMessage
[in] 显示信息
ShowFunMessage
void CDebug::ShowFunMessage(TCHAR* szMessage)类型
Public
目的
输出功能函数信息。
返回值
Null
参数
szMessage
[in] 显示信息
ShowDataMessage
void CDebug::ShowDataMessage(TCHAR* szMessage)类型
Public
目的
输出发送接收数据信息。
返回值
Null
参数
szMessage
[in] 显示信息
ShowUserMessage
void CDebug::ShowUserMessage(TCHAR* szMessage)类型
Public
目的
输出自定义信息。
返回值
Null
参数
szMessage
[in] 显示信息
8.5 帮助函数类 (CHelper)
提供了一系列您在开发驱动过程中可能会用到的功能函数。
操作:
GetWord
WORD CHelper::GetWord(BYTE* buf)
类型
Public
目的
从缓冲区中得到整数.
返回值
转换后的整数.
参数
buf
[in] 数据缓冲区的指针
GetLong
long CHelper::GetLong(BYTE* buf)
类型
Public
目的
从缓冲区中得到长整数。
返回值
转换后的长整数
参数
buf
[in] 数据缓冲区的指针
WordToBcd
WORD CHelper::WordToBcd(WORD value)
类型
Public
目的
把整数转换BCD码。
返回值
转换后的BCD码
参数
value
[in] 要转换的整数.
LongToBcd
long CHelper::LongToBcd(long value)类型
Public
目的
把长整数转换BCD码。
返回值
转换后的BCD码
参数
value
[in] 要转换的长整数
BcdToWord
WORD CHelper::BcdToWord(WORD value)类型
Public
目的
把BCD码转换整数。
返回值
转换后的整数
参数
value
[in] 要转换的BCD码BcdToLong
long CHelper::BcdToLong(long value)类型
Public
目的
把BCD码转换长整数。
返回值
转换后的长整数
参数
value
[in] 要转换的BCD码
S
WORD CHelper::S(WORD value)
类型
Public
目的
转换整数的高低位字节。
返回值
转换后的长整数
参数
value
[in] 要转换的BCD码
S
long CHelper::S(WORD *value)
类型
Public
目的
转换整数的高低位字节。
返回值
转换后的长整数
参数
value
[in] 要转换的BCD码
ByteBufToFloat
float CHelper::ByteBufToFloat(BYTE *buf,int mode)
类型
Public
目的
把4个字节的数据按照mode 转换为浮点数FLOAT。
返回值
转换后的浮点数
参数
value
[in] 数据缓冲区的指针
mode
[in] 数据转换的模式
0 --3210
1 --2301
2 --0123
3 --1032
FloatToByteBuf
void CHelper::FloatToByteBuf(BYTE *buf,float data,int mode)类型
Public
目的
把浮点数FLOAT按照mode 转换为4个字节的数据。
返回值
NA
参数
buf
[out] 数据缓冲区的指针.
data
[in] 要转换的浮点数
mode
[in] 数据转换的模式
0 --3210
1 --2301
2 --0123
3 --1032
ByteToASC
void CHelper::ByteToASC( BYTE* buf, BYTE data )
类型
目的
把一个字节的数据转换为两个ASCII码放在buf内。
返回值
NA
参数
buf
[out] 数据缓冲区的指针.
data
[out] 要转换的字节数
ASCToByte
BYTE CHelper::ASCToByte( BYTE* buf )
类型
Public
目的
把缓冲区中的两个ASCII码转换为一个字节数据。
返回值
转换后的字节数据
参数
buf
[in] 数据缓冲区的指针
WordToASC
void CHelper::WordToASC( BYTE* buf, WORD data )类型
Public
目的
把一个字的数据转换为4个ASCII码放在buf内。
返回值
Null
参数
buf
[out] 数据缓冲区的指针data
[in] 要转换的整数
ASCToWord
WORD CHelper::ASCToWord( BYTE* buf )
类型
Public
目的
把缓冲区中的4个ASCII码转换为一个字数据。
返回值
转换后的整数
参数
buf
[in] 数据缓冲区的指针
LongToASC
void CHelper::LongToASC(BYTE *buf ,long data)类型
Public
目的
把一个双字的数据转换为8个ASCII码放在buf内。
返回值。