⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nsiec104server.c

📁 南瑞的IEC104规约实现的源码
💻 C
📖 第 1 页 / 共 5 页
字号:
/*

            Modify Record 
            2002-11-16            Add Network Card Value Geting From nsc200.ini
            2002-12-26            According   Nedd,adding Send chang yc

*/
#include <socket.h>
#include <sockLib.h>
#include <stdlib.h>
#include <sysLib.h>
#include <logLib.h>
#include <errno.h>
#include <string.h> 
#include <stdio.h> 
#include <time.h>
#include "wdLib.h"
#include "in.h"		
#include "ioLib.h"	

#include "constant.h"
#include "NsDataBase.h"
#include "NsExtTime.h"
#include "NsIoFunction.h"
#include "NsCommon.h"
#include "NsReadOnly.h"
#include "ExtDataBase.h"

#include "Project/NsIec104.h"

static NS_IEC104_MAIN      NsIec104Struct;


        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;
	       
}


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];

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -