📄 nz94.c
字号:
{
Ctl_Stru.cmd_entry=CS_NZ94_CTRL_SELECT;
}
if(RBuffer[2]==0xee)
{
Ctl_Stru.cmd_entry=CS_NZ94_CTRL_UNSELECT;
}
CS_SStore_Lianbiao_Business(Ctl_Stru.source_port_serial,&Ctl_Stru,sizeof(Ctl_Stru));
CS_SStore_Lianbiao_Business(Ctl_Stru.source_port_serial,&Stru_Ctrl_Select,sizeof(Stru_Ctrl_Select));
CS_Write_Event(Ctl_Stru.source_port_serial,CS_ANSWER_EVENT);
NU_Release_Semaphore(&cs_port_semaphore[Ctl_Stru.source_port_serial]);
}
}
/////////////////////////////////////////////////////////////////////////
static void Answer_Ctrl_Execute(UBYTE *RBuffer,UBYTE Source_Addr,UBYTE Dest_Addr)
{
CS_SCTLHEAD Ctl_Stru;
UBYTE SoeFlag;
UBYTE Ngd = 1;
CS_If_Cpu_Online(Dst_Addr_First,Source_Addr-Src_Addr_Base,&SoeFlag,&sonline);
if(1==SoeFlag)
{
Rec_Nz94_CommunicationSOE(Dest_Addr);
}
if (CS_Read_Ctl_Id_Stru(Dest_Addr,CS_NZ94_CTRL,CS_NZ94_CTRL_PERFORM,Cs_Cmd_List,&Ctl_Stru,SCtrlIdManager)==CS_FALSE)
{
}
else
{
Ctl_Stru.num=Ngd;
if(0xaa==RBuffer[2])
{
CS_SStore_Lianbiao_Business(Ctl_Stru.source_port_serial,&Ctl_Stru,sizeof(Ctl_Stru));
CS_SStore_Lianbiao_Business(Ctl_Stru.source_port_serial,&Stru_Ctrl_Execute,sizeof(Stru_Ctrl_Execute));
CS_Write_Event(Ctl_Stru.source_port_serial,CS_ANSWER_EVENT);
NU_Release_Semaphore(&cs_port_semaphore[Ctl_Stru.source_port_serial]);
}
}
}
/////////////////////////////////////////////////////////////////////////
static void Answer_Ctrl_Cancel(UBYTE *RBuffer,UBYTE Source_Addr,UBYTE Dest_Addr)
{
CS_SCTLHEAD Ctl_Stru;
UBYTE SoeFlag;
UBYTE Ngd = 1;
CS_If_Cpu_Online(Dst_Addr_First,Source_Addr-Src_Addr_Base,&SoeFlag,&sonline);
if(1==SoeFlag)
{
Rec_Nz94_CommunicationSOE(Dest_Addr);
}
if (CS_Read_Ctl_Id_Stru(Dest_Addr,CS_NZ94_CTRL,CS_NZ94_CTRL_CANCEL,Cs_Cmd_List,&Ctl_Stru,SCtrlIdManager)==CS_FALSE)
{
}
else
{
Ctl_Stru.num=Ngd;
if(0x55==RBuffer[2])
{
CS_SStore_Lianbiao_Business(Ctl_Stru.source_port_serial,&Ctl_Stru,sizeof(Ctl_Stru));
CS_SStore_Lianbiao_Business(Ctl_Stru.source_port_serial,&Stru_Ctrl_Cancel,sizeof(Stru_Ctrl_Cancel));
CS_Write_Event(Ctl_Stru.source_port_serial,CS_ANSWER_EVENT);
NU_Release_Semaphore(&cs_port_semaphore[Ctl_Stru.source_port_serial]);
}
}
}
/////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////
static void Rec_Ctrl(UBYTE *RBuffer,UBYTE Source_Addr,UBYTE Dest_Addr)
{
switch(RBuffer[2])
{
case 0x33:
case 0xcc:
Answer_Ctrl_Select(RBuffer,Source_Addr,Dest_Addr);
break;
case 0xaa:
Answer_Ctrl_Execute(RBuffer,Source_Addr,Dest_Addr);
break;
case 0x55:
Answer_Ctrl_Cancel(RBuffer,Source_Addr,Dest_Addr);
break;
default:
break;
}
}
//////////////////////////////////////////////////////////////////////////
static void Rec_YaoCe(UBYTE *RecBuffer,UBYTE SourceAddr,UBYTE DestAddr)
{
UBYTE* Addr_YaoCe;
float Value;
UBYTE SoeFlag;
UBYTE HiValue;
UBYTE *Entry_Addr;
UBYTE *p;
UBYTE pTemp;
UBYTE count ;
UBYTE i;
CS_If_Cpu_Online(Dst_Addr_First,SourceAddr-Src_Addr_Base,&SoeFlag,&sonline);
if(1==SoeFlag)
{
Rec_Nz94_CommunicationSOE(DestAddr);
}
Addr_YaoCe=CS_Find_Group_Begin(CS_CAN_PORT,DestAddr,CS_YAOCE_TYPE);
i = RecBuffer[2];
for(count = 0;count<i;count +=2 )
{
Entry_Addr=CS_Find_Entry_Pos(Addr_YaoCe,count,CS_YAOCE_TYPE);
HiValue = RecBuffer[4+count] & 0x7f;
Value = (float)(RecBuffer[3+count]+HiValue*256);
p = (UBYTE*)(&Value);
pTemp = *p;
*p = *(p+3);
*(p+3) = pTemp;
pTemp = *(p+1);
*(p+1) = *(p+2);
*(p+2) = pTemp;
CS_Write_Database(Entry_Addr,p,4);
}
}
////////////////////////////////////////////////////////////////////////////////////////////
//开关变位,以soe方式上送
////////////////////////////////////////////////////////////////////////////////////////////
static void Rec_KGBW(UBYTE *RecBuffer,UBYTE SourceAddr,UBYTE DestAddr)
{
int i,n;
UBYTE SoeFlag;
TSOERECORD SoeRecord;
CS_SCTLHEAD Cs_SctlHead;
UBYTE ifneedsoe;
ifneedsoe = CS_If_Cpu_Online(Dst_Addr_First,SourceAddr-Src_Addr_Base,&SoeFlag,&sonline);
if(1==ifneedsoe)
{
Rec_Nz94_CommunicationSOE(DestAddr);
}
//发送标识结构
Cs_SctlHead.source_port_serial=CS_CAN_PORT;
Cs_SctlHead.dest_cpu=DestAddr;
Cs_SctlHead.trans_mode=CS_BURST_TYPE;
Cs_SctlHead.send_type=0;
Cs_SctlHead.cmd_type=CS_IEC103_BURST;
Cs_SctlHead.cmd_entry=CS_IEC103_BURST_SOE;
Cs_SctlHead.num=1;
CS_Deal_Store_Business(&Cs_SctlHead,sizeof(Cs_SctlHead));
SoeRecord.port_serial=CS_CAN_PORT;
SoeRecord.byAddr=DestAddr;
SoeRecord.tSoe.byDiNo=RecBuffer[2];//条目号
SoeRecord.tSoe.byDiq=RecBuffer[3]; //状态信息
if (SoeRecord.tSoe.byDiq==0x00) //单点信息转换
{
SoeRecord.tSoe.byDiq=1;
}
else
{
SoeRecord.tSoe.byDiq=2;
}
SoeRecord.tSoe.tDate.wMs=MAKEWORD((WORD)RecBuffer[8],(WORD)RecBuffer[9]);
SoeRecord.tSoe.tDate.byMin=RecBuffer[6]; //min
SoeRecord.tSoe.tDate.byHour=RecBuffer[5];//hour
CS_Deal_Store_Business(&SoeRecord,sizeof(SoeRecord));
CS_Soe_Conjunction(&SoeRecord,sizeof(SoeRecord));
CS_Send_Group_Database_Message();
}
///////////////////////////////////////////////////////////////////////////////////////////
//通过移位计算遥信状态
static CS_STATUS Check_Bit(UBYTE Dig_data,UBYTE bit_num)
{
UBYTE temp;
temp = Dig_data<<(7-bit_num);
//if ((Dig_data<<(7-bit_num))>=0x80)
if ((temp&0x80) == 0x80)
{
return CS_SUCCESS;
}
else return CS_FALSE;
}
////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////
static void Rec_YaoXin(UBYTE *RecBuffer,UBYTE SourceAddr,UBYTE DestAddr)
{
UBYTE* Addr_YaoXin;
UBYTE* Entry_Addr;
UBYTE SoeFlag;
UBYTE Value;
UBYTE count ;
UBYTE i;
UBYTE m;
UBYTE n;
m = 1;
CS_If_Cpu_Online(Dst_Addr_First,SourceAddr-Src_Addr_Base,&SoeFlag,&sonline);
if(1==SoeFlag)
{
Rec_Nz94_CommunicationSOE(DestAddr);
}
Addr_YaoXin=CS_Find_Group_Begin(CS_CAN_PORT,DestAddr,CS_YAOXIN_TYPE);
for(count = 0;count<2;count++ ) //YaoXin上送两个字节
{
for(n = 0;n<=7;n++)
{
if (Check_Bit(RecBuffer[2+count],n))
{
Value = 2;
}
else
{
Value = 1;
}
Entry_Addr = CS_Find_Entry_Pos(Addr_YaoXin,m,CS_YAOXIN_TYPE);
CS_Write_Database(Entry_Addr,&Value,1);
m++;
}
}
}
////////////////////////////////////////////////////////////////////////////////////////
static void Rec_AlarmEvent(UBYTE *RecBuffer,UBYTE SourceAddr,UBYTE DestAddr)
{
return;
}
///////////////////////////////////////////////////////////////////////////////////////////
static void Reply_KGBW(UBYTE *RecBuffer,UBYTE SourceAddr,UBYTE DestAddr)
{
UBYTE SendPacket[5];
UBYTE Seria;
UBYTE Type = 0x03;
UBYTE DLC = 0x03;
Type = Type<<5;
SendPacket[0] = 0x00;
SendPacket[1] = Type|DLC;
SendPacket[2] = SourceAddr;
SendPacket[3] = 0x06;
SendPacket[4] = 0x55;
Seria = SourceAddr - Src_Addr_Base;
CS_Cpu_Online_Add(Seria,&sonline);
Store_Com_Frame(SendPacket,5,com_in_buf);
NU_Release_Semaphore(&semCantxbuf);
return;
}
/////////////////////////////////////////////////////////////////////////////////////////////
static void Reply_AlarmEvent(UBYTE *RecBuffer,UBYTE SourceAddr,UBYTE DestAddr)
{
UBYTE SendPacket[5];
UBYTE Seria;
UBYTE Type = 0x03;
UBYTE DLC = 0x03;
Type = Type<<5;
SendPacket[0] = 0x00;
SendPacket[1] = Type|DLC;
SendPacket[2] = SourceAddr;
SendPacket[3] = 0x06;
SendPacket[4] = 0xaa;
Seria = SourceAddr - Src_Addr_Base;
CS_Cpu_Online_Add(Seria,&sonline);
Store_Com_Frame(SendPacket,5,com_in_buf);
NU_Release_Semaphore(&semCantxbuf);
return;
}
//////////////////////////////////////////////////////////////////////////
static void CS_NZ94_Receive_Kernel()
{
UBYTE preturnserial;
UBYTE i;
UWORD wLen;
UBYTE Source_Addr;
UBYTE Dest_Addr;
CS_STATUS Status;
STATUS Nust;
UBYTE flag;
UBYTE Type;
while(1)
{
Nust=NU_Obtain_Semaphore(&semCanrxbuf,ReadOverTime);
if (Nust==NU_SUCCESS )
{
wLen=Retrieve_Com_Frame(RecBuffer,com_out_buf);
if(wLen==0)
{
return;
}
if (Permit_process(CS_CAN_PORT,RecBuffer[0]))
{
Source_Addr=RecBuffer[0];
CS_Search_Dest_From_Source(CS_CAN_PORT,&Source_Addr,&Dest_Addr);
flag = RecBuffer[1]&0x40;
if(flag == 0x40)
{
Type = RecBuffer[1] & 0x0f ;
switch(Type)
{
case 0:
{
Rec_YaoCe(RecBuffer,Source_Addr,Dest_Addr);
}
break;
case 4:
{
Rec_YaoXin(RecBuffer,Source_Addr,Dest_Addr);
}
break;
default:
break;
}
}
else
{
Type = RecBuffer[1];
switch(Type)
{
case 0:
{
Reply_KGBW(RecBuffer,Source_Addr,Dest_Addr);
Rec_KGBW(RecBuffer,Source_Addr,Dest_Addr);
}
break;
case 1:
{
Reply_AlarmEvent(RecBuffer,Source_Addr,Dest_Addr);
Rec_AlarmEvent(RecBuffer,Source_Addr,Dest_Addr);
}
break;
case 4:
{
Rec_Ctrl(RecBuffer,Source_Addr,Dest_Addr);
}
break;
default:
break;
}
}
}
}
}
}
//////////////////////////////////////////////////////////
#define SZ_NZ94_TSK_STK 1024
static NU_TASK NZ94TX,NZ94RX;
static UBYTE NZ94_TxStack[SZ_NZ94_TSK_STK];
static UBYTE NZ94_RxStack[SZ_NZ94_TSK_STK];
void NZ94_INIT()
{
NU_Create_Task(&NZ94TX, "NZ94TX", CS_NZ94_Send_Kernel, 0, NU_NULL,
NZ94_TxStack, SZ_NZ94_TSK_STK, PROTO_TASK_PRI, 0, NU_NO_PREEMPT, NU_START);
NU_Create_Task(&NZ94RX, "NZ94RX", CS_NZ94_Receive_Kernel, 0, NU_NULL,NZ94_RxStack, SZ_NZ94_TSK_STK ,PROTO_TASK_PRI, 0, NU_NO_PREEMPT, NU_START);
}
///////////////////////////////////////////////////////////////////////保护时间报文
//01 01 10 00 2f 00 00 01 cd 00 20 03 22 21 14 12 04 04 21 00
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -