📄 ucosmovementcontrol.c.bak
字号:
//***************************************************************************************************************
// FILE NAME : MovementControl.C
// FILE DESCRIPTION :
// TARGET DEVICE : C8051F021
// CREATED ON : 2007.12.29
// CREATED BY : yuanwq
// VERSION : 1.00
// MODIFY RECORD :
// uCOS-II VERSION : 2.51
//****************************************************************************************************************
//****************************************************************************************************************
// Include File
//****************************************************************************************************************
#include "includes.h"
#include "FunctionPrototype.h"
//#include "Movement_speed.h"
//STACK Define
//*****************************************************************************************************************
OS_STK LED_TestSTK[MaxStkSize];
OS_STK TL16C554communicateRXSTK[MaxStkSize];
OS_STK FRENIC_RS485TXSTK[MaxStkSize];
//OS_STK FALDIC_RS422TXSTK[MaxStkSize];
OS_STK FRENIC_RS485TXProcessSTK[MaxStkSize];
OS_STK TL16C554TestTaskSTK[MaxStkSize];
//----------------------------------------------------------------------------------------------------------------
sbit LED = P1^6;
#include "Movement_speed.h"
//TASK Function
//*****************************************************************************************************************
void LED_Test(void *nouse) reentrant;
void TL16C554communicateRX(void *nouse) reentrant;
void FRENIC_RS485TX(void *nouse) reentrant;
//void FALDIC_RS422TX(void *nouse) reentrant;
void FRENIC_RS485TXProcess(void *nouse) reentrant;
void TL16C554TestTask(void *nouse) reentrant;
//MAIN ROUTINE
//*****************************************************************************************************************
void main(void)
{
INT8U ERROR_NUMBER;
Hardware_Init(); //-------------------------------------------------------------------------- 硬件初始化程序
Variables_Init(); //-------------------------------------------------------------------------- 变量初始化程序
OSInit();
SET_STATUS(Q0_Output,Q_En_Move);
XBYTE[Q0_Address] = Q0_Output.Now_Flag;
//---- 创建信号量
TL16C554_RXSEM = OSSemCreate(0);
while(!TL16C554_RXSEM);
FRENIC_RS485TXMUX = OSSemCreate(1);
while(!FRENIC_RS485TXMUX);
//TL16C554_TXMUX = OSSemCreate(1);
//while(!TL16C554_TXMUX);
//---- 创建邮箱
//TxTL16C554Mbox_A = OSMboxCreate((void *) 0);
//while(!TxTL16C554Mbox_A);
FRENIC_RS485TxMbox = OSMboxCreate((void *) 0);
while(!FRENIC_RS485TxMbox);
//TxTL16C554Mbox_C = OSMboxCreate((void *) 0);
//while(!TxTL16C554Mbox_C);
//TxTL16C554Mbox_D = OSMboxCreate((void *) 0);
//while(!TxTL16C554Mbox_D);
//---- 创建队列
FRENIC_RS485TXMsg = OSQCreate(&FRENIC_RS485TXMsgTbl[0],5);
while(!FRENIC_RS485TXMsg);
//RxTL16C554Msg = OSQCreate(&RxTL16C554MsgTbl[0],5);
//while(!RxTL16C554Msg);
//TL16C554ProcessMsg = OSQCreate(&TL16C554ProcessMsgTbl[0],5);
//while(!TL16C554ProcessMsg);
TL16C554TestMsg = OSQCreate(&TL16C554TestMsgTbl[0],5);
while(!TL16C554TestMsg);
//---- 创建内存分区
CommunicateBUF = OSMemCreate(CommunicatePART,COM_BLOCK_NUM,COM_BLOCK_SIZE,&ERROR_NUMBER);
while(ERROR_NUMBER);
//---- 创建任务
ERROR_NUMBER = OSTaskCreate(TL16C554communicateRX, (void *)0, &TL16C554communicateRXSTK[0],4);
while(ERROR_NUMBER);
//---- 测试灯任务:使测试LED间隔1s闪烁
ERROR_NUMBER = OSTaskCreate(LED_Test, (void *)0, &LED_TestSTK[0],14);
while(ERROR_NUMBER);
//----变频器发送任务
ERROR_NUMBER = OSTaskCreate(FRENIC_RS485TX, (void *)0, &FRENIC_RS485TXSTK[0],7);
while(ERROR_NUMBER);
ERROR_NUMBER = OSTaskCreate(FRENIC_RS485TXProcess, (void *)0, &FRENIC_RS485TXProcessSTK[0],6);
while(ERROR_NUMBER);
ERROR_NUMBER = OSTaskCreate(TL16C554TestTask, (void *)0, &TL16C554TestTaskSTK[0],5);
while(ERROR_NUMBER);
//---- 以Timer0为uCOS系统时钟,对其进行初始化
InitTimer0();
//---- 开始多任务调度
OSStart();
}
void LED_Test(void *nouse) reentrant
{
nouse = nouse;
while(1)
{
LED = ~LED;
OSTimeDly(OS_TICKS_PER_SEC * 1);
}
}
//----TL16C554接收任务
void TL16C554communicateRX(void *nouse) reentrant
{
INT8U ErrTL16C554Rx;
INT8U FinishTL16C554Rx = 0;
INT8U RxTL16C554CheckSUM = 0;
INT8U RxTL16C554CheckSUM_H,RxTL16C554CheckSUM_L;
// INT8U *MemTL16C554RX_B;//*MemTL16C554RX_A,*MemTL16C554RX_C,*MemTL16C554RX_D;
nouse = nouse;
while(1)
{
OSSemPend(TL16C554_RXSEM, 0, &ErrTL16C554Rx);
if(TL_16C554_INIT_SY & 0x01)
{
for(TL16C554RX_i = 0;TL16C554RX_i < RevvCharNumber;TL16C554RX_i++)
{
RevvCharFinish_A[TL16C554RX_i + RevvCharNumber_A] = RevvSerialChar_A[TL16C554RX_i];
}
if(RevvCharNumber_A == 0x00)
{
RevvCharNumber_A = 0x08;
}
else
{
RevvCharNumber_A = 0x00;
}
if(RevvCharNumber_A == 0x00)
{
RS422_CanRevv = 1;
for(TL16C554RX_i = 1;TL16C554RX_i<=13;TL16C554RX_i++)
{
if(TL16C554RX_i == 1)
{
RxTL16C554CheckSUM = RevvCharFinish_A[1];
}
else
{
RxTL16C554CheckSUM += RevvCharFinish_A[TL16C554RX_i];
}
}
RxTL16C554CheckSUM_H = (RxTL16C554CheckSUM & 0xF0) >> 4;
RxTL16C554CheckSUM_L = (RxTL16C554CheckSUM & 0x0F);
RxTL16C554CheckSUM_H = TO_ASCII(RxTL16C554CheckSUM_H);
RxTL16C554CheckSUM_L = TO_ASCII(RxTL16C554CheckSUM_L);
if((RevvCharFinish_A[14] == RxTL16C554CheckSUM_H) && (RevvCharFinish_A[15] == RxTL16C554CheckSUM_L))
{
//---- 数据接收正确,存储数据
//----存储接收数据,并且发送处理任务信号
}
else //校验和错误
{
//发送重新发送信号
}
}
}
if(TL_16C554_INIT_SY & 0x02)
{
for(TL16C554RX_i = 0;TL16C554RX_i < RevvCharNumber;TL16C554RX_i++)
{
RevvCharFinish_B[TL16C554RX_i + RevvCharNumber_B] = RevvSerialChar_B[TL16C554RX_i];
}
if(RevvCharNumber_B == 0x00)
{
RevvCharNumber_B = 0x08;
}
else
{
RevvCharNumber_B = 0x00;
}
if(RevvCharNumber_B == 0x00)
{//OSSemPost(FRENIC_RS485TXMUX);
if((TL16C554RS485Tx_BUF[4] == Write_FRENIC_Comm)&&(RevvCharFinish_B[6] == ACK))
{
//RS485_CanRevv = 1;
//if((RS485_CanSend == 1)&&(RS485_CanRevv == 1))//----发送RS485发送使能信号
//{
RS485_SendNew = 1;
OSSemPost(FRENIC_RS485TXMUX);
//}
SuudRevvRS485 = 1;
}
else
{
if((TL16C554RS485Tx_BUF[4] == Write_FRENIC_Comm)&&(RevvCharFinish_B[6] == NAK))
{
SuudRevvRS485 = 0;
OSSemPost(FRENIC_RS485TXMUX);
///此处需要增加变频器错误应答
///
///
}
else
{
for(TL16C554RX_i = 1;TL16C554RX_i<=13;TL16C554RX_i++)
{
if(TL16C554RX_i == 1)
{
RxTL16C554CheckSUM = RevvCharFinish_B[1];
}
else
{
RxTL16C554CheckSUM += RevvCharFinish_B[TL16C554RX_i];
}
}
RxTL16C554CheckSUM_H = (RxTL16C554CheckSUM & 0xF0) >> 4;
RxTL16C554CheckSUM_L = (RxTL16C554CheckSUM & 0x0F);
RxTL16C554CheckSUM_H = TO_ASCII(RxTL16C554CheckSUM_H);
RxTL16C554CheckSUM_L = TO_ASCII(RxTL16C554CheckSUM_L);
if((RevvCharFinish_B[14] == RxTL16C554CheckSUM_H) && (RevvCharFinish_B[15] == RxTL16C554CheckSUM_L))
{
//---- 数据接收正确,存储数据
//RS485_CanRevv = 1;
//if((RS485_CanSend == 1)&&(RS485_CanRevv == 1))//----发送RS485发送使能信号
//{
OSSemPost(FRENIC_RS485TXMUX);
//}
if(TL16C554RS485Tx_BUF[3] == Read_FRENIC)
{
////////////////////////////////////////////////////
/* MemTL16C554RX_B = (INT8U *)OSMemGet(CommunicateBUF,&ErrTL16C554Rx);
*(MemTL16C554RX_B + 0) = RevvCharFinish_B[1];
*(MemTL16C554RX_B + 1) = RevvCharFinish_B[2];
*(MemTL16C554RX_B + 2) = RevvCharFinish_B[4];
*(MemTL16C554RX_B + 3) = RevvCharFinish_B[5];
*(MemTL16C554RX_B + 4) = RevvCharFinish_B[6];
*(MemTL16C554RX_B + 5) = RevvCharFinish_B[7];
*(MemTL16C554RX_B + 6) = RevvCharFinish_B[9];
*(MemTL16C554RX_B + 7) = RevvCharFinish_B[10];
*(MemTL16C554RX_B + 8) = RevvCharFinish_B[11];
*(MemTL16C554RX_B + 9) = RevvCharFinish_B[12];
//OSQPost(RxTL16C554Msg,MemTL16C554RX_B);
//
//发送信息给接收处理任务
//*/
}
}
else //校验和错误
{
//RS485_SendNew = 0;
//RS485_CanRevv = 1;
//if((RS485_CanSend == 1)&&(RS485_CanRevv == 1))//----发送RS485发送使能信号
//{
OSSemPost(FRENIC_RS485TXMUX);
//}
OSMboxPost(FRENIC_RS485TxMbox,(void *)0);
}
}
}
}
}
/* if(TL_16C554_INIT_SY & 0x04)
{
for(TL16C554RX_i = 0;TL16C554RX_i < RevvCharNumber;TL16C554RX_i++)
{
RevvCharFinish_C[TL16C554RX_i + RevvCharNumber_C] = RevvSerialChar_C[TL16C554RX_i];
}
if(RevvCharNumber_C == 0x00)
{
RevvCharNumber_C = 0x08;
}
else
{
RevvCharNumber_C = 0x00;
}
if(RevvCharNumber_C == 0x00)
{
for(TL16C554RX_i = 1;TL16C554RX_i<=13;TL16C554RX_i++)
{
if(TL16C554RX_i == 1)
{
RxTL16C554CheckSUM = RevvCharFinish_C[1];
}
else
{
RxTL16C554CheckSUM += RevvCharFinish_C[TL16C554RX_i];
}
}
RxTL16C554CheckSUM_H = (RxTL16C554CheckSUM & 0xF0) >> 4;
RxTL16C554CheckSUM_L = (RxTL16C554CheckSUM & 0x0F);
RxTL16C554CheckSUM_H = TO_ASCII(RxTL16C554CheckSUM_H);
RxTL16C554CheckSUM_L = TO_ASCII(RxTL16C554CheckSUM_L);
if((RevvCharFinish_C[14] == RxTL16C554CheckSUM_H) && (RevvCharFinish_C[15] == RxTL16C554CheckSUM_L))
{
//---- 数据接收正确,存储数据
if(RevvCharFinish_C[3] == 0x06)
{
MemTL16C554RX_C = (INT8U *)OSMemGet(CommunicateBUF,&ErrTL16C554Rx);
*(MemTL16C554RX_C + 0) = RevvCharFinish_C[1];
*(MemTL16C554RX_C + 1) = RevvCharFinish_C[2];
*(MemTL16C554RX_C + 2) = RevvCharFinish_C[4];
*(MemTL16C554RX_C + 3) = RevvCharFinish_C[5];
*(MemTL16C554RX_C + 4) = RevvCharFinish_C[6];
*(MemTL16C554RX_C + 5) = RevvCharFinish_C[7];
*(MemTL16C554RX_C + 6) = RevvCharFinish_C[9];
*(MemTL16C554RX_C + 7) = RevvCharFinish_C[10];
*(MemTL16C554RX_C + 8) = RevvCharFinish_C[11];
*(MemTL16C554RX_C + 9) = RevvCharFinish_C[12];
OSQPost(RxTL16C554Msg,MemTL16C554RX_C);
}
}
else //校验和错误
{
}
}
}
if(TL_16C554_INIT_SY & 0x08)
{
for(TL16C554RX_i = 0;TL16C554RX_i < RevvCharNumber;TL16C554RX_i++)
{
RevvCharFinish_D[TL16C554RX_i + RevvCharNumber_D] = RevvSerialChar_D[TL16C554RX_i];
}
if(RevvCharNumber_D == 0x00)
{
RevvCharNumber_D = 0x08;
}
else
{
RevvCharNumber_D = 0x00;
}
if(RevvCharNumber_D == 0x00)
{
for(TL16C554RX_i = 1;TL16C554RX_i<=13;TL16C554RX_i++)
{
if(TL16C554RX_i == 1)
{
RxTL16C554CheckSUM = RevvCharFinish_D[1];
}
else
{
RxTL16C554CheckSUM += RevvCharFinish_D[TL16C554RX_i];
}
}
RxTL16C554CheckSUM_H = (RxTL16C554CheckSUM & 0xF0) >> 4;
RxTL16C554CheckSUM_L = (RxTL16C554CheckSUM & 0x0F);
RxTL16C554CheckSUM_H = TO_ASCII(RxTL16C554CheckSUM_H);
RxTL16C554CheckSUM_L = TO_ASCII(RxTL16C554CheckSUM_L);
if((RevvCharFinish_D[14] == RxTL16C554CheckSUM_H) && (RevvCharFinish_D[15] == RxTL16C554CheckSUM_L))
//---- 数据接收正确,存储数据
{
if(RevvCharFinish_D[3] == 0x06)
{
MemTL16C554RX_D = (INT8U *)OSMemGet(CommunicateBUF,&ErrTL16C554Rx);
*(MemTL16C554RX_D + 0) = RevvCharFinish_D[1];
*(MemTL16C554RX_D + 1) = RevvCharFinish_D[2];
*(MemTL16C554RX_D + 2) = RevvCharFinish_D[4];
*(MemTL16C554RX_D + 3) = RevvCharFinish_D[5];
*(MemTL16C554RX_D + 4) = RevvCharFinish_D[6];
*(MemTL16C554RX_D + 5) = RevvCharFinish_D[7];
*(MemTL16C554RX_D + 6) = RevvCharFinish_D[9];
*(MemTL16C554RX_D + 7) = RevvCharFinish_D[10];
*(MemTL16C554RX_D + 8) = RevvCharFinish_D[11];
*(MemTL16C554RX_D + 9) = RevvCharFinish_D[12];
OSQPost(RxTL16C554Msg,MemTL16C554RX_D);
}
}
else //校验和错误
{
}
}
}
*/
}
}
//----变频器发送任务
void FRENIC_RS485TX(void *nouse) reentrant
{
INT8U ErrFRENIC_RS485TX;
INT8U FRENIC_RS485TXCheckSUM;
INT8U FRENIC_RS485TXCheckSUM_H,FRENIC_RS485TXCheckSUM_L;
INT8U *MemFRENIC_RS485TX;
INT8U *FRENIC_RS485_Tx;
nouse = nouse;
while(1)
{
OSSemPend(FRENIC_RS485TXMUX, 0, &ErrFRENIC_RS485TX);//可能需要设置超时////////////////
if(RS485_SendNew)
{
MemFRENIC_RS485TX = (INT8U *)OSQPend(FRENIC_RS485TXMsg, 50, &ErrFRENIC_RS485TX);
if(ErrFRENIC_RS485TX == OS_TIMEOUT)
{
if((TL16C554RS485Tx_BUF[5] == FREMIC_Mov_Control)&&(TL16C554RS485Tx_BUF[7] == '6'))
{
RS485_SendStart();
RS485_CanSend = FALSE;
RS485_CanRevv = FALSE;
for(TL16C554TX_i=0;TL16C554TX_i<16;TL16C554TX_i++)
{
SendChar_UART_B(TL16C554RS485Tx_BUF[TL16C554TX_i]);
}
}
else
{
OSSemPost(FRENIC_RS485TXMUX); /////
}
}
else
{
TL16C554RS485Tx_BUF[0] = 0x01;
TL16C554RS485Tx_BUF[1] = *(MemFRENIC_RS485TX + 0);
TL16C554RS485Tx_BUF[2] = *(MemFRENIC_RS485TX + 1);
TL16C554RS485Tx_BUF[3] = 0x05;
TL16C554RS485Tx_BUF[4] = *(MemFRENIC_RS485TX + 2);
TL16C554RS485Tx_BUF[5] = *(MemFRENIC_RS485TX + 3);
TL16C554RS485Tx_BUF[6] = *(MemFRENIC_RS485TX + 4);
TL16C554RS485Tx_BUF[7] = *(MemFRENIC_RS485TX + 5);
TL16C554RS485Tx_BUF[8] = 0x20;
TL16C554RS485Tx_BUF[9] = *(MemFRENIC_RS485TX + 6);
TL16C554RS485Tx_BUF[10] = *(MemFRENIC_RS485TX + 7);
TL16C554RS485Tx_BUF[11] = *(MemFRENIC_RS485TX + 8);
TL16C554RS485Tx_BUF[12] = *(MemFRENIC_RS485TX + 9);
TL16C554RS485Tx_BUF[13] = 0x03;
OSMemPut(CommunicateBUF,MemFRENIC_RS485TX);
for(TL16C554TX_i = 1;TL16C554TX_i <= 13;TL16C554TX_i++)
{
if(TL16C554TX_i == 1)
{
FRENIC_RS485TXCheckSUM = TL16C554RS485Tx_BUF[TL16C554TX_i];
}
else
{
FRENIC_RS485TXCheckSUM += TL16C554RS485Tx_BUF[TL16C554TX_i];
}
}
FRENIC_RS485TXCheckSUM_H = (FRENIC_RS485TXCheckSUM & 0xF0) >> 4;
FRENIC_RS485TXCheckSUM_L = (FRENIC_RS485TXCheckSUM & 0x0F);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -