📄 fdk.cpp
字号:
/*本程序是FDK规约的收发程序*/
/*FDK*/
#include <owl.h>
#include <windows.h>
#include <time.h>
#include <stdio.h>
#include "def.h"
#include "db.h"
#include "dbfile.h"
#include "cmdefs.h"
#define KWHCOUNT 0x80 //电度采集间隔
#define YCDATA 0
#define YXDATA 1
#define KWHDATA 2
#define SOEDATA 3
//FDK Function Code
#define SOH 0x01
#define FILESEND 0x01
#define YCSEARCH 0x02
#define YXSEARCH 0x03
#define KWHSEARCH 0x04
#define SOESEARCH 0x05
#define ACKNOANS 0x06
#define SYSTEMSTATUS 0x07
#define YKOPTION 0x08
#define NEWPARADATAMODEL 0x09
#define HIGHSPEEDTOUCH 0x0a
#define SYSTEMRESET 0x0b
#define ONETASK 0x0c
#define MULTITASK 0x0d
#define HOSPITOLDATA 0x0e
#define CLASSDATASEND 0x0f
#define TIMECOMMAND 0x10
#define PARASEARCH 0x11
#define BADLUBO 0x12
#define PROTOMESSAGE 0x1e
//File Send extern Command Code
#define OPEN_WRITE 0x00
#define OPEN_READ 0x01
#define TEXT_SEND 0x02
#define TEXT_SEND_OVER 0x04
#define SEND_CATLOG 0x05
#define FILE_RENAME 0x07
#define FILE_DELETE 0x08
#define CHANGE_CATLOG 0x09
#define DOS_COMMAND 0x0a
#define ABORT_SEND 0x18
//Yc extern Command Code
#define CALL_YC 0x01
#define ANS_YC 0x02
#define CALL_DEAP_YC 0x03
#define ANS_DEAP_YC 0x04
#define CALL_GROUP_YC 0x05
#define ANS_GROUP_YC 0x06
#define CALL_TABLE_YC 0x07
#define ANS_TABLE_YC 0x08
//Yx extern Command Code
#define CALL_YX 0x01
#define ANS_YX 0x02
#define CALL_GROUP_YX 0x03
#define ANS_GROUP_YX 0x04
#define CALL_CHANGE_YX 0x05
#define ANS_CHANGE_YX 0x06
//Kwh extern Command Code
#define CALL_KWH 0x01
#define ANS_KWH 0x02
#define CALL_GROUP_KWH 0x03
#define ANS_GROUP_KWH 0x04
#define CALL_TABLE_KWH 0x05
#define ANS_TABLE_KWH 0x06
//Soe extern Command Code
#define CALL_NEW_SOE 0x01
#define NAS_NEW_SOE 0x02
#define CALL_GROUP_SOE 0x03
#define ANS_GROUP_SOE 0x04
//o'clock extern Command Code
#define REQUST 0x01
#define SETTIME 0x02
//Yk extern Command Code
#define YK_SELECT 0x01
#define YK_BACK_OK 0x02
#define YK_BACK_FALSH 0x03
#define YK_EXEC 0x04
#define YK_ABORT 0x05
//HightSpeed Model extern Command Codeo
#define CALL_HSPEED_DATA 0x01
#define ANS_HSPEED_DATA 0x02
//FDK Function
typedef struct {
RUNFLAG rf;
WORD RecWPBak;
} CHFLAG;
typedef struct {
WORD year;
WORD month;
WORD day;
WORD hour;
WORD min;
WORD sec;
}Group;
//---------------------------------------------------------------------------------
int sss;
CHANNELPARAM FAR *lpChP=NULL;
STATIONPARAM FAR *lpStaP=NULL;
WORD rxbuflen = 256;
WORD txbuflen = 256;
WORD ChNo;
BYTE Retry[64],RepTimes[64],RANDOM0[64],RANDOM1[64],RANDOM2[64],Poll[64],PAFFLAG[64],TIME[64],SDBB[64];
WORD PollOver[64]={
0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,
};
DWORD KwhCount[64];
BYTE RequestTime[64]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
static HINSTANCE hLib;
int FAR PASCAL _export RxProc(HWND, WORD, CHANNELPARAM FAR *, STATIONPARAM FAR *);
int FAR PASCAL _export TxProc(HWND, CHANNELPARAM FAR *, STATIONPARAM FAR *,int);
extern BYTE FAR PASCAL _export CDT_BCH(BYTE *);
extern BYTE FAR PASCAL _export ByteRotate(BYTE srcbyte);
WORD crc16(BYTE FAR *xb,WORD ptr, WORD count,WORD Mode);
WORD RecProc(BYTE FAR *rxb,WORD rdp,WORD Len);
void FDKYcProc(BYTE FAR *rxb,WORD rdp,WORD Len);
void FDKYxProc(BYTE FAR *rxb,WORD rdp,WORD Len);
void FDKKwhProc(BYTE FAR *rxb,WORD rdp,WORD Len);
void FDKSoeProc(BYTE FAR *rxb,WORD rdp,WORD Len);
void FDKYkProc(BYTE FAR *rxb,WORD rdp,WORD Len);
void FDKWave(BYTE FAR *rxb,WORD rdp,WORD Len);
void FDKRequestTime(BYTE FAR *rxb,WORD rdp,WORD Len);
WORD PollingTx(WORD wrp,BYTE PPoll);
WORD FDKSendTime(BYTE FAR *txb,WORD wrp);
WORD FDKMakeYk(BYTE FAR *txb,WORD wrp,WORD Type);
WORD CallData(BYTE FAR *txb,WORD wrp,WORD Type);
WORD CallSoe(BYTE FAR *txb,WORD wrp);
WORD FDKWaveProc(BYTE FAR *txb,WORD wrp);
/*----------------------------------------------------------------*/
int FAR PASCAL LibMain(HANDLE hInstance, WORD wDataSeg, WORD wHeapSize, LPSTR lpszCmdLine)
{
if (wHeapSize >0 ) UnlockData(0);
return 1;
}
int FAR PASCAL WEP (int nParameter)
{
FreeLibrary (hLib);
return 1;
}
//=============================================================================================================
int FAR PASCAL _export RxProc(HWND hWnd, WORD chno, CHANNELPARAM FAR *lpChannelP, STATIONPARAM FAR *lpStationP)
{
WORD rdp;
char FAR *rxb;
BYTE bchdata[6];
WORD CRC;
lpChP = lpChannelP;
if (!lpChP) return 0;
ChNo = chno;
lpChP += ChNo;
lpStaP = lpStationP+lpChP->StaNo;
if (!lpStaP) return 0;
rxb = lpChP->RecBuff;
if (!rxb) return 0;
rxbuflen = lpChP->RxBuffLen;
CHFLAG *chf = (CHFLAG *)lpChP->Reserved;
if ((chf->RecWPBak%rxbuflen)==(lpChP->RxWriteP%rxbuflen)) //如果接收写指针没变化
{
if (!(lpChP->CHStatus & CommBreakFlag))
{
if (++chf->rf.CommBreakNum > 400)
{
lpChP->CHStatus |= CommBreakFlag;
lpChP->CHStatus |= ChInit;
RANDOM0[lpChP->StaNo]=RANDOM1[lpChP->StaNo]=RANDOM2[lpChP->StaNo]=0;
lpChP->CHStatus &= ~(SyncR + CtrlW +InforW);
}
}
}
else
{
chf->RecWPBak = lpChP->RxWriteP%rxbuflen;
// chf->rf.CommBreakNum = 0;
/*
if (lpChP->CHStatus & CommBreakFlag && chf->rf.CommBreakNum--==0)
{
lpChP->CHStatus &= ~CommBreakFlag;
}
*/
if (lpChP->CHStatus & CommBreakFlag)
{
if (chf->rf.CommBreakNum==0)
lpChP->CHStatus &= ~CommBreakFlag;
else
chf->rf.CommBreakNum--;
}
else
chf->rf.CommBreakNum = 0;
}
if (chf->rf.InvalidCharNum>0x1e0)
{
lpChP->CHStatus |= ChInit;
chf->rf.InvalidCharNum = 0;
if ((++chf->rf.CHErr)>0x580)
{
chf->rf.CHErr = 0;
lpChP->CHStatus |= CharInvFlag;
lpChP->CHStatus &= ~(SyncR + CtrlW +InforW);
}
}
while ((lpChP->RxWriteP+rxbuflen - lpChP->RxReadP)%rxbuflen >=6)
{
rdp = lpChP->RxReadP;
if (*(rxb+rdp)==SOH)
{
WORD Len=*(rxb+(rdp+2)%rxbuflen)*(WORD)256+*(rxb+(rdp+1)%rxbuflen);
if ((lpChP->RxWriteP+rxbuflen - lpChP->RxReadP)%rxbuflen<Len+8) return 1;
CRC=crc16(rxb,rdp+1,Len+5,rxbuflen);
if (LOBYTE(CRC)!=*(rxb+(rdp+3)%rxbuflen) || HIBYTE(CRC)!=*(rxb+(rdp+4)%rxbuflen)) // || *(rxb+(rdp+5)%rxbuflen)!=lpStaP->STATIONNO)
{
lpChP->RxReadP=lpChP->RxWriteP=0;
lpChP->ErrDataNum++;
return 1;
}
lpStaP->RTUSTATUS=*(rxb+(rdp+5)%rxbuflen);
lpChP->RxReadP=(rdp+RecProc(rxb,rdp,Len))%rxbuflen;
}
else rdp+=1;
lpChP->RxReadP=rdp%rxbuflen;
}
return 1;
}
int FAR PASCAL _export TxProc(HWND, CHANNELPARAM FAR *lpChannelP, STATIONPARAM FAR *lpStationP,int Station)
{
sss=Station;
// Station &=0xf;
WORD wrp,currch;
BYTE FAR *txb;
lpChP = lpChannelP;
if (!lpChP) return 0;
lpStaP = lpStationP;
txb = lpChP->SendBuff;
if (!txb) return 0;
txbuflen=lpChP->TxBuffLen;
wrp = lpChP->TxWriteP%txbuflen;
if (wrp != lpChP->TxReadP%txbuflen) return 0;
if (lpStaP->DownCmdRP != lpStaP->DownCmdWP)
{
switch (lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[0])
{
case 29: //xbfx
wrp = FDKWaveProc(txb,wrp);
break;
case DCMDSST: //对钟
wrp=FDKSendTime(txb,wrp);
break;
case DCMDYK1: //遥控执行
case DCMDYK0: //遥控预置
case DCMDYK2: //遥控撤消
wrp=FDKMakeYk(txb,wrp,lpStaP->DownCmd[lpStaP->DownCmdRP].Cmd[0]);
break;
case DCMDSJ0: //升降选择
case DCMDSJ1: //升降执行
case DCMDSJ2: //升降撤消
break;
case DCMDGB: //广播命令
break;
case DCMDFG: //复归命令
break;
}
lpStaP->DownCmdRP = (lpStaP->DownCmdRP+1)&3;
}
else if (RequestTime[lpChP->StaNo]==0) wrp=FDKSendTime(txb,wrp);
else
{
// PollOver[lpChP->StaNo]++;
PollOver[lpStaP->CurrUsedCh]++;
// if (PollOver[lpChP->StaNo]>lpStaP->ProcCount)// || RANDOM0[lpChP->StaNo]!=0xcc)
if (PollOver[lpStaP->CurrUsedCh]>lpStaP->ProcCount)// || RANDOM0[lpChP->StaNo]!=0xcc)
{
// if (PollOver[lpChP->StaNo]<lpStaP->ProcCount*2)
if (PollOver[lpStaP->CurrUsedCh]<lpStaP->ProcCount*2)
{
if (RepTimes[lpChP->StaNo]++>=lpStaP->RepeatTimes)
{
RANDOM0[lpChP->StaNo]=RANDOM1[lpChP->StaNo]=RANDOM2[lpChP->StaNo]=0;
RepTimes[lpChP->StaNo]=Retry[lpChP->StaNo]=0;
Poll[lpChP->StaNo]=TIME[lpChP->StaNo]=PAFFLAG[lpChP->StaNo]=SDBB[lpChP->StaNo]=0;
}
else
{
Retry[lpChP->StaNo]=1;
Poll[lpChP->StaNo]--;
}
}
wrp=PollingTx(wrp,(Poll[lpChP->StaNo]++)%0x1f);
// PollOver[lpChP->StaNo]=0;
PollOver[lpStaP->CurrUsedCh]=0;
lpChP->RxReadP=lpChP->RxWriteP;
}
else if (RequestTime[lpChP->StaNo]==0) wrp=FDKSendTime(txb,wrp);
}
lpChP->TxWriteP = wrp%txbuflen;
return 1;
}
BYTE Pyc(WORD rdp)
{
BYTE FAR *rxb = lpChP->RecBuff;
int ycOrd = (*(rxb+rdp%rxbuflen))*2;
int ycValue = (*(rxb+(rdp+2)%rxbuflen)&0xf)*256 + (*(rxb+(rdp+1)%rxbuflen));
if (*(rxb+(rdp+2)%rxbuflen)&8) ycValue=~ycValue&0x8fff;
SetValue(YCDB, lpChP->StaNo, ycOrd, ycValue);
ycOrd++;
ycValue = (*(rxb+(rdp+4)%rxbuflen)&0xf)*256 + (*(rxb+(rdp+3)%rxbuflen));
if (*(rxb+(rdp+4)%rxbuflen)&8) ycValue=~ycValue&0x8fff;
SetValue(YCDB, lpChP->StaNo, ycOrd, ycValue);
return 6;
}
BYTE Pyx(WORD rdp)
{
BYTE FAR *rxb = lpChP->RecBuff;
int yxbOrd = *(rxb+rdp) - 0xF0;
int i, j;
BYTE flag = (lpStaP+lpChP->StaNo)->RotateFlag;
BYTE yxbv, yxtb, yxv[8];
for (i=0; i<4; i++)
{
yxbv = *(rxb+(rdp+i+1)%rxbuflen);
if (flag) yxbv = ByteRotate(yxbv);
for (j=0, yxtb=0x80; j<8; j++, yxtb>>=1)
{
yxv[j] = 0;
if (yxbv&yxtb) yxv[j]=1;
}
SetBatchValue(YXDB, lpChP->StaNo, yxbOrd*32+i*8, 8, (char huge *)yxv);
}
return 6;
}
BYTE Pkwh(WORD rdp)
{
BYTE FAR *rxb = lpChP->RecBuff;
int kwhOrd = *(rxb+rdp) - 0xA0;
DWORD kwhValue = (DWORD)*(rxb+(rdp+4)%rxbuflen)+(DWORD)*(rxb+(rdp+3)%rxbuflen)*256l
+ (DWORD)*(rxb+(rdp+2)%rxbuflen)*256l*256l;
SetValue(KWHDB, lpChP->StaNo, kwhOrd, kwhValue);
return 6;
}
BYTE Pyk(WORD rdp)
{
if ((lpChP->RxWriteP+rxbuflen - lpChP->RxReadP)%rxbuflen <18 ) return 0;
BYTE bchdata[6],i;
BYTE FAR *rxb = lpChP->RecBuff;
//tzc
for (i=0; i<6; i++) bchdata[i] = *(rxb+(rdp+6+i)%rxbuflen);
if (CDT_BCH(bchdata)!=bchdata[5]) return 12;
for (i=0; i<6; i++) bchdata[i] = *(rxb+(rdp+12+i)%rxbuflen);
if (CDT_BCH(bchdata)!=bchdata[5]) return 18;
BYTE FJFLAG=0xaa;
for (i=0;i<6;i++) if (*(rxb+(rdp+i)%rxbuflen)!=lpChP->yktemp[i]) {FJFLAG=0x55;break;}
//tzc
COMMAND cmdrcd;
// BYTE FAR *rxb = lpChP->RecBuff;
BYTE rp = (lpStaP->DownCmdRP-1) & 3;
WORD rtuno = lpStaP->DownCmd[rp].Cmd[0]+lpStaP->DownCmd[rp].Cmd[1]*256;
if ((lpStaP->DownCmd[rp].Cmd[0]==DCMDYK0) && (lpChP->StaNo == rtuno))
{
cmdrcd.CmdContent[0] = 0x44; //遥控返校
cmdrcd.CmdContent[1] = lpStaP->DownCmd[rp].Cmd[1];
cmdrcd.CmdContent[2] = lpStaP->DownCmd[rp].Cmd[2];
cmdrcd.CmdContent[3] = *(rxb+(rdp+3)%rxbuflen);
cmdrcd.CmdContent[4] = *(rxb+(rdp+4)%rxbuflen);
cmdrcd.CmdContent[5] = *(rxb+(rdp+1)%rxbuflen);
cmdrcd.CmdContent[6] = FJFLAG;//0xAA; //遥控返校错:0x55 遥控返校正确:0xAA
cmdrcd.SubCmdType = TCZYKCMD;
cmdrcd.DataLen = 0;
cmdrcd.DataPt = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -