📄 module2.bas
字号:
Attribute VB_Name = "Module2"
Public Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _
Destination As Any, Source As Any, ByVal Length As Long)
Public Type FixFloat '定点小数
byteArr(3 - 1) As Byte
End Type
Public Type ROM_FILE_HEADER_1d0 'EEPROM头格式1.0
wroteFlag(4 - 1) As Byte 'ZTIC,用来标识是否为写过的EEPROM
version As Single '版本号
fileSize As Long '文件长度,所有数据的大小
crc32 As Long 'CRC32校验,对以下数据进行校验,用于检查文件完整性
bCompress As Byte '是否压缩
fileDate As Double '修改时间,相当于DATE类型,直接赋给 COleDateTime ,然后用COleDateTime的Format("%Y %m %d %H %M %S")得到时间串
recCnt As Long '记录个数,必须小于文件长度
nextRecAddr As Integer '下一条记录的地址,必须小于文件长度,为0表无下一条记录
End Type
'对于1.0版,每条记录有5字节固定信息
Public Type ROM_REC_HEADER_1d0
recLen As Integer '2字节 -- 当前记录长度,必须小于文件长度
nextRecAddr As Integer '2字节 -- 下一条记录起始地址,必须小于文件长度,为0表无下一条记录
unitType As Byte '1字节 -- 硬件单元类型,0 = 板卡描述;1 = AD
End Type
'对于1.0版,板卡描述记录的固定信息
Public Type ROM_REC_CARDDESC_HEADER_1d0
cardDescPreLen As Byte '1字节 -- 板卡描述前缀 PCI, 0无效
cardCode As Long '4字节 -- 板卡代码 8348
cardDescSufLen As Byte '1字节 -- 板卡描述后缀 BJ
unitDesc As Long '4字节 -- 功能类型 1=AD, 2=DA, 4=SW
remarkLen As Long '备注内容长度,用于对板卡各种情况的说明
allRecAddrCnt As Long '4字节 -- 快速索引个数,为0表示未建立快速索引
End Type
'对于1.0版,AD记录的3字节固定信息
Public Type ROM_REC_AD_HEADER_1d0
unitCnt As Byte '1字节 -- AD芯片数=8
bCanCombineAD As Byte '1字节 -- 是否能合并通道采集
rangeTotal As Byte '1字节 -- 有效量程总数
rangeDescAddr As Integer '2字节 --档位地址,0表无地址,每描述1字节
gearTotal As Byte '1字节 -- 速度档数,根据速度分档,对于8348默认分为400K,500K,1M,2M,4M,共5档
gearDescAddr As Integer '2字节 --档位地址,0表无地址,每描述2字节
ampTotal As Byte '1字节 -- 程控增益总数
ampDescAddr As Integer '2字节 --档位地址,0表无地址,每描述1字节
bDescSame As Byte '1字节 -- 所有芯片描述是否相同
ADunitDescAddrOrCnt As Integer '2字节 -- bDescSame = 0代表地址个数,接下来若干字节是地址,0表无AD芯片描述
' bDescSame = 1代表描述地址
End Type
Public Type ROM_REC_AD_UNIT_DESC_1d0
precision As Byte '1字节 -- 每芯片精度,12或16
chCntPerUnit As Byte '1字节 -- 每芯片通道数
maxSpeed As Long '4字节 -- 每芯片最大速度(单位Hz)
ADclock As Long '4字节 -- 每芯片AD时钟(单位Hz)
combineDivisor As Long '4字节 -- 每芯片合并通道分频系数
rangeCntPerUnit As Byte '1字节 -- 每芯片真正用了几个量程
rangeCodeAddr As Integer '2字节 -- 有效量程代码地址
gearCntPerUnit As Byte '1字节 -- 速度档数,0表不
gearCodeAddr As Integer '2字节 --速度地址,0表无地址
ampCntPerUnit As Byte '1字节 -- 程控增益档数,0表不带程控增益
ampCodeAddr As Integer '2字节 --增益代码地址,0表无地址
End Type
Public Type ROM_REC_AD_RANGE_TABLE_DESC_1d0 '带所有档
rangeCode As Byte '1字节 -- 量程代码
voltRangeAddr As Integer '2字节 -- 各量程最大电压范围的首地址,0表与量程代码代表的电压范围一致
hasDefaultVal As Byte '1字节 -- 是否包含默认值
tableAddr As Integer '2字节 -- 线性表首地址
tableItemCnt As Integer '2字节 -- 线性表项数,默认为2
tableItemLen As Integer '2字节 -- 线性表每项长度,默认为3*9 = 27字节
tableItemFieldLen As Byte '1字节 -- 线性表每项中每个数据的长度,默认为3字节,有符号定点小数()
End Type
Public Type ROM_REC_AD_LINEAR_TABLEITEM '每个量程线性表,不包含出厂默认值
inputVolt As FixFloat '输入电压
initCode(8 - 1) As FixFloat '每芯片每档位对应同一个输入电压的原码值
End Type
Public Function FixFloatToSingle(aFixFloat As FixFloat) As Single
'把转化为一个single
'-83886.08(&H800000) -- +83886.07(7FFFFF) '-8388605
' Dim aSingle As Single
Dim aLong As Long
CopyMemory aLong, aFixFloat, 3
aLong = IIf(aFixFloat.byteArr(2) >= &H80, aLong Or &HFF000000, aLong And &HFFFFFF)
FixFloatToSingle = Format(aLong / 100#, "0.00")
End Function
Public Function SingleToFixFloat(aSingle As Single) As FixFloat
'把转化为一个single
'-83886.08(&H800000) -- +83886.07(7FFFFF) '-8388605
'Dim aFixFloat As FixFloat
Dim aLong As Long
aLong = CLng(aSingle * 100#) '-8388607 '&H800001
CopyMemory SingleToFixFloat, aLong, 3
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -