📄 hwcb_yn_auto.prg
字号:
clear
skip -1
if bof()
k = Show2LnBox('已到首条记录', '按"确定"键继续')
go top
endif
endif
return
***********************移到下一条记录*****************
procedure NextRecord
if bof()
return
endif
if eof()
k = Show2LnBox('已到记录末尾', '按"确定"键继续')
go bottom
else
redraw = .T.
scanNeeded = .T.
clear
skip
if eof()
k = Show2LnBox('已到记录末尾', '按"确定"键继续')
go bottom
endif
endif
return
***************根据帮助变量显示帮助信息******************
procedure HelpHdl
colsave=_color(7) &&保存当前颜色并设颜色为黑底白字
do case
case helpContext = 1
do _LcdWinOpen with 0,0, 127,127, 13, 16
*打开液晶窗口(0,0)-(127,127),13行16列
do _LcdPullMode with 0 &&设置屏幕不随光标滚动
? '帮助'
? '用切换+箭头浏览'
? '功能 -- 主菜单'
? '确定 -- 抄 表'
? '删除-设异常情况'
? '↑ - 上一条记录'
? '← - 未抄首记录'
? '↓ - 下一条记录'
? '→ - 暂未定义'
? '+ - 按卡本查询'
? '- - 按户号查询'
? '* - 按表号查询'
? '/ - 按表箱号查'
do while inkey(0) # KEY_ESC
enddo
do _LcdWinClose &&关闭液晶窗口
case helpContext = 2
do Show2LnBox with '请输入本月', '抄表读数'
endcase
do _color with colsave &&恢复颜色
*注意:当返回值没用时,函数可用DO...WITH...形式调用
return
******************主菜单*************************
procedure MainMenu
do _LcdWinOpen with 5,20, 122,106, 8,16
do _ShowCursor
@0,0 prompt '1.密码保护'
@1,0 prompt '2.定位方式'
@2,0 prompt '3.统计信息'
@3,0 prompt '4.数据通讯'
@4,0 prompt '5.电池容量'
@5,0 prompt '6.抄表情况'
@6,0 prompt '7.退出系统'
menu to m
do _LcdWinClose
return m
&&//////////////////////提示是否要求进行红外抄表/////////////////////////
procedure menu_calc
do _lcdwinopen with 0,0, 127,127, 8,20
@2,0 say '选择采集数据方式'
@3,0 prompt '1. 使用红外抄'
@4,0 prompt '2. 手工输入数'
menu to m
do _LcdWinClose
return m
*******************红外电表*****************************
&&////////////////ASC字符转换为BCD码////////////////////////
PROCEDURE Trans
PARAMETER DSTR,BM
DL=LEN(DSTR)
HSTR=''
I=1
DO WHILE I<=DL
B=SUBSTR(DSTR,I,1)
A=ASC(B)+BM
IF A < 0
A = 256+A
ENDIF
HSTR=HSTR+_HEXSTR(A,2)
I=I+1
ENDDO
RETURN HSTR
&&////////////////低字节在前,高字节在后//////////////////////
PROCEDURE upset
PARAMETER c,n
I=2*n-1
CC=''
DO WHILE I>=1
CC=CC+SUBSTR(c,I,2)
I=I-2
ENDDO
RETURN CC
&&///////////////////////////////////////////////////////////
&&////////////////////准备通讯//////////////////////////////
procedure ready
do _LcdWinClose
do _lcdwinopen with 0,0, 127,127, 8,20
@1,0 say '对准电表按键通讯'
x=inkey(0)
do _LcdWinClose
return
&&//////////////////输入表号////////////////////////////////
procedure inputMeterNO
PARAMETER tmpbh01
do _LcdWinClose
do _lcdwinopen with 0,0, 127,127, 8,20
@ 0,0 say '通讯失败的原因:'
@ 1,0 say '1.表号错误'
@ 2,0 say '2.角度和距离错误'
@ 3,0 say '3.表计型号选择错误'
@ 4,0 say '请表号:'
@ 5,0 say '按[确定]取通用号'
@ 6,0 say tmpbh01
accept to tmpbh01
if len(tmpbh01)=0
tmpbh01='AAAAAAAAAAAA'
else
tmpbh01=right('000000000000' + tmpbh01,12)
endif
do _LcdWinClose
return tmpbh01
&&/////////////////////////////取电量数据块////////////////////////
PROCEDURE DSP_DDS63
para tmpkzz,mystr001
private DD0,DD1,DD2,DD3,DD4 &&总尖峰平谷电量
tempSTR0 = LEFT(mystr001,4)
tempSTR0 = Trans(tempSTR0,-51)
tempSTR0 = UPSET(tempSTR0,4)
do case
case tmpkzz = 'C034'
tempSTR0 = LEFT(tempSTR0,6) + RIGHT(tempSTR0,2)
case left(tmpkzz,1) = '9'
tempSTR0 = LEFT(tempSTR0,6) + '.' + RIGHT(tempSTR0,2)
otherwise
tempSTR0 = mystr001
endcase
RETURN tempSTR0
&&////////////////////读取数据/////////////////////////////////////////
&&功能:输入标识,进行读取数据
&&flag 是控制字
&&tmpbh002 格式化表号
&&读取宇能dds63电表
procedure Read_hwsj
parameter tcommand,tmpbh002
tflag = tcommand
I=13
NEW_YBH=''
MYCS=0
DO WHILE I>1
I=I-2
NEW_YBH=NEW_YBH + CHR(_HEXVAL(SUBSTR(tmpbh002,I,2)))
MYCS=MYCS + _HEXVAL(SUBSTR(tmpbh002,I,2))
ENDDO
MYCS=MYCS+51+51+_HEXVAL(SUBSTR(tflag,1,2))+_HEXVAL(SUBSTR(tflag,3,2))
MYCS=mod(MYCS+208+03,256)
tflag=CHR(51+_HEXVAL(SUBSTR(tflag,3,2)))+CHR(51+_HEXVAL(SUBSTR(tflag,1,2)))
cmd1=^254+^254+^254+^104+NEW_YBH+^104+^01+^02 +tflag+chr(MYCS)+^22
do _LcdWinClose
do _lcdwinopen with 0,0, 127,127,10,34
@1,0 say '开始通讯...'
do delay with 10
do inicom with 2 &&初始化端口
do _SENDAUXSTR WITH cmd1 &&发送命令
row = 2
if tcommand = 'C034'
@row,0 say '读取表号...'
row = row + 1
else
@row,0 say '表号:'+tmpbh002+'...'
row = row + 1
@row,0 say '控制字:'+tcommand
row = row + 1
@row,0 say trim(item_name)
row = row + 1
endif
@row,0 say '接收数据...'
row = row + 1
myfs=_RECVAUXSTR(len(cmd1),-1) &&接收字符串(避免红外反射),不等待
tmpdata = check_rd_dds63(row) &&检查数据并返回数据
tmpdata = DSP_DDS63(tcommand,tmpdata) &&取读数
do _LcdWinClose
do show2lnbox with '测试表号',tmpdata
return tmpdata
&&////////////////////以上为读数据/////////////////////////////////////
&&//////////////////////////初始化端口/////////////////////////////////
procedure IniCom
para tt
do delay with 10
do _DISABLERX
do delay with 10
DO _IRPOWERCTRL WITH 1 &&红外通讯参数设置
DO _SETIRMFREQ WITH 38000 &&红外调制速率
DO _SETIROUTPUT WITH 2
do case
case tt=0
Do _SETCOM with 179,1,300
case tt=1
Do _SETCOM with 179,1,600
case tt=2
Do _SETCOM with 179,1,1200 && 1_Ir 2_Com
case tt=3
Do _SETCOM with 179,1,2400
case tt=4
Do _SETCOM with 179,1,4800
case tt=5
Do _SETCOM with 179,1,9600
endcase
do delay with 10
DO _ENABLERX WITH 0
do delay with 10
return
&&/////////////////////////////检查接收的数据帧///////////////////////////
PROCEDURE check_rd_dds63
PARAM row_err
I=1
MYSTR=''
DO WHILE .T.
RESTR=_RECVAUXSTR(1,1)
DO CASE
CASE RESTR=^104 && 68H
EXIT
CASE I>5
CONFIRM=.F.
do ErrorCenter with 1,row_err
RETURN ''
ENDCASE
I=I+1
ENDDO
RESTR=RESTR+_RECVAUXSTR(9,1)
MYLEN=asc(RIGHT(RESTR,1))
RESTR=RESTR+_RECVAUXSTR(MYLEN+2,1)
CHKS1=_SUMSTR(LEFT(RESTR,MYLEN+10))
CS2=ASC(SUBSTR(RESTR,MYLEN+11,1))
CC=ASC(SUBSTR(RESTR,9,1))
DO CASE
CASE CS2=CHKS1 .AND. ( CC=129 .or.CC=132)
MYSTR=SUBSTR(RESTR,13,MYLEN-2)
CONFIRM=.T.
DO _BEEP WITH 1
OTHERWISE
CONFIRM=.F.
do ErrorCenter with 1,row_err
RETURN ''
ENDCASE
RETURN MYSTR
&&/////////////////////////////以上为检查接收的数据帧///////////////////////
&&////////////////////错误处理程序//////////////////////////////////
procedure ErrorCenter
para tt,row_err11
return
do case
case tt=1
@row_err11,0 say '通讯失败....'
row_err11 = row_err11 + 1
@row_err11,0 say '请重新通讯...'
case tt=2
@row_err11,0 say '内存申请失败....'
row_err11 = row_err11 + 1
@row_err11,0 say '请关闭机器...'
endcase
return
procedure CloseCom
DO _DISABLERX &&禁止红外通讯
DO _IRPOWERCTRL WITH 0 &&关闭红外电源
return
&&/////////////////////////////延时功能////////////////////////////////
procedure delay
param tt
i=0
do while i<tt
i=i+1
enddo
return
&&////////////////////////格式化表号///////////////////////////////////
procedure mask_bh
param tmphb003
tmphb003 = trim(tmphb003)
i = len(tmphb003)
j = 12
tmp = ''
j = i
do while j < 12
tmp = tmp + '0'
j = j + 1
enddo
tmp = tmp + tmphb003
return tmp
**************查找表号***********************
procedure auto_find_bh
param tmpbh003
go top
clear
i = 0
?'正在查找'
tbh = trim(tmpbh003)
c = Recno()
tbh = RTrim(Upper(tbh))
f = _FastLocate('serial_id', '=',tbh, c)
if f
return .t.
else
do while .t.
if len(tbh) = 1
exit
endif
if mod(i,2) = 0
?'正在查找...'
endif
i = i + 1
tbh = right(tbh,len(tbh) - 1)
f = _FastLocate('serial_id', '=',tbh, c)
enddo
clear
l = Show2LnBox('表号:'+tmpbh003,'未下载用户的抄表数据')
return .f.
endif
return .t.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -