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

📄 comm103.c

📁 串口103规约
💻 C
📖 第 1 页 / 共 3 页
字号:
/****************************************************************
 * Version : 9793-1.0
 * Author :  徐广辉
 * Create Date: 2002/10/4
 * FileName :comm103.c
 * Description:后台监控(串口103)接口
 *
 * Modify Log:
 ****************************************************************/
#include "vxWorks.h"
#include "sockLib.h"
#include "sys/socket.h"
#include "netinet/in.h"
#include "inetLib.h"
#include "stdio.h"
#include "stdlib.h"
#include "ioLib.h"
#include "taskLib.h"
#include "string.h"
#include "msgQLib.h"
#include "pinglib.h"
#include "tasklib.h"
#include "selectLib.h"
#include "fcntl.h"
#include "netinet/tcp.h"
#include "define.h"
#include "extern.h"
#include "timer.h"
#include "dispatch.h"
#include "base.h"
#include "stream.h"
#include "database.h"

#undef  _COMM103_RECV_DEBUG_
#undef  _COMM103_SEND_DEBUG_
#undef  _COMM103_WATCH_DEBUG_

#define  COMM103_RESENDBUF_LENTH	300
#define  COMM103_GRP_DESMAXLENTH	15
#define  COMM103_GRP_DESMAXNUM		21

#define	 COMM103_GROUP_TYPE_UNUSED  0
#define	 COMM103_GROUP_TYPE_FUNINF  1
#define	 COMM103_GROUP_TYPE_GIN		2
#define	 COMM103_GROUP_TYPE_GZXX	3
#define	 COMM103_GROUP_TYPE_AREA	4

#define	 COMM103_NO_CALLQH_COMMAND  0
#define	 COMM103_CALLINGQH_COMMAND  1

#define	 COMM103_RECVQUE_NUM		100
#define	 COMM103_LEVELONE_NUM		300
#define	 COMM103_LEVELONE_BUFLEN	300

#define	COMM103_DEVSTATE_NOCONNECT	0x01
#define	COMM103_DEVSTATE_NEEDRESET	0x02
#define	COMM103_DEVSTATE_NORMAL		0x00


struct	COMM103_GROUP_INDEX 	
{
	u_char  ginhight;
	u_char	converttype;
	u_char	des[COMM103_GRP_DESMAXLENTH];
	struct  DEV_GROUP_DES_DATA *groupgin;
};
struct  LEVELONE_QUE
{
	int  quesave;
	int queload;
	u_char buflenth[COMM103_LEVELONE_NUM];
	u_char *buf[COMM103_LEVELONE_NUM];
};
struct	 COMM103_DEVICE_DATABASE
{
	u_char		state;
	u_char		fcb;
	u_char		grpqh;
	u_char      qhstate;
	u_char      setqh;
	u_short		factory_addr;
	u_short		dev_addr;
	u_char		map_addr;
	u_char		groupnum;
	struct	LEVELONE_QUE    leveloneque;
	struct	COMM103_GROUP_INDEX 	*groupindex[1];

};
struct	 COMM103_DEVICE_MAP
{
	u_char	    commno;
	u_char	    board_addr;
	u_short		return_id;
	u_char		gintype;
	u_char		devicenum;
	u_char		recvlenth;
	u_char		recvbuf[COMM103_LEVELONE_BUFLEN];
	u_char		resendlenth;
	u_char		resendbuf[COMM103_RESENDBUF_LENTH];
	u_char		groupdes[COMM103_GRP_DESMAXNUM][COMM103_GRP_DESMAXLENTH];
	MSG_Q_ID    comm103recvid;
	MSG_Q_ID    comm103sendid;
	struct		COMM103_DEVICE_DATABASE   *commdevice_database[1];
};

#ifdef  _COMM103_WATCH_DEBUG_
struct	 COMM103_DEVICE_MAP *COMM103_deviceshowptr;
#endif

static int  COMM103_deal_mes(struct  COMM103_DEVICE_MAP * ndp);
extern	int	register_index_listA(struct strstream * strp,int pos,int msg_id,u_char msg_type,u_char board_addr,int return_id);
static struct	 COMM103_DEVICE_DATABASE * COMM103FindDevice(struct  COMM103_DEVICE_MAP * ndp,u_short addr);
static struct  DEV_ENTRY_DES_DATA * COMM103FindFUNINF(struct  COMM103_DEVICE_DATABASE * dp,u_char grp,u_char entry);
static void COMM103DealUpSendMsg(struct  COMM103_DEVICE_DATABASE * dp,struct	can_asdu *asdup,int len);
static void COMM103DealDownSendMsg(struct  COMM103_DEVICE_MAP * ndp,u_char *buf,int len);
static void COMM103FormEndCall(struct  COMM103_DEVICE_DATABASE * dp,u_char scn);
static int COMM103GenReadHeadCheck(struct  COMM103_DEVICE_DATABASE * dp,struct	can_asdu10 *asdu10p,int len);
static void COMM103ChangAsduType(struct  COMM103_DEVICE_DATABASE * dp,struct	can_asdu10 *asdu10p,int len);
static u_char COMM103FindGintype(struct  COMM103_DEVICE_DATABASE * dp,u_char gin);
static void COMM103FormAsdu1(struct  COMM103_DEVICE_DATABASE * dp,u_char *buf,u_char fun,u_char inf,u_char cot,u_char rii);
static void COMM103FormAsdu2(struct  COMM103_DEVICE_DATABASE * dp,u_char *buf,u_char fun,u_char inf,u_char cot,u_char rii);
static void COMM103FormAsdu4(struct  COMM103_DEVICE_DATABASE * dp,u_char *buf,u_char fun,u_char inf,u_char cot,u_char rii);
static int COMM103COMMMsgVerfy(struct COMM103_DEVICE_MAP *dp);
static struct  COMM103_DEVICE_DATABASE * COMM103MsgVerfyFcb(struct COMM103_DEVICE_MAP *ndp,int frametype);
static void COMM103ClearLevelOneQue(struct COMM103_DEVICE_DATABASE *dp);
static u_char COMM103GetLinkControl(struct COMM103_DEVICE_DATABASE *dp,u_char fun);
static void COMM103UpSendAsdu5(struct COMM103_DEVICE_DATABASE *dp,u_char cot);
static void COMM103SendCommFIX(struct COMM103_DEVICE_DATABASE *dp,u_char fun,u_char badd,u_char comno);
static void COMM103SendCommNOFIX(struct COMM103_DEVICE_MAP *ndp,struct COMM103_DEVICE_DATABASE *dp,u_char fun,u_char badd,u_char comno,u_char gintype);
static void COMM103ReSendCommNOFIX(struct COMM103_DEVICE_MAP *ndp,struct COMM103_DEVICE_DATABASE *dp);
static void COMM103Memcopy(u_char *targetbuf,u_char *sourcebuf,int len,u_char type);
static void COMM103GinCheck(u_char *buf,int lenth,u_char gintype);
static void COMM103SendMsgtoMon(struct COMM103_DEVICE_MAP *ndp,u_short addr);
static void COMM103SetTime(u_char *timebuf);
static void COMM103DealQHCall(struct COMM103_DEVICE_MAP *ndp,struct COMM103_DEVICE_DATABASE *dp);
static	int	COMM103_answer_one_entry_list(struct  COMM103_DEVICE_DATABASE * dp,struct	can_asdu *can_asdup,int len);

extern void COMM103BufShow(u_char *buf,int len);

static	void COMM103_Init_groupdesp(struct  COMM103_DEVICE_MAP * ndp,u_char *olddes,u_char *newdes){
	int i;
	if(strcmp(olddes,"装置描述")==0)i=0;
	else if(strcmp(olddes,"装置参数")==0)i=1;
	else if(strcmp(olddes,"定值区号")==0)i=2;
	else if(strcmp(olddes,"定值")==0)i=3;
	else if(strcmp(olddes,"动作元件")==0)i=4;
	else if(strcmp(olddes,"装置自检")==0)i=5;
	else if(strcmp(olddes,"运行告警")==0)i=6;
	else if(strcmp(olddes,"软压板")==0)i=7;
	else if(strcmp(olddes,"硬压板")==0)i=8;
	else if(strcmp(olddes,"遥信")==0)i=9;
	else if(strcmp(olddes,"保护测量")==0)i=10;
	else if(strcmp(olddes,"遥测")==0)i=11;
	else if(strcmp(olddes,"遥脉")==0)i=12;
	else if(strcmp(olddes,"遥控")==0)i=13;
	else if(strcmp(olddes,"遥调")==0)i=14;
	else if(strcmp(olddes,"档位")==0)i=15;
	else if(strcmp(olddes,"故障信息")==0)i=16;
	else if(strcmp(olddes,"扰动数据说明")==0)i=17;
	else if(strcmp(olddes,"设置信息")==0)i=18;
	else if(strcmp(olddes,"操作信息")==0)i=19;
	else return;
	strcpy(newdes,ndp->groupdes[i]);
}	
static	void COMM103_Init_devData(struct  COMM103_DEVICE_MAP * ndp,struct	COMM103_DEVICE_DATABASE *dp)
{
	int	  i,j,k,type;
	type=search_dev_type(dp->dev_addr);
	if(type==ERROR){
		dp->groupnum=0;
		dp->groupindex[0]=NULL;
		return ;
	}
	for(i=0;i<dev_type_database_ptr->type_num;i++) {
		if(dev_type_database_ptr->dev[i]->type==type) {
			dp->groupnum=dev_type_database_ptr->dev[i]->group_num;
			for(j=0;j<dev_type_database_ptr->dev[i]->group_num;j++) {
				dp->groupindex[j]=(struct COMM103_GROUP_INDEX *)malloc(sizeof(struct COMM103_GROUP_INDEX));
				dp->groupindex[j]->groupgin=dev_type_database_ptr->dev[i]->group[j];
				if(dev_type_database_ptr->dev[i]->group[j]->entry_num==0){
					dp->groupindex[j]->converttype=COMM103_GROUP_TYPE_UNUSED;
				}
				else {
					dp->groupindex[j]->ginhight=dev_type_database_ptr->dev[i]->group[j]->entry[0].group;
					if(	strcmp(dev_type_database_ptr->dev[i]->group[j]->des,"定值")==0 
						|| strcmp(dev_type_database_ptr->dev[i]->group[j]->des,"定值区号")==0
						|| strcmp(dev_type_database_ptr->dev[i]->group[j]->des,"保护测量")==0) 
					{
						dp->groupindex[j]->converttype=COMM103_GROUP_TYPE_GIN;
						dp->groupindex[j]->des[0]='\0';
						COMM103_Init_groupdesp(ndp,dev_type_database_ptr->dev[i]->group[j]->des,dp->groupindex[j]->des);
						if(strcmp(dev_type_database_ptr->dev[i]->group[j]->des,"定值区号")==0)
						{
							if(dev_type_database_ptr->dev[i]->group[j]->transmit_flag!=YES)
								dp->grpqh=dev_type_database_ptr->dev[i]->group[j]->group;
							dp->qhstate=COMM103_NO_CALLQH_COMMAND;
						}
					}
					else if(strcmp(dev_type_database_ptr->dev[i]->group[j]->des,"动作元件")==0 
						|| strcmp(dev_type_database_ptr->dev[i]->group[j]->des,"运行告警")==0
						|| strcmp(dev_type_database_ptr->dev[i]->group[j]->des,"装置自检")==0 
						|| strcmp(dev_type_database_ptr->dev[i]->group[j]->des,"软压板")==0
						|| strcmp(dev_type_database_ptr->dev[i]->group[j]->des,"故障信息")==0 
						|| strcmp(dev_type_database_ptr->dev[i]->group[j]->des,"硬压板")==0) 
					{
						dp->groupindex[j]->converttype=COMM103_GROUP_TYPE_FUNINF;
						dp->groupindex[j]->des[0]='\0';
						COMM103_Init_groupdesp(ndp,dev_type_database_ptr->dev[i]->group[j]->des,dp->groupindex[j]->des);
					}
					else{
						dp->groupindex[j]->converttype=COMM103_GROUP_TYPE_UNUSED;
						dp->groupindex[j]->des[0]='\0';
						COMM103_Init_groupdesp(ndp,dev_type_database_ptr->dev[i]->group[j]->des,dp->groupindex[j]->des);
					}
				}
			}
		}
	}
}

extern	void  *comm103_init(struct strstream * strp,u_char type,u_char protocol,u_char board_addr)
{
	struct	COMM103_DEVICE_MAP * mdp;
	int	i,j,num,ip[4],protocol_type;
	u_char tasknam[20];
	
	if(type!=COM_PROTOCOL) return NULL;
	mdp=(struct COMM103_DEVICE_MAP *)malloc(sizeof(struct COMM103_DEVICE_MAP)+(dev_tab_ptr->dev_num*sizeof(int)));
	mdp->comm103recvid=msgQCreate(COMM103_RECVQUE_NUM,COMM103_LEVELONE_BUFLEN,MSG_Q_FIFO);
	mdp->comm103sendid=dispatch_id;
	mdp->board_addr=board_addr;
	mdp->return_id=0xff;
	mdp->recvlenth=0;
	mdp->resendlenth=0;
	mdp->gintype=0;
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"串口号=%d",&i);
	mdp->commno=i;
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"规约号=%d",&i);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"线路方式=%d",&i);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"波特率=%d",&i);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"数据位=%d",&i);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"奇偶校=%d",&i);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"停止位=%d",&i);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"同步字1=%d",&i);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"同步字2=%d",&i);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"转换方=%d",&i);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"GIN数据顺序=%d",&i);
	mdp->gintype=i;
	for(i=0;i<COMM103_GRP_DESMAXNUM;i++)mdp->groupdes[i][0]='\0';
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"装置描述=%s",mdp->groupdes[0]);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"装置参数=%s",mdp->groupdes[1]);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"定值区号=%s",mdp->groupdes[2]);
 	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"定值=%s",mdp->groupdes[3]);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"动作元件=%s",mdp->groupdes[4]);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"装置自检=%s",mdp->groupdes[5]);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"运行告警=%s",mdp->groupdes[6]);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"软压板=%s",mdp->groupdes[7]);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"硬压板=%s",mdp->groupdes[8]);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"遥信=%s",mdp->groupdes[9]);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"保护测量=%s",mdp->groupdes[10]);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"遥测=%s",mdp->groupdes[11]);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"遥脉=%s",mdp->groupdes[12]);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"遥控=%s",mdp->groupdes[13]);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"遥调=%s",mdp->groupdes[14]);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"档位=%s",mdp->groupdes[15]);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"故障信息=%s",mdp->groupdes[16]);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"扰动数据说明=%s",mdp->groupdes[17]);
 	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"设置信息=%s",mdp->groupdes[18]);
	strseeknext(strp);
	sscanf(&(strp->buf[strp->pos]),"操作信息=%s",mdp->groupdes[19]);
	mdp->devicenum=dev_tab_ptr->dev_num;
	for(i=0;i<dev_tab_ptr->dev_num;i++){
		mdp->commdevice_database[i]=(struct COMM103_DEVICE_DATABASE *)malloc(sizeof(struct COMM103_DEVICE_DATABASE)+(60*sizeof(int)));
		mdp->commdevice_database[i]->dev_addr=dev_tab_ptr->dev[i].addr;
		mdp->commdevice_database[i]->map_addr=dev_tab_ptr->dev[i].dummy_addr;
		mdp->commdevice_database[i]->factory_addr=0;
		mdp->commdevice_database[i]->fcb=0;
		mdp->commdevice_database[i]->qhstate=COMM103_NO_CALLQH_COMMAND;
		mdp->commdevice_database[i]->grpqh=0xff;
		mdp->commdevice_database[i]->setqh=0;
		mdp->commdevice_database[i]->state=COMM103_DEVSTATE_NOCONNECT;
		mdp->commdevice_database[i]->leveloneque.queload=0;
		mdp->commdevice_database[i]->leveloneque.quesave=0;
		for(j=0;j<COMM103_LEVELONE_NUM;j++){
			mdp->commdevice_database[i]->leveloneque.buf[j]=NULL;
		}
		COMM103_Init_devData(mdp,mdp->commdevice_database[i]);
	}

	/**/register_index_listA(strp,config_data[mdp->board_addr].f_pos_com[mdp->commno],(int)mdp->comm103recvid,MSGQ_TYPE,mdp->board_addr,mdp->return_id);
	register_mon_msg((int)mdp->comm103recvid,MSGQ_TYPE,mdp->board_addr,mdp->return_id);			
	register_sio_msg(mdp->board_addr,mdp->commno,(int)mdp->comm103recvid,MSGQ_TYPE);
	sprintf(tasknam,"comm103_tsk%02d",mdp->board_addr);
	taskSpawn(tasknam,100,0,50000,(FUNCPTR)COMM103_deal_mes,(int)mdp,0,0,0,0,0,0,0,0,0);
	/*set_con_sta(mdp->board_addr,mdp->commno,RET_DISCONN);*/
	printf("comm103 init sucess\n");

#ifdef  _COMM103_WATCH_DEBUG_
	COMM103_deviceshowptr=mdp;
#endif
	return NULL;
}

static int  COMM103_deal_mes(struct  COMM103_DEVICE_MAP * ndp)
{
	u_char	buf[COMM103_LEVELONE_BUFLEN];
	int		len;

	struct	can_asdu *asdup;
	struct	 COMM103_DEVICE_DATABASE *dp;
	

	FOREVER{
		len=msgQReceive(ndp->comm103recvid,buf,COMM103_LEVELONE_BUFLEN,WAIT_FOREVER);
		if(len>0) {

#ifdef  _COMM103_RECV_DEBUG_
			if(buf[0]!=COM_MSG)printf("len=%dtype=%d  ",len,buf[0]);
#endif

			if(buf[0]==COM_MSG){
				COMM103DealDownSendMsg(ndp,&buf[1],len-1);
			}
			else{
				switch(buf[0]){
				case  HOOK_MSG:
				case  CONTRL_MSG:
					asdup=(struct	can_asdu *)&buf[5];
					len-=4;
					break;
				case  MON_MSG:	/*主动上送信息*/
				case  PERIOD_HOOK_MSG:
					asdup=(struct	can_asdu *)&buf[1];
					break;
				default:
					return;
				}
				dp=COMM103FindDevice(ndp,asdup->dev_addr[0]+(asdup->dev_addr[1]*256));
				if(dp!=NULL)COMM103DealUpSendMsg(dp,asdup,len-1);
			}
		}
	}
}


static void COMM103IsertinLeveloneQue(struct  COMM103_DEVICE_DATABASE * dp,u_char *buf,int len){

⌨️ 快捷键说明

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