PB 中读取地磅称量数据
在 PB 开发企业应用时我们经常会遇到与仪器仪表接口的处理,这里我总结了一下与地磅接口读取称量数据的方法。
一般的地磅都有以下的参数组成:
串口编号
串口参数
时钟周期
读数长度
读字符串起始位
读字符串长度
首末位字符标志
首末位判断 ( 是否从首位起读 ) '0' 为首位
字符串是否反序
编码类型 (1.ASCII 2.BCD 3. 其他 )
当前使用的大多数地磅都是使用串口与计算机连接的,仪表在其每一个时钟周期发送一次数据到串口,处理程序需要在设备的每个时钟周期读取仪表数据(在 PB 中是使用 timer 来处理的)。
从串口取数方法很多,可以直接用 API 读取,也可以用第三方空间读取,在此就不在描述了。这里主要描述一下对数据的分析处理过程,分别对应 ASCII 编码和 BCD 编码。
ASCII 编码的数据处理过程(相对比较简单):
1. 读取串口数据(一般读取后的是 Blob 类型,需要转换成 String 类型使用)。
2. 根据仪表参数( 读字符串起始位,读字符串长度,首末位字符标志 )截取数值字串。
3. 如果仪表参数指示需要对读取的字串反序处理就对截取后的字串进行反序处理。
4. 显示字串。
BCD 编码的数据处理过程(相对复杂):
使用 BCD 编码的仪表可能各厂家的是不一样的,具体实现要参照仪表的技术资料。
大多数使用 BCD 编码的是一位标志位,一位状态位,三个 BCD 数字位(低位在前),以前描述的就是这种类型。
BCD 是一种压缩数字存储方式,每 4 个二进制位存放一个
BCD 码数值采用压缩格式 , 用一个字节来存放两位数字 .
数值 99BCD 码的存储方法如下 ( 以数值 99 压缩后的表现为例 ):
二进制表示 1001 1001
ASCII 码字符表示 153
十六进制字符表示 0x99
压缩存储是采用把一个字节分成两部分来存储数据 , 高 4 位和低 4 位各存储一位数字
PB 中二进制操作不方便 , 所以本方法采用将 ASCII 值转为 16 进制字符取其两位数字的方法。
1. 读取串口数据(使用 Blob 读取)
2. 将 Blob 数据逐个字段转换为 String 类型在转换为 ASCII 编码字符串,并且每个 ASCII 编码之间用一个符号 ( 不能是仪表使用的符号 ) 分割,新的字串末尾需要一个符号位。
3. 在字串中查找格式标志检查这个时钟周期是否收到格式数据,没有收到格式数据停止处理等待下一个时钟周期。
4. 一般字串的第一位为状态位,取出状态位处理。
状态位的值为一个 ASCII 码值,我们对 ASCII 码值进行算术运算加简单的判断即可取出状态信息,程序如下:
if li_State > 128 then li_State -= 128 // 数据溢出
if li_State > 64 then li_State -= 64 // 稳定
if li_State > 32 then li_State -= 32 // 符号
if li_State > 16 then // 单位:吨
li_State -= 16
ls_Unit = "T"
end if
if li_State >= 8 then li_State -= 8 // 重量 , 此时 li_State 为小数符号位
5. 取出 BCD1 处理:将 ASCII 码值转换为 16 进制在将 16 进制字符的两位作为数字转换为两位数的数值,并保存 BCD1 数值。(此时两位数位个位和十位)
6. 取出 BCD2 处理:同 BCD1 。(此时两位数位百位和千位)
7. 取出 BCD3 处理:同 BCD1 。(此时两位数位万位和十万位)
8. 合并转换后的三个 BCD 位的数值: BCD = BCD3 * 10000 + BCD2 * 100 + BCD1
9. 处理小数位:此时的小数位位数存放于状态位 ASCII 值算术处理的后的结果 li_State 中,所以只要执行操作: BCD = BCD / 10 ^ li_State 即可。
10. 处理单位换算,如果单位为吨则执行操作: BCD = BCD * 10 ^ 3
11. 显示仪表数据。
以上为读取地磅数据中最关键的部分内容,希望大家多提宝贵意见。