📄 plcdlg.cpp
字号:
m_X00.SetBitmap(IDB_NORMAL);
else
m_X00.SetBitmap(IDB_RED);
if(X[1]==0)
m_X01.SetBitmap(IDB_NORMAL);
else
m_X01.SetBitmap(IDB_RED);
if(X[2]==0)
m_X02.SetBitmap(IDB_NORMAL);
else
m_X02.SetBitmap(IDB_RED);
if(X[3]==0)
m_X03.SetBitmap(IDB_NORMAL);
else
m_X03.SetBitmap(IDB_RED);
if(X[4]==0)
m_X04.SetBitmap(IDB_NORMAL);
else
m_X04.SetBitmap(IDB_RED);
if(X[5]==0)
m_X05.SetBitmap(IDB_NORMAL);
else
m_X05.SetBitmap(IDB_RED);
if(X[6]==0)
m_X06.SetBitmap(IDB_NORMAL);
else
m_X06.SetBitmap(IDB_RED);
if(X[7]==0)
m_X07.SetBitmap(IDB_NORMAL);
else
m_X07.SetBitmap(IDB_RED);
if(X[8]==0)
m_X10.SetBitmap(IDB_NORMAL);
else
m_X10.SetBitmap(IDB_RED);
if(X[9]==0)
m_X11.SetBitmap(IDB_NORMAL);
else
m_X11.SetBitmap(IDB_RED);
if(X[10]==0)
m_X12.SetBitmap(IDB_NORMAL);
else
m_X12.SetBitmap(IDB_RED);
if(X[11]==0)
m_X13.SetBitmap(IDB_NORMAL);
else
m_X13.SetBitmap(IDB_RED);
if(X[12]==0)
m_X14.SetBitmap(IDB_NORMAL);
else
m_X14.SetBitmap(IDB_RED);
if(X[13]==0)
m_X15.SetBitmap(IDB_NORMAL);
else
m_X15.SetBitmap(IDB_RED);
if(X[14]==0)
m_X16.SetBitmap(IDB_NORMAL);
else
m_X16.SetBitmap(IDB_RED);
if(X[15]==0)
m_X17.SetBitmap(IDB_NORMAL);
else
m_X17.SetBitmap(IDB_RED);
if(X[16]==0)
m_X20.SetBitmap(IDB_NORMAL);
else
m_X20.SetBitmap(IDB_RED);
if(X[17]==0)
m_X21.SetBitmap(IDB_NORMAL);
else
m_X21.SetBitmap(IDB_RED);
if(X[18]==0)
m_X22.SetBitmap(IDB_NORMAL);
else
m_X22.SetBitmap(IDB_RED);
if(X[19]==0)
m_X23.SetBitmap(IDB_NORMAL);
else
m_X23.SetBitmap(IDB_RED);
if(X[20]==0)
m_X24.SetBitmap(IDB_NORMAL);
else
m_X24.SetBitmap(IDB_RED);
if(X[21]==0)
m_X25.SetBitmap(IDB_NORMAL);
else
m_X25.SetBitmap(IDB_RED);
if(X[22]==0)
m_X26.SetBitmap(IDB_NORMAL);
else
m_X26.SetBitmap(IDB_RED);
if(X[23]==0)
m_X27.SetBitmap(IDB_NORMAL);
else
m_X27.SetBitmap(IDB_RED);
if(Y[0]==0)
m_Y00.SetBitmap(IDB_NORMAL);
else
m_Y00.SetBitmap(IDB_RED);
if(Y[1]==0)
m_Y01.SetBitmap(IDB_NORMAL);
else
m_Y01.SetBitmap(IDB_RED);
if(Y[2]==0)
m_Y02.SetBitmap(IDB_NORMAL);
else
m_Y02.SetBitmap(IDB_RED);
if(Y[3]==0)
m_Y03.SetBitmap(IDB_NORMAL);
else
m_Y03.SetBitmap(IDB_RED);
if(Y[4]==0)
m_Y04.SetBitmap(IDB_NORMAL);
else
m_Y04.SetBitmap(IDB_RED);
if(Y[5]==0)
m_Y05.SetBitmap(IDB_NORMAL);
else
m_Y05.SetBitmap(IDB_RED);
if(Y[6]==0)
m_Y06.SetBitmap(IDB_NORMAL);
else
m_Y06.SetBitmap(IDB_RED);
if(Y[7]==0)
m_Y07.SetBitmap(IDB_NORMAL);
else
m_Y07.SetBitmap(IDB_RED);
if(Y[8]==0)
m_Y10.SetBitmap(IDB_NORMAL);
else
m_Y10.SetBitmap(IDB_RED);
if(Y[9]==0)
m_Y11.SetBitmap(IDB_NORMAL);
else
m_Y11.SetBitmap(IDB_RED);
if(Y[10]==0)
m_Y12.SetBitmap(IDB_NORMAL);
else
m_Y12.SetBitmap(IDB_RED);
if(Y[11]==0)
m_Y13.SetBitmap(IDB_NORMAL);
else
m_Y13.SetBitmap(IDB_RED);
if(Y[12]==0)
m_Y14.SetBitmap(IDB_NORMAL);
else
m_Y14.SetBitmap(IDB_RED);
if(Y[13]==0)
m_Y15.SetBitmap(IDB_NORMAL);
else
m_Y15.SetBitmap(IDB_RED);
if(Y[14]==0)
m_Y16.SetBitmap(IDB_NORMAL);
else
m_Y16.SetBitmap(IDB_RED);
if(Y[15]==0)
m_Y17.SetBitmap(IDB_NORMAL);
else
m_Y17.SetBitmap(IDB_RED);
/* RECT rec;
rec.left=122;
rec.bottom=16;
rec.top=365;
rec.right=300;
InvalidateRect(&rec,true);
*/
Invalidate(false);
}
void CPLCDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CString ddd;
ddd.Format("%d,%d",point.x,point.y);
AfxMessageBox(ddd);
CDialog::OnLButtonDblClk(nFlags, point);
}
void CPLCDlg::InitBtn()
{
m_CloseAll.SetIcon(IDC_CLOSEALL);
m_CloseAll.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_CloseAll.SetRounded(TRUE);
// m_CloseAll.SetSound(MAKEINTRESOURCE(IDR_WAVEHOVER), ::GetModuleHandle(NULL));
m_CloseAll.SetBtnCursor(IDI_CLOSE);
m_OpenAll.SetIcon(IDC_OPENALL);
m_OpenAll.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_OpenAll.SetRounded(TRUE);
// m_OpenAll.SetSound(MAKEINTRESOURCE(IDR_WAVEHOVER), ::GetModuleHandle(NULL));
m_OpenAll.SetBtnCursor(IDI_OPEN);
m_Exit.SetIcon(IDCANCEL);
m_Exit.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_Exit.SetRounded(TRUE);
// m_Exit.SetSound(MAKEINTRESOURCE(IDR_WAVEHOVER), ::GetModuleHandle(NULL));
m_Exit.SetBtnCursor(IDI_QUIT);
m_Run.SetIcon(IDC_RUN);
m_Run.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_Run.SetRounded(TRUE);
// m_Exit.SetSound(MAKEINTRESOURCE(IDR_WAVEHOVER), ::GetModuleHandle(NULL));
m_Run.SetBtnCursor(IDI_QUIT);
m_ShunXu.SetIcon(IDC_RUN);
m_ShunXu.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
m_ShunXu.SetRounded(TRUE);
// m_Exit.SetSound(MAKEINTRESOURCE(IDR_WAVEHOVER), ::GetModuleHandle(NULL));
m_ShunXu.SetBtnCursor(IDI_QUIT);
}
/*
以下为命令程序
*/
//调度程序
//既有自动执行,又有手动执行的。
int CPLCDlg::AddCommand(unsigned char CommandStr[],int CommandLength,unsigned char RecDataLength,unsigned char Flag,int Style,int PortNo)
{
int Result=1;
//首先判断是否序列中有该项
int leng_CommandArr=CommandArr[PortNo].GetSize();
for(int iMain=0;iMain<leng_CommandArr;iMain++)
{
CString curStr=CommandArr[PortNo].GetAt(iMain);
int leng=CommandLengthArr[PortNo].GetAt(iMain);
for(int itm=0;itm<CommandLength;itm++)
{
unsigned char a=CommandStr[itm];
unsigned char b=curStr.GetAt(itm);
if(a!=b)
{
Result=1;
break;//有不相等的数据,马上跳出,无需检验了.
}
else
{
Result=0;
}
}
if(Result==0) //如果二者相等,则不必添加命令了。
return Result;
}
CString tm;
for(int itmm=0;itmm<CommandLength;itmm++)
tm+=CommandStr[itmm];
if(Style==1) //顺序添加,主要采用此种方式
{
CommandArr[PortNo].Add(tm);
CommandFlag[PortNo].Add(Flag);
CommandLengthArr[PortNo].Add(CommandLength);
RecDataLengthArr[PortNo].Add(RecDataLength);
}
if(Style==2) //后来优先添加,对于启动电机等动作采用此种方式,为了节约时间
{
CommandArr[PortNo].InsertAt(0,tm);
CommandFlag[PortNo].InsertAt(0,Flag);
CommandLengthArr[PortNo].InsertAt(0,CommandLength);
RecDataLengthArr[PortNo].InsertAt(0,RecDataLength);
}
return Result;
}
int CPLCDlg::DelCommand(unsigned char CommandStr[],int CommandLength,int PortNo)
{
int Result=0;
//首先判断是否序列中有该项
//问题出在这里.
int TotalLength=CommandArr[PortNo].GetSize();
for(int iMain=0;iMain<TotalLength;iMain++)
{
CString curCompStr =CommandArr[PortNo].GetAt(iMain); //当前要比较的命令
int leng_CompStr =CommandLengthArr[PortNo].GetAt(iMain);
bool Flag=false;
//比较结果,如果CommandStr和curCompStr相等,Flag=true;
if(CommandLength==leng_CompStr)//如果二者长度相等,才有接下来判断的必要。
{
for(int il=0;il<CommandLength;il++)
{
unsigned char a=CommandStr[il];
unsigned char b=curCompStr.GetAt(il);
if(a==b)//如果全部相等
{
Flag=false;
}
else
{
Flag=true;
break;
}
}
}
else
{
Flag=true;
}
if(Flag==false)
{
CommandArr[PortNo].RemoveAt(iMain);
CommandFlag[PortNo].RemoveAt(iMain);
CommandLengthArr[PortNo].RemoveAt(iMain);
RecDataLengthArr[PortNo].RemoveAt(iMain);
Result = 1;
return Result;
}
}
return Result;
}
//初始化命令 ,主要是做一些自检之类的工作.
int CPLCDlg::InitCommand()
{
int Result=0;
AddCommand(Plc_TT,16,14,14,2,1);
AddCommand(Command_Status_Plc_Y,15,44,16,1,0);//获取Y状态
AddCommand(Command_Status_Plc_X,15,42,15,1,0);//获取X状态
/**/ return Result;
}
//对要发送的数据进行预处理
//主要是把命令序列中的数据加入到当前的命令序列中。
//如果当前的命令三次无效,则将其删除。
//对于即时删除的命令,如果状态
//如何及时控制。
int CPLCDlg::DealCommandArr(int PortNo)
{
int Result=0;
RecData_Length=0;
CommandArr_Cur[PortNo].RemoveAll(); //当前桢命令字符序列
CommandLengthArr_Cur[PortNo].RemoveAll(); //当前桢命令长度序列
CommandFlag_Cur[PortNo].RemoveAll(); //当前桢命令标志。
RecDataLengthArr_Cur[PortNo].RemoveAll(); //当前桢接收到数据的应有长度
//对错误次数进行判断
int i;
static int ErrorsMax=5; //错误上限
if(PortNo==0)
{
if(ErrorNum_PlcRun==ErrorsMax)
{
DelCommand(Plc_Run,8,PortNo);
ErrorNum_PlcRun=0;
}
if(ErrorNum_PlcStp==ErrorsMax)
{
DelCommand(Plc_Stp,8,PortNo);
ErrorNum_PlcStp=0;
}
for(i=0;i<32;i++)
{
if(ErrorNum_YOpen[i]==ErrorsMax)
{
DelCommand(YOpen[i],16,PortNo);
ErrorNum_YOpen[i]=0;
}
if(ErrorNum_YClose[i]==ErrorsMax)
{
DelCommand(YClose[i],16,PortNo);
ErrorNum_YClose[i]=0;
}
}
if(ErrorNum_PlcTT==ErrorsMax)
{
DelCommand(Plc_TT,16,PortNo);
ErrorNum_PlcTT=0;
}
if(ErrorNum_Status_Y==ErrorsMax)
{
DelCommand(Command_Status_Plc_Y,15,PortNo);
ErrorNum_Status_Y=0;
}
if(ErrorNum_Status_X==ErrorsMax)
{
DelCommand(Command_Status_Plc_X,15,PortNo);
ErrorNum_Status_X=0;
}
}
CommandArr_Cur[PortNo].Append(CommandArr[PortNo]);
CommandLengthArr_Cur[PortNo].Append(CommandLengthArr[PortNo]);
CommandFlag_Cur[PortNo].Append( CommandFlag[PortNo]);
RecDataLengthArr_Cur[PortNo].Append(RecDataLengthArr[PortNo]);
Result=RecDataLengthArr_Cur[PortNo].GetSize();
for(i=0;i<Result;i++)
RecData_Length+=RecDataLengthArr_Cur[PortNo].GetAt(i);
return Result;
}
//发送命令.用来调正数据。
//获取上一个命令
int CPLCDlg::SendCommand(int CommandNo,int PortNo)
{
int Result=1;
int siz=CommandArr_Cur[PortNo].GetSize();
if(siz==0)
{
Result=0;
return Result;
}
unsigned char tmp[128];
CString str=CommandArr_Cur[PortNo].GetAt(CommandNo);
int len=str.GetLength();
memcpy(tmp,str,len);
if(PortNo==0)
port1.WriteToPort(tmp,len);
int Flag=CommandFlag_Cur[PortNo].GetAt(CommandNo);//该命令的标志
iCommand[PortNo]++;
//发送完本帧命令,则当前帧变为上一帧。
if(CommandNo==siz-1)
{
//要及时删除以前的,否则会造成内存扩大。2005.6.1/10:00改正
CommandArr_Pre[PortNo].RemoveAll();
CommandLengthArr_Pre[PortNo].RemoveAll();
CommandFlag_Pre[PortNo].RemoveAll();
RecDataLengthArr_Pre[PortNo].RemoveAll();
CommandArr_Pre[PortNo].Append(CommandArr_Cur[PortNo]);
CommandLengthArr_Pre[PortNo].Append(CommandLengthArr_Cur[PortNo]);
CommandFlag_Pre[PortNo].Append(CommandFlag_Cur[PortNo]);
RecDataLengthArr_Pre[PortNo].Append(RecDataLengthArr_Cur[PortNo]);
}
//如果在本帧中
//如果是全部的数据的第一个命令。
if(iFrame[PortNo]!=0)
{
if(CommandNo==0)//发送本帧的第一个命令,则PreCommand在前一帧中的最后一个
{
int max=CommandArr_Pre[PortNo].GetSize();
PreCommand[PortNo]=CommandArr_Pre[PortNo].GetAt(max-1);
PreFlag[PortNo]=CommandFlag_Pre[PortNo].GetAt(max-1);
}
else
{
PreCommand[PortNo]=CommandArr_Cur[PortNo].GetAt(CommandNo-1);
PreFlag[PortNo]=CommandFlag_Cur[PortNo].GetAt(CommandNo-1);
}
}
unsigned char Flag_Std[]={1,2,3,9,10,11,12,14,17,18,19,20,7,8};//即时删除的命令的标志
bool Re=false;
for(int i=0;i<14;i++ )
{
if(Flag==Flag_Std[i])
{
Re=true;
break;
}
}
if(Re==true)
DelCommand(tmp,len,0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -