📄 comm103.c
字号:
/****************************************************************
* 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 + -