📄 cbcx.c
字号:
#include "F3200.h" // F3200库函数头文件
#include "STDLIB.h"
#include "math.h"
/*********************************************************/
#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=4; //串口号(TVIR)
UBYTE tr[12][3]; //时段表
UBYTE bt[4]; //备用时段启动时间:月日时分
ULONG ClrPswd = 0x12345600, PgmPswd = 0x12345601;
/**************************************/
/* 子函数 */
/**************************************/
double jinwu(double i)//四舍五入
{
int j;
j=(int)(i*1000)%10;
if(j>4)
i=((int)(i*100+0.5))/100.0;
else
i=((int)(i*100))/100.0;
return i;
}
void inttohex(int k,UBYTE *d)//整数转化十六进制
{int zs,ys,c;
UBYTE a[2];
c=k;
a[0]=0x00;
a[1]=0x00;
if (c<=255)
{
if (c<16)
{
if (c==15)
{a[0]=0x0F;}
if (c==14)
{a[0]=0x0E;}
if (c==13)
{a[0]=0x0D;}
if (c==12)
{a[0]=0x0C;}
if (c==11)
{a[0]=0x0B;}
if (c==10)
{a[0]=0x0A;}
if (c==9)
{a[0]=0x09;}
if (c==8)
{a[0]=0x08;}
if (c==7)
{a[0]=0x07;}
if (c==6)
{a[0]=0x06;}
if (c==5)
{a[0]=0x05;}
if (c==4)
{a[0]=0x04;}
if (c==3)
{a[0]=0x03;}
if (c==2)
{a[0]=0x02;}
if (c==1)
{a[0]=0x01;}
if (c==0)
{a[0]=0x00;}
}
if (c>=16)
{ zs=c/16;
if (zs==15)
{a[0]=0x0F;}
if (zs==14)
{a[0]=0x0E;}
if (zs==13)
{a[0]=0x0D;}
if (zs==12)
{a[0]=0x0C;}
if (zs==11)
{a[0]=0x0B;}
if (zs==10)
{a[0]=0x0A;}
if (zs==9)
{a[0]=0x09;}
if (zs==8)
{a[0]=0x08;}
if (zs==7)
{a[0]=0x07;}
if (zs==6)
{a[0]=0x06;}
if (zs==5)
{a[0]=0x05;}
if (zs==4)
{a[0]=0x04;}
if (zs==3)
{a[0]=0x03;}
if (zs==2)
{a[0]=0x02;}
if (zs==1)
{a[0]=0x01;}
if (zs==0)
{a[0]=0x00;}
ys=c%16;
if (ys==15)
{a[1]=0x0F;}
if (ys==14)
{a[1]=0x0E;}
if (ys==13)
{a[1]=0x0D;}
if (ys==12)
{a[1]=0x0C;}
if (ys==11)
{a[1]=0x0B;}
if (ys==10)
{a[1]=0x0A;}
if (ys==9)
{a[1]=0x09;}
if (ys==8)
{a[1]=0x08;}
if (ys==7)
{a[1]=0x07;}
if (ys==6)
{a[1]=0x06;}
if (ys==5)
{a[1]=0x05;}
if (ys==4)
{a[1]=0x04;}
if (ys==3)
{a[1]=0x03;}
if (ys==2)
{a[1]=0x02;}
if (ys==1)
{a[1]=0x01;}
if (ys==0)
{a[1]=0x00;}
a[0]=a[0]<<4;
a[0]=a[0]+a[1];
}
d[0]=a[0];
}
}
void bcd2ascii(UBYTE *bcd,UBYTE *a,UBYTE l)//BCD码转ASCII码
{
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);
}
void a2bcd2(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);
//ul=sizeof(a);
bcd[0] =(ul%10) + (((ul/10)%10)<<4);
bcd[1] =((ul/100)%10) + (((ul/1000)%10)<<4);
bcd[2] = ((ul/10000)%10) + (((ul/100000)%10)<<4);
bcd[3] =((ul/1000000)%10)+(((ul/10000000)%10)<<4);
}
UBYTE hex2bcd(UBYTE hex)
{
return (hex%10)+(((hex/10)%10) <<4);
}
double hex2bcd2(UBYTE hex)
{
return (hex%10)+(((hex/10)%10) <<4);
}
ULLONG hex2bcd3(UBYTE *hex)
{
return ((int)hex[0]-48)*1000000000+((int)hex[1]-48)*100000000+((int)hex[2]-48)*10000000+((int)hex[3]-48)*1000000+((int)hex[4]-48)*100000+((int)hex[5]-48)*10000+((int)hex[6]-48)*1000+((int)hex[7]-48)*100+((int)hex[8]-48)*10+((int)hex[9]-48)*1;
}
ULLONG hex2bcd4(UBYTE *hex)//整数转十六进制
{ ULLONG C1,K,C2,C3,C4,C5,C6,C7,C8,C9;
int i;
C1=0;C2=0;C3=0;C4=0;C5=0;C6=0;C7=0;C8=0,C9=0;
K=((int)hex[0]-48);
C1=K;
for(i=0;i<9;i++) C1=C1*16;
K=((int)hex[1]-48);
C2=K;
for(i=0;i<8;i++) C2=C2*16;
K=((int)hex[2]-48);
C3=K;
for(i=0;i<7;i++) C3=C3*16;
K=((int)hex[3]-48);
C4=K;
for(i=0;i<6;i++) C4=C4*16;
K=((int)hex[4]-48);
C5=K;
for(i=0;i<5;i++) C5=C5*16;
K=((int)hex[5]-48);
C6=K;
for(i=0;i<4;i++) C6=C6*16;
K=((int)hex[6]-48);
C7=K;
for(i=0;i<3;i++) C7=C7*16;
K=((int)hex[7]-48);
C8=K;
for(i=0;i<2;i++) C8=C8*16;
K=((int)hex[8]-48);
C9=K;
for(i=0;i<1;i++) C9=C9*16;
K=((int)hex[9]-48);
return C1+C2+C3+C4+C5+C6+C7+C8+C9+K;
}
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_Write485(UBYTE Index,ULLONG DevID,UWORD id, 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+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(i>=Retry) {
k = OSMessageBox("DLT645","通讯失败!","[ENTER]重试"); //消息框
if(k!=K_ENTER) { a = -1; break; }
}
else break;
}
CloseSubWindow(w0);
return a;
}
//时钟频率
LONG DLT645_Writeclock(UBYTE Index,ULLONG DevID,UWORD id, 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] = d[0];
for(i=0;i<Retry;i++){
a = DLT645(Index,DevID,0x04,s,Len,r,0,Dly);
// if(a>=0) break;
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_Write485td(UBYTE Index,ULLONG DevID,UWORD id, 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] = 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_Write485ql(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[0] = (UBYTE)oPswd; s[1] = (UBYTE)(oPswd>>8); s[2] = (UBYTE)(oPswd>>16); s[3] = (UBYTE)(oPswd>>24);
// for(i=0;i<Len;i++) s[i+2] = d[i];
for(i=0;i<Retry;i++){
a = DLT645(Index,DevID,0x09,s,Len+2,r,0,Dly);
if(a>=0) break;
if (a=-1)
{OSMessageBox("DLT645","电表清零超时","按任一键返回主菜单");
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -