You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2482 lines
89 KiB
C++
2482 lines
89 KiB
C++
/****************************************************************************
|
|
** File name : HTConfig.cpp
|
|
** Description : config parameter
|
|
** Create date : 2018.09.01
|
|
** Auther by : Liuyx
|
|
** Version info : V1.0.01
|
|
** Copyright (C) 2002-2018 xi'an huatek, Inc Co., Ltd
|
|
** Update record:
|
|
** DATE AUTHER DESC
|
|
** -------------------------------------------------------------------------
|
|
** 2018.09.01 Liuyx first build
|
|
****************************************************************************/
|
|
#include "HTGlobal.h"
|
|
#include "HXIec104.h"
|
|
|
|
|
|
|
|
void NsNetServerProcess(void);
|
|
|
|
static void NsIec104Process(void);
|
|
static void NsIec104Init(unsigned char Card,short Port);
|
|
static void NsIec104NetInit(void);
|
|
|
|
static void NsIec104Reset(void);
|
|
static void NsIec104ProcessFormatI(void);
|
|
static void NsIec104ProcessFormatS(void);
|
|
static void NsIec104ProcessFormatU(void);
|
|
static void NsIec104Interrogation(void);
|
|
static void NsIec104InterrogationGroup(void);
|
|
static void NsIec104InterrogationAll(void);
|
|
static void NsIec104ProcessYxGroup(unsigned char Group);
|
|
static void NsIec104ProcessYcGroup(unsigned char Group);
|
|
static void NsIec104ProcessCellGroup(unsigned char Group);
|
|
static void NsIec104ProcessTime(void);
|
|
static void NsIec104ProcessYkYt(void);
|
|
static void NsIec104ProcessPulse(void);
|
|
static void NsIec104DefaultGroup(unsigned char Group);
|
|
static void NsIec104ProcessPulseData(void);
|
|
static void NsIec104SendGroup(void);
|
|
|
|
static void NsIec104SendYkMessage(short Who,unsigned char Action);
|
|
static void NsIec104ReceiveYkReturn(void);
|
|
static void NsIec104SendYkSelectConfirm(void);
|
|
static void NsIec104SendYkExeConfirm(void);
|
|
static void NsIec104SendYkEscConfirm(void);
|
|
static unsigned char NsIec104SendCosSoe(void);
|
|
static void NsIec104InitYk(void);
|
|
static void NsIec104CycleCount(void);
|
|
static void NsIec104SendChangeYc(void);
|
|
/*
|
|
static void Iec104testCosSoe(void);
|
|
void debug104(void);
|
|
*/
|
|
static void NsIec104Init(unsigned char Card,short Port)
|
|
{
|
|
unsigned short i;
|
|
int Result;
|
|
// char Buff[32];
|
|
// char Ip0Buff[64],Ip0Route[64];
|
|
//// char Ip1Buff[64],Ip1Route[64];
|
|
NS_SYSTEM_DATA_MODE SysData;
|
|
|
|
NsIec104Struct.LinkState=NS_DISCONNECTED;
|
|
NsIec104Struct.NsNewSocketId=0;
|
|
// getforsecond(&NsIec104Struct.LinkValidTime);
|
|
NsIec104Struct.ReceiveIndex=0;
|
|
NsIec104Struct.ReceiveIndexLength=0;
|
|
NsIec104Struct.SendMeNumber=0;
|
|
NsIec104Struct.HasSendNumber=0;
|
|
NsIec104Struct.NeedSendNumber=0;
|
|
NsIec104Struct.LeftSendNumber=0;
|
|
NsIec104Struct.Card=Card;
|
|
NsIec104Struct.Port=Port;
|
|
NsIec104Struct.YkStartSign=OFF;
|
|
NsIec104Struct.Table=0;
|
|
NsIec104Struct.NetRunSign=OFF;
|
|
NsIec104Struct.SetNetSign=OFF;
|
|
|
|
// Result=ReadNsc200Ini("NsIec104","SetTimeFlag",Buff);
|
|
if(Result)
|
|
{
|
|
NsIec104Struct.SetTimeFlag=1;
|
|
}
|
|
|
|
for(i=0;i<NS_IEC104_USE_CYCLE;i++)
|
|
{
|
|
// getforsecond(&NsIec104Cycle[i].LastTime);
|
|
NsIec104Cycle[i].TimeNap= NsIec104Nap[i];
|
|
NsIec104Cycle[i].TimeSign=OFF;
|
|
}
|
|
|
|
for(i=0;i<NS_IEC104_MAX_YC;i++)
|
|
NsIec104Struct.YcNap[i]=5;
|
|
NsIec104Struct.YcChangeCycle=0;
|
|
|
|
// NsIec104Struct.TableNo = NsGetCommTable(Port);
|
|
// GetSysDataMode(NsIec104Struct.TableNo,&SysData);
|
|
/*NsIec104Struct.XYxNum = SysData.NsYxTableNumber;
|
|
|
|
NsIec104Struct.XYmNum = SysData.NsYmTableNumber;*/
|
|
NsIec104Struct.XYcNum = SysData.NsYcTableNumber;
|
|
NsIec104Struct.XYcCycleNum = (NsIec104Struct.XYcNum + NS_IEC104_ONCE_YC_COUNT - 1) / NS_IEC104_ONCE_YC_COUNT;
|
|
|
|
}
|
|
|
|
#if 0
|
|
static void NsIec104NetInit(void)
|
|
{
|
|
int Result;
|
|
char Buff[32];
|
|
char Ip0Buff[64],Ip0Route[64];
|
|
char Ip1Buff[64],Ip1Route[64];
|
|
|
|
NsTcpServerInit(NsIec104Struct.Card,NsIec104Struct.Port,"10.14.127.200");
|
|
switch(NsIec104Struct.Card)
|
|
{
|
|
case 0:
|
|
Result=ReadNsc200Ini("NsIec104","Route0Sign",Buff);
|
|
if(Result)
|
|
{
|
|
NsReadIpAddress("NsIec104","Route0Net",Ip0Buff);
|
|
NsReadIpAddress("NsIec104","Route0Ip",Ip0Route);
|
|
NsAddRoute(Ip0Buff,Ip0Route);
|
|
}
|
|
break;
|
|
case 1:
|
|
Result=ReadNsc200Ini("NsIec104","Route1Sign",Buff);
|
|
if(Result)
|
|
{
|
|
NsReadIpAddress("NsIec104","Route1Net",Ip1Buff);
|
|
NsReadIpAddress("NsIec104","Route1Ip",Ip1Route);
|
|
NsAddRoute(Ip1Buff,Ip1Route);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
static void NsIec104InitYk(void)
|
|
{
|
|
|
|
NsIec104Struct.YkStartSign=OFF;
|
|
NsIec104Struct.YkNowState=0xff;
|
|
NsIec104Struct.YkCellNumber=0xff;
|
|
NsIec104Struct.YkKgNumber=0xff;
|
|
|
|
}
|
|
|
|
void NsNetServerProcessv(void)
|
|
{
|
|
|
|
while(1)
|
|
{
|
|
taskDelay(88);
|
|
}
|
|
}
|
|
|
|
|
|
void NsNetServerProcess(void)
|
|
{
|
|
unsigned long Now,Nap;
|
|
unsigned short Card;
|
|
int Result;
|
|
char Buff[32];
|
|
|
|
Card=0;
|
|
Result=ReadNsc200Ini("NsTasks","NsServerCard",Buff);
|
|
if(Result)
|
|
{
|
|
Card=Result;
|
|
if(Card<=2&&Card>0)
|
|
{
|
|
Card-=1;
|
|
}
|
|
}
|
|
NsIec104Init(Card,2404);
|
|
for(;;)
|
|
{
|
|
NsIec104Struct.SystemState = NsGetSysParameter(NS_NSCC_STATE);
|
|
NsIec104Struct.NetRunSign = NsNetConfigState();
|
|
|
|
if(NsIec104Struct.NetRunSign==ON&&NsIec104Struct.SetNetSign==OFF&&NsIec104Struct.SystemState==DUTY)
|
|
{
|
|
NsIec104NetInit();
|
|
NsIec104Struct.SetNetSign=ON;
|
|
}
|
|
if(NsIec104Struct.NetRunSign==ON&&NsIec104Struct.SetNetSign==ON&&NsIec104Struct.SystemState==DUTY)
|
|
{
|
|
getforsecond(&Now);
|
|
Nap=DiffMsLong(Now,NsIec104Struct.LinkValidTime);
|
|
if(Nap>NS_IEC104_PERMIT_TIME)
|
|
{
|
|
NsIec104Struct.LinkState=NS_DISCONNECTED;
|
|
}
|
|
if(NsIec104Struct.YkStartSign==ON)
|
|
{
|
|
Nap=DiffMsLong(Now,NsIec104Struct.YkStartTime);
|
|
if(Nap>NS_IEC104_YK_PERMIT_TIME)
|
|
{
|
|
NsIec104InitYk();
|
|
}
|
|
}
|
|
if(NsIec104Struct.LinkState==NS_DISCONNECTED)
|
|
{
|
|
|
|
NsIec104Struct.NsNewSocketId=NsTcpConnect(NsIec104Struct.NsNewSocketId,NsIec104Struct.Card);
|
|
|
|
if(NsIec104Struct.NsNewSocketId>0)
|
|
{
|
|
NsIec104Struct.LinkState=NS_CONNECTED;
|
|
NsIec104Struct.SendMeNumber=0;
|
|
getforsecond(&NsIec104Struct.LinkValidTime);
|
|
}
|
|
else
|
|
{
|
|
/*NsIec104Init(NsIec104Struct.Card,NsIec104Struct.Port);*/
|
|
|
|
/* NsTcpServerInit(NsIec104Struct.Card,NsIec104Struct.Port,"10.14.8.23");*/
|
|
NsIec104Struct.LinkState=NS_DISCONNECTED;
|
|
NsIec104Reset();
|
|
taskDelay(866);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
NsIec104Struct.ReceiveIndexLength=recv(NsIec104Struct.NsNewSocketId,&NsIec104Struct.ReceiveBuffer[NsIec104Struct.ReceiveIndex],198,0);
|
|
|
|
if(NsIec104Struct.ReceiveIndexLength>0)
|
|
{
|
|
NsIec104Struct.ReceiveLength+=NsIec104Struct.ReceiveIndexLength;
|
|
if(NsIec104Struct.ReceiveLength<NS_IEC104_RECEIVEBUFFER)
|
|
{
|
|
NsIec104Process();
|
|
}
|
|
else
|
|
{
|
|
NsIec104Reset();
|
|
}
|
|
/*
|
|
debug104();
|
|
Iec104testCosSoe();
|
|
*/
|
|
getforsecond(&NsIec104Struct.LinkValidTime);
|
|
}
|
|
|
|
NsIec104ReceiveYkReturn();
|
|
NsIec104SendGroup();
|
|
|
|
if(NsIec104Struct.LeftSendNumber==0)
|
|
{
|
|
NsIec104Struct.CosSign=NsIec104SendCosSoe();
|
|
if(NsIec104Struct.CosSign==0)
|
|
{
|
|
NsIec104SendChangeYc();
|
|
}
|
|
}
|
|
}
|
|
NsIec104CycleCount();
|
|
}
|
|
taskDelay(18);
|
|
}
|
|
}
|
|
|
|
static void NsIec104SendChangeYc(void)
|
|
{
|
|
|
|
unsigned short General,Index;
|
|
unsigned char *P;
|
|
unsigned short i,RealNumber;
|
|
short *Pyc,YcValue,YcNap;
|
|
float fYc;
|
|
|
|
|
|
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=9; /* asdu type */
|
|
NsIec104Struct.SendBuffer[Index++]=0; /* information object count No 7 Byte */
|
|
|
|
/* REASONBYTE now is two */
|
|
NsIec104Struct.SendBuffer[Index++]=3; /* reason */
|
|
NsIec104Struct.SendBuffer[Index++]=0x0; /* reason */
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=0x01;
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
/*
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
*/
|
|
NsIec104Struct.YcLibIndex=NsIec104Struct.YcChangeCycle*NS_IEC104_ONCE_YC_COUNT;
|
|
/*NsIec104Struct.YcChangeCycle=(NsIec104Struct.YcChangeCycle+1)%NS_IEC104_CHANGE_YC_CYCLE;*/
|
|
NsIec104Struct.YcChangeCycle=(NsIec104Struct.YcChangeCycle+1)%NsIec104Struct.XYcCycleNum;
|
|
|
|
NsIec104Struct.YcChangeCount=0;
|
|
|
|
switch(NsIec104Struct.Table)
|
|
{
|
|
case 0:
|
|
NsGetDd1Lib(NS_YC_DATA,NsIec104Struct.YcLibIndex,NsIec104Struct.DataBuff,NS_IEC104_ONCE_YC_COUNT);
|
|
break;
|
|
case 1:
|
|
NsGetDd2Lib(NS_YC_DATA,NsIec104Struct.YcLibIndex,NsIec104Struct.DataBuff,NS_IEC104_ONCE_YC_COUNT);
|
|
break;
|
|
case 2:
|
|
NsGetDd3Lib(NS_YC_DATA,NsIec104Struct.YcLibIndex,NsIec104Struct.DataBuff,NS_IEC104_ONCE_YC_COUNT);
|
|
break;
|
|
case 3:
|
|
NsGetDd4Lib(NS_YC_DATA,NsIec104Struct.YcLibIndex,NsIec104Struct.DataBuff,NS_IEC104_ONCE_YC_COUNT);
|
|
break;
|
|
}
|
|
|
|
for(i=0;i<NS_IEC104_ONCE_YC_COUNT;i++)
|
|
{
|
|
/*Pyc=(short *)&NsIec104Struct.DataBuff[2*i];
|
|
YcValue= *Pyc;
|
|
YcNap=YcValue-NsIec104Struct.YcLastValue[NsIec104Struct.YcLibIndex+i];
|
|
if(YcNap<0)
|
|
YcNap=NsIec104Struct.YcLastValue[NsIec104Struct.YcLibIndex+i]-YcValue;
|
|
|
|
if(YcNap>NsIec104Struct.YcNap[NsIec104Struct.YcLibIndex+i])
|
|
{
|
|
NsIec104Struct.YcChangeCount++;
|
|
NsIec104Struct.YcLastValue[NsIec104Struct.YcLibIndex+i]=YcValue;*/
|
|
/* Information Object Address Now Three Bytes */
|
|
General=0x701+NsIec104Struct.YcLibIndex+i;
|
|
P=(unsigned char *)&General;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0];
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendBuffer[Index++]=0;
|
|
|
|
/*fYc = YcValue * 1.0;
|
|
P=(unsigned char *)&fYc;
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=P[0];
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendBuffer[Index++]=P[2];
|
|
NsIec104Struct.SendBuffer[Index++]=P[3];*/
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.DataBuff[2*i];
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.DataBuff[2*i + 1];
|
|
NsIec104Struct.SendBuffer[Index++]=0x00; /*qds*/
|
|
/*}*/
|
|
}
|
|
|
|
/* Repair Length and Count*/
|
|
NsIec104Struct.SendBuffer[1]=Index-2;
|
|
NsIec104Struct.SendBuffer[7]=NsIec104Struct.YcChangeCount;
|
|
if(NsIec104Struct.YcChangeCount>0)
|
|
{/*
|
|
printf("\n Co=%d Ind=%dGe=%d",NsIec104Struct.YcChangeCount,NsIec104Struct.YcLibIndex,General);
|
|
*/
|
|
if((NsIec104Struct.SendLength=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0))<0)
|
|
{
|
|
perror ("Client FirstWrite Error");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
static void NsIec104SendGroup(void)
|
|
{
|
|
if(NsIec104Struct.NeedSendNumber>0&&NsIec104Struct.HasSendNumber<NS_IEC104_MAX_K)
|
|
{
|
|
/*
|
|
printf("\n GroupId=%d",NsIec104Struct.NsNewSocketId);
|
|
*/
|
|
if((NsIec104Struct.SendLength=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.GroupSendBuffer[NsIec104Struct.LeftSendNumber][0],NsIec104Struct.GroupSendLength[NsIec104Struct.LeftSendNumber],0x0))<0)
|
|
{
|
|
perror ("GRoup Erroe");
|
|
}
|
|
|
|
NsIec104Struct.LeftSendNumber++;
|
|
/*
|
|
printf("\n Send Group=%d",NsIec104Struct.SendLength);
|
|
*/
|
|
if(NsIec104Struct.LeftSendNumber>=NsIec104Struct.NeedSendNumber)
|
|
{
|
|
NsIec104Struct.HasSendNumber=0;
|
|
NsIec104Struct.NeedSendNumber=0;
|
|
NsIec104Struct.LeftSendNumber=0;
|
|
}
|
|
}
|
|
taskDelay(108);
|
|
|
|
}
|
|
|
|
|
|
static void NsIec104Process(void)
|
|
{
|
|
int i;
|
|
|
|
/* printf("r:");
|
|
for(i=0;i<NsIec104Struct.ReceiveLength;i++)
|
|
printf("%4x",NsIec104Struct.ReceiveBuffer[i]);
|
|
printf("\n");
|
|
*/
|
|
if(NsIec104Struct.ReceiveLength>=NS_IEC_104_MIN_LENGTH && NsIec104Struct.ReceiveBuffer[0]==NS_IEC_104_HEAD)
|
|
{
|
|
NsIec104Struct.FormatType=NsIec104Struct.ReceiveBuffer[2]&0x03;
|
|
if(NsIec104Struct.FormatType==0||NsIec104Struct.FormatType==2) /* I */
|
|
{
|
|
NsIec104ProcessFormatI();
|
|
}
|
|
else
|
|
{
|
|
if(NsIec104Struct.FormatType==1) /* S */
|
|
NsIec104ProcessFormatS();
|
|
else
|
|
{
|
|
if(NsIec104Struct.FormatType==3)/* U */
|
|
NsIec104ProcessFormatU();
|
|
}
|
|
}
|
|
NsIec104Reset();
|
|
}
|
|
|
|
}
|
|
|
|
static void NsIec104ProcessFormatI(void)
|
|
{
|
|
int i;
|
|
unsigned char *p;
|
|
unsigned short NoWay;
|
|
/*
|
|
printf("\nFormatI");
|
|
*/
|
|
NsIec104Struct.ApduLength=NsIec104Struct.ReceiveBuffer[1];
|
|
if(NsIec104Struct.ApduLength>NS_IEC_104_MIN_LENGTH)
|
|
{
|
|
NsIec104Struct.ReceiveHimNumber[0]=NsIec104Struct.ReceiveBuffer[2];
|
|
NsIec104Struct.ReceiveHimNumber[1]=NsIec104Struct.ReceiveBuffer[3];
|
|
NoWay=*(unsigned short *)&NsIec104Struct.ReceiveHimNumber[0];
|
|
NoWay>>=1;
|
|
NoWay+=1;
|
|
NoWay<<=1;
|
|
p=(unsigned char *)&NoWay;
|
|
NsIec104Struct.ReceiveHimNumber[0]=p[0];
|
|
NsIec104Struct.ReceiveHimNumber[1]=p[1];
|
|
|
|
NsIec104Struct.AsduType=NsIec104Struct.ReceiveBuffer[6];
|
|
|
|
for(i=0;i< NS_IEC_104_REASONBYTE;i++)
|
|
NsIec104Struct.TransmitReason[i]=NsIec104Struct.ReceiveBuffer[NS_STARTREASON+i];
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.CommonAsduAddress[i]=NsIec104Struct.ReceiveBuffer[NS_STARTASDUADDRESS+i];
|
|
|
|
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
|
|
NsIec104Struct.InformationObject[i]=NsIec104Struct.ReceiveBuffer[NS_STARTINFORMATION+i];
|
|
|
|
NsIec104Struct.AsduQualifier=NsIec104Struct.ReceiveBuffer[NS_STARTQUALIFIER];
|
|
|
|
switch(NsIec104Struct.AsduType)
|
|
{
|
|
case 46:
|
|
case 47:
|
|
NsIec104Struct.YkYtType=NsIec104Struct.AsduType;
|
|
NsIec104ProcessYkYt();
|
|
break;
|
|
case 100: /* Interrogation */
|
|
NsIec104Interrogation();
|
|
break;
|
|
case 101:
|
|
NsIec104ProcessPulse();
|
|
break;
|
|
case 103:
|
|
NsIec104ProcessTime();
|
|
/*
|
|
printf("\n Time1");
|
|
*/
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
static unsigned char NsIec104SendCosSoe(void)
|
|
{
|
|
unsigned short Number;
|
|
NS_SOE_FORMAT SoeData;
|
|
NS_COS_FORMAT CosData;
|
|
unsigned short Index,SendCount;
|
|
unsigned char *P,i,CosSendSign;
|
|
unsigned short RealNumber,Object,Msecond;
|
|
|
|
Index=0;
|
|
CosSendSign=0;
|
|
Number=NsCheckDd1Cos();
|
|
if(Number>0)
|
|
{
|
|
if(Number>36)
|
|
Number=36;
|
|
SendCount=0;
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=0x01; /* 0x01--->0x02 asdu type */
|
|
NsIec104Struct.SendBuffer[Index++]=1; /* information object count */
|
|
|
|
/* REASONBYTE now is two */
|
|
NsIec104Struct.SendBuffer[Index++]=0x03; /* reason */
|
|
NsIec104Struct.SendBuffer[Index++]=0x00; /* reason */
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
for(i=0;i<Number;i++)
|
|
{
|
|
if(NsGetDd1CosLib(&CosData)==ON)
|
|
{
|
|
SendCount++;
|
|
/* Information Object Address now three byte: 0xc01---0xc80 */
|
|
Object=CosData.SendNumber+0x01;
|
|
P=(unsigned char *)&Object;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0];
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
NsIec104Struct.SendBuffer[Index++]=CosData.State;
|
|
}
|
|
|
|
}
|
|
|
|
/* Repair Length */
|
|
NsIec104Struct.SendBuffer[7]=SendCount; /* vsq number */
|
|
NsIec104Struct.SendBuffer[1]=Index-2;
|
|
|
|
}
|
|
else
|
|
{
|
|
Number=NsCheckDd1Soe();
|
|
if(Number>0)
|
|
{
|
|
if(Number>18)
|
|
Number=18;
|
|
SendCount=0;
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=30; /* asdu type */
|
|
NsIec104Struct.SendBuffer[Index++]=1; /* information object count */
|
|
|
|
/* REASONBYTE now is two */
|
|
NsIec104Struct.SendBuffer[Index++]=0x03; /* reason */
|
|
NsIec104Struct.SendBuffer[Index++]=0x00; /* reason */
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
for(i=0;i<Number;i++)
|
|
{
|
|
if(NsGetDd1SoeLib(&SoeData)==ON)
|
|
{
|
|
SendCount++;
|
|
/* Information Object Address now three byte: 0xc01---0xc80 */
|
|
Object=SoeData.SendNumber+0x01;
|
|
P=(unsigned char *)&Object;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0];
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
NsIec104Struct.SendBuffer[Index++]=SoeData.State;
|
|
Msecond=SoeData.Msecond+SoeData.Second*1000;
|
|
P=(unsigned char *)&Msecond;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0];
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendBuffer[Index++]=SoeData.Minute;
|
|
NsIec104Struct.SendBuffer[Index++]=SoeData.Hour;
|
|
NsIec104Struct.SendBuffer[Index++]=SoeData.Day;
|
|
NsIec104Struct.SendBuffer[Index++]=SoeData.Month;
|
|
NsIec104Struct.SendBuffer[Index++]=(SoeData.Year-2000);
|
|
|
|
}
|
|
}
|
|
/* Repair Length */
|
|
NsIec104Struct.SendBuffer[7]=SendCount; /* vsq number */
|
|
NsIec104Struct.SendBuffer[1]=Index-2;
|
|
}
|
|
else
|
|
{
|
|
if(NsIec104Cycle[0].TimeSign== ON)
|
|
{
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x04;
|
|
NsIec104Struct.SendBuffer[Index++]=0x43;
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
NsIec104Cycle[0].TimeSign=OFF;
|
|
}
|
|
}
|
|
}
|
|
if(Index>0)
|
|
{
|
|
NsIec104Struct.SendLength=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0);
|
|
CosSendSign=0x01;
|
|
}
|
|
return CosSendSign;
|
|
}
|
|
|
|
|
|
|
|
static void NsIec104ProcessYkYt(void)
|
|
{
|
|
|
|
unsigned char YkInformation,YkReason,YkWhat;
|
|
unsigned short YkObject;
|
|
unsigned char Media,YkAction;
|
|
NS_RELATION Dear;
|
|
|
|
/*
|
|
Information Object Address 0xb01---0xb80
|
|
for(i=0;i< NS_IEC_104_REASONBYTE;i++)
|
|
NsIec104Struct.TransmitReason[i]=NsIec104Struct.ReceiveBuffer[NS_STARTREASON+i];
|
|
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
|
|
NsIec104Struct.InformationObject[i]=NsIec104Struct.ReceiveBuffer[NS_STARTINFORMATION+i];
|
|
|
|
*/
|
|
|
|
YkInformation=NsIec104Struct.ReceiveBuffer[NS_STARTINFORMATION+NS_IEC_104_INFORMATIONBYTE];
|
|
YkReason=NsIec104Struct.ReceiveBuffer[NS_STARTREASON];
|
|
|
|
YkObject=NsIec104Struct.ReceiveBuffer[NS_STARTINFORMATION]+NsIec104Struct.ReceiveBuffer[NS_STARTINFORMATION+1]*256;
|
|
YkObject-=0xb01;
|
|
|
|
YkWhat=0; /* nothing */
|
|
if(YkReason==6)
|
|
{
|
|
if(YkInformation&0x80) /* YkSelect */
|
|
YkWhat=1;
|
|
else
|
|
YkWhat=2; /* YkExe*/
|
|
|
|
|
|
}
|
|
else
|
|
if(YkReason==8) /* Esc*/
|
|
YkWhat=3;
|
|
|
|
switch(YkWhat)
|
|
{
|
|
case 1: /* select */
|
|
NsIec104Struct.ReceiveYkId=YkObject;
|
|
YkAction=YkInformation&0x03;
|
|
switch(YkAction)
|
|
{
|
|
case 1: /* Open */
|
|
NsIec104Struct.YkCellAction=NS_TRIP;
|
|
break;
|
|
case 2: /* close */
|
|
NsIec104Struct.YkCellAction=NS_CLOSE;
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
NsIec104Struct.YkCellNumber=NsGetYkCell(NS_YK_CELL_NUMBER,NsIec104Struct.ReceiveYkId);
|
|
NsIec104Struct.YkKgNumber=NsGetYkCell(NS_YK_CELL_KG,NsIec104Struct.ReceiveYkId);
|
|
NsIec104Struct.YkNowState=NS_YK_SELECT;
|
|
Media=NsGetYkCell(NS_YK_CELL_CPU,NsIec104Struct.ReceiveYkId);
|
|
Dear.NsYkPort=NsIec104Struct.Card+NS_IEC_104_YK_BASE_PORT;
|
|
Dear.NsYkSlavePort=Media;
|
|
NsPutDear(&Dear,6);
|
|
NsIec104SendYkMessage(NS_YK_SELECT,NsIec104Struct.YkCellAction);
|
|
NsIec104Struct.YkStartSign=ON;
|
|
getforsecond(&NsIec104Struct.YkStartTime);
|
|
/*
|
|
printf("\n Send Yk SelectId=%d Cell=%d Kg=%d",NsIec104Struct.ReceiveYkId,NsIec104Struct.YkCellNumber,NsIec104Struct.YkKgNumber);
|
|
*/
|
|
break;
|
|
case 2: /* YkExe */
|
|
NsIec104Struct.ReceiveYkId=YkObject;
|
|
YkAction=YkInformation&0x03;
|
|
switch(YkAction)
|
|
{
|
|
case 1: /* Open */
|
|
NsIec104Struct.YkCellAction=NS_TRIP;
|
|
break;
|
|
case 2: /* close */
|
|
NsIec104Struct.YkCellAction=NS_CLOSE;
|
|
break;
|
|
default:
|
|
NsIec104Struct.YkCellAction=0xff;
|
|
break;
|
|
}
|
|
NsIec104Struct.YkCellNumber=NsGetYkCell(NS_YK_CELL_NUMBER,NsIec104Struct.ReceiveYkId);
|
|
NsIec104Struct.YkKgNumber=NsGetYkCell(NS_YK_CELL_KG,NsIec104Struct.ReceiveYkId);
|
|
NsIec104Struct.YkNowState=NS_YK_EXE;
|
|
Media=NsGetYkCell(NS_YK_CELL_CPU,NsIec104Struct.ReceiveYkId);
|
|
Dear.NsYkPort=NsIec104Struct.Card+NS_IEC_104_YK_BASE_PORT;
|
|
Dear.NsYkSlavePort=Media;
|
|
NsPutDear(&Dear,6);
|
|
NsIec104SendYkMessage(NS_YK_EXE,NsIec104Struct.YkCellAction);
|
|
NsIec104Struct.YkStartSign=ON;
|
|
getforsecond(&NsIec104Struct.YkStartTime);
|
|
/*
|
|
printf("\n Send Yk ExeId=%d Cell=%d Kg=%d",NsIec104Struct.ReceiveYkId,NsIec104Struct.YkCellNumber,NsIec104Struct.YkKgNumber);
|
|
*/
|
|
break;
|
|
case 3:
|
|
NsIec104Struct.ReceiveYkId=YkObject;
|
|
YkAction=YkInformation&0x03;
|
|
switch(YkAction)
|
|
{
|
|
case 1: /* Open */
|
|
NsIec104Struct.YkCellAction=NS_TRIP;
|
|
break;
|
|
case 2: /* close */
|
|
NsIec104Struct.YkCellAction=NS_CLOSE;
|
|
break;
|
|
default:
|
|
NsIec104Struct.YkCellAction=0xff;
|
|
break;
|
|
}
|
|
NsIec104Struct.YkCellNumber=NsGetYkCell(NS_YK_CELL_NUMBER,NsIec104Struct.ReceiveYkId);
|
|
NsIec104Struct.YkKgNumber=NsGetYkCell(NS_YK_CELL_KG,NsIec104Struct.ReceiveYkId);
|
|
NsIec104Struct.YkNowState=NS_YK_ESC;
|
|
Media=NsGetYkCell(NS_YK_CELL_CPU,NsIec104Struct.ReceiveYkId);
|
|
Dear.NsYkPort=NsIec104Struct.Card+NS_IEC_104_YK_BASE_PORT;
|
|
Dear.NsYkSlavePort=Media;
|
|
NsPutDear(&Dear,6);
|
|
NsIec104SendYkMessage(NS_YK_ESC,NsIec104Struct.YkCellAction);
|
|
NsIec104Struct.YkStartSign=ON;
|
|
getforsecond(&NsIec104Struct.YkStartTime);
|
|
/*
|
|
printf("\n Send Yk EscId=%d Cell=%d Kg=%d",NsIec104Struct.ReceiveYkId,NsIec104Struct.YkCellNumber,NsIec104Struct.YkKgNumber);
|
|
*/
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
static void NsIec104SendYkMessage(short Who,unsigned char Action)
|
|
{
|
|
|
|
char Dd1Message[16];
|
|
|
|
switch(Who)
|
|
{
|
|
case NS_YK_ESC:
|
|
Dd1Message[0]=SEND_YK_HOST_DD1;
|
|
Dd1Message[1]=NS_YK_ESC;
|
|
Dd1Message[2]=NsIec104Struct.YkCellNumber;
|
|
Dd1Message[3]=NsIec104Struct.YkKgNumber;
|
|
Dd1Message[4]=NsIec104Struct.YkCellAction;
|
|
NsHostSendYkMessage(SEND_YK_HOST_DD1,8,Dd1Message);
|
|
break;
|
|
case NS_YK_EXE:
|
|
Dd1Message[0]=SEND_YK_HOST_DD1;
|
|
Dd1Message[1]=NS_YK_EXE;
|
|
Dd1Message[2]=NsIec104Struct.YkCellNumber;
|
|
Dd1Message[3]=NsIec104Struct.YkKgNumber;
|
|
Dd1Message[4]=NsIec104Struct.YkCellAction;
|
|
NsHostSendYkMessage(SEND_YK_HOST_DD1,8,Dd1Message);
|
|
break;
|
|
case NS_YK_SELECT:
|
|
Dd1Message[0]=SEND_YK_HOST_DD1;
|
|
Dd1Message[1]=NS_YK_SELECT;
|
|
Dd1Message[2]=NsIec104Struct.YkCellNumber;
|
|
Dd1Message[3]=NsIec104Struct.YkKgNumber;
|
|
Dd1Message[4]=NsIec104Struct.YkCellAction;
|
|
NsHostSendYkMessage(SEND_YK_HOST_DD1,8,Dd1Message);
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void NsIec104ReceiveYkReturn(void)
|
|
{
|
|
char ReturnMessage[16];
|
|
int Length,HasMessage;
|
|
NS_RELATION Dear;
|
|
|
|
if(NsIec104Struct.YkStartSign==ON)
|
|
{
|
|
NsGetDear(&Dear);
|
|
if(Dear.NsYkPort==(NsIec104Struct.Card+NS_IEC_104_YK_BASE_PORT))
|
|
{
|
|
/*
|
|
printf("\n Yk Return");
|
|
*/
|
|
if(NsHostReceiveYkMessage(SEND_YK_HOST_DD1,ReturnMessage)==1)
|
|
{
|
|
|
|
/*
|
|
printf("\nYkMes0=%0x--1=%0x--2=%0x---3=%0x---4=%0x",
|
|
ReturnMessage[0],ReturnMessage[1],ReturnMessage[2],ReturnMessage[3],ReturnMessage[4]);
|
|
*/
|
|
|
|
if(ReturnMessage[0]==SEND_YK_HOST_DD1)
|
|
{
|
|
if(NsIec104Struct.YkNowState==ReturnMessage[1])
|
|
{
|
|
if((ReturnMessage[2]==NsIec104Struct.YkCellNumber)&&
|
|
(ReturnMessage[3]==NsIec104Struct.YkKgNumber)&&
|
|
(ReturnMessage[4]==NsIec104Struct.YkCellAction))
|
|
{
|
|
NsIec104Struct.YkError=ReturnMessage[5];
|
|
if(NsIec104Struct.YkNowState==NS_YK_SELECT)
|
|
{
|
|
NsIec104SendYkSelectConfirm();
|
|
/*
|
|
printf("\n Selec Confim");
|
|
*/
|
|
}
|
|
else
|
|
{
|
|
if(NsIec104Struct.YkNowState==NS_YK_EXE)
|
|
NsIec104SendYkExeConfirm();
|
|
else
|
|
{
|
|
if(NsIec104Struct.YkNowState==NS_YK_ESC)
|
|
NsIec104SendYkEscConfirm();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static void NsIec104SendYkSelectConfirm(void)
|
|
{
|
|
|
|
|
|
unsigned short YkObject,Index;
|
|
unsigned char *P,i;
|
|
unsigned short RealNumber;
|
|
|
|
|
|
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.YkYtType; /* asdu type */
|
|
NsIec104Struct.SendBuffer[Index++]=1; /* information object count */
|
|
|
|
/* REASONBYTE now is two */
|
|
NsIec104Struct.SendBuffer[Index++]=0x07; /* reason */
|
|
NsIec104Struct.SendBuffer[Index++]=0x00; /* reason */
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
/* Information Object Address now three byte: 0xc01---0xc80 */
|
|
YkObject=NsIec104Struct.ReceiveYkId+0xb01;
|
|
P=(unsigned char *)&YkObject;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0];
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
/* Value */
|
|
if(NsIec104Struct.YkCellAction==NS_TRIP)
|
|
NsIec104Struct.SendBuffer[Index++]=0x81;
|
|
else
|
|
if(NsIec104Struct.YkCellAction==NS_CLOSE)
|
|
NsIec104Struct.SendBuffer[Index++]=0x82;
|
|
else
|
|
NsIec104Struct.YkCellAction=0xff;
|
|
|
|
/* Repair Length */
|
|
NsIec104Struct.SendBuffer[1]=Index-2;
|
|
if((NsIec104Struct.SendLength=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0))<0)
|
|
{
|
|
perror ("Client FirstWrite Error");
|
|
}
|
|
}
|
|
|
|
static void NsIec104SendYkExeConfirm(void)
|
|
{
|
|
|
|
|
|
unsigned short YkObject,Index;
|
|
unsigned char *P,i;
|
|
unsigned short RealNumber;
|
|
|
|
|
|
/* YkExe Confirm */
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.YkYtType; /* asdu type */
|
|
NsIec104Struct.SendBuffer[Index++]=1; /* information object count */
|
|
|
|
/* REASONBYTE now is two */
|
|
NsIec104Struct.SendBuffer[Index++]=0x07; /* reason */
|
|
NsIec104Struct.SendBuffer[Index++]=0x00; /* reason */
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
/* Information Object Address now three byte: 0xc01---0xc80 */
|
|
YkObject=NsIec104Struct.ReceiveYkId+0xb01;
|
|
P=(unsigned char *)&YkObject;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0];
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
/* Value */
|
|
if(NsIec104Struct.YkCellAction==NS_TRIP)
|
|
NsIec104Struct.SendBuffer[Index++]=0x01;
|
|
else
|
|
if(NsIec104Struct.YkCellAction==NS_CLOSE)
|
|
NsIec104Struct.SendBuffer[Index++]=0x02;
|
|
else
|
|
NsIec104Struct.YkCellAction=0xff;
|
|
|
|
/* Repair Length */
|
|
NsIec104Struct.SendBuffer[1]=Index-2;
|
|
if((NsIec104Struct.SendLength=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0))<0)
|
|
{
|
|
perror ("Client FirstWrite Error");
|
|
}
|
|
taskDelay(100);
|
|
/* YkExe End */
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.YkYtType; /* asdu type */
|
|
NsIec104Struct.SendBuffer[Index++]=1; /* information object count */
|
|
|
|
/* REASONBYTE now is two */
|
|
NsIec104Struct.SendBuffer[Index++]=10; /* reason */
|
|
NsIec104Struct.SendBuffer[Index++]=0x00; /* reason */
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
/* Information Object Address now three byte: 0xc01---0xc80 */
|
|
YkObject=NsIec104Struct.ReceiveYkId+0xb01;
|
|
P=(unsigned char *)&YkObject;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0];
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
/* Value */
|
|
if(NsIec104Struct.YkCellAction==NS_TRIP)
|
|
NsIec104Struct.SendBuffer[Index++]=0x01;
|
|
else
|
|
if(NsIec104Struct.YkCellAction==NS_CLOSE)
|
|
NsIec104Struct.SendBuffer[Index++]=0x02;
|
|
else
|
|
NsIec104Struct.YkCellAction=0xff;
|
|
|
|
/* Repair Length */
|
|
NsIec104Struct.SendBuffer[1]=Index-2;
|
|
if((NsIec104Struct.SendLength=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0))<0)
|
|
{
|
|
perror ("Client FirstWrite Error");
|
|
}
|
|
taskDelay(8);
|
|
}
|
|
|
|
static void NsIec104SendYkEscConfirm(void)
|
|
{
|
|
|
|
|
|
unsigned short YkObject,Index;
|
|
unsigned char *P,i;
|
|
unsigned short RealNumber;
|
|
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.YkYtType; /* asdu type */
|
|
NsIec104Struct.SendBuffer[Index++]=1; /* information object count */
|
|
|
|
/* REASONBYTE now is two */
|
|
NsIec104Struct.SendBuffer[Index++]=0x09; /* reason */
|
|
NsIec104Struct.SendBuffer[Index++]=0x00; /* reason */
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
/* Information Object Address now three byte: 0xc01---0xc80 */
|
|
YkObject=NsIec104Struct.ReceiveYkId+0xb01;
|
|
P=(unsigned char *)&YkObject;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0];
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
/* Value */
|
|
if(NsIec104Struct.YkCellAction==NS_TRIP)
|
|
NsIec104Struct.SendBuffer[Index++]=0x81;
|
|
else
|
|
if(NsIec104Struct.YkCellAction==NS_CLOSE)
|
|
NsIec104Struct.SendBuffer[Index++]=0x82;
|
|
else
|
|
NsIec104Struct.YkCellAction=0xff;
|
|
|
|
/* Repair Length */
|
|
NsIec104Struct.SendBuffer[1]=Index-2;
|
|
if((NsIec104Struct.SendLength=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0))<0)
|
|
{
|
|
perror ("Client FirstWrite Error");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void NsIec104ProcessPulseAck(void)
|
|
{
|
|
unsigned short i,Index,RealNumber;
|
|
unsigned char *P;
|
|
|
|
/* First Send Confirm */
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x0e;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=101;
|
|
NsIec104Struct.SendBuffer[Index++]=1;
|
|
|
|
for(i=0;i< NS_IEC_104_REASONBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=0x07;
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.InformationObject[i];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.Qcc;
|
|
|
|
if((NsIec104Struct.SendLength = send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0))<0)
|
|
{
|
|
perror ("Client Write Error");
|
|
}
|
|
|
|
|
|
}
|
|
|
|
static void NsIec104ProcessPulseEnd(void)
|
|
{
|
|
unsigned short i,Index,RealNumber;
|
|
unsigned char *P;
|
|
|
|
/* end confirm*/
|
|
taskDelay(16);
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x0e;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=101;
|
|
NsIec104Struct.SendBuffer[Index++]=1;
|
|
|
|
for(i=0;i< NS_IEC_104_REASONBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=10;
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.InformationObject[i];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.Qcc;
|
|
|
|
if((NsIec104Struct.SendLength = send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0)) < 0)
|
|
{
|
|
perror ("Client Write Error");
|
|
}
|
|
|
|
}
|
|
|
|
|
|
static void NsIec104ProcessPulse(void)
|
|
{
|
|
unsigned short General,Index;
|
|
unsigned char *P;
|
|
unsigned short i,j,RealNumber;
|
|
|
|
|
|
|
|
NsIec104Struct.Qcc=NsIec104Struct.ReceiveBuffer[NS_IEC_104_QCC_POSITION];
|
|
NsIec104Struct.FreezeSign=NsIec104Struct.Qcc&0xc0;
|
|
|
|
NsIec104Struct.FreezeSign>>=6;
|
|
NsIec104Struct.PulseGroup=NsIec104Struct.Qcc&0x3f;
|
|
|
|
switch(NsIec104Struct.FreezeSign)
|
|
{
|
|
case 0:
|
|
NsIec104ProcessPulseData();
|
|
break;
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
NsIec104ProcessPulseAck();
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void NsIec104ProcessPulseGroup(void)
|
|
{
|
|
unsigned short General,Index;
|
|
unsigned char *P,start;
|
|
unsigned short i,j,RealNumber,YmLib;
|
|
|
|
|
|
for(start=0;start<2;start++)
|
|
{
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=15; /* asdu type */
|
|
NsIec104Struct.SendBuffer[Index++]=16; /* information object count */
|
|
|
|
/* REASONBYTE now is two */
|
|
NsIec104Struct.SendBuffer[Index++]=37+NsIec104Struct.PulseGroup; /* reason */
|
|
NsIec104Struct.SendBuffer[Index++]=0x0; /* reason */
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
YmLib=start*16+32*(NsIec104Struct.PulseGroup-1);
|
|
switch(NsIec104Struct.Table)
|
|
{
|
|
case 0:
|
|
NsGetDd1Lib(NS_YM_DATA,YmLib,NsIec104Struct.DataBuff,16);
|
|
break;
|
|
case 1:
|
|
NsGetDd2Lib(NS_YM_DATA,YmLib,NsIec104Struct.DataBuff,16);
|
|
break;
|
|
case 2:
|
|
NsGetDd3Lib(NS_YM_DATA,YmLib,NsIec104Struct.DataBuff,16);
|
|
break;
|
|
case 3:
|
|
NsGetDd4Lib(NS_YM_DATA,YmLib,NsIec104Struct.DataBuff,16);
|
|
break;
|
|
}
|
|
|
|
for(i=0;i<16;i++)
|
|
{
|
|
/* Information Object Address now three byte: 0xc01---0xc80 */
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=0x80+i+start*16+32*(NsIec104Struct.PulseGroup-1);
|
|
NsIec104Struct.SendBuffer[Index++]=0x0c;
|
|
NsIec104Struct.SendBuffer[Index++]=0;
|
|
/* Value */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.DataBuff[4*i];
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.DataBuff[4*i+1];
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.DataBuff[4*i+2];
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.DataBuff[4*i+3];
|
|
/* sequence number */
|
|
NsIec104Struct.SendBuffer[Index++]=start*16+i;
|
|
}
|
|
/* Repair Length */
|
|
NsIec104Struct.SendBuffer[1]=Index-2;
|
|
if((NsIec104Struct.SendLength=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0))<0)
|
|
{
|
|
perror ("Client FirstWrite Error");
|
|
}
|
|
}
|
|
}
|
|
|
|
static void NsIec104ProcessPulseAll(void)
|
|
{
|
|
unsigned short General,Index;
|
|
unsigned char *P,GroupIndex,start;
|
|
unsigned short i,j,RealNumber;
|
|
unsigned long InformationObject;
|
|
|
|
|
|
GroupIndex=0;
|
|
NsIec104Struct.NeedSendNumber=0;
|
|
NsIec104Struct.HasSendNumber=0;
|
|
NsIec104Struct.LeftSendNumber=0;
|
|
|
|
/* First Send Confirm */
|
|
Index=0;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x68;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x0e;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=P[0]; /* send number */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=101;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=1;
|
|
|
|
for(i=0;i< NS_IEC_104_REASONBYTE;i++)
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x07;
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.InformationObject[i];
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.Qcc;
|
|
NsIec104Struct.GroupSendLength[GroupIndex]=Index;
|
|
|
|
GroupIndex++;
|
|
NsIec104Struct.NeedSendNumber++;
|
|
|
|
for(start=0;start<NS_IEC_104_TOTAL_YM_TIMES;start++) /* total 128 ym send 8 times */
|
|
{
|
|
Index=0;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x68;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x00;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=P[0]; /* send number */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=15; /* asdu type */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NS_IEC_104_ONCE_YM ; /* information object count */
|
|
|
|
/* REASONBYTE now is two */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=37 ; /* reason */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x0; /* reason */
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
switch(NsIec104Struct.Table)
|
|
{
|
|
case 0:
|
|
NsGetDd1Lib(NS_YM_DATA,start*NS_IEC_104_ONCE_YM,NsIec104Struct.DataBuff,NS_IEC_104_ONCE_YM);
|
|
break;
|
|
case 1:
|
|
NsGetDd2Lib(NS_YM_DATA,start*NS_IEC_104_ONCE_YM,NsIec104Struct.DataBuff,NS_IEC_104_ONCE_YM);
|
|
break;
|
|
case 2:
|
|
NsGetDd3Lib(NS_YM_DATA,start*NS_IEC_104_ONCE_YM,NsIec104Struct.DataBuff,NS_IEC_104_ONCE_YM);
|
|
break;
|
|
case 3:
|
|
NsGetDd4Lib(NS_YM_DATA,start*NS_IEC_104_ONCE_YM,NsIec104Struct.DataBuff,NS_IEC_104_ONCE_YM);
|
|
break;
|
|
}
|
|
for(i=0;i<NS_IEC_104_ONCE_YM;i++)
|
|
{
|
|
/* Information Object Address now three byte: 0xc01---0xc80 */
|
|
InformationObject=0xc01+i+start*NS_IEC_104_ONCE_YM;
|
|
P=(unsigned char *)&InformationObject;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=P[0];
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=P[1];
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=P[2];
|
|
/* Value */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.DataBuff[4*i];
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.DataBuff[4*i+1];
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.DataBuff[4*i+2];
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.DataBuff[4*i+3];
|
|
/* sequence number */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=i;
|
|
}
|
|
/* Repair Length */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][1]=Index-2;
|
|
NsIec104Struct.GroupSendLength[GroupIndex]=Index;
|
|
/*
|
|
if((NsIec104Struct.SendLength=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.GroupSendBuffer[GroupIndex][0],NsIec104Struct.GroupSendLength,0x0))<0)
|
|
{
|
|
perror ("Client FirstWrite Error");
|
|
}
|
|
*/
|
|
GroupIndex++;
|
|
NsIec104Struct.NeedSendNumber++;
|
|
|
|
}
|
|
/* Send Pulse End Packet */
|
|
Index=0;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x68;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x0e;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=P[0]; /* send number */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=101;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=1;
|
|
|
|
for(i=0;i< NS_IEC_104_REASONBYTE;i++)
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=10;
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.InformationObject[i];
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.Qcc;
|
|
NsIec104Struct.GroupSendLength[GroupIndex]=Index;
|
|
/*
|
|
if((NsIec104Struct.SendLength = send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.GroupSendBuffer[GroupIndex][0],NsIec104Struct.GroupSendLength,0x0)) < 0)
|
|
{
|
|
perror ("Client Write Error");
|
|
}
|
|
*/
|
|
/* mask 2003-01-24
|
|
GroupIndex++;
|
|
NsIec104Struct.NeedSendNumber++;
|
|
*/
|
|
}
|
|
|
|
static void NsIec104ProcessPulseData(void)
|
|
{
|
|
|
|
|
|
switch(NsIec104Struct.PulseGroup)
|
|
{
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
NsIec104ProcessPulseAck();
|
|
NsIec104ProcessPulseGroup();
|
|
NsIec104ProcessPulseEnd();
|
|
break;
|
|
case 5:
|
|
NsIec104ProcessPulseAll();
|
|
break;
|
|
}
|
|
}
|
|
|
|
static void NsIec104ProcessTime(void)
|
|
{
|
|
|
|
unsigned short i,Index,RealNumber,Mmsecond;
|
|
unsigned char *P,Year,Month,Day,Hour,Minute,Second;
|
|
struct tm NowTime;
|
|
|
|
/* First Send Confirm */
|
|
for(i=0;i<7;i++)
|
|
{
|
|
NsIec104Struct.TimeSave[i]=NsIec104Struct.ReceiveBuffer[NS_IEC_104_TIME_POSITION+i];
|
|
/*
|
|
printf("\n Time=%d",NsIec104Struct.TimeSave[i]);
|
|
*/
|
|
}
|
|
Mmsecond=(NsIec104Struct.ReceiveBuffer[NS_IEC_104_TIME_POSITION]
|
|
+256*NsIec104Struct.ReceiveBuffer[NS_IEC_104_TIME_POSITION+1])%1000;
|
|
|
|
Second=(NsIec104Struct.ReceiveBuffer[NS_IEC_104_TIME_POSITION]
|
|
+256*NsIec104Struct.ReceiveBuffer[NS_IEC_104_TIME_POSITION+1])/1000;
|
|
Minute=NsIec104Struct.ReceiveBuffer[NS_IEC_104_TIME_POSITION+2]&0x3f;
|
|
Hour=NsIec104Struct.ReceiveBuffer[NS_IEC_104_TIME_POSITION+3]&0x1f;
|
|
Day=NsIec104Struct.ReceiveBuffer[NS_IEC_104_TIME_POSITION+4]&0x1f;
|
|
Month=NsIec104Struct.ReceiveBuffer[NS_IEC_104_TIME_POSITION+5]&0x0f;
|
|
Year=NsIec104Struct.ReceiveBuffer[NS_IEC_104_TIME_POSITION+6]&0x7f;
|
|
/*
|
|
if(NsIec104Struct.SetTimeFlag)
|
|
{
|
|
NowTime.tm_sec = Second;
|
|
NowTime.tm_min = Minute;
|
|
NowTime.tm_hour = Hour;
|
|
NowTime.tm_mday = Day;
|
|
NowTime.tm_mon = Month;
|
|
NowTime.tm_year = Year + 2000;
|
|
setvxTime(&NowTime);
|
|
}
|
|
*/
|
|
/*
|
|
printf("\n Year=%d Month=%d Day=%d Hour=%d Min=%d Sec=%d Msec=%d",
|
|
Year,Month,Day,Hour,Minute,Second,Mmsecond);
|
|
*/
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x0e;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=103;
|
|
NsIec104Struct.SendBuffer[Index++]=1;
|
|
|
|
for(i=0;i< NS_IEC_104_REASONBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=0x07;
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.InformationObject[i];
|
|
|
|
for(i=0;i<7;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.TimeSave[i];
|
|
|
|
NsIec104Struct.SendBuffer[1]=Index-2;
|
|
if((NsIec104Struct.SendLength = send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0))<0)
|
|
{
|
|
perror ("Client Write Error");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void NsIec104Interrogation(void)
|
|
{
|
|
|
|
|
|
switch(NsIec104Struct.AsduQualifier)
|
|
{
|
|
case 20: /* All Interrogation */
|
|
NsIec104InterrogationAll();
|
|
break;
|
|
|
|
default:
|
|
NsIec104InterrogationGroup();
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
static void NsIec104InterrogationGroup(void)
|
|
{
|
|
unsigned char WhichGroup;
|
|
|
|
|
|
if(NsIec104Struct.AsduQualifier>=NS_IEC104_GROUP_BEGIN&&NsIec104Struct.AsduQualifier<=NS_IEC104_GROUP_END)
|
|
{
|
|
WhichGroup=NsIec104Struct.ReceiveBuffer[NS_IEC_104_GROUP_BYTE];
|
|
WhichGroup-=21;
|
|
switch(WhichGroup)
|
|
{
|
|
|
|
case 0:
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
case 4:
|
|
case 5:
|
|
case 6:
|
|
case 7:
|
|
NsIec104ProcessYxGroup(WhichGroup);
|
|
break;
|
|
case 8:
|
|
case 9:
|
|
case 10:
|
|
case 11:
|
|
NsIec104ProcessYcGroup(WhichGroup);
|
|
break;
|
|
case 12: /* location information */
|
|
NsIec104DefaultGroup(WhichGroup);
|
|
break;
|
|
case 13: /* BCD Information */
|
|
NsIec104DefaultGroup(WhichGroup);
|
|
break;
|
|
case 14: /* cell state */
|
|
NsIec104DefaultGroup(WhichGroup);
|
|
break;
|
|
case 15: /* backup use */
|
|
NsIec104DefaultGroup(WhichGroup);
|
|
break;
|
|
default:
|
|
NsIec104DefaultGroup(WhichGroup);
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
static void NsIec104DefaultGroup(unsigned char Group)
|
|
{
|
|
unsigned short General,Index;
|
|
unsigned char *P;
|
|
unsigned short i,j,RealNumber;
|
|
|
|
|
|
/* First Send Confirm */
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x0e;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=100;
|
|
NsIec104Struct.SendBuffer[Index++]=1;
|
|
|
|
for(i=0;i< NS_IEC_104_REASONBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=0x07;
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.InformationObject[i];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=21+Group;
|
|
|
|
if((NsIec104Struct.SendLength = send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0))<0)
|
|
{
|
|
perror ("Client Write Error");
|
|
}
|
|
|
|
taskDelay(6);
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x0e;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=100;
|
|
NsIec104Struct.SendBuffer[Index++]=1;
|
|
|
|
for(i=0;i< NS_IEC_104_REASONBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=10;
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.InformationObject[i];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=21+Group;
|
|
|
|
if((NsIec104Struct.SendLength = send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0)) < 0)
|
|
{
|
|
perror ("Client Write Error");
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void NsIec104ProcessYxGroup(unsigned char Group)
|
|
{
|
|
unsigned short General,Index,YxLibIndex;
|
|
unsigned char *P,start,YxBit,YxByte;
|
|
unsigned short i,j,g,RealNumber;
|
|
|
|
|
|
/* Once Gonce need send 64 Yx 8 bytes Group from 0 begin*/
|
|
/* First Send Confirm */
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x0e;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=100; /* transmit type */
|
|
NsIec104Struct.SendBuffer[Index++]=1; /* vsq */
|
|
|
|
for(i=0;i< NS_IEC_104_REASONBYTE;i++) /* reason */
|
|
NsIec104Struct.SendBuffer[Index++]=0x07;
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.InformationObject[i];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=21+Group;
|
|
/*
|
|
printf("\n YxGroup=%d",Group);
|
|
*/
|
|
|
|
if((NsIec104Struct.SendLength=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0))<0)
|
|
{
|
|
perror ("Client Write Error");
|
|
}
|
|
for(start=0;start<2;start++)
|
|
{
|
|
taskDelay(60);
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=1; /* asdu type */
|
|
NsIec104Struct.SendBuffer[Index++]=64|0x80; /* information object d",count */
|
|
|
|
/* REASONBYTE now is two */
|
|
NsIec104Struct.SendBuffer[Index++]=21+Group; /* reason */
|
|
NsIec104Struct.SendBuffer[Index++]=0x00; /* reason */
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
/* Information Object Address now three byte*/
|
|
|
|
General=0x01+start*0x40+Group*0x80;
|
|
P=(unsigned char *)&General;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0];
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendBuffer[Index++]=0;
|
|
YxLibIndex=start*8+Group*16;
|
|
|
|
switch(NsIec104Struct.Table)
|
|
{
|
|
case 0:
|
|
NsGetDd1Lib(NS_YX_DATA,YxLibIndex,NsIec104Struct.DataBuff,8);
|
|
break;
|
|
case 1:
|
|
NsGetDd2Lib(NS_YX_DATA,YxLibIndex,NsIec104Struct.DataBuff,8);
|
|
break;
|
|
case 2:
|
|
NsGetDd3Lib(NS_YX_DATA,YxLibIndex,NsIec104Struct.DataBuff,8);
|
|
break;
|
|
case 3:
|
|
NsGetDd4Lib(NS_YX_DATA,YxLibIndex,NsIec104Struct.DataBuff,8);
|
|
break;
|
|
}
|
|
for(i=0;i<8;i++) /* totla 64 yx*/
|
|
{
|
|
|
|
YxByte=NsIec104Struct.DataBuff[i];
|
|
for(g=0;g<8;g++)
|
|
{
|
|
YxBit=(YxByte>>g)&0x01;
|
|
NsIec104Struct.SendBuffer[Index++]=YxBit;
|
|
}
|
|
}
|
|
/* Repair Length */
|
|
NsIec104Struct.SendBuffer[1]=Index-2;
|
|
if((NsIec104Struct.SendLength=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0))<0)
|
|
{
|
|
perror ("Client FirstWrite Error");
|
|
}
|
|
}
|
|
|
|
taskDelay(6);
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x0e;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=100;
|
|
NsIec104Struct.SendBuffer[Index++]=1;
|
|
|
|
for(i=0;i< NS_IEC_104_REASONBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=10;
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.InformationObject[i];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=21+Group;
|
|
|
|
if((NsIec104Struct.SendLength = send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0)) < 0)
|
|
{
|
|
perror ("Client Write Error");
|
|
}
|
|
|
|
}
|
|
|
|
static void NsIec104ProcessYcGroup(unsigned char Group)
|
|
{
|
|
unsigned short General,Index;
|
|
unsigned char *P;
|
|
unsigned short i,RealNumber,YcLibIndex;
|
|
|
|
|
|
|
|
/* Once Gonce need send 60 Yc Group Number is 8 9 10 11 begin from 8 */
|
|
/* First Send Confirm */
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x0e;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=100;
|
|
NsIec104Struct.SendBuffer[Index++]=1;
|
|
|
|
for(i=0;i< NS_IEC_104_REASONBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=0x07;
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.InformationObject[i];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=21+Group;
|
|
|
|
if((NsIec104Struct.SendLength = send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0))<0)
|
|
{
|
|
perror ("Client Write Error");
|
|
}
|
|
|
|
taskDelay(60);
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x00;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=9; /* asdu type */
|
|
NsIec104Struct.SendBuffer[Index++]=64|0x80; /* information object count */
|
|
|
|
/* REASONBYTE now is two */
|
|
NsIec104Struct.SendBuffer[Index++]=21+Group; /* reason */
|
|
NsIec104Struct.SendBuffer[Index++]=0x0; /* reason */
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
/* Information Object Address now three byte*/
|
|
General=0x701+Group*0x80;
|
|
P=(unsigned char *)&General;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0];
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendBuffer[Index++]=0;
|
|
|
|
YcLibIndex=0;
|
|
switch(NsIec104Struct.Table)
|
|
{
|
|
case 0:
|
|
NsGetDd1Lib(NS_YC_DATA,YcLibIndex,NsIec104Struct.DataBuff,64);
|
|
break;
|
|
case 1:
|
|
NsGetDd2Lib(NS_YC_DATA,YcLibIndex,NsIec104Struct.DataBuff,64);
|
|
break;
|
|
case 2:
|
|
NsGetDd3Lib(NS_YC_DATA,YcLibIndex,NsIec104Struct.DataBuff,64);
|
|
break;
|
|
case 3:
|
|
NsGetDd4Lib(NS_YC_DATA,YcLibIndex,NsIec104Struct.DataBuff,64);
|
|
break;
|
|
}
|
|
|
|
for(i=0;i<64;i++)
|
|
{
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.DataBuff[2*i];
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.DataBuff[2*i+1];
|
|
NsIec104Struct.SendBuffer[Index++]=0x00; /*qds*/
|
|
|
|
}
|
|
/* Repair Length */
|
|
NsIec104Struct.SendBuffer[1]=Index-2;
|
|
if((NsIec104Struct.SendLength=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0))<0)
|
|
{
|
|
perror ("Client FirstWrite Error");
|
|
}
|
|
/*
|
|
printf("\nYcGroupFirst=%d",Group);
|
|
*/
|
|
taskDelay(6);
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[Index++]=0x68;
|
|
NsIec104Struct.SendBuffer[Index++]=0x0e;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
P=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.SendBuffer[Index++]=P[0]; /* send number */
|
|
NsIec104Struct.SendBuffer[Index++]=P[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=100;
|
|
NsIec104Struct.SendBuffer[Index++]=1;
|
|
|
|
for(i=0;i< NS_IEC_104_REASONBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=10;
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
|
|
NsIec104Struct.SendBuffer[Index++]=NsIec104Struct.InformationObject[i];
|
|
|
|
NsIec104Struct.SendBuffer[Index++]=21+Group;
|
|
|
|
if((NsIec104Struct.SendLength = send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],Index,0x0)) < 0)
|
|
{
|
|
perror ("Client Write Error");
|
|
}
|
|
/*
|
|
printf("\nEndwrite=%d",NsIec104Struct.SendLength);
|
|
*/
|
|
}
|
|
|
|
|
|
static void NsIec104ProcessCellGroup(unsigned char Group)
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
static void NsIec104InterrogationAll(void)
|
|
{
|
|
unsigned short i,Index,start,g;
|
|
long ShiftValue;
|
|
unsigned char *PGive,j,GroupIndex,YxByte,YxBit,*pYc;
|
|
unsigned short RealNumber,YxLibIndex,YcLibIndex;
|
|
unsigned long InformationObject;
|
|
unsigned short sYc;
|
|
float fYc;
|
|
|
|
|
|
/* First Send Confirm */
|
|
GroupIndex=0;
|
|
NsIec104Struct.NeedSendNumber=0;
|
|
NsIec104Struct.HasSendNumber=0;
|
|
NsIec104Struct.LeftSendNumber=0;
|
|
|
|
|
|
Index=0;
|
|
NsIec104Struct.GroupSendBuffer[0][Index++]=0x68;
|
|
NsIec104Struct.GroupSendBuffer[0][Index++]=0x0e;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
PGive=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.GroupSendBuffer[0][Index++]=PGive[0]; /* send number */
|
|
NsIec104Struct.GroupSendBuffer[0][Index++]=PGive[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
|
|
NsIec104Struct.GroupSendBuffer[0][Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.GroupSendBuffer[0][Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
|
|
NsIec104Struct.GroupSendBuffer[0][Index++]=100;
|
|
NsIec104Struct.GroupSendBuffer[0][Index++]=1;
|
|
|
|
for(i=0;i< NS_IEC_104_REASONBYTE;i++)
|
|
NsIec104Struct.GroupSendBuffer[0][Index++]=0x07;
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.GroupSendBuffer[0][Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
|
|
NsIec104Struct.GroupSendBuffer[0][Index++]=NsIec104Struct.InformationObject[i];
|
|
|
|
NsIec104Struct.GroupSendBuffer[0][Index++]=20;
|
|
NsIec104Struct.GroupSendLength[0]=Index;
|
|
/*
|
|
if((NsIec104Struct.SendLength = send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.GroupSendBuffer[0][0],NsIec104Struct.GroupSendLength[0],0x0))<0)
|
|
{
|
|
perror ("Client Write Error");
|
|
}
|
|
*/
|
|
|
|
/* Second Send Yx total send 1024 yx */
|
|
GroupIndex++;
|
|
NsIec104Struct.NeedSendNumber++;
|
|
|
|
for(start=0;start<NS_IEC_104_TOTAL_YX_TIMES;start++)
|
|
{
|
|
Index=0;
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x68;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x0e;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
PGive=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=PGive[0]; /* send number */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=PGive[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=1; /* asdu type */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NS_IEC_104_ONCE_YX|0x80; /* information object count */
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=20; /* reason */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x0; /* reason */
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
InformationObject=0x01+start*NS_IEC_104_ONCE_YX;
|
|
PGive=(unsigned char *)&InformationObject;
|
|
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
|
|
{
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=PGive[i];
|
|
}
|
|
|
|
YxLibIndex=start*NS_IEC_104_ONCE_YX_BYTES;
|
|
switch(NsIec104Struct.Table)
|
|
{
|
|
case 0:
|
|
NsGetDd1Lib(NS_YX_DATA,YxLibIndex,NsIec104Struct.DataBuff,NS_IEC_104_ONCE_YX_BYTES);
|
|
break;
|
|
case 1:
|
|
NsGetDd2Lib(NS_YX_DATA,YxLibIndex,NsIec104Struct.DataBuff,NS_IEC_104_ONCE_YX_BYTES);
|
|
break;
|
|
case 2:
|
|
NsGetDd3Lib(NS_YX_DATA,YxLibIndex,NsIec104Struct.DataBuff,NS_IEC_104_ONCE_YX_BYTES);
|
|
break;
|
|
case 3:
|
|
NsGetDd4Lib(NS_YX_DATA,YxLibIndex,NsIec104Struct.DataBuff,NS_IEC_104_ONCE_YX_BYTES);
|
|
break;
|
|
}
|
|
for(j=0;j<NS_IEC_104_ONCE_YX_BYTES;j++)
|
|
{
|
|
|
|
YxByte=NsIec104Struct.DataBuff[j];
|
|
for(g=0;g<8;g++)
|
|
{
|
|
YxBit=(YxByte>>g)&0x01;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=YxBit;
|
|
}
|
|
}
|
|
|
|
/*
|
|
Debug Yx Message
|
|
for(j=0;j<NS_IEC_104_ONCE_YX;j++)
|
|
{
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x30;
|
|
}
|
|
*/
|
|
|
|
|
|
/* Repair Length */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][1]=Index-2;
|
|
NsIec104Struct.GroupSendLength[GroupIndex]=Index;
|
|
/*
|
|
if((NsIec104Struct.GroupSendLength[GroupIndex] = send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.GroupSendBuffer[GroupIndex][0],NsIec104Struct.GroupSendLength[GroupIndex],0x0)) < 0)
|
|
{
|
|
perror ("Client Write Error");
|
|
}
|
|
*/
|
|
NsIec104Struct.NeedSendNumber++;
|
|
GroupIndex++;
|
|
}
|
|
|
|
/* Third Send Yc */
|
|
for(start=0;start<NS_IEC_104_TOTAL_YC_TIMES;start++)
|
|
{
|
|
|
|
Index=0;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x68;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x00;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
PGive=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=PGive[0]; /* send number */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=PGive[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=9; /* 11->21 sigle yc asdu type */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NS_IEC_104_ONCE_YC|0x80; /* information object count */
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=20; /* reason */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x0; /* reason */
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
InformationObject=0x701+start*NS_IEC_104_ONCE_YC;
|
|
PGive=(unsigned char *)&InformationObject;
|
|
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
|
|
{
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=PGive[i];
|
|
}
|
|
|
|
|
|
YcLibIndex=start*NS_IEC_104_ONCE_YC;
|
|
switch(NsIec104Struct.Table)
|
|
{
|
|
case 0:
|
|
NsGetDd1Lib(NS_YC_DATA,YcLibIndex,NsIec104Struct.DataBuff,NS_IEC_104_ONCE_YC);
|
|
break;
|
|
case 1:
|
|
NsGetDd2Lib(NS_YC_DATA,YcLibIndex,NsIec104Struct.DataBuff,NS_IEC_104_ONCE_YC);
|
|
break;
|
|
case 2:
|
|
NsGetDd3Lib(NS_YC_DATA,YcLibIndex,NsIec104Struct.DataBuff,NS_IEC_104_ONCE_YC);
|
|
break;
|
|
case 3:
|
|
NsGetDd4Lib(NS_YC_DATA,YcLibIndex,NsIec104Struct.DataBuff,NS_IEC_104_ONCE_YC);
|
|
break;
|
|
}
|
|
|
|
for(j=0;j<NS_IEC_104_ONCE_YC;j++)
|
|
{
|
|
|
|
/*sYc = *((unsigned short *)&NsIec104Struct.DataBuff[j*2]);
|
|
fYc = sYc * 1.0;
|
|
pYc = (unsigned char *)&fYc;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=pYc[0];
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=pYc[1];
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=pYc[2];
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=pYc[3];*/
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.DataBuff[2*j];
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.DataBuff[2*j + 1];
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0; /* qds */
|
|
}
|
|
/*
|
|
printf("\n Yc Send ");
|
|
*/
|
|
|
|
/* Repair Length */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][1]=Index-2;
|
|
NsIec104Struct.GroupSendLength[GroupIndex]=Index;
|
|
/*
|
|
if((NsIec104Struct.GroupSendLength[GroupIndex]=send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.GroupSendBuffer[GroupIndex][0],NsIec104Struct.GroupSendLength[GroupIndex],0x0))<0)
|
|
{
|
|
perror ("Client Write Error");
|
|
}
|
|
*/
|
|
NsIec104Struct.NeedSendNumber++;
|
|
GroupIndex++;
|
|
}
|
|
|
|
|
|
/* Fiveth Send Over */
|
|
Index=0;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x68;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=0x0e;
|
|
|
|
RealNumber=(NsIec104Struct.SendMeNumber<<1);
|
|
PGive=(unsigned char *)&RealNumber;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=PGive[0]; /* send number */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=PGive[1];
|
|
NsIec104Struct.SendMeNumber=(NsIec104Struct.SendMeNumber+1)%65535;
|
|
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.ReceiveHimNumber[0]; /* receive number */
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.ReceiveHimNumber[1];
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=100;
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=1;
|
|
|
|
for(i=0;i< NS_IEC_104_REASONBYTE;i++)
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=10;
|
|
|
|
for(i=0;i<NS_IEC_104_ASDUADDRESSBYTE;i++)
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.CommonAsduAddress[i];
|
|
|
|
|
|
for(i=0;i<NS_IEC_104_INFORMATIONBYTE;i++)
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=NsIec104Struct.InformationObject[i];
|
|
|
|
NsIec104Struct.GroupSendBuffer[GroupIndex][Index++]=20;
|
|
NsIec104Struct.GroupSendLength[GroupIndex]=Index;
|
|
/*
|
|
if((NsIec104Struct.SendLength = send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.GroupSendBuffer[GroupIndex][0],NsIec104Struct.GroupSendLength[GroupIndex],0x0)) < 0)
|
|
{
|
|
perror ("Client Write Error");
|
|
}
|
|
*/
|
|
|
|
|
|
NsIec104Struct.NeedSendNumber++;
|
|
GroupIndex++;
|
|
|
|
|
|
}
|
|
|
|
|
|
static void NsIec104ProcessFormatS(void)
|
|
{
|
|
int Index;
|
|
/*
|
|
printf("\nFormatS");
|
|
|
|
Index=0;
|
|
NsIec104Struct.SendBuffer[0]=0x68;
|
|
NsIec104Struct.SendBuffer[1]=0x04;
|
|
NsIec104Struct.SendBuffer[2]=0x0b;
|
|
NsIec104Struct.SendBuffer[3]=0x00;
|
|
NsIec104Struct.SendBuffer[4]=0x00;
|
|
NsIec104Struct.SendBuffer[5]=0x00;
|
|
|
|
NsIec104Struct.ReceiveHimNumber[0]=NsIec104Struct.ReceiveBuffer[2];
|
|
NsIec104Struct.ReceiveHimNumber[1]=NsIec104Struct.ReceiveBuffer[3];
|
|
|
|
if((NsIec104Struct.SendLength = send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],6,0x0)) < 0)
|
|
{
|
|
perror ("Client Write Error");
|
|
}
|
|
printf("\nwrite=%d",NsIec104Struct.SendLength);
|
|
*/
|
|
}
|
|
|
|
|
|
static void NsIec104ProcessFormatU(void)
|
|
{
|
|
int Index;
|
|
int i;
|
|
|
|
|
|
NsIec104Struct.UCommand=NsIec104Struct.ReceiveBuffer[2];
|
|
Index=0;
|
|
if(NsIec104Struct.UCommand&NS_IEC_104_STARTDT)
|
|
{
|
|
Index=6;
|
|
NsIec104Struct.SendBuffer[0]=0x68;
|
|
NsIec104Struct.SendBuffer[1]=0x04;
|
|
NsIec104Struct.SendBuffer[2]=0x0b;
|
|
NsIec104Struct.SendBuffer[3]=0x00;
|
|
NsIec104Struct.SendBuffer[4]=0x00;
|
|
NsIec104Struct.SendBuffer[5]=0x00;
|
|
/*
|
|
printf("\nFormatU STARTDT");
|
|
*/
|
|
|
|
NsIec104Struct.SendMeNumber=0x00;
|
|
NsIec104Struct.ReceiveHimNumber[0]=0x00;
|
|
NsIec104Struct.ReceiveHimNumber[1]=0x00;
|
|
/*NsIec104Struct.NeedSendNumber=0;
|
|
NsIec104Struct.HasSendNumber=0;
|
|
NsIec104Struct.LeftSendNumber=0;*/
|
|
|
|
}
|
|
else
|
|
{
|
|
if(NsIec104Struct.UCommand&NS_IEC_104_STOPDT)
|
|
{
|
|
Index=6;
|
|
NsIec104Struct.SendBuffer[0]=0x68;
|
|
NsIec104Struct.SendBuffer[1]=0x04;
|
|
NsIec104Struct.SendBuffer[2]=0x23;
|
|
NsIec104Struct.SendBuffer[3]=0x00;
|
|
NsIec104Struct.SendBuffer[4]=0x00;
|
|
NsIec104Struct.SendBuffer[5]=0x00;
|
|
|
|
NsIec104Struct.SendMeNumber=0x00;
|
|
NsIec104Struct.ReceiveHimNumber[0]=0x00;
|
|
NsIec104Struct.ReceiveHimNumber[1]=0x00;
|
|
NsIec104Struct.NeedSendNumber=0;
|
|
NsIec104Struct.HasSendNumber=0;
|
|
NsIec104Struct.LeftSendNumber=0;
|
|
|
|
|
|
}
|
|
else
|
|
{
|
|
if(NsIec104Struct.UCommand&NS_IEC_104_TESTFR)
|
|
{
|
|
Index=6;
|
|
NsIec104Struct.SendBuffer[0]=0x68;
|
|
NsIec104Struct.SendBuffer[1]=0x04;
|
|
NsIec104Struct.SendBuffer[2]=0x83;
|
|
NsIec104Struct.SendBuffer[3]=0x00;
|
|
NsIec104Struct.SendBuffer[4]=0x00;
|
|
NsIec104Struct.SendBuffer[5]=0x00;
|
|
}
|
|
}
|
|
|
|
}
|
|
if(Index>0)
|
|
{
|
|
if((NsIec104Struct.SendLength = send(NsIec104Struct.NsNewSocketId,&NsIec104Struct.SendBuffer[0],6,0x0)) < 0)
|
|
{
|
|
perror ("Client Write Error");
|
|
}
|
|
/*
|
|
printf("\ns:");
|
|
for (i = 0; i < 6; i++)
|
|
printf("%4x",NsIec104Struct.SendBuffer[i]);
|
|
printf("\n");
|
|
*/
|
|
}
|
|
}
|
|
|
|
|
|
|
|
static void NsIec104Reset(void)
|
|
{
|
|
|
|
NsIec104Struct.ReceiveLength=0;
|
|
NsIec104Struct.ReceiveIndexLength=0;
|
|
NsIec104Struct.ReceiveIndex=0;
|
|
NsIec104Struct.HasSendNumber=0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void NsIec104CycleCount(void)
|
|
{
|
|
unsigned short i;
|
|
unsigned long Nap,NowSecond;
|
|
|
|
|
|
|
|
getforsecond(&NowSecond);
|
|
for(i=0;i<NS_IEC104_USE_CYCLE;i++)
|
|
{
|
|
Nap = DiffMsLong(NowSecond,NsIec104Cycle[i].LastTime);
|
|
if(Nap >= NsIec104Cycle[i].TimeNap)
|
|
{
|
|
NsIec104Cycle[i].TimeSign= ON;
|
|
getforsecond(&NsIec104Cycle[i].LastTime);
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
/*
|
|
void debug104(void)
|
|
{
|
|
unsigned char Buff[256];
|
|
short i;
|
|
|
|
for(i=0;i<200;i++)
|
|
Buff[i]=0;
|
|
|
|
for(i=0;i<96;i+=2)
|
|
Buff[i]=i+100;
|
|
|
|
NsPutDd1Lib(NS_YC_DATA,0,0,&Buff[0],48);
|
|
|
|
for(i=0;i<12;i++)
|
|
Buff[i]=0x0f;
|
|
NsPutDd1Lib(NS_YX_DATA,0,0,&Buff[0],12);
|
|
}
|
|
|
|
static void Iec104testCosSoe(void) {
|
|
struct tm NowTime;
|
|
static i = 0;
|
|
static unsigned char st = 0;
|
|
NS_COS_FORMAT CosValue;
|
|
NS_SOE_FORMAT SoeValue;
|
|
|
|
getvxTime(&NowTime);
|
|
for(i=0;i<10;i++){
|
|
SoeValue.SendNumber = i;
|
|
SoeValue.KgNumber = i;
|
|
SoeValue.CellNumber = 0;
|
|
SoeValue.RealAddress = 1;
|
|
SoeValue.Type = 2;
|
|
SoeValue.State = st;
|
|
|
|
SoeValue.Year = 2003;
|
|
SoeValue.Month = 7;
|
|
SoeValue.Day = 22;
|
|
SoeValue.Hour = 15;
|
|
|
|
SoeValue.Minute = 00;
|
|
SoeValue.Second = i;
|
|
SoeValue.Msecond = 888;
|
|
|
|
NsPutNetSoeLib(&SoeValue);
|
|
NsPutDd1SoeLib(&SoeValue);
|
|
NsPutDd2SoeLib(&SoeValue);
|
|
NsPutDd3SoeLib(&SoeValue);
|
|
NsPutAllSoeLib(&SoeValue);
|
|
|
|
CosValue.SendNumber =i;
|
|
CosValue.KgNumber = i;
|
|
CosValue.CellNumber = 0;
|
|
CosValue.RealAddress = 1;
|
|
CosValue.Type = 2;
|
|
CosValue.State = st;
|
|
|
|
NsPutNetCosLib(&CosValue);
|
|
NsPutDd1CosLib(&CosValue);
|
|
NsPutDd2CosLib(&CosValue);
|
|
NsPutDd3CosLib(&CosValue);
|
|
NsPutAllCosLib(&CosValue);
|
|
|
|
}
|
|
if (st == 0) st = 1;
|
|
else st = 0;
|
|
}
|
|
*/ |