一、 动态库概述
1、 采用RS485通讯方式。
2、 通讯波特率为19200bps。
3、 此动态库可自适应简繁体操作系统。
4、 此动态库要与文件RM.txt联用。
5、 此动态库修改了GatherSendCardData函数,使该函数的输出文件中存放的物理卡号以十进制显示,并且姓名也以汉字显示出来。
6、 修改了在Delphui中使用SetClock函数无法传递数组参数的问题,特增加了一个SetClockStr函数,用于设置响铃点。
7、 修改了在采集打卡数据时及发卡数据时,当选中了“物理卡号以十进制输出”选项后,有些较大的物理卡号会输出为负数的问题。
8、 此动态库在运行时,要有“MSWINSCK.OCX”控件的支持,所以在使用时,请将些控件复制到Windows的“System32”文件夹下,并注册。
9、 五个属性说明:
i. Ver ,String型,只读属性,表示本动态库的版本号,此属性在以前的动态库中就存在。当前的值为:"V7.3 (CopyRight: 2004-05 ~ 2007-08)" ,在引用时,只要判断前四个字符是“V
ii. Mode,Int型,可读可写,为0,表示串口通讯;为1,表示TCP通讯
iii. IP,String型,可读可写,考勤机的IP地址;
iv. TcpPort,Long型,可读可写,考勤机进行TCP连接时的端口号,一般是1001;
v. TcpState,Int型,只读,当前TCP连接的状态,它的取值为:
0 |
缺省的。关闭 |
1 |
打开 |
2 |
侦听 |
3 |
连接挂起 |
4 |
识别主机 |
5 |
已识别主机 |
6 |
正在连接 |
7 |
已连接 |
8 |
同级人员正在关闭连接 |
9 |
错误 |
a)
GatherRecordSum :PC采集打卡数据总条数 √
GatherData :PC采集打卡数据 √
GatherSendCardSum :PC采集发卡名单总条数 √
GatherSendCardData :PC采集发卡数据 √
ClearRecord :清除考勤机全部打卡数据 √
ClearNameList :清除考勤机全部发卡名单 √
CardSendToMachine :PC下传一条发卡名单 √
ClearName :从考勤机的发卡名单中清除某张卡的逻辑卡号 √
SendRecordToMachine :发送一条打卡数据到考勤机上。√
RepairAddress :修改考勤机地址√
SetClock :下传响铃时间表√
RepairSystemParameter :修改系统参数√
ReadCardNum :读取最近一次打卡的物理卡号(即读卡) √
ClearFlag :清除新卡标志√
FindCard :查找此物理卡号是否在机器中与发已卡√
SetPort :设置端口√
DestoryPort :释放端口√
ReadSystemParameter :读取系统参√
ModifyDateTime :修改时间日期 √
SendShortMsg :发送短信到考勤机 ×
GetSounds :设置语音 ×
SetMachinePassword : 设置(修改)机器菜单密码 ×
GetMachinePassword : 取得机器菜单密码 ×
SetClockStr :设置响铃时间(以字符串型式传入参数) √
SendPictureMach :下传开机画面
Set KQ = CreateObject("KQCONNECT_v70.Connect_v70")
函数说明:
1、 GatherRecordSum(ByVal VarAddr As Integer, VarRecordCount As Long, VarDescritption As String) As Boolean
功能说明: PC采集打卡数据总条数
参数: VarAddr为机器地址
VarRecordCount返回的记录总数
VarDescription描述,用此参数可以查看错误信息
返回值: 布尔值True成功,False失败
例子: GatherRecordSum VarAddr, RecordSum, "ok"
2、 GatherData(ByVal VarAddr As Integer, ByVal VarFilePath As String, VarFileName As String, VarDescription As String, BackRecordSum As Long, Optional SleepDate As Long = 2,Optional phStrCardFlg As Long = 0, Optional IsFullYear As Boolean = False) As Boolean
功能说明:PC采集打卡数据
参数: VarAddr为机器地址
VarFilePath文件路径
VarFileName文件名
VarDescription描述,用此参数可以查看错误信息
BackRecordSum 返回记录数
SleepDate 延时设置。(在局域网中采集可能要改变其参数)
phStrCardFlg 输出的物理卡号,默认0十六进制,1为十进制
IsFullYear 为真,表示输出完整年份,如2005,否则输出05
例子: GatherData(TxtAddress.Text, App.Path, "DataRecordSet.txt", "OK", RecordSum, SleepDate.Text)
文件格式如下:三位机器地址+十位物理卡号+(6或8)位年月日+6位时分秒.
3、 GatherRecordSum(ByVal VarAddr As Integer, VarRecordCount As Long, VarDescritption As String) As Boolean
功能说明: PC采集打卡数据总条数
参数: VarAddr为机器地址
VarRecordCount记录数
VarDescription描述,用此参数可以查看错误信息
返回值: 布尔值True成功,False失败
例子: GatherRecordSum TxtAddress.Text, RecordCount, "ok"
4、 GtherSendCardSum(ByVal VarAddr As Integer, VarRecordCount As String) As Boolean
功能说明:PC采集发卡名单总条数
参数: VarAddr为机器地址
VarRecordCount返回的记录总数
返回值: 布尔值True成功,False失败
例子: GatherSendCardSum VarAddr, RecordSum
5、 GatherSendCardData(ByVal varaddr As Integer, ByVal VarFilePath As String, ByVal VarFileName As String, VarDescription As String, BackRecordSum As Long, Optional ByVal SleepDate As Long = 15, Optional ByVal phStrCardFlg As Long = 0) As Boolean
功能说明:PC采集发卡数据
参数: VarAddr为机器地址
VarFilePath文件路径
VarFileName文件名
VarDescription描述,用此参数可以查看错误信息
BackRecordSum记录数
SleepDate延时,单位是毫秒,在局域网中采集可能要将其改大一些一般为10—100之间)
phStrCardFlg 输出的物理卡号,默认0十六进制,1为十进制,此参数可选,为了与以前兼容
返回值: 布尔值True成功,False失败
例子: KQ.GatherSendCardData(TxtAddress.Text,App.Path,"NameList.txt", StrDescription, RecCount1, SleepDate.Text)
文件格式如下:十位物理卡号+8位卡号(即工号)+四个汉字姓名
6、 ClearRecord(ByVal VarAddr As Integer) As Boolean
功能说明:清除考勤机全部打卡数据
参数: VarAddr为机器地址
返回值: 布尔值True成功,False失败
例子: KQ.ClearRecord(CInt(Trim(TxtAddress)))
7、 ClearNameList(ByVal VarAddr As Integer) As Boolean
功能说明:清除考勤机全部发卡名单
参数: VarAddr为机器地址
返回值: 布尔值True成功,False失败
例子: KQ.ClearNameList(CInt(Trim(TxtAddress)))
8、 CardSendToMachine(ByVal varAddr As Integer, ByVal strPhyCard As String, ByVal strCardID As String, ByVal strName As String, ByVal WeekFlag As Integer, ByVal TimeSect As String) As Boolean
功能说明:PC下传一条发卡名单
参数: 共6个
VarAddr 为机器地
strPhyCard 为物理卡号,十进制数表示
strCardID 为工号,8位表示
strName 姓名
WeekFlag 周允许状态,此参数暂时不用传"00"就可以了
TimeSect 时间段,此参数暂时不用传"00000000"就可以了
返回值: 布尔值True成功,False失败
例子:KQ.CardSendToMachine(CInt(TxtAddress.Text), TxtCardNum.Text, Trim(TxtNo.Text), "徐荣华", "00", "00000000")
9、 ClearName (ByVal VarAddr As Integer, ByVal PhyNum As String) As Boolean
功能说明:用来从考勤机的发卡名单中清除某张卡的逻辑卡号
参数: VarAddr为机器地址
PhyNum为物理卡号
返回值: 布尔值True成功,False失败
例子: KQ.clearname(CInt(TxtAddress.Text), Trim(TxtCardNum.Text))
10、 Public Function SendRecordToMachine(ByVal varAddr As Integer, ByVal PhyNum As String, ByVal DateTime As String, Optional ByVal FlagByte As String = "FF", Optional ByVal KeepByte As String = "99") As Boolean
功能说明:发送一条打卡数据到考勤机上。
参数: VarAddr为机器地址
PhyNum 物理卡号 (传进8位十六进制的物理卡号)
DateTime年月日时分秒,格式为:yymmddhhmmss
FlagByte特征字节,默认为FF
KeepByte保留字节,默认为99
返回值: 布尔值True成功,False失败
例子:KQ.SendRecordToMachine(TxtAddress.Text,TxtCardNum.Text, "
11、 RepairAddress (ByVal VarAddr As Integer, ByVal NewAddress As Integer) As Boolean
功能说明:修改考勤机地址
参数: VarAddr为机器旧地址
NewAddress机器新地址
返回值: 布尔值True成功,False失败
例子:KQ.RepairAddress(CInt(TxtAddress.Text), CInt(TxtNewAddr.Text))
12、 SetClock(ByVal VarAddr As Integer, ByRef ITime() As Date, ByVal Sect As String) As Boolean
功能说明:下传响铃时间表总共为30段一次下发10段,分三次下发同SECT这个参数决定。
参数:VarAddr为机器地址
Itime时间
Sect时间段参数1、表第一个10段,2、表第二个10段,3、第三个10段。
返回值:布尔值True成功,False失败
另外请参见:SetClockStr函数,它可以接受字符串参数。
例子:
Dim TimeArry(10) As Date
Dim i As Integer
Dim IHour As String, IMinute As String
Dim MySecond As Long
For i = 0 To 9
If TxtHour(i) <> "" Then
IHour = TxtHour(i).Text
Else
IHour = "0"
End If
If TxtMin(i) <> "" Then
IMinute = TxtMin(i).Text
Else
IMinute = "0"
End If
TimeArry(i) = CDate(IHour + ":" + IMinute)
Next
If KQ.SetClock(CInt(TxtAddress.Text), TimeArry, 1) Then
Sta_Info.SimpleText = "成功"
Else
Sta_Info.SimpleText = "不成功"
End If
End Sub
13、 RepairSystemParameter(ByVal VarAddr As Integer, ByVal JDYS As String, ByVal DKYS As String, ByVal TZZ As String) As Boolean
功能说明:修改系统参数
参数: VarAddr为机器地址
JDYS 继电器延时 2 bytes
DKYS 打卡 延时 2 bytes
TZZ 特征字 2 ytes
0B101905040611402900 0100 03E8 000097
0B 10 19 050406 112947 00 0100 0000 0000 7B
0B101905040611420200010003E8 8000 3E
A + 0FH + 19H + 日期、时间、周 + 响铃/开锁延时2bytes + 打卡延时2bytes + 特征字2bytes + 校验
继电器延时为2个字节,前者对应继电器1/s,后者对应继电器2/s,数值均不超过99(63H),打卡延时为2字节,其值小于1440(
特征字: D7 工作模式 0、考勤模式 1、门禁模式
D6 字体设置 0、简体 1、 繁体
D5 响铃允许 0、禁止响铃 1、允许响铃
D4 开锁模式 0、卡||密码 1、卡+密码
D3 认卡模式 0、发卡有效 1、直接有效
返回值: 布尔值True成功,False失败
例子:RepairSystemParameter(CInt(TxtAddress.Text), Right("0000" & TxtY.Text, 4), "0000", JF)
此函数暂不完善,很容易造成机器故障,请慎用此功能(一般使用出厂时设定)。
14、 ReadCardNum(ByVal VarAddr As Integer, ByRef AllStr As String) As String
功能说明:读取最近一次打卡的物理卡号(即读卡)
参数: VarAddr为机器地址
AllStr读出的全部信息。(内部使用)
返回值: 物理卡号
例子: KQ. ReadCardNum(CInt(Trim(TxtAddress)), AllStr)
15、 ClearFlag(ByVal VarAddr As Integer) As Boolean
功能说明:清除新卡标志
参数:
VarAddr为机器地址
返回值: 布尔值True成功,False失败
例子: ClearFlag(18)
16、 SendPictureMach(ByVal VarAddr As String, ByVal BmpFilePath As String) As Boolean (此函数暂不完整,不允许使用)
功能说明:下传开机画面
参数: VarAddr为机器地址
BmpFilePath文件名
返回值: 布尔值True成功,False失败
例子:KQ.SendPictureMach(TxtAddress.Text, BmpPath)
17、 FindCard(ByVal VarAddr As Integer, ByVal PhyNum As String, CardYN As Boolean) As Boolean
功能说明: 查找此物理卡号是否在机器中已发过卡
参数: VarAddr为机器地址
PhyNum 物理卡号 (传进十进制的物理卡号)
CardYN是否在机器中 (返回标志,True存在,False不存在)
返回值: 布尔值True成功,False失败
例子:FindCard(CInt(TxtAddress.Text), Trim(TxtCardNum.Text), CardYN)
功能说明: 关闭串口
参数: 无
返回值: 布尔值True成功,False失败
19、 SetPort(ByVal intCom As Integer) As Boolean
功能说明: 如果是串口模式,则设置并打开串口;
如果是TCP模式,则连接考勤机
参数: intCom 串口号
返回值: 布尔值True成功,False失败
20、 ReadSystemParameter(ByVal VarAddr As Integer, ByRef BackString As String) As Boolean
功能说明: 读取系统参
参数: VarAddr为机器地址
BackString返回的参数
返回值: 布尔值True成功,False失败
例子:KQ.ReadSystemParameter(TxtAddress.Text, str)
21、 ModifyDateTime(ByVal VarAddr As Integer, ByVal DDate As String, ByVal TTime As String, ByVal WWeek As Byte) As Boolean
功能说明: 修改日期时间
参数: VarAddr为机器地址
Ddate为日期
Ttime为时间
Wweek为星期(做考勤时不用)
返回值: 布尔值True成功,False失败
例子:
DDate = Right(Year(Date), 2) & Right(("00" & Month(Date)), 2) & Right(("00" & Day(Date)), 2)
TTime = Right(("00" & Hour(Time)), 2) & Right(("00" & Minute(Time)), 2) & Right(("00" & Second(Time)), 2)
WWeek = "01"
Mreturn = KQ.ModifyDateTime(CInt(Trim(TxtAddress.Text)), DDate, TTime, WWeek)
If Mreturn Then
Sta_Info.SimpleText = "修改日期成功"
Else
Sta_Info.SimpleText = "修改日期不成功"
End If
24、SendShortMsg(ByVal varaddr As Integer, ByVal TTime As Integer, ByVal MsgStr As String) As Boolean
功能说明: 发送短信到考勤机(此函数暂不提供)
参数: VarAddr为机器地址
Ttime为显示时长
MsgStr为短信内容
返回值: 布尔值True成功,False失败
例子:
If KQ.SendShortMsg(TxtAddress.Text, Text6.Text, TxtMsg.Text) Then
Sta_Info.SimpleText = " 发送短信成功!"
Else
Sta_Info.SimpleText = "发送短信失败!"
End If
25、 GetSounds(ByVal varaddr As Integer, ByVal SoundNum As Integer) As Boolean
此函数主要用于实时监控,如有问题可直接找本公司。
功能说明: 发送语音到考勤机
参数: VarAddr为机器地址
SoundNum为语音号内容为1到8对应语音如下
语音提示:
1:无效卡
2:
3:欢迎你
4:你好
5:生日快乐
6:你迟到了
7:节日快乐
8:注意安全
返回值: 布尔值True成功,False失败
例子:KQ.GetSounds(TxtAddress.Text, SoundNum.Text)
26、 SetMachinePassword(ByVal varaddr As Integer, ByVal nPassword As Integer) As Boolean
功能说明:设置(修改)机器的菜单密码(只适用带按键机型)
参数: VarAddr 为机器地址
nPassword 为要设置的密码,最多4位
返回值: 布尔值True成功,False失败
27、 GetMachinePassword GetMachinePassword(ByVal varAddr As Integer) As Integer
功能说明:读取机器菜单密码(只适用带按键机型)
参数: VarAddr 为机器地址
返回值: 不小于0的整数值,如读取失败,返回-1
28、 SetClockStr(ByVal varAddr As Integer, ByVal strTime As String, ByVal Sect As String) As Boolean
功能说明:下传响铃时间表总共为30段,一次下发10段,如果要下发30段,则要分三次下发。下发哪一段由SECT参数决定。此数功能与SetClock一样,只不过传的参数是字符串。
参数:VarAddr为机器地址
strTime时间字符串,格式为两位小时+两位分钟;
例如:”0800120513301400180020302325”,代表8:00、12:05、13:30、14:00、18:00、20:30、23:25。
Sect时间段参数,可取的值为[1,2,3];取1、表示第一个10段;取2、表示第二个10段;取3、表示第三个10段。
返回值:布尔值True成功,False失败
例子:
Dim i As Integer
Dim IHour As String, IMinute As String
Dim MySecond As Long
strTime = ""
For i = 0 To 9
If TxtHour(i) <> "" Then
IHour = Right("00" & Trim(TxtHour(i).Text), 2)
Else
IHour = "00"
End If
If TxtMin(i) <> "" Then
IMinute = Right("00" & Trim(TxtMin(i).Text), 2)
Else
IMinute = "00"
End If
strTime = strTime & IHour & IMinute
Next
If KQ.SetClockstr(CInt(TxtAddress.Text), strTime, Text7.Text) Then
Sta_Info.SimpleText = "响铃时间设置成功!"
Else
Sta_Info.SimpleText = "响铃时间设置失败!"
End If
Attribute VB_Name = "CheckData_250X"
Option Explicit
'*****************************************************************************
'功能说明:
'根据采集回的数据(*.txt),验证数据的正确性,验证规则:
'1) 读出当前机器内的数据总数(M),与文本文件中的总数(N)比较,如果(N<M或 M=0),则返回False;
'2) 判断数据中的日期时间格式是否合法,如果不是有效的日期时间,则返回False;
'3) 判断最后一笔记录的刷卡时间与当前时间的间隔,如果超过1小时,则返回False;
'4) 动态判断日期时间是否升序排列,如果不是,则返回False;
'5) 此函数一般用在采集完刷卡数据之后。
'修改时间:
'参数:共7个
' VarAddr为机器地址
' VarFilePath文件路径
' VarFileName文件名
' VarDescription描述,用此参数可以查看错误信息
' intDelay 合理的时间间隔,单位是小时
' phStrCardFlg 输出的物理卡号,默认0十六进制,1为十进制,此参数可选,为了与以前兼容
' IsFullYear 为真,表示输出完整年份,如2005,否则输出05
'返回值: 整型,
'0-表示数据正常;
'1- 表示总条数小于机器内的条数;
'2- 表示有乱数据;
'3- 表示最后一笔记录的刷卡时间离现在间隔过长;
'4- 日期时间没有按升序排列
'-1,表示其他异常,具体异常可查看VarDescription变量的值。
'*****************************************************************************
Public Function CheckData( _
ByVal varAddr As Integer _
, ByVal VarFilePath As String _
, ByVal VarFileName As String _
, ByRef VarDescription As String _
, Optional ByVal intDelay As Integer = 24 _
, Optional ByVal phStrCardFlg As Long = 0 _
, Optional ByVal IsFullYear As Boolean = False _
) As Integer
Dim lngSum_Mach As Long '机器中的总条数
Dim i As Long, J As Long
Dim intRow As Long
Dim strFile As String
Dim Nfile As Integer
Dim strTemp As String
Dim strMachine As String '机器号
Dim strPhyCardID10 As String '10位10进制物理卡号
Dim strPhyCardID8 As String '8位16进制物理卡号
Dim strRecoString As String
Dim strDateTime As String '完全日期时间
Dim strDate As String
' Dim strTime As String
Dim datLastTime As Date '最后打卡时间
Dim datTemp As Date '存放上一条的打卡时间
On Error GoTo Err2
CheckData = -1
'先?出????
Sleep (2000)
DoEvents
If GatherRecordSum(varAddr, lngSum_Mach, "ok") = False Then
CheckData = -1
VarDescription = "采集总条数失败 "
Exit Function
End If
If lngSum_Mach <= 0 Then
CheckData = 1
VarDescription = "采集出的总条数是0 "
Exit Function
End If
'打开文件,进行校对
strFile = VarFilePath & "\" & VarFileName
If Dir(strFile) = "" Then
CheckData = -1
VarDescription = "文件找不到," & strFile
Exit Function
End If
intRow = 0
datLastTime = CDate("
datTemp = CDate("
Nfile = FreeFile()
Open strFile For Input As #Nfile
Do While Not EOF(Nfile) ' 循环至文件尾。
Line Input #Nfile, strTemp ' 读入一行数据并将其赋予某变量。
Debug.Print strTemp ' 在立即窗口中显示数据。
intRow = intRow + 1
If Len(strTemp) < 23 Then
Close #Nfile
CheckData = 2
VarDescription = "有乱数据,第" & intRow & "行 "
Exit Function
End If
strRecoString = Left(strTemp, 23) '读取23位长度的记录
strMachine = Mid(strRecoString, 1, 3) '机器号
strPhyCardID8 = Mid(strRecoString, 4, 8) '8位16进制物理卡号
strPhyCardID10 = Right("0000000000" & CLng("&H" & strPhyCardID8), 10) '10位10进制物理卡号
strDateTime = "20" & Mid(strRecoString, 12, 2) & "-" & Mid(strRecoString, 14, 2) & "-" & Mid(strRecoString, 16, 2) & " " & Mid(strRecoString, 18, 2) & ":" & Mid(strRecoString, 20, 2) & ":" & Mid(strRecoString, 22, 2)
strDate = "20" & Mid(strRecoString, 12, 2) & "-" & Mid(strRecoString, 14, 2) & "-" & Mid(strRecoString, 16, 2)
' strTime = Mid(strRecoString, 18, 2) & ":" & Mid(strRecoString, 20, 2) & ":" & Mid(strRecoString, 22, 2)
'如果时间格式不对,则记录错误
If IsDate(Format(strDateTime, "yyyy-MM-dd hh:mm:ss")) = False Or _
IsDate(Format(strDate, "yyyy-MM-dd")) = False Then
Close #Nfile
CheckData = 2
VarDescription = "有乱数据,第" & intRow & "行 "
Exit Function
End If
datLastTime = CDate(Format(strDateTime, "yyyy-MM-dd hh:mm:00")) '
If datTemp > datLastTime Then
CheckData = 4 '没有按递增顺序
VarDescription = "没有按递增顺序,位置:" & intRow
Else
datTemp = datLastTime
End If
Close #Nfile ' 关闭文件。
If intRow < lngSum_Mach Then
CheckData = 1
VarDescription = "文本文件中的总条数小于机器内的总条数,文件内" & intRow & "条,机器内" & lngSum_Mach & "条"
Exit Function
End If
If DateAdd("n", intDelay * 60, datLastTime) < Now Then
CheckData = 3
VarDescription = "最后一条数据的时间距离现在超过" & intDelay & "小时,最后时间为:" & datLastTime
Exit Function
End If
'能执行到这里,而没被改变,则说明数据合法
If CheckData = "-1" Then
CheckData = 0
End If
Exit Function
Err2:
CheckData = -1
VarDescription = Err.Description
End Function