📄 discom.c
字号:
{
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 + -