⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hwcb_yn_auto.prg

📁 Powerbuilder开发的抄表器接口程序
💻 PRG
📖 第 1 页 / 共 2 页
字号:
		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 + -