📄 nz94.c
字号:
/* 南自94规约
*/
#include "hardef.h"
#include "wtypedef.h"
#include "evar.h"
#include <nucleus.h>
#include "sys.h"
#include "extm103.H"
#include "command.H"
/////////////////////////////////////////////////////////////////////
#define CS_NZ94_TIME 80
#define CS_NZ94_RESET 90
#define CS_NZ94_CTRL 10
////////////////////////////////////////////////////////////////////
#define CS_NZ94_CTRL_SELECT 1
#define CS_NZ94_CTRL_PERFORM 2
#define CS_NZ94_CTRL_CANCEL 3
#define CS_NZ94_CTRL_UNSELECT 4
/////////////////////////////////////////////////////////////////////
extern NU_SEMAPHORE semCanrxbuf;
extern NU_SEMAPHORE semCantxbuf;
////////////////////////////////////////////////////////////////////
static UBYTE Src_Addr_Base ;
static UBYTE Src_Addr_Length ;
static UBYTE Dst_Addr_First ;
static UBYTE Rtu_Total ;
static UBYTE ReadOverTime = 400;
CS_SCPU_ONLINE sonline;
CS_SCTLHEAD Cs_Cmd_List[10];
CS_SCTL_ID_MANAGE SCtrlIdManager[10];
static UBYTE SendBuffer[1000];
static UBYTE RecBuffer[1000];
UBYTE ontimes=0;
TCTRLRECORD Stru_Ctrl_Select,Stru_Ctrl_Execute,Stru_Ctrl_Cancel;
extern NU_SEMAPHORE cs_sptx_semaphore[8];
extern NU_SEMAPHORE cs_sprx_semaphore[8];
enum {YaoCe,YaoXin,AlarmAction,KGBW}CurFrame;
///////////////////////////////////////////////////////////////////
static void Send_CheckTimer(CS_SCTLHEAD Cmd_Stru) //测试通过
{
int minute,hour,day,month;
UBYTE SendPacket[10];
TDUISHI Stru_CheckTimer;
UBYTE Source_Addr;
UBYTE Seria;
UBYTE Source_Addr_Length;
UBYTE hValue;
UBYTE lValue;
UBYTE Type=0;
UBYTE DLC=8;
Type=Type<<5;
if (Cmd_Stru.send_type==0)
{
CS_SRetrieve_Lianbiao_Business(CS_CAN_PORT,&Stru_CheckTimer,sizeof(Stru_CheckTimer));
CS_Search_Source_From_Dest(CS_CAN_PORT,&Source_Addr,&Source_Addr_Length,&Stru_CheckTimer.byAddr);
SendPacket[0]=0x00;
SendPacket[1] = Type|DLC;
SendPacket[2]=(BYTE)(Stru_CheckTimer.time.wMs);//msL
SendPacket[3]=(BYTE)(Stru_CheckTimer.time.wMs>>8);//msH
//minute
hValue=(UBYTE)(Stru_CheckTimer.time.byMin/10);
minute=Stru_CheckTimer.time.byMin-hValue*10;
lValue=(UBYTE)(minute);
SendPacket[4]=(hValue<<4)|lValue;//min
//hour
hValue=(UBYTE)(Stru_CheckTimer.time.byHour/10);
hour=Stru_CheckTimer.time.byHour-hValue*10;
lValue=(UBYTE)(hour);
SendPacket[5]=(hValue<<4)|lValue;
//day
hValue=(UBYTE)((Stru_CheckTimer.time.byDay&0x1f)/10);
day=(Stru_CheckTimer.time.byDay&0x1f)-hValue*10;
lValue=(UBYTE)(day);
SendPacket[6]=(hValue<<4)|lValue;//day,高四位表示‘星期’,低四位表示‘日’
//month
hValue=(UBYTE)(Stru_CheckTimer.time.byMon/10);
month=Stru_CheckTimer.time.byMon-hValue*10;
lValue=(UBYTE)(month);
SendPacket[7]=(hValue<<4)|lValue;
SendPacket[8]=Stru_CheckTimer.time.wYear;//year
SendPacket[9]=0x15;//Century
Seria = Source_Addr - Src_Addr_Base;
CS_Cpu_Online_Add(Seria,&sonline);
Store_Com_Frame(SendPacket,10,com_in_buf);
NU_Release_Semaphore(&semCantxbuf);
}
return ;
}
/////////////////////////////////////////////////////////////////
static void Send_Reset(CS_SCTLHEAD Cmd_Stru)
{
UBYTE SendPacket[3];
TFUGUIRECORD Stru_Reset;
UBYTE Source_Addr;
UBYTE Source_Addr_Length;
UBYTE Seria;
UBYTE Type=6;
UBYTE DLC=1;
Type=Type<<5;
SendPacket[0]=0x00;
SendPacket[1]=Type|DLC;
if (Cmd_Stru.send_type==0)
{
CS_SRetrieve_Lianbiao_Business(CS_CAN_PORT,&Stru_Reset,sizeof(Stru_Reset));
CS_Search_Source_From_Dest(CS_CAN_PORT,&Source_Addr,&Source_Addr_Length,&Stru_Reset.byAddr);
if(Cmd_Stru.dest_cpu == 255)
{
SendPacket[2]=0xff;
Seria = Source_Addr - Src_Addr_Base;
CS_Cpu_Online_Add(Seria,&sonline);
Store_Com_Frame(SendPacket,3,com_in_buf);
NU_Release_Semaphore(&semCantxbuf);
}
else
{
SendPacket[2] =Source_Addr;
Seria = Source_Addr - Src_Addr_Base;
CS_Cpu_Online_Add(Seria,&sonline);
Store_Com_Frame(SendPacket,3,com_in_buf);
NU_Release_Semaphore(&semCantxbuf);
}
}
return ;
}
/////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////
static void Send_Ctrl(CS_SCTLHEAD Cmd_Stru)
{
UBYTE Source_Addr;
UBYTE Source_Addr_Length;
UBYTE SendPacket[6];
UBYTE Seria;
TCTRLRECORD Stru_Ctrl;
UBYTE Type = 0x04;
UBYTE DLC = 0x04;
Type = Type<<5;
if (Cmd_Stru.send_type==0)
{
CS_Search_Source_From_Dest(CS_CAN_PORT,&Source_Addr,&Source_Addr_Length,&Stru_Ctrl.byAddr);
SendPacket[0]=Source_Addr|0x40;
SendPacket[1] = Type|DLC;
if (Cmd_Stru.cmd_entry==CS_NZ94_CTRL_SELECT)
{
CS_SRetrieve_Lianbiao_Business(CS_CAN_PORT,&Stru_Ctrl_Select,sizeof(Stru_Ctrl_Select));
if(Stru_Ctrl.tCtrl.byDiq == 1) //1分
SendPacket[2] = 0x33;
else
SendPacket[2] = 0xcc; //合
SendPacket[3] = Source_Addr ; //目前定义的遥控对象是装置地址,如果不是就是0
SendPacket[4] = ~(0x33); //遥控命令反码
SendPacket[5] = ~(Source_Addr); //遥控对象反码
}
if(Cmd_Stru.cmd_entry==CS_NZ94_CTRL_PERFORM)
{
CS_SRetrieve_Lianbiao_Business(CS_CAN_PORT,&Stru_Ctrl_Execute,sizeof(Stru_Ctrl_Execute));
SendPacket[2] = 0xaa;
SendPacket[3] = Source_Addr ;
SendPacket[4] = ~0xaa;
SendPacket[5] = ~Source_Addr;
}
if(Cmd_Stru.cmd_entry==CS_NZ94_CTRL_CANCEL)
{
CS_SRetrieve_Lianbiao_Business(CS_CAN_PORT,&Stru_Ctrl_Cancel,sizeof(Stru_Ctrl_Cancel));
SendPacket[2] = 0x55;
SendPacket[3] = Source_Addr ;
SendPacket[4] = ~0x55;
SendPacket[5] = ~Source_Addr;
}
Seria = Source_Addr - Src_Addr_Base;
CS_Cpu_Online_Add(Seria,&sonline);
Store_Com_Frame(SendPacket,6,com_in_buf);
NU_Release_Semaphore(&semCantxbuf);
}
return;
}
static void SendYaoCe(UBYTE Source_Addr)
{
UBYTE SendPacket[4];
UBYTE Seria;
UBYTE Type = 0x02;
UBYTE DLC = 0x02;
Type = Type<<5;
Source_Addr = Source_Addr|0x40;
SendPacket[0] = Source_Addr;
SendPacket[1] = Type|DLC;
SendPacket[2] = 0x00;
SendPacket[3] = 0x00;
Seria = Source_Addr - Src_Addr_Base;
CS_Cpu_Online_Add(Seria,&sonline);
Store_Com_Frame(SendPacket,4,com_in_buf);
NU_Release_Semaphore(&semCantxbuf);
}
static void SendYaoXin(UBYTE Source_Addr)
{
UBYTE SendPacket[4];
UBYTE Seria;
UBYTE Type = 0x02;
UBYTE DLC = 0x02;
Type = Type<<5;
Source_Addr = Source_Addr|0x40;
SendPacket[0] = Source_Addr;
SendPacket[1] = Type|DLC;
SendPacket[2] = 0x03;
SendPacket[3] = 0x00;
Seria = Source_Addr - Src_Addr_Base;
CS_Cpu_Online_Add(Seria,&sonline);
Store_Com_Frame(SendPacket,4,com_in_buf);
NU_Release_Semaphore(&semCantxbuf);
}
////////////////////////////////////////////////////////////////
static void CS_NZ94_Send_Kernel()
{
CS_SCTLHEAD Cmd_Stru;
UBYTE Cpu_Addr;
STATUS Nust;
UBYTE i;
UBYTE Flag = 1;
CS_Init_CS_SCPU_ONLINE(&sonline);
CS_Init_CS_SCTL_ID_MANAGE(SCtrlIdManager,10);
CS_Get_Port_Para(CS_CAN_PORT,&Src_Addr_Base,&Src_Addr_Length,&Dst_Addr_First,&Rtu_Total);
Cpu_Addr = Src_Addr_Base;
CurFrame = YaoCe;
while(1)
{
// for (Cpu_Addr = Src_Addr_Base; Cpu_Addr < (Src_Addr_Base + Rtu_Total); Cpu_Addr++)
// {
Nust=NU_Obtain_Semaphore(&cs_port_semaphore[CS_CAN_PORT],ReadOverTime);
if (Nust == NU_SUCCESS)
{
CS_SRetrieve_Lianbiao_Business( CS_CAN_PORT,&Cmd_Stru, sizeof(Cmd_Stru));
if (Cmd_Stru.trans_mode==CS_BROADCAST_TYPE)
{
}
else
{
CS_Write_Ctl_Id_Stru(Cmd_Stru,Cs_Cmd_List,SCtrlIdManager);
}
switch(Cmd_Stru.cmd_type) //类型标志
{
case CS_NZ94_TIME: //对时
Send_CheckTimer(Cmd_Stru);
break;
case CS_NZ94_RESET: //复归
Send_Reset(Cmd_Stru);
break;
case CS_NZ94_CTRL: //遥控
Send_Ctrl(Cmd_Stru);
break;
default:
break;
}
}
/* else
{
for(i =0 ;i<4;i++)
{
switch(CurFrame)
{
case YaoCe:
{
SendYaoCe(Cpu_Addr);
CurFrame = YaoCe;
}
break;
case YaoXin:
{
SendYaoXin(Cpu_Addr);
CurFrame = AlarmAction;
}
break;
case AlarmAction:
{
SendAlarmEvent(Cpu_Addr);
CurFrame = KGBW;
}
break;
case KGBW:
{
SendKGBW(Cpu_Addr);
CurFrame = YaoCe;
}
break;
default:
break;
}
}
}
}*/
}
return ;
}
///////////////////////////////////////////////////////////////////
static CS_STATUS Permit_process(UBYTE port_serial,UBYTE source_addr)
{
UBYTE i;
for(i=0;i<cs_vsport_assem.port_num;i++)
{
if(port_serial==cs_vsport_lchr[i].port_serial)
{
if((source_addr>=cs_vsport_lchr[i].source_min_addr[0])&&
(source_addr<(cs_vsport_lchr[i].source_min_addr[0]+cs_vsport_lchr[i].cpu_num)))
{
return CS_SUCCESS;
}
else
{
return CS_FALSE;
}
}
}
}
//////////////////////////////////////////////////////////////////////////
static void Rec_Nz94_CommunicationSOE(UBYTE Dest_Addr)
{
UBYTE ngd;
TSOERECORD psoerecord;
CS_SCTLHEAD cs_sctlhead;
SY_DATE_TIME sy_data_time;
cs_sctlhead.source_port_serial=CS_CAN_PORT;
cs_sctlhead.dest_cpu=0;
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));
psoerecord.port_serial=CS_CAN_PORT;
psoerecord.byAddr=0;//表示CPU通信正常值
psoerecord.tSoe.byDiq=2;
psoerecord.tSoe.byDiNo=Dest_Addr;
//要调用时间函数取得时间
SY_Get_Sys_Time(&sy_data_time);
//psoerecord.tSoe.tDate.wMs=sy_data_time.unMSEL;//ms
psoerecord.tSoe.tDate.wMs=sy_data_time.ucSec*1000;
psoerecord.tSoe.tDate.byMin=sy_data_time.ucMinute; //min
psoerecord.tSoe.tDate.byHour=sy_data_time.ucHour;//hour
psoerecord.tSoe.tDate.byDay=sy_data_time.ucDate;//Day
psoerecord.tSoe.tDate.byMon=sy_data_time.ucMonth;//Month
psoerecord.tSoe.tDate.wYear=sy_data_time.unYear;//year
CS_Deal_Store_Business(&psoerecord,sizeof(psoerecord));
CS_Send_Group_Database_Message();
ontimes++;
}
//////////////////////////////////////////////////////////////////////////
static void Answer_Ctrl_Select(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_SELECT,Cs_Cmd_List,&Ctl_Stru,SCtrlIdManager)==CS_FALSE)
{
}
else
{
Ctl_Stru.num=Ngd;
if((0x33==RBuffer[2])||(RBuffer[2]==0xcc))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -