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

📄 discom.c

📁 CPU为CSP8051F020
💻 C
📖 第 1 页 / 共 3 页
字号:
	{
		Tcar[8] |= 0x10; 								// 4位	:
	}
	else
	{
		Tcar[8] &= ~0x10; 								// 4位	:
	}


	SPI_WRITE(Tcar[8]);
	SPI_WRITE(Tcar[7]);

	if (IsDot)
	{
		SPI_WRITE(dis[Tcar[6]]| Dot);
		SPI_WRITE(dis[Tcar[5]]| Dot);
		SPI_WRITE(dis[Tcar[4]]| Dot);
	}
	else
	{
		SPI_WRITE(dis[Tcar[6]]);
		SPI_WRITE(dis[Tcar[5]]);
		SPI_WRITE(dis[Tcar[4]]);
	}

	SPI_WRITE(dis[Tcar[3]]);
	SPI_WRITE(dis[Tcar[2]]);
	SPI_WRITE(dis[Tcar[1]]);
	SPI_WRITE(dis[Tcar[0]]);

	CST = 1;
	for (nw=0;nw<25;nw++)    // 延时50uS
	{
	}
	CST = 0;
}

void SendL( )
{
	/************************************************************************/
	//  拦焦车状态															//
	//	3位 右二	2位	右一		1位	左一	0位	左1						//
	//	3位	对准	2位	允许推焦8-2	1位	锁闭7-6	0位	一级允推7-1				//
	/************************************************************************/

	union
	{
		UWORD SPI_WORD;
		UBYTE SPI_BYTE[2];
	}SPI_DATA;
	bit IsDot;

	//Lcar[0]=	data_out[9]>>4;
	Lcar[1]= data_out[12]/100;			//计划炉号(用序号表示)
	Lcar[2]=(data_out[12]%100)/10;
	Lcar[3]= data_out[12]%10;


	SPI_DATA.SPI_BYTE[0]=data_out[2];	//拦焦车位置
	SPI_DATA.SPI_BYTE[1]=data_out[3];
	KKK=SPI_DATA.SPI_WORD/100;

	if ( ( (KKK > 155) && (KKK<201) ) 	// 在虚拟炉号
	|| ((KKK >255) && (KKK <301) )
	|| (KKK < 101) || (KKK>355) )
	{
		IsDot  = 1;
	}
	else
	{
		IsDot = 0;
	}

	if (KKK<100)
	{
		KKK += 900;
	}
	else if (KKK < 178 )
	{
		KKK -= 100;
	}
	else if (KKK < 278 )
	{
		KKK -= 145;
	}
	else
	{
		KKK -= 190;
	}
	if ( KKK >= 999)
	{
		KKK = 999;
	}

	Lcar[4] = KKK / 100;
	Lcar[5] = (KKK % 100) / 10;
	Lcar[6] = KKK % 10;

	KKK = SPI_DATA.SPI_WORD;				// 拦焦车炉号
	MMM = (UWORD)data_out[12] * 100 + 50;		// 计划炉号
	if (MMM <= 5550)
	{
		MMM += 10000;
	}
	else if (MMM <= 11050)
	{
		MMM += 14500;
	}
	else
	{
		MMM += 19000;
	}

	KKK -= MMM;

	if ( (DIS_DOT & 5) == 5 )
	{
		if (KKK >= 50)							// 左二、左一 00
		{
			Lcar[7] = 0x03;
			Lcar[8] &= 0x07;
		}
		else if (KKK <= -50)					// 右二、右一
		{
			Lcar[7] = 0x0c;
			Lcar[8] &= 0x07;
		}
		else if ( (KKK < 50) && (KKK >12) )		// 左一
		{
			Lcar[7] = 0x02;
			Lcar[8] &= 0x07;
		}
		else if ( (KKK > -50) && (KKK < -12) )	// 右一
		{
			Lcar[7] = 0x04;
			Lcar[8] &= 0x07;
		}
		else									// 对中
		{
			Lcar[7] = 0x00;
			Lcar[8] |= 0x08;
		}

		if ( (data_out[7] & 0x08) == 0x08 )				// 对中
		{
			Lcar[7] = 0x00;
			Lcar[8] |= 0x08;
		}
	}
	else
	{
		Lcar[7] = 0x00;
		Lcar[8] &= ~0x08;
	}



	if ( (data_out[7] & 0x04) == 0)
	{
		Lcar[8] &= ~0x04; 							// 2位	允许推焦8-2
	}
	else
	{
		Lcar[8] |=0x04; 							// 2位	允许推焦8-2
	}

	if ( (data_out[6] & 0x40) == 0)
	{
		Lcar[8] &= ~0x02; 							// 1位	锁闭7-6
	}
	else
	{
		Lcar[8] |= 0x02; 							// 1位	锁闭7-6
	}

	if ( (data_out[6] & 0x02) == 0)
	{
		Lcar[8] &= ~0x01; 							// 0位	一级允推7-1
	}
	else
	{
		Lcar[8] |= 0x01; 							// 0位	一级允推7-1
	}
	SPI_WRITE(Lcar[8]);
	SPI_WRITE(Lcar[7]);
	if (IsDot)
	{
		SPI_WRITE(dis[Lcar[6]] | Dot);
		SPI_WRITE(dis[Lcar[5]] | Dot);
		SPI_WRITE(dis[Lcar[4]] | Dot);
	}
	else
	{
		SPI_WRITE(dis[Lcar[6]]);
		SPI_WRITE(dis[Lcar[5]]);
		SPI_WRITE(dis[Lcar[4]]);
	}
	SPI_WRITE(dis[Lcar[3]]);
	SPI_WRITE(dis[Lcar[2]]);
	SPI_WRITE(dis[Lcar[1]]);
	//	SPI_WRITE(dis[Lcar[0]]);


	CSL = 1;
	for (nw=0;nw<25;nw++)    // 延时50uS
	{
	}
	CSL = 0;
}

void SendX( )
{
	/************************************************************************/
	//  熄焦车状态															//
	//	3位 右二	2位	右一		1位	左一	0位	左1						//
	//	3位	对准	2位	允许推焦8-4	1位	车门7-7	0位	一级允推7-2				//
	/************************************************************************/

	union
	{
		UWORD SPI_WORD;
		UBYTE SPI_BYTE[2];
	}SPI_DATA;


	bit IsDot;



	Xcar[0]=	data_out[10]>>4;		// 计划时间
	Xcar[1]=	data_out[10] & 0x0f;
	Xcar[2]=	data_out[11]>>4;
	Xcar[3]=	data_out[11] & 0x0f;

	if (( Car==3) && (Position_XJC<4500) )
	{
		Xcar[0]=	(Position_XJC%10000)/1000;		// 计划时间-->熄焦车实际地址
		Xcar[1]=	(Position_XJC%1000)/100;
		Xcar[2]=	(Position_XJC%100)/10;
		Xcar[3]=	(Position_XJC%10);

	}

	SPI_DATA.SPI_BYTE[0]=data_out[4];	// 熄焦车位置
	SPI_DATA.SPI_BYTE[1]=data_out[5];
	KKK=SPI_DATA.SPI_WORD/100;

	if ( ( (KKK > 155) && (KKK<201) ) 	// 在虚拟炉号
	|| ((KKK >255) && (KKK <301) )
	|| (KKK < 101) || (KKK>355) )
	{
		IsDot  = 1;
	}
	else
	{
		IsDot = 0;
	}

	if (KKK<100)
	{
		KKK += 900;
	}
	else if (KKK < 178 )
	{
		KKK -= 100;
	}
	else if (KKK < 278 )
	{
		KKK -= 145;
	}
	else
	{
		KKK -= 190;
	}
	if ( KKK >= 999)
	{
		KKK = 999;
	}

	Xcar[4] = KKK / 100;
	Xcar[5] = (KKK % 100) / 10;
	Xcar[6] = KKK % 10;

	KKK = SPI_DATA.SPI_WORD;				// 熄焦车炉号
	MMM = (UWORD)(data_out[12]) * 100 ;		// 计划炉号
	if (data_out[12] <= 55)
	{
		MMM += 10050;
	}
	else if (data_out[12] <= 110)
	{
		MMM += 14550;
	}
	else
	{
		MMM += 19050;
	}

	KKK -= MMM;

	if ( (DIS_DOT & 5) == 5 )
	{
		if (KKK >= 50)							// 左二、左一 0011
		{
			Xcar[7] = 0x03;
			Xcar[8] &= 0x07;
		}
		else if (KKK <= -50)					// 右二、右一 1100
		{
			Xcar[7] = 0x0c;
			Xcar[8] &= 0x07;
		}
		else if ( (KKK < 50) && (KKK >12) )		// 左一 0010
		{
			Xcar[7] = 0x02;
			Xcar[8] &= 0x07;
		}
		else if ( (KKK > -50) && (KKK < -12) )	// 右一0100
		{
			Xcar[7] = 0x04;
			Xcar[8] &= 0x07;
		}
		else									// 对中
		{
			Xcar[7] = 0x00;
			Xcar[8] |= 0x08;
		}

		if ( (data_out[7] & 0x20) == 0x20 )				// 对中
		{
			Xcar[7] = 0x00;
			Xcar[8] |= 0x08;
		}

	}
	else
	{
		Xcar[7] = 0x00;
		Xcar[8] &= ~0x08;

	}

	if ((data_out[7] & 0x10) == 0)
	{
		Xcar[8] &=~0x04; 					// 2位	允许推焦8-4
	}
	else
	{
		Xcar[8] |= 0x04; 							// 2位	允许推焦8-4
	}

	if ((data_out[6] & 0x80) == 0)
	{
		Xcar[8] &= ~0x02; 							// 1位	车门7-7
	}
	else
	{
		Xcar[8] |= 0x02; 							// 1位	车门7-7
	}

	if ((data_out[6] & 0x04 )== 0)
	{
		Xcar[8] &= ~0x01; 							// 0位	二级允推7-2
	}
	else
	{
		Xcar[8] |= 0x01; 							// 0位	二级允推7-2
	}

	if ( (DIS_DOT & 10) == 10 )
	{
		Xcar[8] |= 0x10; 								// 4位	:
	}
	else
	{
		Xcar[8] &= ~0x10; 								// 4位	:
	}


	SPI_WRITE(Xcar[8]);
	SPI_WRITE(Xcar[7]);
	if (IsDot)
	{
		SPI_WRITE(dis[Xcar[6]] | Dot);
		SPI_WRITE(dis[Xcar[5]] | Dot);
		SPI_WRITE(dis[Xcar[4]] | Dot);
	}
	else
	{
		SPI_WRITE(dis[Xcar[6]]);
		SPI_WRITE(dis[Xcar[5]]);
		SPI_WRITE(dis[Xcar[4]]);
	}
	SPI_WRITE(dis[Xcar[3]]);
	SPI_WRITE(dis[Xcar[2]]);
	SPI_WRITE(dis[Xcar[1]]);
	SPI_WRITE(dis[Xcar[0]]);


	CSX = 1;
	for (nw=0;nw<25;nw++)    // 延时50uS
	{
	}
	CSX = 0;
}

//--------------------------------------------------------------------------------------
void PlayVoice()
{
	switch (Voice)
	{
		case 0:
			P5 = 0x0FF;
		return;

		case 1:
			P5 = ~0x80;		//0111 111
		break;

		case 2:
			P5 = ~0x40;		//1011 1111
		break;

		case 3:
			P5 = ~0x20;		//1111 0111
		break;

		case 4:
			P5 = ~0x10;		//1111 1011
		break;

		case 5:
			P5 = ~0x08;		//1111 1101
		break;

		case 6:
			P5 = ~0x04;		//1111 1110
		break;

		default:
			P5 =0x0FF;
		return;
	}

	for (TTTT=0;TTTT<2000;TTTT++)    // 延时500uS
	{
		WDTCN = 0xa5;					// 

		Com();
	}	

	

	//Timer0_Delay_ms(500);
	P5 = 0x0FF;
}

void Com()
{

		if ( PLC_COM_OK | PLC_COM_OVER )			// PLC上一次通信完成,或通信时间溢出,重新开始通信
		{
			PLC_COM_OK = 0;							// 通信完成复位
			PLC_COM_OVER = 0;						// 通信溢出复位
			PLC_COM_START = 0;						// 通信开始复位

			if ( ++Run >= 200)
			{
				READ = ~READ;						// 读写轮替//				Run = 200;
			}
			else
			{
				READ = 1;							// 读//
			}
			SendT();								// 显示信息
			SendL();
			SendX();

			if (READ)
			{										// 读PLC
				//发送命令(08字节):01 03 00 64 00 04 (CRC)
				for (j = 0; j<TX0_READ_PLC_NUMBER; j++)
				{
					trbox[j] = Cmd_READ[j];
				}

				//for (j = 0; j<TX0_READ_PLC_NUMBER-2; j++)
				//{
				//	trbox[j] = Cmd_READ[j];
				//}

				//GetCRC16(Cmd_READ,TX0_READ_PLC_NUMBER-2);
				//trbox[TX0_READ_PLC_NUMBER-2] = CRCHi;
				//trbox[TX0_READ_PLC_NUMBER-1] = CRCLo;

				TX0_NUMBER = TX0_READ_PLC_NUMBER;
			}
			else
			{										// 写PLC
				//发送命令(27字节):01 10 00 C8 00 08 10 12 34 56 78 9A BC DE F0 12 34 01 23 45 67 89 AB (CRC)

				for (j = 0; j< 7 ; j++)
				{
					trbox[j] = Cmd_WRITE[j];
				}
				trbox[7] = data_out[0];		//T	400201
				trbox[8] = data_out[1];
				trbox[9] = data_out[2];		//L	400202
				trbox[10] = data_out[3];
				trbox[11] = data_out[4];	//X	400203
				trbox[12] = data_out[5];
				trbox[13] = data_out[6];	//状态400204
				trbox[14] = data_out[7];

				trbox[15] = data_out[14];	//400205
				trbox[16] = data_out[15];	//
				trbox[17] = data_out[16];	//400206
				trbox[18] = data_out[17];

				trbox[19] = data_out[12];	//400207
				trbox[20] = data_out[13];
				trbox[21] = data_out[14];
				trbox[22] = data_out[15];

				//for (j = 7; j< ( TX0_WRITE_PLC_NUMBER - 2 ); j++)
				//{
				//	trbox[j] = data_out[j-7];
				//}
				GetCRC16(trbox,( TX0_WRITE_PLC_NUMBER - 2 ) );
				trbox[TX0_WRITE_PLC_NUMBER - 2] = CRCHi;
				trbox[TX0_WRITE_PLC_NUMBER - 1] = CRCLo;

				TX0_NUMBER = TX0_WRITE_PLC_NUMBER;
			}
			TX0_index=0;
			RX0_index=0;
			TI0 = 1;								// 起动PLC通信
			Count1ms_PLC = 0;						// 通信时间复位
			PLC_COM_START = 1;						// 通信计时开始
		}
		else
		{
			SendT();								// 显示信息
			SendL();
			SendX();
		}

}

⌨️ 快捷键说明

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