📄 xinjzhf.cpp
字号:
/*********************************************************
NOTE:
本程序专为新疆地区转发而编制,所收到的数据放在转发站的64以后,
虽是polling规约,但新疆中调在应用中掘弃了不必要的成分,所以变得比
较简单,不问即答,也不必等待询问命令,只管发送,换言之,收发没有必
然联系。
**********************************************************/
#include <owl.h>
#include <windows.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include "def.h"
#include "db.h"
#include "dbfile.h"
#include "cmdefs.h"
BYTE STATIONNO[64];
BYTE XJCRCDATA[]={
0x00,0x00,0xC1,0xC0,0x81,0xC1,0x40,0x01,
0x01,0xC3,0xC0,0x03,0x80,0x02,0x41,0xC2,
0x01,0xC6,0xC0,0x06,0x80,0x07,0x41,0xC7,
0x00,0x05,0xC1,0xC5,0x81,0xC4,0x40,0x04,
0x01,0xCC,0xC0,0x0C,0x80,0x0D,0x41,0xCD,
0x00,0x0F,0xC1,0xCF,0x81,0xCE,0x40,0x0E,
0x00,0x0A,0xC1,0xCA,0x81,0xCB,0x40,0x0B,
0x01,0xC9,0xC0,0x09,0x80,0x08,0x41,0xC8,
0x01,0xD8,0xC0,0x18,0x80,0x19,0x41,0xD9,
0x00,0x1B,0xC1,0xDB,0x81,0xDA,0x40,0x1A,
0x00,0x1E,0xC1,0xDE,0x81,0xDF,0x40,0x1F,
0x01,0xDD,0xC0,0x1D,0x80,0x1C,0x41,0xDC,
0x00,0x14,0xC1,0xD4,0x81,0xD5,0x40,0x15,
0x01,0xD7,0xC0,0x17,0x80,0x16,0x41,0xD6,
0x01,0xD2,0xC0,0x12,0x80,0x13,0x41,0xD3,
0x00,0x11,0xC1,0xD1,0x81,0xD0,0x40,0x10,
0x01,0xF0,0xC0,0x30,0x80,0x31,0x41,0xF1,
0x00,0x33,0xC1,0xF3,0x81,0xF2,0x40,0x32,
0x00,0x36,0xC1,0xF6,0x81,0xF7,0x40,0x37,
0x01,0xF5,0xC0,0x35,0x80,0x34,0x41,0xF4,
0x00,0x3C,0xC1,0xFC,0x81,0xFD,0x40,0x3D,
0x01,0xFF,0xC0,0x3F,0x80,0x3E,0x41,0xFE,
0x01,0xFA,0xC0,0x3A,0x80,0x3B,0x41,0xFB,
0x00,0x39,0xC1,0xF9,0x81,0xF8,0x40,0x38,
0x00,0x28,0xC1,0xE8,0x81,0xE9,0x40,0x29,
0x01,0xEB,0xC0,0x2B,0x80,0x2A,0x41,0xEA,
0x01,0xEE,0xC0,0x2E,0x80,0x2F,0x41,0xEF,
0x00,0x2D,0xC1,0xED,0x81,0xEC,0x40,0x2C,
0x01,0xE4,0xC0,0x24,0x80,0x25,0x41,0xE5,
0x00,0x27,0xC1,0xE7,0x81,0xE6,0x40,0x26,
0x00,0x22,0xC1,0xE2,0x81,0xE3,0x40,0x23,
0x01,0xE1,0xC0,0x21,0x80,0x20,0x41,0xE0,
0x01,0xA0,0xC0,0x60,0x80,0x61,0x41,0xA1,
0x00,0x63,0xC1,0xA3,0x81,0xA2,0x40,0x62,
0x00,0x66,0xC1,0xA6,0x81,0xA7,0x40,0x67,
0x01,0xA5,0xC0,0x65,0x80,0x64,0x41,0xA4,
0x00,0x6C,0xC1,0xAC,0x81,0xAD,0x40,0x6D,
0x01,0xAF,0xC0,0x6F,0x80,0x6E,0x41,0xAE,
0x01,0xAA,0xC0,0x6A,0x80,0x6B,0x41,0xAB,
0x00,0x69,0xC1,0xA9,0x81,0xA8,0x40,0x68,
0x00,0x78,0xC1,0xB8,0x81,0xB9,0x40,0x79,
0x01,0xBB,0xC0,0x7B,0x80,0x7A,0x41,0xBA,
0x01,0xBE,0xC0,0x7E,0x80,0x7F,0x41,0xBF,
0x00,0x7D,0xC1,0xBD,0x81,0xBC,0x40,0x7C,
0x01,0xB4,0xC0,0x74,0x80,0x75,0x41,0xB5,
0x00,0x77,0xC1,0xB7,0x81,0xB6,0x40,0x76,
0x00,0x72,0xC1,0xB2,0x81,0xB3,0x40,0x73,
0x01,0xB1,0xC0,0x71,0x80,0x70,0x41,0xB0,
0x00,0x50,0xC1,0x90,0x81,0x91,0x40,0x51,
0x01,0x93,0xC0,0x53,0x80,0x52,0x41,0x92,
0x01,0x96,0xC0,0x56,0x80,0x57,0x41,0x97,
0x00,0x55,0xC1,0x95,0x81,0x94,0x40,0x54,
0x01,0x9C,0xC0,0x5C,0x80,0x5D,0x41,0x9D,
0x00,0x5F,0xC1,0x9F,0x81,0x9E,0x40,0x5E,
0x00,0x5A,0xC1,0x9A,0x81,0x9B,0x40,0x5B,
0x01,0x99,0xC0,0x59,0x80,0x58,0x41,0x98,
0x01,0x88,0xC0,0x48,0x80,0x49,0x41,0x89,
0x00,0x4B,0xC1,0x8B,0x81,0x8A,0x40,0x4A,
0x00,0x4E,0xC1,0x8E,0x81,0x8F,0x40,0x4F,
0x01,0x8D,0xC0,0x4D,0x80,0x4C,0x41,0x8C,
0x00,0x44,0xC1,0x84,0x81,0x85,0x40,0x45,
0x01,0x87,0xC0,0x47,0x80,0x46,0x41,0x86,
0x01,0x82,0xC0,0x42,0x80,0x43,0x41,0x83,
0x00,0x41,0xC1,0x81,0x81,0x80,0x40,0x40
};
unsigned int crccode[0x100]={
0X0 , 0Xc0c1, 0Xc181, 0X140, 0Xc301, 0X3c0, 0X280, 0Xc241,
0Xc601, 0X6c0, 0X780, 0Xc741, 0X500, 0Xc5c1, 0Xc481, 0X440,
0Xcc01, 0Xcc0, 0Xd80, 0Xcd41, 0Xf00, 0Xcfc1, 0Xce81, 0Xe40,
0Xa00 , 0Xcac1, 0Xcb81, 0Xb40 , 0Xc901, 0X9c0, 0X880 , 0Xc841,
0Xd801, 0X18c0, 0X1980, 0Xd941, 0X1b00, 0Xdbc1, 0Xda81, 0X1a40,
0X1e00, 0Xdec1, 0Xdf81, 0X1f40, 0Xdd01, 0X1dc0, 0X1c80, 0Xdc41,
0X1400, 0Xd4c1, 0Xd581, 0X1540, 0Xd701, 0X17c0, 0X1680, 0Xd641,
0Xd201, 0X12c0, 0X1380, 0Xd341, 0X1100, 0Xd1c1, 0Xd081, 0X1040,
0Xf001, 0X30c0, 0X3180, 0Xf141, 0X3300, 0Xf3c1, 0Xf281, 0X3240,
0X3600, 0Xf6c1, 0Xf781, 0X3740, 0Xf501, 0X35c0, 0X3480, 0Xf441,
0X3c00, 0Xfcc1, 0Xfd81, 0X3d40, 0Xff01, 0X3fc0, 0X3e80, 0Xfe41,
0Xfa01, 0X3ac0, 0X3b80, 0Xfb41, 0X3900, 0Xf9c1, 0Xf881, 0X3840,
0X2800, 0Xe8c1, 0Xe981, 0X2940, 0Xeb01, 0X2bc0, 0X2a80, 0Xea41,
0Xee01, 0X2ec0, 0X2f80, 0Xef41, 0X2d00, 0Xedc1, 0Xec81, 0X2c40,
0Xe401, 0X24c0, 0X2580, 0Xe541, 0X2700, 0Xe7c1, 0Xe681, 0X2640,
0X2200, 0Xe2c1, 0Xe381, 0X2340, 0Xe101, 0X21c0, 0X2080, 0Xe041,
0Xa001, 0X60c0, 0X6180, 0Xa141, 0X6300, 0Xa3c1, 0Xa281, 0X6240,
0X6600, 0Xa6c1, 0Xa781, 0X6740, 0Xa501, 0X65c0, 0X6480, 0Xa441,
0X6c00, 0Xacc1, 0Xad81, 0X6d40, 0Xaf01, 0X6fc0, 0X6e80, 0Xae41,
0Xaa01, 0X6ac0, 0X6b80, 0Xab41, 0X6900, 0Xa9c1, 0Xa881, 0X6840,
0X7800, 0Xb8c1, 0Xb981, 0X7940, 0Xbb01, 0X7bc0, 0X7a80, 0Xba41,
0Xbe01, 0X7ec0, 0X7f80, 0Xbf41, 0X7d00, 0Xbdc1, 0Xbc81, 0X7c40,
0Xb401, 0X74c0, 0X7580, 0Xb541, 0X7700, 0Xb7c1, 0Xb681, 0X7640,
0X7200, 0Xb2c1, 0Xb381, 0X7340, 0Xb101, 0X71c0, 0X7080, 0Xb041,
0X5000, 0X90c1, 0X9181, 0X5140, 0X9301, 0X53c0, 0X5280, 0X9241,
0X9601, 0X56c0, 0X5780, 0X9741, 0X5500, 0X95c1, 0X9481, 0X5440,
0X9c01, 0X5cc0, 0X5d80, 0X9d41, 0X5f00, 0X9fc1, 0X9e81, 0X5e40,
0X5a00, 0X9ac1, 0X9b81, 0X5b40, 0X9901, 0X59c0, 0X5880, 0X9841,
0X8801, 0X48c0, 0X4980, 0X8941, 0X4b00, 0X8bc1, 0X8a81, 0X4a40,
0X4e00, 0X8ec1, 0X8f81, 0X4f40, 0X8d01, 0X4dc0, 0X4c80, 0X8c41,
0X4400, 0X84c1, 0X8581, 0X4540, 0X8701, 0X47c0, 0X4680, 0X8641,
0X8201, 0X42c0, 0X4380, 0X8341, 0X4100, 0X81c1, 0X8081, 0X4040,
};
char crccode1[0x100]={
0X0 , 0X1021, 0X2042, 0X3063, 0X4084, 0X50a5, 0X60c6, 0X70e7,
0X8108, 0X9129, 0Xa14a, 0Xb16b, 0Xc18c, 0Xd1ad, 0Xe1ce, 0Xf1ef,
0X1231, 0X0210, 0X3273, 0X2252, 0X52b5, 0X4294, 0X72f7, 0X62d6,
0X9339, 0X8318, 0Xb37b, 0Xa35a, 0Xd3bd, 0Xc39c, 0Xf3ff, 0Xe3de,
0X2462, 0X3443, 0X0420, 0X1401, 0X64e6, 0X74c7, 0X44a4, 0X5485,
0Xa56a, 0Xb54b, 0X8528, 0X9509, 0Xe5ee, 0Xf5cf, 0Xc5ac, 0Xd58d,
0X3653, 0X2672, 0X1611, 0X0630, 0X76d7, 0X66f6, 0X5695, 0X46b4,
0Xb75b, 0Xa77a, 0X9719, 0X8738, 0Xf7df, 0Xe7fe, 0Xd79d, 0Xc7bc,
0X48c4, 0X58e5, 0X6886, 0X78a7, 0X0840, 0X1861, 0X2802, 0X3823,
0Xc9cc, 0Xd9ed, 0Xe98e, 0Xf9af, 0X8948, 0X9969, 0Xa90a, 0Xb92b,
0X5af5, 0X4ad4, 0X7ab7, 0X6a96, 0X1a71, 0X0a50, 0X3a33, 0X2a12,
0Xdbfd, 0Xcbdc, 0Xfbbf, 0Xeb9e, 0X9b79, 0X8b58, 0Xbb3b, 0Xab1a,
0X6ca6, 0X7c87, 0X4ce4, 0X5cc5, 0X2c22, 0X3c03, 0X0c60, 0X1c41,
0Xedae, 0Xfd8f, 0Xcdec, 0Xddcd, 0Xad2a, 0Xbd0b, 0X8d68, 0X9d49,
0X7e97, 0X6eb6, 0X5ed5, 0X4ef4, 0X3e13, 0X2e32, 0X1e51, 0X0e70,
0Xff9f, 0Xefbe, 0Xdfdd, 0Xcffc, 0Xbf1b, 0Xaf3a, 0X9f59, 0X8f78,
0X9188, 0X81a9, 0Xb1ca, 0Xa1eb, 0Xd10c, 0Xc12d, 0Xf14e, 0Xe16f,
0X1080, 0X00a1, 0X30c2, 0X20e3, 0X5004, 0X4025, 0X7046, 0X6067,
0X83b9, 0X9398, 0Xa3fb, 0Xb3da, 0Xc33d, 0Xd31c, 0Xe37f, 0Xf35e,
0X02b1, 0X1290, 0X22f3, 0X32d2, 0X4235, 0X5214, 0X6277, 0X7256,
0Xb5ea, 0Xa5cb, 0X95a8, 0X8589, 0Xf56e, 0Xe54f, 0Xd52c, 0Xc50d,
0X34e2, 0X24c3, 0X14a0, 0X0481, 0X7466, 0X6447, 0X5424, 0X4405,
0Xa7db, 0Xb7fa, 0X8799, 0X97b8, 0Xe75f, 0Xf77e, 0Xc71d, 0Xd73c,
0X26d3, 0X36f2, 0X0691, 0X16b0, 0X6657, 0X7676, 0X4615, 0X5634,
0Xd94c, 0Xc96d, 0Xf90e, 0Xe92f, 0X99c8, 0X89e9, 0Xb98a, 0Xa9ab,
0X5844, 0X4865, 0X7806, 0X6827, 0X18c0, 0X08e1, 0X3882, 0X28a3,
0Xcb7d, 0Xdb5c, 0Xeb3f, 0Xfb1e, 0X8bf9, 0X9bd8, 0Xabbb, 0Xbb9a,
0X4a75, 0X5a54, 0X6a37, 0X7a16, 0X0af1, 0X1ad0, 0X2ab3, 0X3a92,
0Xfd2e, 0Xed0f, 0Xdd6c, 0Xcd4d, 0Xbdaa, 0Xad8b, 0X9de8, 0X8dc9,
0X7c26, 0X6c07, 0X5c64, 0X4c45, 0X3ca2, 0X2c83, 0X1ce0, 0X0cc1,
0Xef1f, 0Xff3e, 0Xcf5d, 0Xdf7c, 0Xaf9b, 0Xbfba, 0X8fd9, 0X9ff8,
0X6e17, 0X7e36, 0X4e55, 0X5e74, 0X2e93, 0X3eb2, 0X0ed1, 0X1ef0,
};
typedef struct {
RUNFLAG rf;
WORD RecWPBak;
} CHFLAG;
//---------------------------------------------------------------------------------
CHANNELPARAM FAR *lpChP=NULL;
STATIONPARAM FAR *lpStaP=NULL;
WORD rxbuflen = 256;
WORD txbuflen = 256;
WORD ChNo;
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 FAR PASCAL _export GetRcdNum(WORD dbn, WORD stano);
DWORD FAR PASCAL _export GetValue(WORD dbn, WORD stano, WORD ord);
void SetYx(WORD RtuNo,BYTE YxNo,BYTE yxv);
WORD ProcRec(WORD,char FAR *,WORD,WORD);
UINT crc16(WORD,BYTE,BYTE FAR *,WORD);
WORD CRC(WORD);
WORD TransYc(WORD,int);
WORD TransYx(WORD,int);
WORD TransKwh(WORD,int);
void ProcCtrlW(WORD);
BYTE ProcInfoW(WORD);
BYTE Pyc(WORD);
BYTE Pyx(WORD);
BYTE Pkwh(WORD);
BYTE Pyk(WORD);
BYTE Psj(WORD);
BYTE Psoe(WORD);
WORD iTime(WORD);
WORD msYk(WORD);
WORD msSj(WORD);
WORD msGb(WORD);
WORD msFg(WORD);
//----------------------------------------------------------------//
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)
{
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];
lpStaP = lpStationP;
if (!lpStaP) return 0;
lpChP = lpChannelP;
if (!lpChP) return 0;
ChNo = chno;
lpChP += ChNo;
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 > 30000)
{
lpChP->CHStatus |= CommBreakFlag;
lpChP->CHStatus |= ChInit;
lpChP->CHStatus &= ~(SyncR + CtrlW +InforW);
}
}
}
else
{
chf->RecWPBak = lpChP->RxWriteP%rxbuflen;
// chf->rf.CommBreakNum = 0;
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 (!(lpChP->CHStatus & SyncR)) //如果没有同步字
{
if ((*(rxb+rdp)==lpChP->SyncWord[0]) && (*(rxb+(rdp+1)%rxbuflen)==lpChP->SyncWord[1]) &&
(*(rxb+(rdp+2)%rxbuflen)==lpChP->SyncWord[0]) && (*(rxb+(rdp+3)%rxbuflen)==lpChP->SyncWord[1]) &&
(*(rxb+(rdp+4)%rxbuflen)==lpChP->SyncWord[0]) && (*(rxb+(rdp+5)%rxbuflen)==lpChP->SyncWord[1]))
{
lpChP->CHStatus |= SyncR;
chf->rf.NoSyncNum = 0;
chf->rf.OnlySyncNum = 0;
lpChP->CHStatus &= ~(CtrlW+InforW);
lpChP->RxReadP = (rdp+6)%rxbuflen;
break;
}
else
{
lpChP->RxReadP = (rdp+1)%rxbuflen;
chf->rf.NoSyncNum++;
if (chf->rf.NoSyncNum>600)
{
lpChP->CHStatus |= ChInit;
chf->rf.NoSyncNum = 0;
if ((++chf->rf.CHErr)>0x180)
{
chf->rf.CHErr = 0;
lpChP->CHStatus |= NoSyncFlag;
}
}
continue;
}
}
else //
{
if ((*(rxb+rdp)==lpChP->SyncWord[0]) && (*(rxb+(rdp+1)%rxbuflen)==lpChP->SyncWord[1]) &&
(*(rxb+(rdp+2)%rxbuflen)==lpChP->SyncWord[0]) && (*(rxb+(rdp+3)%rxbuflen)==lpChP->SyncWord[1]) &&
(*(rxb+(rdp+4)%rxbuflen)==lpChP->SyncWord[0]) && (*(rxb+(rdp+5)%rxbuflen)==lpChP->SyncWord[1]))
{
// 有同步字 又收到同步字
lpChP->CHStatus &= ~(CtrlW+InforW);
lpChP->RxReadP = (rdp+6)%rxbuflen;
chf->rf.OnlySyncNum++;
if (chf->rf.OnlySyncNum>600)
{
lpChP->CHStatus |= ChInit;
chf->rf.OnlySyncNum = 0;
if ((++chf->rf.CHErr)>0x180)
{
chf->rf.CHErr = 0;
lpChP->CHStatus |= OnlySyncFlag;
}
}
break;
}
else if(!(lpChP->CHStatus & CtrlW)) //有同步字 没有控制字
{
lpChP->CHStatus |= CtrlW;
lpChP->CHStatus &= ~InforW;
for (int i=0; i<6; i++) bchdata[i] = *(rxb+(rdp+i)%rxbuflen);
if (CDT_BCH(bchdata)==bchdata[5])
{
//如果本通道是当前站正在使用的通道,则处理控制字
if ((lpStaP+lpChP->StaNo)->CurrUsedCh==ChNo)
ProcCtrlW(rdp);
}
lpChP->RxReadP = (rdp+6)%rxbuflen;
break;
}
else //有同步字 有控制字
{
for (int i=0; i<6; i++) bchdata[i] = *(rxb+(rdp+i)%rxbuflen);
if (CDT_BCH(bchdata)==bchdata[5])
{
//如果本通道是当前站正在使用的通道,则处理信息字
if ((lpStaP+lpChP->StaNo)->CurrUsedCh==ChNo)
lpChP->RxReadP = (rdp + ProcInfoW(rdp))%rxbuflen;
else
lpChP->RxReadP = (rdp+6)%rxbuflen;
break;
}
else
{
lpChP->RxReadP = (rdp+6)%rxbuflen;
break;
}
} //end else if
} //end else
} // end while
*/
while ((lpChP->RxWriteP+rxbuflen - lpChP->RxReadP)%rxbuflen >=7)
{
rdp = lpChP->RxReadP;
WORD crc=0;
if ((BYTE)*(rxb+(rdp+1)%rxbuflen)==0x11 ||(BYTE)*(rxb+(rdp+1)%rxbuflen)==0x15)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -