📄 cbcx.c
字号:
}
if(i>=Retry) {
k = OSMessageBox("DLT645","通讯失败!","[ENTER]重试"); //消息框
if(k!=K_ENTER) { a = -1; break; }
}
else break;
}
CloseSubWindow(w0);
return a;
}
LONG DLT645_Write485tdd(UBYTE Index,ULLONG DevID,UWORD id, ULONG oPswd,UBYTE Len,UWORD Dly,UBYTE Retry)
{
OS_WIN *w0;
UBYTE k,s[255],r[8],i,j;
LONG a;
w0 = OSCreatSubWindow(16,20,92,80,1,1,"数据编程");
OSDrawInWin(w0,2,2,"电表",3,0);
sprintf(s,"%4X%08X",(ULONG)(DevID>>32),(ULONG)DevID); OSDrawInWin(w0,8,14,s,3,0);
sprintf(s,"数据: %04X",id); OSDrawInWin(w0,2,26,s,3,0);
OSDrawInWin(w0,16,46,"正在通讯...",3,0);
while(1){
s[0] = (UBYTE)id; s[1] = (UBYTE)(id>>8);
s[2] = (UBYTE)oPswd; s[3] = (UBYTE)(oPswd>>8); s[4] = (UBYTE)(oPswd>>16); s[5] = (UBYTE)(oPswd>>24);
// for(i=0;i<Len;i++) s[i+2] = d[i];
for(i=0;i<Retry;i++){
a = DLT645(Index,DevID,0x04,s,Len+2,r,0,Dly);
if(a>=0) break;
//if (a=-1)
// {OSMessageBox("DLT645","电表清零超时","按任一键返回主菜单");
// break;
// }
}
if(i>=Retry) {
k = OSMessageBox("DLT645","通讯失败!","[ENTER]重试"); //消息框
if(k!=K_ENTER) { a = -1; break; }
}
else break;
}
CloseSubWindow(w0);
return a;
}
LONG DLT645_Write(UBYTE Index,ULLONG DevID, UWORD id, ULONG oPswd, UBYTE *d, UBYTE Len, UWORD Dly, UBYTE Retry)
{
OS_WIN *w0;
UBYTE k,s[255],r[8],i,j;
LONG a;
w0 = OSCreatSubWindow(16,20,92,80,1,1,"数据编程");
OSDrawInWin(w0,2,2,"电表",3,0);
sprintf(s,"%4X%08X",(ULONG)(DevID>>32),(ULONG)DevID); OSDrawInWin(w0,8,14,s,3,0);
sprintf(s,"数据: %04X",id); OSDrawInWin(w0,2,26,s,3,0);
OSDrawInWin(w0,16,46,"正在通讯...",3,0);
while(1){
s[0] = (UBYTE)id; s[1] = (UBYTE)(id>>8);
s[2] = (UBYTE)oPswd; s[3] = (UBYTE)(oPswd>>8); s[4] = (UBYTE)(oPswd>>16); s[5] = (UBYTE)(oPswd>>24);
// s[2] = (UBYTE)oPswd; s[5] = (UBYTE)(oPswd>>8); s[4] = (UBYTE)(oPswd>>16); s[3] = (UBYTE)(oPswd>>24);
for(i=0;i<Len;i++) s[i+6] = d[i];
for(i=0;i<Retry;i++){
a = DLT645(Index,DevID,0x04,s,Len,r,0,Dly);
if(a>=0) break;
}
if(i>=Retry) {
k = OSMessageBox("DLT645","通讯失败!","[ENTER]重试"); //消息框
if(k!=K_ENTER) { a = -1; break; }
}
else break;
}
CloseSubWindow(w0);
return a;
}
LONG DLT645_WriteID(UBYTE Index,ULLONG DevID,UWORD Dly,UBYTE Retry)
{
OS_WIN *w0;
LONG a;
UBYTE k,s[20],r[6],i;
w0 = OSCreatSubWindow(16,20,92,80,1,1,"设置电表编号");
OSDrawInWin(w0,2,2,"编号",3,0);
sprintf(s,"%4X%08X",(ULONG)(DevID>>32),(ULONG)DevID); OSDrawInWin(w0,8,14,s,3,0);
OSDrawInWin(w0,16,46,"正在通讯...",3,0);
ID2bcd(DevID,s); //表号-->BCD
while(1){
for(i=0;i<Retry;i++){
a = DLT645(Index,0x999999999999,0x0A,s,6,r,0,Dly);
if(a>=0) break;
}
if(i>=Retry) {
k = OSMessageBox("DLT645","通讯失败!","[ENTER]重试"); //消息框
if(k!=K_ENTER) { a = -1; break; }
// if(k==K_ESC) break;
}
else break;
}
CloseSubWindow(w0);
return a;
}
LONG DLT645_WritePswd(UBYTE Index,ULLONG DevID, ULONG oPswd, ULONG nPswd,UWORD Dly, UBYTE Retry)
//LONG DLT645_WritePswd(UBYTE Index,ULLONG DevID, UBYTE *oPswd, UBYTE *nPswd,UWORD Dly, UBYTE Retry)
{
OS_WIN *w0;
LONG a;
UBYTE k,s[20],r[6],i;
w0 = OSCreatSubWindow(16,20,92,80,1,1,"设置电表密码");
OSDrawInWin(w0,2,2,"编号",3,0);
sprintf(s,"%4X%08X",(ULONG)(DevID>>32),(ULONG)DevID); OSDrawInWin(w0,8,14,s,3,0);
OSDrawInWin(w0,16,46,"正在通讯...",3,0);
//s[0] = (UBYTE)oPswd;
s[0] = (UBYTE)oPswd;
s[1] = (UBYTE)(oPswd>>8);
s[2] = (UBYTE)(oPswd>>16);
s[3] = (UBYTE)(oPswd>>24);
s[4]= (UBYTE)(nPswd);
s[5] = (UBYTE)(nPswd>>8);
s[6] = (UBYTE)(nPswd>>16);
s[7] = (UBYTE)(nPswd>>24);
while(1){
for(i=0;i<Retry;i++){
a = DLT645(Index,DevID,0x0F,s,8,r,4,Dly);
if(a>=0) break;
}
if(i>=Retry) {
k = OSMessageBox("DLT645","通讯失败!","[ENTER]重试"); //消息框
if(k!=K_ENTER) { a = -1; break; }
}
else break;
}
CloseSubWindow(w0);
return a;
}
void DLT645_BroadTime(UBYTE Index)
{
OS_CALENDAR p;
UBYTE s[20],r[8];
ULONG DlyCnt,Dly,i;
OS_WIN *w1;
OSGetCalendar(&p);
w1 = OSCreatSubWindow(9,30,110,60,1,1,"通讯");
s[0] = hex2bcd(p.second);
s[1] = hex2bcd(p.minute);
s[2] = hex2bcd(p.hour);
s[3] = hex2bcd(p.day);
s[4] = hex2bcd(p.month);
s[5] = hex2bcd(p.year%100);
DLT645(Index,0x999999999999,0x08,s,6,r,0,0);
DlyCnt = OSTMRGet(); //2005-08-15添加 开始延时
Dly=1500;
OSDrawInWin(w1,16,10,"正在广播校时...",3,0);
while(OSTMRGet()<(DlyCnt+Dly)){
i+=1;
}
CloseSubWindow(w1);//2005-08-15添加 开始延时
OSMessageBox("广播校时","发送完成!","任意键返回...");
}
ULLONG DLT645_InputID(void)
{
OS_WIN *w0;
UBYTE k,d[12],i;
ULLONG a=0;
w0 =OSCreatSubWindow(5,32,120,44,1,1,"输入电表表号");
//w0 = OSCreatSubWindow(6,32,110,44,1,1,"输入电表编号");
d[0] = 0;
k = OSEntryInWin(w0,2,8,12,d,0,0,1);
if(k==K_ESC) a=0x1000000000000;
else if(k==K_ENTER){
// if(d[0]==0) a=0x000000000000;
if(d[0]==0) a=0xAAAAAAAAAAAA;
else {
for(i=0;i<12;i++){
if(d[i]==0) break;
if(d[i]>0x39) d[i] += 9;
a = (a<<4)+(d[i]&0xF);
}
}
}
CloseSubWindow(w0);
return a;
}
ULONG DLT645_InputPswd(UBYTE mode)
{
OS_WIN *w0;
UBYTE k,d[12],i;
ULONG a=mode;
if(mode==0) w0 = OSCreatSubWindow(16,32,80,44,1,1,"输入清零密码");
else w0 = OSCreatSubWindow(16,32,80,44,1,1,"输入编程密码");
d[0] = 0;
k = OSEntryInWin(w0,16,8,6,d,0,0,1);
if(k==K_ESC) a=0xFFFFFFFF;
else if(k==K_ENTER){
for(i=0;i<6;i++){
if(d[i]==0) break;
if(d[i]>0x39) d[i] += 9;
a = (a<<4)+(d[i]&0xF);
}
}
CloseSubWindow(w0);
return a;
}
/************************************************************************************/
//----------------------------------------------------------------------------
void viewbh(ULLONG devID)//读取表号
{
OS_WIN *w0,*w1;
UBYTE k;
UBYTE d[20],s[20],bh[20],bh1[20];
ULLONG nID,m;
sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
nID = DLT645_InputID();
if(nID<0x1000000000000){
while(1){
sprintf(s," ID [%04X%08X]",(ULONG)(nID>>32),(ULONG)nID);
w1 = OSCreatSubWindow(0,0,128,128,1,1,s);
if(DLT645_Read(4,devID,0xC032,bh1,6,2000,3)<0) break;
OSDrawInWin(w1,2,4,"电表表号:",3,0);
sprintf(bh,"%02X%02X%02X%02X%02X%02X",bh1[5],bh1[4],bh1[3],bh1[2],bh1[1],bh1[0]); OSDrawInWin(w1,8,18,bh,3,0);
OSDrawInWin(w1,2,100,"任意键返回...",3,0);
OSWaitKey();
CloseSubWindow(w1);
CloseSubWindow(w0);
break;
}
}
CloseSubWindow(w1);
CloseSubWindow(w0);
}
void ViewPower485(ULLONG devID)//读取电量
{
OS_WIN *w0,*w1;
UBYTE k;
UBYTE d[20],s[20],bh[20],bh1[20];
ULLONG nID,m;
sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
nID = DLT645_InputID();
if(nID<0x1000000000000){
while(1){
sprintf(s," ID [%04X%08X]",(ULONG)(nID>>32),(ULONG)nID);
w1 = OSCreatSubWindow(0,0,128,128,1,1,s);
if(DLT645_Read(4,nID,0x9010,d,20,2000,3)<0) break;
// if(DLT645_Read(4,devID,0xC032,bh1,6,2000,3)<0) break;
// OSDrawInWin(w1,2,4,"电表表号:",3,0);
// sprintf(bh,"%02X%02X%02X%02X%02X%02X",bh1[5],bh1[4],bh1[3],bh1[2],bh1[1],bh1[0]); OSDrawInWin(w1,8,18,bh,3,0);
OSDrawInWin(w1,2,4,"当前电量:",3,0);
sprintf(s," %02X%02X%02X.%02X kWh",d[3],d[2],d[1],d[0]); OSDrawInWin(w1,8,18,s,3,0);
OSDrawInWin(w1,2,100,"任意键返回...",3,0);
OSWaitKey();
CloseSubWindow(w1);
CloseSubWindow(w0);
break;
}
}
CloseSubWindow(w1);
CloseSubWindow(w0);
}
void Viewzt(ULLONG devID)//读取状态
{
OS_WIN *w0,*w1;
UBYTE k;
UBYTE d[20],s[20],bh[20],bh1[20];
ULLONG nID,m;
sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
nID = DLT645_InputID();
if(nID<0x1000000000000){
while(1){
sprintf(s," ID [%04X%08X]",(ULONG)(nID>>32),(ULONG)nID);
w1 = OSCreatSubWindow(0,0,128,128,1,1,s);
if(DLT645_Read(4,nID,0xC020,d,20,2000,3)<0) break;
// if(DLT645_Read(4,devID,0xC032,bh1,6,2000,3)<0) break;
// OSDrawInWin(w1,2,4,"电表表号:",3,0);
// sprintf(bh,"%02X%02X%02X%02X%02X%02X",bh1[5],bh1[4],bh1[3],bh1[2],bh1[1],bh1[0]); OSDrawInWin(w1,8,18,bh,3,0);
OSDrawInWin(w1,2,4,"当前状态:",3,0);
sprintf(s," %02X",d[0]); OSDrawInWin(w1,8,18,s,3,0);
OSDrawInWin(w1,2,100,"任意键返回...",3,0);
OSWaitKey();
CloseSubWindow(w1);
CloseSubWindow(w0);
break;
}
}
CloseSubWindow(w1);
CloseSubWindow(w0);
}
void ViewPowersjk485(ULLONG devID)//读取正向有功电能数据块
{
OS_WIN *w0,*w1,*w2;
UBYTE k;
UBYTE d[48],s[20],bh[20],bh1[20];
ULLONG nID,m;
sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
nID = DLT645_InputID();
if(nID<0x1000000000000){
while(1){
sprintf(s," ID [%04X%08X]",(ULONG)(nID>>32),(ULONG)nID);
w1 = OSCreatSubWindow(0,0,128,128,1,1,s);
if(DLT645_Read(4,nID,0x901F,d,48,2000,3)<0) break;
// if(DLT645_Read(4,devID,0xC032,bh1,6,2000,3)<0) break;
// OSDrawInWin(w1,2,4,"电表表号:",3,0);
// sprintf(bh,"%02X%02X%02X%02X%02X%02X",bh1[5],bh1[4],bh1[3],bh1[2],bh1[1],bh1[0]); OSDrawInWin(w1,8,18,bh,3,0);
OSDrawInWin(w1,2,2,"前一月:",3,0);
sprintf(s," %02X%02X%02X.%02X 度",d[3],d[2],d[1],d[0]);
OSDrawInWin(w1,36,2,s,3,0);
OSDrawInWin(w1,2,16,"前二月:",3,0);
sprintf(s," %02X%02X%02X.%02X 度",d[7],d[6],d[5],d[4]);
OSDrawInWin(w1,36,16,s,3,0);
OSDrawInWin(w1,2,30,"前三月:",3,0);
sprintf(s," %02X%02X%02X.%02X 度",d[11],d[10],d[9],d[8]);
OSDrawInWin(w1,36,30,s,3,0);
OSDrawInWin(w1,2,44,"前四月:",3,0);
sprintf(s," %02X%02X%02X.%02X 度",d[15],d[14],d[13],d[12]);
OSDrawInWin(w1,36,44,s,3,0);
OSDrawInWin(w1,2,58,"前五月:",3,0);
sprintf(s," %02X%02X%02X.%02X 度",d[19],d[18],d[17],d[16]);
OSDrawInWin(w1,36,58,s,3,0);
OSDrawInWin(w1,2,72,"前六月:",3,0);
sprintf(s," %02X%02X%02X.%02X 度",d[23],d[22],d[21],d[20]);
OSDrawInWin(w1,36,72,s,3,0);
OSDrawInWin(w1,1,100,"任一键返回Enter下一页",3,0);
k=OSWaitKey();
if(k==K_ENTER)
{
sprintf(s," ID [%04X%08X]",(ULONG)(nID>>32),(ULONG)nID);
w2 = OSCreatSubWindow(0,0,128,128,1,1,s);
OSDrawInWin(w2,2,2,"前 七 月",3,0);
sprintf(s," %02X%02X%02X.%02X度",d[27],d[26],d[25],d[24]);
OSDrawInWin(w2,48,2,s,3,0);
OSDrawInWin(w2,2,16,"前 八 月",3,0);
sprintf(s," %02X%02X%02X.%02X度",d[31],d[30],d[29],d[28]);
OSDrawInWin(w2,48,16,s,3,0);
OSDrawInWin(w2,2,30,"前 九 月",3,0);
sprintf(s," %02X%02X%02X.%02X度",d[35],d[34],d[33],d[32]);
OSDrawInWin(w2,48,30,s,3,0);
OSDrawInWin(w2,2,44,"前 十 月",3,0);
sprintf(s," %02X%02X%02X.%02X度",d[39],d[38],d[37],d[36]);
OSDrawInWin(w2,48,44,s,3,0);
OSDrawInWin(w2,2,58,"前十一月:",3,0);
sprintf(s," %02X%02X%02X.%02X度",d[43],d[42],d[41],d[40]);
OSDrawInWin(w2,48,58,s,3,0);
OSDrawInWin(w2,2,72,"前十二月:",3,0);
sprintf(s," %02X%02X%02X.%02X度",d[47],d[46],d[45],d[44]);
OSDrawInWin(w2,48,72,s,3,0);
OSDrawInWin(w2,2,100,"按任一键返回...",3,0);
OSWaitKey();
CloseSubWindow(w2);CloseSubWindow(w1);CloseSubWindow(w0);return;
}
CloseSubWindow(w1);
CloseSubWindow(w0);
break;
}
// CloseSubWindow(w1);CloseSubWindow(w0);return;
}
// CloseSubWindow(w2);
// CloseSubWindow(w1);
// CloseSubWindow(w0);
}
void Viewmccs485(ULLONG devID)//读取脉冲常数
{
OS_WIN *w0,*w1;
UBYTE k;
UBYTE d[20],s[20],bh[20],bh1[20];
ULLONG nID,m;
sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
nID = DLT645_InputID();
if(nID<0x1000000000000){
while(1){
sprintf(s," ID [%04X%08X]",(ULONG)(nID>>32),(ULONG)nID);
w1 = OSCreatSubWindow(0,0,128,128,1,1,s);
if(DLT645_Read(4,nID,0xC030,d,3,2000,3)<0) break;
OSDrawInWin(w1,2,4,"当前脉冲常数:",3,0);
sprintf(s," %02X%02X%",d[1],d[0]); OSDrawInWin(w1,8,18,s,3,0);
OSDrawInWin(w1,2,100,"任意键返回...",3,0);
OSWaitKey();
CloseSubWindow(w1);
CloseSubWindow(w0);
break;
}
}
CloseSubWindow(w1);
CloseSubWindow(w0);
}
void ViewDatelf(ULLONG devID) //联发读取电表日期
{
OS_WIN *w0,*w1;
UBYTE k;
UBYTE d[4],c[3],s[20],d1[3];
ULLONG nID,m;
sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
nID = DLT645_InputID();
sprintf(s," ID [%04X%08X]",(ULONG)(nID>>32),(ULONG)nID);
w1 = OSCreatSubWindow(0,0,128,128,1,1,s);
if(nID<0x1000000000000){
while(1){
if(DLT645_Read(4,nID,0xC010,d,4,6000,3)<0) break;
if(DLT645_Read(4,nID,0xC011,c,3,6000,3)<0) break;
if(DLT645_Read(4,nID,0xC030,d1,3,2000,3)<0) break;
OSDrawInWin(w1,2,4,"电表日期",3,0);
sprintf(s,"%02X年%02X月%02X日",d[3],d[2],d[1]); OSDrawInWin(w1,8,18,s,3,0);
OSDrawInWin(w1,2,36,"电表时间",3,0);
sprintf(s,"%2X:%02X:%02X",c[2],c[1],c[0]); OSDrawInWin(w1,8,50,s,3,0);
OSDrawInWin(w1,2,68,"电表脉冲",3,0);
sprintf(s," %02X%02X%",d1[1],d1[0]); OSDrawInWin(w1,8,82,s,3,0);
OSDrawInWin(w1,2,100,"任意键返回...",3,0);
OSWaitKey();
CloseSubWindow(w1);
break;
}
}
CloseSubWindow(w1);
CloseSubWindow(w0);
}
void ViewDatelfau(ULLONG devID) //联发读取电表日期
{
OS_WIN *w0,*w1;
UBYTE k;
UBYTE d[4],c[3],s[20],d1[3];
ULLONG nID,m;
sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
//nID = DLT645_InputID();
nID=devID;
sprintf(s," ID [%04X%08X]",(ULONG)(nID>>32),(ULONG)nID);
w1 = OSCreatSubWindow(0,0,128,128,1,1,s);
if(nID<0x1000000000000){
while(1){
if(DLT645_Read(4,nID,0xC010,d,4,6000,3)<0) break;
if(DLT645_Read(4,nID,0xC011,c,3,6000,3)<0) break;
if(DLT645_Read(4,nID,0xC030,d1,3,2000,3)<0) break;
OSDrawInWin(w1,2,4,"电表日期",3,0);
sprintf(s,"%02X年%02X月%02X日",d[3],d[2],d[1]); OSDrawInWin(w1,8,18,s,3,0);
OSDrawInWin(w1,2,36,"电表时间",3,0);
sprintf(s,"%2X:%02X:%02X",c[2],c[1],c[0]); OSDrawInWin(w1,8,50,s,3,0);
OSDrawInWin(w1,2,68,"电表脉冲",3,0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -