📄 js520a.c
字号:
void SetTarrif(ULLONG devID, ULONG pPswd)
{
OS_WIN *w0,*w1;
OS_CALENDAR p;
UBYTE s[20],k,i,t[12][20];
ULLONG nID;
ULONG sele;
sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
sele = 0;
while(1){
for(i=0;i<12;i++) {
sprintf(t[i],"%02d--%02X:%02X 费率%02X",i+1,tr[i][2],tr[i][1],tr[i][0]);
}
k = OSListInWin(w0,2,2,9,20,0,19,&sele,12,1,&t[0][0]);
if(k==K_ESC) break;
else if(k==K_ENTER) {
for(i=0;i<12;i++){
if(tr[i][0] > 0x04){ break; }
}
if(DLT645_Write(4,devID,0xC33F,pPswd,&tr[0][0],i*3,2000,3)==0) {
OSMessageBox("修改显示选择","修改成功!","任意键返回...");
}
}
else if(k==K_HYPHEN){
w1 = OSCreatSubWindow(8,32,100,64,1,1,"修改时段表");
sprintf(s,"输入时段%d:",sele+1);
OSDrawInWin(w1,2,4,s,3,0);
OSDrawInWin(w1,2,16,"[时:分 费率]",3,0);
s[0]=0;
k = OSEntryInWin(w1,2,32,6,s,0,0,1); //输入
if(k==K_ENTER){
tr[sele][2] = (s[0]<<4)+(s[1]&0xF);
tr[sele][1] = (s[2]<<4)+(s[3]&0xF);
tr[sele][0] = (s[4]<<4)+(s[5]&0xF);
}
CloseSubWindow(w1);
}
}
CloseSubWindow(w0);
}
void SetStore(ULLONG devID,ULONG pPswd)
{
OS_WIN *w0;
UBYTE k,d[8],s[20];
ULLONG nID;
sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
OSDrawInWin(w0,2,14,"请输入抄表日:",3,0);
OSDrawInWin(w0,24,34,"[日:时]",3,0);
d[0]=0;
k = OSEntryInWin(w0,26,50,4,d,0,0,1);
if(k==K_ENTER){
s[1] = (d[0]<<4)+(d[1]&0xF);
s[0] = (d[2]<<4)+(d[3]&0xF);
if(DLT645_Write(4,devID,0xC117,pPswd,s,2,1000,3)==0) {
OSMessageBox("修改抄表日","修改成功!","任意键返回...");
}
}
CloseSubWindow(w0);
}
void ReadPswd(ULLONG devID)
{
OS_WIN *w0;
UBYTE k;
UBYTE d[16],c[3],s[20];
sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
while(1){
if(DLT645_Read(4,devID,0xC1EE,d,12,1000,3)<0) break;
sprintf(s,"清零密码: %02X%02X%02X-%02X",d[3],d[2],d[1],d[0]);
OSDrawInWin(w0,2,30,s,3,0);
sprintf(s,"编程密码: %02X%02X%02X-%02X",d[7],d[6],d[5],d[4]);
OSDrawInWin(w0,2,44,s,3,0);
OSDrawInWin(w0,2,100,"任意键返回...",3,0);
OSWaitKey();
break;
}
CloseSubWindow(w0);
}
void ReadEE(ULLONG devID)
{
OS_WIN *w0;
UBYTE k;
UBYTE d[16],c[3],s[20];
UWORD addr;
sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
while(1){
OSDrawInWin(w0,2,4,"输入地址",3,0);
d[0] = 0;
k = OSEntryInWin(w0,14,20,6,d,0,0,1);
if(k==K_ESC) break;
else if(k==K_ENTER){
addr = (UWORD)atol(d);
addr = (addr&0xFF) + 0xFF00;
}
if(DLT645_Read(4,devID,addr,d,18,1000,3)<0) break;
sprintf(s,"00: %02X%02X%02X%02X",d[0],d[1],d[2],d[3]);
OSDrawInWin(w0,2,12,s,3,0);
sprintf(s,"04: %02X%02X%02X%02X",d[4],d[5],d[6],d[7]);
OSDrawInWin(w0,2,24,s,3,0);
sprintf(s,"08: %02X%02X%02X%02X",d[8],d[9],d[10],d[11]);
OSDrawInWin(w0,2,36,s,3,0);
sprintf(s,"0C: %02X%02X%02X%02X",d[12],d[13],d[14],d[15]);
OSDrawInWin(w0,2,48,s,3,0);
OSDrawInWin(w0,2,100,"任意键返回...",3,0);
OSWaitKey();
break;
}
CloseSubWindow(w0);
}
void ClrAll()
{
OS_WIN *w0;
UBYTE s[64],r[32],k;
OS_CALENDAR p;
UWORD d[8] ={ 0x0000,0x0000,0x0FFF,0x0FFF,0x0000,0x0000,0x0FFF,0x0FFF };
w0 = OSCreatSubWindow(0,0,128,128,1,1,"电表初始化");
s[7] = 0x00;
s[8] = 0x56;
s[9] = 0x34;
s[10] = 0x12;
s[11] = 0x01;
s[12] = 0x56;
s[13] = 0x34;
s[14] = 0x12;
sprintf(r,"密码 : %02X%02X%02X%02X",s[10],s[9],s[8],s[7]);
OSDrawInWin(w0,2,36,r,3,0);
sprintf(r," %02X%02X%02X%02X",s[14],s[13],s[12],s[11]);
OSDrawInWin(w0,2,48,r,3,0);
s[15] = 0x00;
s[16] = 0x01; //抄表日: 1日0点
sprintf(r,"抄表日: %02X:%02X",s[16],s[15]);
OSDrawInWin(w0,2,8,r,3,0);
s[17] = 0x10;
s[18] = 0x00;
s[19] = 0x7F;
sprintf(r,"循显 : %02X%02X%02X",s[17],s[18],s[19]);
OSDrawInWin(w0,2,22,r,3,0);
//-----------------
s[20] = 0x06;
s[21] = 0x02;
s[22] = 0x00;
s[23] = 0x07;
s[24] = 0x04;
s[25] = 0x00;
s[26] = 0x22;
sprintf(r,"时段数: %02X",s[20]/3);
OSDrawInWin(w0,2,64,r,3,0);
sprintf(r,"%02X:%02X 费率%02X",s[23],s[22],s[21]);
OSDrawInWin(w0,12,76,r,3,0);
sprintf(r,"%02X:%02X 费率%02X",s[26],s[25],s[24]);
OSDrawInWin(w0,12,88,r,3,0);
while(1){
OSDrawInWin(w0,2,100,"ECS退出,其它发送",3,0);
OSKeyBufClr();
k = OSWaitKey();
if(k==K_ESC) break;
OSGetCalendar(&p);
s[0] = hex2bcd(p.second);
s[1] = hex2bcd(p.minute);
s[2] = hex2bcd(p.hour);
s[3] = 0; //week
s[4] = hex2bcd(p.day);
s[5] = hex2bcd(p.month);
s[6] = hex2bcd(p.year%100);
DLT645(4,0x999999999999,0xFE,s,27,r,0,0);
BuzzPlay(12,120,5);
}
CloseSubWindow(w0);
}
//------------------------------------------
void SetMeter(void)
{
OS_WIN *w0;
UBYTE k;
ULONG sele;
ULLONG a;
w0 = OSCreatSubWindow(0,0,128,126,1,1,"设置电表数据");
while(1){
k = OSMenuInWin(w0,2,1,19,9,&sele,13,1," 1.设置初始编号"," 2.设置密码"," 3.广播校时"," 4.电表清零"," 5.设置时间"," 6.设置出厂表号"," 7.设置局编号"," 8.显示选择"," 9.设置时段表"," 10.设置抄表日","11. 读密码","12. 读EE"," 13.电表初始化");
if(k==K_ESC) break;
else if(k==K_HYPHEN){
a = DLT645_InputID();
if(a<0x1000000000000) devID = a;
sele = DLT645_InputPswd(0);
if(sele!=0xFFFFFFFF) ClrPswd = (sele<<8);
sele = DLT645_InputPswd(1);
if(sele!=0xFFFFFFFF) PgmPswd = (sele<<8)+1;
}
else if(k==K_ENTER){
switch(sele){
case 0: SetIniID(devID); break;
case 1: SetPassword(devID,ClrPswd,PgmPswd); break;
case 2: CorrectTime(); break;
case 3: SetPower(devID,ClrPswd); break;
case 4: SetTime(devID,PgmPswd); break;
case 5: SetMtID(devID,PgmPswd); break;
case 6: devID = SetDevID(devID,PgmPswd); break;
case 7: SetDisplay(devID,PgmPswd); break;
case 8: SetTarrif(devID,PgmPswd); break;
case 9: SetStore(devID,PgmPswd); break;
case 10: ReadPswd(devID); break;
case 11: ReadEE(devID); break;
case 12: ClrAll(); break;
default: break;
}
}
}
CloseSubWindow(w0);
}
//--------------------------------------------------------------
//--------------------------------------------------------------
void ComSele(void)
{
OS_WIN *w0;
UBYTE k;
ULONG sele;
w0 = OSCreatSubWindow(20,60,88,46,1,1,"选择串口");
if(Global_ComNum==4) sele = 1;
else sele = 0;
k = OSMenuInWin(w0,4,4,12,2,&sele,2,1,"电力红外接口","RS485接口");
if(k==K_ENTER){
if(sele==0) Global_ComNum = 1; //TVIR
else if(sele==1) Global_ComNum = 4; //RS485
else Global_ComNum = 1;
OSComIni(Global_ComNum,1200,1,0,1,8);
}
CloseSubWindow(w0);
}
//--------------------------------------------------------------
//--------------------------------------------------------------
void ReadMeter(void)
{
OS_WIN *w0;
OS_DBF *rd;
OS_FIELD *id,*rflag,*rtime,*rdata;
OS_CALENDAR p;
FIELD fld,fld1;
UBYTE k,d[40];
ULONG sele;
ULLONG devid = 0xAAAAAAAAAAAA;
w0 = OSCreatSubWindow(0,0,128,128,1,1,"日常抄表");
OSDrawInWin(w0,16,32,"正在分析数据...",3,0);
rd = (OS_DBF*)OSDBFOpen(0,0,"read.dbf");
if(rd==0){
OSMessageBox("打开数据库","打开失败!" ,"任意键返回...");
CloseSubWindow(w0);
return;
}
id = OSDBFFieldSearch(rd,"METERID");
if(id==0) {
OSMessageBox("打开数据库","数据库字段错!" ,"任意键返回...");
OSDBFClose(rd);
CloseSubWindow(w0);
return;
}
rflag = OSDBFFieldSearch(rd,"RFLAG");
if(rflag==0) {
OSMessageBox("打开数据库","数据库字段错!" ,"任意键返回...");
OSDBFFieldFree(id);
OSDBFClose(rd);
CloseSubWindow(w0);
return;
}
rtime = OSDBFFieldSearch(rd,"RTIME");
if(rtime==0) {
OSMessageBox("打开数据库","数据库字段错!" ,"任意键返回...");
OSDBFFieldFree(rflag);
OSDBFFieldFree(id);
OSDBFClose(rd);
CloseSubWindow(w0);
return;
}
rdata = OSDBFFieldSearch(rd,"RDATA");
if(rdata==0) {
OSMessageBox("打开数据库","数据库字段错!" ,"任意键返回...");
OSDBFFieldFree(rtime);
OSDBFFieldFree(rflag);
OSDBFFieldFree(id);
OSDBFClose(rd);
CloseSubWindow(w0);
return;
}
while(1){
k = OSMessageBox("抄表","请对准要抄收的电表." ,"ENTER键抄表...");
if(k==K_ENTER){
devid = 0xAAAAAAAAAAAA;
if(DLT645_Read(4,devid,0xC033,d,6,1000,3)<0){
OSMessageBox("数据抄收","读回电表编号失败!","任意键继续...");
continue;
}
devid = (ULLONG)d[0]+((ULLONG)d[1]<<8)+((ULLONG)d[2]<<16)+((ULLONG)d[3]<<24)+((ULLONG)d[4]<<32)+((ULLONG)d[5]<<40);
for(k=0;k<250;k++) fld1.C.data[k] = 0xFF;
if(DLT645_Read(4,devid,0x901F,d,16,1000,3)<0) continue;
bcd2ascii(d,fld1.C.data,16);
if(DLT645_Read(4,devid,0x9020,d,4,1000,3)<0) continue;
bcd2ascii(d,&fld1.C.data[32],4);
if(DLT645_Read(4,devid,0xB020,d,4,1000,3)<0) continue;
bcd2ascii(d,&fld1.C.data[40],4);
if(DLT645_Read(4,devid,0xB021,d,3,1000,3)<0) continue;
bcd2ascii(d,&fld1.C.data[48],3);
if(DLT645_Read(4,devid,0xB210,d,4,1000,3)<0) continue;
bcd2ascii(d,&fld1.C.data[54],4);
if(DLT645_Read(4,devid,0xB212,d,2,1000,3)<0) continue;
bcd2ascii(d,&fld1.C.data[62],2);
if(DLT645_Read(4,devid,0xC010,d,4,1000,3)<0) continue;
bcd2ascii(d,&fld1.C.data[66],4);
if(DLT645_Read(4,devid,0xC011,d,3,1000,3)<0) continue;
bcd2ascii(d,&fld1.C.data[74],3);
if(DLT645_Read(4,devid,0xC020,d,1,1000,3)<0) continue;
bcd2ascii(d,&fld1.C.data[80],1);
if(DLT645_Read(4,devid,0xC030,d,3,1000,3)<0) continue;
bcd2ascii(d,&fld1.C.data[82],3);
if(DLT645_Read(4,devid,0xC032,d,6,1000,3)<0) continue;
bcd2ascii(d,&fld1.C.data[88],6);
if(DLT645_Read(4,devid,0xC117,d,2,1000,3)<0) continue;
bcd2ascii(d,&fld1.C.data[100],2);
if(DLT645_Read(4,devid,0xC33F,d,36,1000,3)<0) continue;
bcd2ascii(d,&fld1.C.data[104],36);
OSDrawInWin(w0,16,32,"抄表完成,正在存贮...",3,0);
//------------------------------------------
sele = 0;
while(1){
if(OSDBFFieldRead(rd,id,sele,&fld)==0){
if(fld.N.data == devid){ //正确, 存贮数据
fld.C.data[0] = '1';
OSDBFFieldWrite(rd,rflag,sele,&fld);
OSGetCalendar(&p); //读当前时钟
fld.T.year = p.year;
fld.T.month = p.month;
fld.T.day = p.day;
fld.T.week = p.week;
fld.T.hour = p.hour;
fld.T.minute = p.minute;
fld.T.second = p.second;
OSDBFFieldWrite(rd,rtime,sele,&fld);
OSDBFFieldWrite(rd,rdata,sele,&fld1);
OSMessageBox("数据抄收","抄收成功!","任意键继续...");
break;
}
else sele++; //不是本记录
}
else{ //末找到,增加一条记录
if(OSDBFRecordAdd(rd)==0){
fld.N.data = devid;
OSDBFFieldWrite(rd,id,sele,&fld);
fld.C.data[0] = '1';
OSDBFFieldWrite(rd,rflag,sele,&fld);
OSGetCalendar(&p); //读当前时钟
fld.T.year = p.year;
fld.T.month = p.month;
fld.T.day = p.day;
fld.T.week = p.week;
fld.T.hour = p.hour;
fld.T.minute = p.minute;
fld.T.second = p.second;
OSDBFFieldWrite(rd,rtime,sele,&fld);
OSDBFFieldWrite(rd,rdata,sele,&fld1);
OSMessageBox("数据抄收","抄收成功!","任意键继续...");
break;
}
else {
OSMessageBox("数据抄收","磁盘已满!","任意键返回...");
}
}
}
}
else break;
}
OSDBFFieldFree(rdata);
OSDBFFieldFree(rtime);
OSDBFFieldFree(rflag);
OSDBFFieldFree(id);
OSDBFClose(rd);
CloseSubWindow(w0);
}
//--------------------------------------------------------------
//--------------------------------------------------------------
void ReadHistory(void)
{
}
/**************************************/
/* 主程序: 用户程序从此开始 */
/**************************************/
int main(void)
{
OS_WIN *wnd_Main;
UBYTE k;
LONG sele;
for(k=0;k<12;k++){ tr[k][0] = 0xFF; }
tr[0][0] = 0x02; tr[0][1] = 0x00; tr[0][2] = 0x07;
tr[1][0] = 0x04; tr[1][1] = 0x00; tr[1][2] = 0x22;
OSLCDClearPanel(0);
wnd_Main = OSCreatSubWindow(8,16,110,84,1,1,"江苏DDSF[V1.00]"); //创建子窗口
OSComIni(Global_ComNum,1200,1,0,1,8);
while(1){
k = OSMenuInWin(wnd_Main,2,2,16,5,&sele,5,1,"[1]日常抄表","[2]查看电表数据","[3]设置电表数据","[4]串口选择","[5]返回系统");
if(k==K_ENTER){
switch(sele){
case 0: ReadMeter(); break;
case 1: ViewMeter(); break;
case 2: SetMeter(); break;
case 3: ComSele(); break;
case 4: OSExit(); break;
default: break;
}
}
}
CloseSubWindow(wnd_Main);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -