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

📄 path_switch.c

📁 单片机程序代码,经过很详细的测试.呵呵,硬件相关.
💻 C
📖 第 1 页 / 共 5 页
字号:
#include <REG54.H>
#include "f2rc7860.h"
#include "rc7860.h"
#include "ep1k50.h"
#include "cmd_para_save.h"

unsigned char xdata path_switch_state[63] = {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};
//通道倒换标志位,0主用到备用强制倒换,1备用到主用强制倒换,2自动倒换状态

unsigned char xdata path_switch_array[4][63][4] = {{{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}},
	    									 	   {{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}},
   										   		   {{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}},
										   	       {{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff},{0xff,0xff,0xff,0xff}}};
//光口保护倒换数组,第一维4表示哪个主用光口,第二维63表示时隙值,
//第三维倒换信息:第1位表示备用光口、第2位表示被保护光口、第3位表示上行并发光口、第4位表示该主用光口连接状态

unsigned char xdata port_reg[63];
 
unsigned char xdata bboardid;								//备用盘号
unsigned char xdata bportid;								//备用端口号
unsigned char xdata btimeid;								//备用时隙号
unsigned char xdata mboardid;								//主用盘号
unsigned char xdata mportid;								//主用端口号
unsigned char xdata mtimeid;								//主用时隙号
unsigned char xdata auto_path_port = 0xFF;

extern unsigned long int xdata commandid;
extern unsigned char xdata tx_buf[];
extern unsigned char xdata tx_buf_pointer;
extern bit tx_done;
extern void SetResRdyTbl(unsigned char prio) large reentrant;
extern unsigned char GetResRdyTbl(unsigned char prio) large reentrant;
extern void SetExtRdyTbl(Uchar prio) large reentrant;
extern unsigned char f2rc7860_rd(unsigned int f2addr) large reentrant;
extern void f2rc7860_wr(unsigned int f2addr,unsigned char value) large reentrant;
extern unsigned char xdata start_flg[4];

extern unsigned char ais_reg[4][8];
extern unsigned char xdata test_reg[24];
extern unsigned char xdata init_temp;		//初始化完成标志位(即C82命令完成)

unsigned char path_switch_function(unsigned char inport,unsigned char TU12ID,unsigned char outport) large reentrant {
//通道倒换子函数
volatile unsigned char return_value;
unsigned char xdata *valueid;
unsigned char xdata value;
unsigned char xdata quotient;
unsigned char xdata residue;
    
	quotient = TU12ID >> 3;										//得到该时隙所在的字节值(同timeid / 8运算)
	residue = TU12ID & 0x07;									//同timeid % 8运算
	residue = 7 - residue;                      				//得到该时隙所在的bit位

	switch(inport){												//判断被倒换的光口是否正常,可以倒换
		case 0: valueid = (quotient + 0x88A6);
    	        value = ((*valueid) >> residue) & 0x01;       	//如果该时隙出现AIS
				if (value != 0){                                //该时隙不能倒换
	            	return_value = 2; 
				}
				else{
            		PTUN(outport,TU12ID)=0;
				   	return_value = 0;
    	        }
				break;
	    case 1: valueid = (quotient + 0x8AA6);
            	value = ((*valueid) >> residue) & 0x01;
    	        if (value != 0){
        	    	return_value = 2;
				}
	            else{
    	        	PTUN(outport,TU12ID) = 1;
        	    	return_value = 0;
            	}
				break;
    	case 2: value = f2rc7860_rd(quotient + 0x00A6);
				value = (value >> residue) & 0x01;
        	    if (value != 0){
            		return_value = 2; 
				}
    	        else{
        	    	PTUN(outport,TU12ID)=2;
            	   	return_value = 0;
	            }
				break;
	    case 3: value = f2rc7860_rd(quotient + 0x02A6);
				value = (value >> residue) & 0x01;
    	        if (value != 0){
        	    	return_value = 2;
				}
	            else{
    	        	PTUN(outport,TU12ID)=3;
        	       	return_value = 0;
            	}
				break;                    
	   default: return_value = 2;
   				break;
   }

/*	if (inport >= 0 & inport < 4){
		PTUN(outport,TU12ID) = inport;
		return_value = 0;
	}
	else return_value = 2;
*/	return (return_value);
}

unsigned char get_solt_working(unsigned char out_board,unsigned char out_port,unsigned char out_time){
//取得所要查询的时隙的当前连接
unsigned char xdata port;			//1K50中的输出端口
unsigned char xdata mport;			//1K50中的输入端口

	switch(out_board){				//将输出盘号端口号转换成为1K50中的输出端口号
		case 1: port = 5;
				break;
		case 2: port = 6;
				break;
		case 3: port = 4;
				break;
		case 4: if(out_port == 1){
					port = 2;
				}
				else port = 3;
				break;
		case 5: if(out_port == 1){
					port = 0;
				}
				else port = 1;
				break;
		default: break;
	}
	switch (port){										//得到1K50中的当前输入端口
		case 0: mport = XBYTE[0x8C00 + out_time - 1];
				break;
		case 1: mport = XBYTE[0x8C40 + out_time - 1];
				break;
		case 2: mport = XBYTE[0x8C80 + out_time - 1];
				break;
		case 3: mport = XBYTE[0x8CC0 + out_time - 1];
				break;
		case 4: mport = XBYTE[0x8D00 + out_time - 1];
				break;
		case 5: mport = XBYTE[0x8D40 + out_time - 1];
				break;
		case 6: mport = XBYTE[0x8D80 + out_time - 1];
				break;
		default: break;
    }
	return (mport);
}


unsigned char get_path_switch(struct cmd_para_save *path_switch){
//C50 MCP读取通道倒换情况
unsigned char xdata boardid;
unsigned char xdata portid;
unsigned char xdata timeid;
unsigned char xdata mport;
unsigned char xdata return_value;

	boardid = path_switch -> path_table_swget_board;			//输出盘号
	portid = path_switch -> path_table_swget_port;				//输出端口号
	timeid = path_switch -> path_table_swget_slot;				//输出时隙
	btimeid = timeid;

	if (timeid > 0 & timeid < 64){
		mport = get_solt_working(boardid,portid,timeid);		//得到所保护的输出时隙的输入端口
		switch (path_switch_array[mport][timeid - 1][0]){		//转换主用表中的端口信息上报MCP
			case 0: bboardid = 5;
					bportid = 1;
					return_value = 0;
					break;
			case 1: bboardid = 5;
					bportid = 2;
					return_value = 0;
					break;
			case 2: bboardid = 4;
					bportid = 1;
					return_value = 0;
					break;
			case 3: bboardid = 4;
					bportid = 2;
					return_value = 0;
					break;
			case 0xff: bboardid = 0;
					bportid = 0;
					return_value = 0;
					break;
			default:bboardid = 0;
					bportid = 0;
					return_value = 0;
					break;
		}
	}
	else return_value = 2;
	if (!GetResRdyTbl(21))
		SetResRdyTbl(21); 
	return (return_value);
}

void report_path_switch_table(unsigned char value,unsigned char bboard,unsigned char bport,unsigned char btime){
//C50回应函数
	tx_buf[0] = '$';
	tx_buf[1] = '2';
	tx_buf[2] = '1';
	tx_buf[3] = 0x43;
	tx_buf[4] = 0x35;
	tx_buf[5] = 0x30;
	tx_buf[6] = '0';
	tx_buf[7] = '0';
	tx_buf[8] = '0';
	tx_buf[9] = '7';
	tx_buf[10] = value + 0x30;
	tx_buf[11] = bboard + 0x30;
	if (bboard == 5){
		tx_buf[12] = '1';
	}
	else if(bboard == 4){
		tx_buf[12] = '4';
	}
	else tx_buf[12] = '0';
	tx_buf[13] = '0';
	tx_buf[14] = bport + 0x30;
	tx_buf[15] = (btime / 10) + 0x30;
	tx_buf[16] = (btime % 10) + 0x30;
	tx_buf[17] = '*';
	tx_buf_pointer = 0;	
	while(tx_buf[tx_buf_pointer] != '*'){
		SBUF = tx_buf[tx_buf_pointer];
		while(tx_done == 0);
		tx_done = 0;
		tx_buf_pointer++;
	}
	SBUF = tx_buf[tx_buf_pointer];          //发送最后一个字符'*'
	while(tx_done == 0);
	tx_done = 0;

}


unsigned char set_path_switch(struct cmd_para_save *path_switch){
//C51 设置通道倒换表
unsigned char xdata boardid;
unsigned char xdata portid;
unsigned char xdata timeid;
unsigned char xdata port;
unsigned char xdata bboardid2;
unsigned char xdata bportid2;
unsigned char xdata btimeid2;
unsigned char xdata mport;
unsigned char xdata return_value;

	commandid = 0x00433531;
	boardid = path_switch -> path_table_swset_board;		//输出盘号
	portid = path_switch -> path_table_swset_port;			//输出端口号
	timeid = path_switch -> path_table_swset_slot;			//输出时隙号
	bboardid = path_switch -> path_table_swset_Bboard;		//备用盘号(下行光口发2M收)
	bportid = path_switch -> path_table_swset_Bport;		//备用端口号(下行光口发2M收)
	btimeid = path_switch -> path_table_swset_Bslot;		//备用时隙号(下行光口发2M收)
	bboardid2 = path_switch -> path_table_swset_Bboard2;	//备用盘号(上行2M发光口收)
	bportid2 = path_switch -> path_table_swset_Bport2;		//备用端口号(上行2M发光口收)
	btimeid2 = path_switch -> path_table_swset_Bslot2;		//备用时隙号(上行2M发光口收)

	if (timeid > 0 & timeid < 64){
		mport = get_solt_working(boardid,portid,timeid);	//得到所保护的输出时隙的输入端口

		switch (bboardid){									//得到备用端口在1K50上的端口值
			case 0: bportid = 0xff;
					break;
			case 4: if (bportid == 1){
    					bportid = 2;
					}
					else bportid = 3;
					break;
			case 5: if (bportid == 1){
						bportid = 0;
					}
					else bportid = 1;
					break;
			default: break;
		}

		switch (bboardid2){									//得到备用端口在1K50上的端口值
			case 0: bportid2 = 0xff;
					break;
			case 4: if (bportid2 == 1){
    					bportid2 = 2;
					}
					else bportid2 = 3;
					break;
			case 5: if (bportid2 == 1){
						bportid2 = 0;
					}
					else bportid2 = 1;
					break;
			default: break;
		}

		switch(boardid){									//将输出盘号端口号转换成为1K50中的输出端口号
			case 1: port = 5;
					break;
			case 2: port = 6;
					break;
			case 3: port = 4;
					break;
			case 4: if(portid == 1){
						port = 2;
					}
					else port = 3;
					break;
			case 5: if(portid == 1){
						port = 0;
					}
					else port = 1;
					break;
			default: break;
		}	

		switch (mport){													//填写光口保护倒换表
			case 0: path_switch_array[0][timeid - 1][0] = bportid;		//填写MCB光口1的供倒换光口
					path_switch_array[0][timeid - 1][1] = port;			//填写MCB光口1的被保护光口
					path_switch_array[0][timeid - 1][2] = bportid2;		//填写被保护光口的上行并发光口
					path_switch_array[0][timeid - 1][3] = 1;			//光口是否连接的标志位,1表示有连接
					if (bportid != 0xff){
						path_switch_array[bportid][timeid - 1][0] = 0;		//填写供倒换光口
						path_switch_array[bportid][timeid - 1][1] = port;
						path_switch_array[bportid][timeid - 1][2] = 0;
						path_switch_array[bportid][timeid - 1][3] = 0;
					}
					else {
						path_switch_array[bportid2][timeid - 1][0] = 0xff;		//填写供倒换光口
						path_switch_array[bportid2][timeid - 1][1] = port;
						path_switch_array[bportid2][timeid - 1][2] = 0xff;
						path_switch_array[bportid2][timeid - 1][3] = 0;
					}						
					break;
			case 1: path_switch_array[1][timeid - 1][0] = bportid;		//填写MCB光口2的供倒换光口
					path_switch_array[1][timeid - 1][1] = port;			//填写MCB光口2的被保护光口
					path_switch_array[1][timeid - 1][2] = bportid2;		//填写被保护光口的上行并发光口
					path_switch_array[1][timeid - 1][3] = 1;
					if (bportid != 0xff){
						path_switch_array[bportid][timeid - 1][0] = 1;
						path_switch_array[bportid][timeid - 1][1] = port;
						path_switch_array[bportid][timeid - 1][2] = 1;
						path_switch_array[bportid][timeid - 1][3] = 0;
					}
					else {
						path_switch_array[bportid2][timeid - 1][0] = 0xff;		//填写供倒换光口

⌨️ 快捷键说明

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