📄 js520a.c
字号:
/********************************************************
FACILITY 3200 样例程序[v1.000]
深圳市康卓电子技术有限公司
*********************************************************/
#include "F3200.h" // F3200库函数头文件
/*********************************************************/
#define pCTS_O asm(" bset #7,0xFFFFF423
bset #7,0xFFFFF420 ")
#define pCTS_H asm(" bset #7,0xFFFFF421")
#define pCTS_L asm(" bclr #7,0xFFFFF421")
/*********** 定义全局变量 ***************/
UBYTE Global_ComNum=1; //串口号(TVIR)
UBYTE tr[12][3]; //时段表
ULONG ClrPswd = 0x12345600, PgmPswd = 0x12345601;
ULLONG devID = 0;
/**************************************/
/* 子函数 */
/**************************************/
void bcd2ascii(UBYTE *bcd,UBYTE *a,UBYTE l)
{
UBYTE i;
for(i=0;i<l;i++){
a[i*2] = (bcd[i]>>4)+0x30;
a[i*2+1] = (bcd[i]&0xF) + 0x30;
}
for(i=0;i<l*2;i++){
if(a[i]>0x39) a[i]+=7;
}
}
void a2bcd(UBYTE *a,UBYTE *bcd)
{
UBYTE i,s[10];
ULONG ul;
bcd[0]=0;
for(i=0;i<9;i++){
if(a[i]=='.'){
if((i+1)<9) bcd[0] += (a[i+1]<<4);
if((i+2)<9) bcd[0] += (a[i+2]&0xF);
break;
}
}
a[i]=0;
ul = atol(a);
bcd[1] = (ul%10) + (((ul/10)%10)<<4);
bcd[2] = ((ul/100)%10) + (((ul/1000)%10)<<4);
bcd[3] = ((ul/10000)%10) + (((ul/100000)%10)<<4);
}
UBYTE hex2bcd(UBYTE hex)
{
return (hex%10)+(((hex/10)%10) <<4);
}
void ID2bcd(ULLONG id,UBYTE *d) //表号-->BCD
{
d[0] = (UBYTE)id;
d[1] = (UBYTE)(id>>8);
d[2] = (UBYTE)(id>>16);
d[3] = (UBYTE)(id>>24);
d[4] = (UBYTE)(id>>32);
d[5] = (UBYTE)(id>>40);
d[6] = (UBYTE)(id>>48);
}
/******************************************************************************/
LONG DLT645(UBYTE Index,ULLONG DevID,UBYTE Cmd,UBYTE *s,UBYTE sl,UBYTE *r,UBYTE rl,UWORD Dly)
{
UBYTE i,l;
UBYTE ChkSum=(0x68+0x68);
ULONG DlyCnt,RcvPro;
//--- 发送 ---
pCTS_H;
for(i=0;i<Index;i++) OSCOMSChar(0xFE);
OSCOMSChar(0x68);
for(i=0;i<6;i++){ OSCOMSChar((UBYTE)DevID); ChkSum += (UBYTE)DevID; DevID>>=8; }
OSCOMSChar(0x68);
OSCOMSChar(Cmd); ChkSum += Cmd;
OSCOMSChar(sl); ChkSum += sl;
for(i=0;i<sl;i++){ OSCOMSChar(s[i]+0x33); ChkSum += (s[i]+0x33); }
OSCOMSChar(ChkSum);
OSCOMSChar(0x16);
//--- 等待发送完成 ---
while(OSCOMSCheck()!=0);
//--- 接收 ---
pCTS_L;
while(OSCOMRChar(r)==0); //清接收缓冲
if(Dly == 0) return 0; //不需要接收数据
DlyCnt = OSTMRGet(); //开始延时
RcvPro = 0;
while(OSTMRGet()<(DlyCnt+Dly)){
if(OSCOMRChar(&i)==0){
ChkSum += i;
switch(RcvPro){
case 0: //wait 0x68
if(i==0x68){ ChkSum = 0x68; RcvPro++; }
break;
case 1 ... 6: //接收表号
r[RcvPro-1] = i;
RcvPro++;
break;
case 7: //0x68 again
if(i==0x68) RcvPro++;
else RcvPro = 0;
break;
case 8: //cmd
if(i==(Cmd|0x80)) RcvPro++;
else RcvPro = 0;
break;
case 9:
if(i<=(rl+2)){ l=i; RcvPro++; }
else RcvPro = 0;
break;
default:
if(RcvPro==(l+10)) { //check sum
if((UBYTE)(i+i)==ChkSum) RcvPro++;
else RcvPro = 0;
}
else if(RcvPro==(l+11)){
if(i==0x16) { //接收完成
return l; //返回收到的数据字节数
}
else RcvPro = 0;
}
else{ r[RcvPro-10] = i-0x33; RcvPro++; }
break;
}
}
}
//--- 延时满 ---
return -1;
}
//--- 返回: 收到的数据(不含帧信息)的字节数, <0出错 ---
// len 接收的最大长度
LONG DLT645_Read(UBYTE Index, ULLONG DevID, UWORD ID, UBYTE *d, UBYTE Len, UWORD Dly, UBYTE Retry) //前导码,通讯号,ID0ID1,接收数据,接收数据最大长度,延时(ms),出错重试次数
{
OS_WIN *w0;
UBYTE k,s[20],r[255],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[1] = (UBYTE)(ID>>8); s[0] = (UBYTE)ID;
for(i=0;i<Retry;i++){
a = DLT645(Index,DevID,0x01,s,2,r,Len,Dly);
if(a>=2){
for(j=0;j<(a-2);j++) d[j] = r[j+2]; //don't need ID
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);
for(i=0;i<Len;i++) s[i+6] = d[i];
for(i=0;i<Retry;i++){
a = DLT645(Index,DevID,0x04,s,Len+6,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; }
}
else break;
}
CloseSubWindow(w0);
return a;
}
LONG DLT645_WritePswd(UBYTE Index,ULLONG DevID, ULONG oPswd, ULONG 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[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];
OSGetCalendar(&p);
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);
OSMessageBox("广播校时","发送完成!","任意键返回...");
}
ULLONG DLT645_InputID(void)
{
OS_WIN *w0;
UBYTE k,d[12],i;
ULLONG a=0;
w0 = OSCreatSubWindow(6,32,110,44,1,1,"输入编号");
d[0] = 0;
k = OSEntryInWin(w0,4,8,12,d,0,0,1);
if(k==K_ESC) a=0x1000000000000;
else if(k==K_ENTER){
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 ViewPower(ULLONG devID)
{
OS_WIN *w0;
UBYTE k;
UBYTE d[16],c[4],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,0x901F,d,16,2000,3)<0) break;
if(DLT645_Read(4,devID,0x9020,c,4,1000,3)<0) break;
OSDrawInWin(w0,2,4,"当前正向电量",3,0);
sprintf(s,"总: %02X%02X%02X.%02X kWh",d[3],d[2],d[1],d[0]); OSDrawInWin(w0,8,18,s,3,0);
sprintf(s,"峰: %02X%02X%02X.%02X kWh",d[7],d[6],d[5],d[4]); OSDrawInWin(w0,8,30,s,3,0);
sprintf(s,"平: %02X%02X%02X.%02X kWh",d[11],d[10],d[9],d[8]); OSDrawInWin(w0,8,42,s,3,0);
sprintf(s,"谷: %02X%02X%02X.%02X kWh",d[15],d[14],d[13],d[12]); OSDrawInWin(w0,8,54,s,3,0);
OSDrawInWin(w0,2,70,"当前反向电量",3,0);
sprintf(s,"总: %02X%02X%02X.%02X kWh",c[3],c[2],c[1],c[0]); OSDrawInWin(w0,8,84,s,3,0);
OSDrawInWin(w0,2,100,"任意键返回...",3,0);
OSWaitKey();
break;
}
CloseSubWindow(w0);
}
void ViewHistory(ULLONG devID)
{
OS_WIN *w0,*w1;
UBYTE k;
ULONG sele;
UBYTE d[12][16],c[4],s[20],i;
UWORD id=0xD120;
sprintf(s," ID [%04X%08X]",(ULONG)(devID>>32),(ULONG)devID);
w0 = OSCreatSubWindow(0,0,128,128,1,1,s);
for(i=0;i<12;i++){
if(DLT645_Read(4,devID,id+i,d[i],16,2000,3)<0) break;
}
sele =0;
while(1){
k = OSMenuInWin(w0,2,2,19,9,&sele,12,1, " 上 1月电量",
" 上 2月电量",
" 上 3月电量",
" 上 4月电量",
" 上 5月电量",
" 上 6月电量",
" 上 7月电量",
" 上 8月电量",
" 上 9月电量",
" 上10月电量",
" 上11月电量",
" 上12月电量");
if(k==K_ESC) break;
else if(k==K_ENTER){
sprintf(s,"上%2d月正向电量",sele+1);
w1 = OSCreatSubWindow(2,20,120,90,1,1,s);
sprintf(s,"总: %02X%02X%02X.%02X kWh",d[sele][3],d[sele][2],d[sele][1],d[sele][0]); OSDrawInWin(w1,8,4,s,3,0);
sprintf(s,"峰: %02X%02X%02X.%02X kWh",d[sele][7],d[sele][6],d[sele][5],d[sele][4]); OSDrawInWin(w1,8,17,s,3,0);
sprintf(s,"平: %02X%02X%02X.%02X kWh",d[sele][11],d[sele][10],d[sele][9],d[sele][8]); OSDrawInWin(w1,8,30,s,3,0);
sprintf(s,"谷: %02X%02X%02X.%02X kWh",d[sele][15],d[sele][14],d[sele][13],d[sele][12]); OSDrawInWin(w1,8,43,s,3,0);
OSDrawInWin(w1,2,60,"任意键返回...",3,0);
OSWaitKey();
CloseSubWindow(w1);
}
}
CloseSubWindow(w0);
}
void ViewReverse(ULLONG devID)
{
OS_WIN *w0;
UBYTE k;
UBYTE d[4],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,0xB020,d,4,2000,3)<0) break;
if(DLT645_Read(4,devID,0xB021,c,3,2000,3)<0) break;
OSDrawInWin(w0,2,4,"反向起始时间",3,0);
sprintf(s,"%02X月%02X日%02X时%02X分",d[3],d[2],d[1],d[0]); OSDrawInWin(w0,8,18,s,3,0);
OSDrawInWin(w0,2,36,"反向累计总时间",3,0);
sprintf(s,"%2X%02X%02X分钟",c[2],c[1],c[0]); OSDrawInWin(w0,8,50,s,3,0);
OSDrawInWin(w0,2,100,"任意键返回...",3,0);
OSWaitKey();
break;
}
CloseSubWindow(w0);
}
void ViewProgram(ULLONG devID)
{
OS_WIN *w0;
UBYTE k;
UBYTE d[4],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,0xB210,d,4,2000,3)<0) break;
if(DLT645_Read(4,devID,0xB212,c,2,2000,3)<0) break;
OSDrawInWin(w0,2,4,"最后一次编程时间",3,0);
sprintf(s,"%02X月%02X日%02X时%02X分",d[3],d[2],d[1],d[0]); OSDrawInWin(w0,8,18,s,3,0);
OSDrawInWin(w0,2,36,"编程次数",3,0);
sprintf(s,"%2X%02X 次",c[1],c[0]); OSDrawInWin(w0,8,50,s,3,0);
OSDrawInWin(w0,2,100,"任意键返回...",3,0);
OSWaitKey();
break;
}
CloseSubWindow(w0);
}
void ViewTime(ULLONG devID)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -