#include"stdafx.h"
#include "ProcessResTest.h"
#include "ResTestDlg.h"
#include "StatusLog.h"
#include "Mysql.h"
#include "SerialPortEx.h"
#include <map>
#include "HttpClient.h"
using namespace std;
bool m_UpdateSql=true;
CMysql mysql;
CStatusLog m_StatusLog;
CString m_ServerIP=_T("");
CStdioFile m_WriteLog;
CSerialPortEx m_ResCom;
int m_ResComNo;
int m_PrintComNo;
int m_SataionID=-1;
CString m_SNID=_T("");
int m_SQLResult=0;
CString m_ChanleList=_T("test");
CString m_UpdateStr=_T("");
CString m_Model=_T("");
CString m_SNStr=_T("");
CString m_LogPath=_T("");
CString m_TestStation=_T("");
CString m_Operator;
bool m_TestFinalResult;
int m_TotalCount=0;
CString m_StrDesc;
CString m_StrMax;
CString m_StrMin;
int m_ProTestDelay=0;
int m_Coun=0;
CString m_TestResult=_T("");
CString m_MachineID=_T("");
CHttpClient m_MesHttp;
struct ProCahnel
{
CString m_Upper;
CString m_Lower;
CString m_Count;
CString m_Moffset;
double m_TestValue;
double m_MaxValue;
double m_MinValue;
CString m_Result;
};
map <CString,ProCahnel> ProMap;
typedef map<CString,ProCahnel>::iterator ProMap_it;
enum ResultList
{
Result_OK,
Result_NG, //上一个站位NG
Result_Repeat, //当前SN已过该站位,SN重复
Result_NoRecord, //数据库中没有记录
Result_DataBaseError, //数据库错误
Result_StationError, //站位错误,当前SN下一站位不是当前站位
};
void ConnectToMYSQL(void) //连接mysql数据库
{
CStringA m_IP;
m_IP=m_ServerIP;
string dbName = "mes";
string host = m_IP.GetBuffer();//pHost->h_name;
m_IP.ReleaseBuffer();
string user = "root";
string password = "liom9028";
Database_Param Database_p(host,user,password,dbName,0,NULL,0);
if(!mysql.ConnectDB(&Database_p))
{
AfxMessageBox(_T("连接mysql数据库失败!\r\n"));
}
else
{
CString m_MessageStr=_T("1>Connect TO MYSQL IS OK \r\n");
SendMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_UPDATA_MESSAGE, 1,(LPARAM)(LPCTSTR)m_MessageStr);
}
}
int CheckSNInformation(CString m_SNID) //检查当前SN在数据库中的信息
{
CString m_Buffer=_T("");
CString m_Result=_T("");
CStringA m_IDBuffer;
m_IDBuffer=_T("SNID=")+m_SNID+_T(" order by id desc limit 1");
string db_name = "mes";
string tab_name = "historylist";
string where_def =m_IDBuffer.GetBuffer();
m_IDBuffer.ReleaseBuffer();
string select_exp = "*";
Data_Param data_p(db_name,tab_name,where_def,select_exp,"");
mysql.SelectDB(&data_p);
if(mysql.SelectRecord(&data_p))
{
if (mysql.GetRecord())
{
m_Buffer=mysql.row[2]; //获取当前最新站位信息
int m_StationBuffer=_ttoi(m_Buffer);
if (m_SataionID!=m_StationBuffer)
{
if (m_SataionID==(m_StationBuffer+1))
{
m_Buffer=mysql.row[3]; //获取前一个站位的状态
mysql.FreeResult();
if (m_Buffer==_T("1"))
{
return Result_OK; //当前SN 可以通过该站位
}
else
{
AfxMessageBox(_T("当前SN在上一个站位是处于NG状态,请检查!"));
return Result_NG; //上一个站位状态NG
}
}
else
{
mysql.FreeResult();
AfxMessageBox(_T("站位错误,当前SN下一站位不是电阻测试站位,请检查!"));
return Result_StationError;
}
}
else //如果站位ID相同 检查站位状态
{
m_Buffer=mysql.row[3]; //获取前站位的状态
if (m_Buffer==_T("0"))
{
mysql.FreeResult();
return Result_OK; //当前SN 可以通过该站位
}
else
{
mysql.FreeResult();
AfxMessageBox(_T("SN 重复,当前SN已通过电阻测试站位,请检查!"));
return Result_Repeat; // 当前SN 重复
}
}
}
else
{
mysql.FreeResult();
AfxMessageBox(_T("当前SN在数据库中没有记录,请检查!"));
return Result_NoRecord; //在记录中没有查找到当前sn
}
}
else
{
ConnectToMYSQL();
AfxMessageBox(_T("链接数据库失败,请检查网络链接!"));
return Result_DataBaseError; //数据库链接异常
}
}
int SearchSNList(CString m_SN) //查找当前SN信息
{
CStringA m_IDBuffer;
m_IDBuffer=_T("SN='")+m_SN+_T("'");
string db_name = "mes";
string tab_name = "snlist";
string where_def =m_IDBuffer.GetBuffer();
m_IDBuffer.ReleaseBuffer();
string select_exp = "*";
Data_Param data_p(db_name,tab_name,where_def,select_exp,"");
mysql.SelectDB(&data_p);
if(mysql.SelectRecord(&data_p))
{
if (mysql.GetRecord())
{
m_SNID=mysql.row[0];
mysql.FreeResult();
return 0;
}
else
{
mysql.FreeResult();
return 1;
}
}
else
{
ConnectToMYSQL();
return 2;
}
}
bool InsertTestResult(void) //上传测试结果到history
{
CString m_ResID;
CStringA m_Valu;
if (m_TestFinalResult)
{
m_Valu=_T("'")+m_SNID+_T("','")+m_TestStation+_T("','1',")+m_TestResult;
}
else
{
m_Valu=_T("'")+m_SNID+_T("','")+m_TestStation+_T("','0',")+m_TestResult;
}
string db_name = "";
string tab_name = "historylist (SNID,StationID,TestResult,TestData)";
string where_def ="";
string select_exp = "";
string m_InsertV=m_Valu.GetBuffer();
m_Valu.ReleaseBuffer();
Data_Param data_p(db_name,tab_name,where_def,select_exp,m_InsertV);
if (!mysql.InsertRecord(&data_p))
{
ConnectToMYSQL();
return false;
}
if (mysql.SelectRecordID())
{
if (mysql.GetRecord())
{
m_ResID=mysql.row[0];
mysql.FreeResult();
return 1;
}
else
{
mysql.FreeResult();
return 0;
}
}
return 0;
}
void ReadConfig(void)
{
CString m_FilePath;
GetModuleFileName(NULL,m_FilePath.GetBufferSetLength(MAX_PATH),MAX_PATH);
m_FilePath.ReleaseBuffer();
m_FilePath = m_FilePath.Left( m_FilePath.ReverseFind( '\\' ) + 1 );
m_LogPath=m_FilePath;
m_FilePath=m_FilePath+_T("config.ini");
GetPrivateProfileString(_T("ServerIPAdress"),_T("IP"),_T(""),m_ServerIP.GetBufferSetLength(20),20,m_FilePath);
m_ServerIP.ReleaseBuffer();
GetPrivateProfileString(_T("MachieID"),_T("Machine"),_T("1"),m_MachineID.GetBufferSetLength(MAX_PATH),MAX_PATH,m_FilePath);
m_MachineID.ReleaseBuffer();
m_ResComNo=GetPrivateProfileInt(_T("ResCom"),_T("Com"),0,m_FilePath);
int m_Data=0;
m_Data=GetPrivateProfileInt(_T("Function"),_T("EnableUpdateSQL"),0,m_FilePath);
if (m_Data)
{
m_UpdateSql=true;
}
else
{
m_UpdateSql=false;
}
m_SataionID=GetPrivateProfileInt(_T("StationID"),_T("ID"),-1,m_FilePath);
}
void WriteLogFile(void)
{
CTime m_time=CTime::GetCurrentTime();
CString m_TestTime;
CString m_FileName;
m_TestTime=m_time.Format("%Y/%m/%d %H:%M:%S");
ProMap_it m_ProMap_it;
m_ProMap_it=ProMap.begin();
CString m_UpperStr;
CString m_LowerStr;
CString m_WriteBuffer1=_T("");
CString m_WriteBuffer2=_T("");
CString m_WriteBuffer=_T("");
m_WriteBuffer1=_T("'");
m_WriteBuffer1+=m_Model+_T(",'")+m_SNStr+_T(",");
CString m_Str;
for (;m_ProMap_it!=ProMap.end();m_ProMap_it++)
{
m_UpperStr=m_ProMap_it->second.m_Upper;
m_LowerStr=m_ProMap_it->second.m_Lower;
m_Str.Format(_T("%0.5lf"),m_ProMap_it->second.m_TestValue);
m_WriteBuffer2+=m_Str+_T(",");
}
m_WriteBuffer=m_WriteBuffer1+m_UpperStr+_T(",")+m_LowerStr+_T(",")+m_WriteBuffer2+_T(",");
if (m_TestFinalResult)
{
m_FileName=m_Model+m_time.Format("_%Y-%m-%d_GOOD.csv");
m_WriteBuffer=m_WriteBuffer+m_TestTime+_T(",PASS,")+m_Operator+_T(",\n");
}
else
{
m_FileName=m_Model+m_time.Format("_%Y-%m-%d_NG.csv");
m_WriteBuffer=m_WriteBuffer+m_TestTime+_T(",NG,")+m_Operator+_T(",\n");
}
CString m_LogWritePath;
m_LogWritePath=m_LogPath+_T("\\log\\")+m_FileName;
if ( m_WriteLog.Open(m_LogWritePath,CFile::modeCreate|CFile::modeWrite|CFile::modeNoTruncate))
{
char* old_locale = _strdup( setlocale(LC_CTYPE,NULL) );
setlocale(LC_CTYPE, "chs" );//设定
m_WriteLog.SeekToEnd();
m_WriteLog.WriteString(m_WriteBuffer);
setlocale( LC_CTYPE, old_locale );
free( old_locale );//还原区域设定
m_WriteLog.Close();
}
}
int SplitCString(CString &strIn, CStringArray& strAryRe, LPCTSTR str) //字符串分割
{
assert(str!=_T(""));
strAryRe.RemoveAll();
int nStart = 0;
int nEnd = 0;
CString strTmp;
while ( (nEnd = strIn.Find(str, nStart)) != -1 )
{
strTmp = strIn.Mid(nStart, nEnd-nStart);
strAryRe.Add(strTmp);
nStart = nEnd+1;
}
strTmp = strIn.Mid(nStart, strIn.GetLength());
strAryRe.Add(strTmp);
return strAryRe.GetSize();
}
bool TestRes(void)
{
CString m_RestultMs=_T("");
CString m_StrBuffer=_T("");
CString m_TestStr=_T("");
int m_Count=0;
int m_Index=1;
double m_Upper=0.0;
double m_Lower=0.0;
double m_Test=0.0;
double m_TestMax=0.0;
double m_TestMin=0.0;
double m_TestVauleBuffer=0.0;
m_TestFinalResult=true;
m_UpdateStr=_T("");
for (int i=0;i<m_TotalCount;i++) //循环测试次数
{
m_Index=1;
m_ResCom.ClearBuffer();
m_ResCom.WriteToPort(_T("G\n")); //触发扫描开始扫描
Sleep(m_ProTestDelay);
m_ResCom.WriteToPort(_T("?\n")); //查询数据
Sleep(200);
m_RestultMs=m_ResCom.RecvData(); //接收数据
m_StatusLog.StatusOut(_T("Receive from machine : ")+m_RestultMs); /////////////////////
m_Count=m_RestultMs.Find(_T("="));
if(m_Count>=0)
{
m_RestultMs=m_RestultMs.Mid(m_Count+1,m_RestultMs.GetLength()-m_Count-1); //得到电阻数据
if (m_RestultMs.Find(_T("mO"))>=0) //毫欧
{
m_RestultMs.Replace(_T("mO"),_T(""));
m_TestVauleBuffer=_ttof(m_RestultMs)/1000.0;
}
else if (m_RestultMs.Find(_T("kO"))>=0) //k欧 超量程
{
AfxMessageBox(_T("测试值超过量程 当前测量值是: ") +m_RestultMs);
return false;
}
else if(m_RestultMs.Find(_T("KO"))>=0) //K欧
{
m_RestultMs.Replace(_T("KO"),_T(""));
m_TestVauleBuffer=_ttof(m_RestultMs)*1000;
}
else if (m_RestultMs.Find(_T("O"))>=0) //欧
{
m_RestultMs.Replace(_T("O"),_T(""));
m_TestVauleBuffer=_ttof(m_RestultMs);
}
else
{
AfxMessageBox(_T("仪器返回数据异常!"));
return false;
}
ProMap_it m_ProMap_it;
m_ProMap_it=ProMap.begin();
for (;m_ProMap_it!=ProMap.end();m_ProMap_it++)
{
m_Index=_ttoi(m_ProMap_it->first);
if (m_Index==1) //检查测试通道
{
if (i==0)
{
m_ProMap_it->second.m_TestValue=0.0;
m_ProMap_it->second.m_MaxValue=m_TestVauleBuffer;
m_ProMap_it->second.m_MinValue=m_TestVauleBuffer;
m_ProMap_it->second.m_TestValue+=m_TestVauleBuffer;
}
else
{
m_ProMap_it->second.m_TestValue+=m_TestVauleBuffer; //计算几次测试值的总和
if(m_ProMap_it->second.m_MaxValue<m_TestVauleBuffer)
{
m_ProMap_it->second.m_MaxValue=m_TestVauleBuffer;
}
if (m_ProMap_it->second.m_MinValue>m_TestVauleBuffer)
{
m_ProMap_it->second.m_MinValue=m_TestVauleBuffer;
}
}
if (i==m_TotalCount-1)
{
m_Upper=_ttof(m_ProMap_it->second.m_Upper);
m_Lower=_ttof(m_ProMap_it->second.m_Lower);
m_ProMap_it->second.m_TestValue=m_ProMap_it->second.m_TestValue/m_TotalCount;
m_TestResult.Format(_T("%0.6lf"),m_ProMap_it->second.m_TestValue);
m_Test=m_ProMap_it->second.m_TestValue;
m_StrDesc.Format(_T("%0.6lf"),m_ProMap_it->second.m_MaxValue-m_ProMap_it->second.m_MinValue);
double m_MaxOff=0.0;
double m_MinOff=0.0;
m_MaxOff=m_ProMap_it->second.m_MaxValue;
m_MinOff=m_ProMap_it->second.m_MinValue;
m_StrMax.Format(_T("%0.6lf"),m_MaxOff);
m_StrMin.Format(_T("%0.6lf"),m_MinOff);
if((m_Test>=m_Lower)&&(m_Test<=m_Upper))
{
if ((m_MaxOff>=m_Lower)&&(m_MaxOff<=m_Upper))
{
if ((m_MinOff>=m_Lower)&&(m_MinOff<=m_Upper))
{
m_ProMap_it->second.m_Result=_T("1");
if((_ttof(m_StrDesc))<=(_ttof(m_ProMap_it->second.m_Moffset)))
{
m_TestFinalResult=true ;
m_UpdateStr+=m_TestResult+_T(",")+m_StrDesc+_T(",")+m_StrMax+_T(",")+m_StrMin+_T(",1,");
}
else
{
m_TestFinalResult=false ;
m_UpdateStr+=m_TestResult+_T(",")+m_StrDesc+_T(",")+m_StrMax+_T(",")+m_StrMin+_T(",0,");
}
}
else
{
m_TestFinalResult=false ;
m_ProMap_it->second.m_Result=_T("0");
m_UpdateStr+=m_TestResult+_T(",")+m_StrDesc+_T(",")+m_StrMax+_T(",")+m_StrMin+_T(",0,");
}
}
else
{
m_TestFinalResult=false ;
m_ProMap_it->second.m_Result=_T("0");
m_UpdateStr+=m_TestResult+_T(",")+m_StrDesc+_T(",")+m_StrMax+_T(",")+m_StrMin+_T(",0,");
}
}
else
{
m_TestFinalResult=false;
m_ProMap_it->second.m_Result=_T("0");
m_UpdateStr+=m_TestResult+_T(",")+m_StrDesc+_T(",")+m_StrMax+_T(",")+m_StrMin+_T(",0,");
}
}
}
else
{
AfxMessageBox(_T("测试通道设定应该是1,当前是: ") +m_Index);
return false;
}
}
}
else
{
AfxMessageBox(_T("仪器返回数据异常!"));
return false;
}
}
return true;
}
bool RunInitOperation(void)
{
CString m_ResBuffer;
if(m_ResCom.OpenComm(m_ResComNo,9600,'N',8,0))
{
m_ResCom.WriteToPort(_T("?\n"));
Sleep(100);
m_ResBuffer=m_ResCom.RecvData();
if (m_ResBuffer.IsEmpty())
{
return false;
}
else
{
m_ResCom.WriteToPort(_T("AF\n")); //关闭数据自动返回
Sleep(200);
m_ResCom.WriteToPort(_T("S7\n")); //单次触发
Sleep(200);
m_ResCom.WriteToPort(_T("S4\n")); //显示R值
Sleep(200);
m_ResCom.WriteToPort(_T("S3\n")); //关闭分选
Sleep(200);
m_ResCom.WriteToPort(_T("S0\n")); //慢速
Sleep(200);
m_ResCom.WriteToPort(_T("R0\n")); //自动量程
return true;
}
}
else
{
AfxMessageBox(_T("打开通讯串口失败!"));
return false;
}
}
UINT RunProcessResTest(LPVOID pParam)
{
bool m_RunMark=true;
bool m_PrintMark=false;
CString m_ResPStr=_T("");
int m_Step=0;
CString m_ChanleListOld=_T("");
m_StatusLog.Init(_T("")); //初始化log文件记录类
CResTestDlg* m_PResTestDlg =(CResTestDlg*)pParam;
ReadConfig();
ConnectToMYSQL(); //链接数据库
while(1)
{
WaitForSingleObject(m_StartHandle,INFINITE);
if (m_PResTestDlg->m_InitMachine)
{
if (RunInitOperation())
{
CString m_MessageStr=_T("1> 电阻测试仪初始化成功\r\n");
SendMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_UPDATA_MESSAGE, 2,(LPARAM)(LPCTSTR)m_MessageStr);
}
else
{
CString m_MessageStr=_T("1> 电阻测试仪初始化失败\r\n");
SendMessage(AfxGetMainWnd()->GetSafeHwnd(), WM_UPDATA_MESSAGE, 3,(LPARAM)(LPCTSTR)m_MessageStr);
}
m_PResTestDlg->m_InitMachine=false;
ResetEvent(m_StartHandle);
continue;
}
m_PrintMark=m_PResTestDlg->m_PrintEnable;
m_ChanleList=m_PResTestDlg->m_ProList;
m_TestStation=m_PResTestDlg->m_StationID;
m_Model=m_PResTestDlg->m_ProName;
m_Operator=m_PResTestDlg->m_OperatorStr;
m_ProTestDelay=m_PResTestDlg->m_TestDelay;
m_SNStr=m_PResTestDlg->m_SNString;
m_Step=0;
m_RunMark=TRUE;
while(m_RunMark)
{
switch (m_Step)
{
case 0: //分析测试通道
{
m_UpdateSql=m_PResTestDlg->m_SNEnable;
if (m_ChanleListOld!=m_ChanleList)
{
m_ChanleListOld=m_ChanleList;
ProCahnel m_ProCahnel;
CStringArray m_ProArray;
if (!ProMap.empty())
{
ProMap.clear();
}
m_Coun= SplitCString(m_ChanleList,m_ProArray,_T(","))/6;
if (m_Coun==0)
{
AfxMessageBox(_T("解析测试程序文件异常!"));
m_RunMark=false;
ResetEvent(m_StartHandle);
break;
}
for (int i=0;i<1;i++) //当前程序是单通道的
{
m_ProCahnel.m_Upper=m_ProArray.GetAt(i*6+1);
m_ProCahnel.m_Lower=m_ProArray.GetAt(i*6+2);
m_ProCahnel.m_Count=m_ProArray.GetAt(i*6+3);
m_TotalCount=_ttoi(m_ProArray.GetAt(i*6+3));
m_ProCahnel.m_Moffset=m_ProArray.GetAt(i*6+4);
m_ProCahnel.m_TestValue=0;
m_ProCahnel.m_MaxValue=0;
m_ProCahnel.m_MinValue=0;
m_ProCahnel.m_Result=_T("");
ProMap.insert(make_pair(m_ProArray.GetAt(i*6+0),m_ProCahnel));
}
}
m_Step++;
break;
}
case 1: //发送触发命令
{
if (!TestRes())
{
if(AfxMessageBox(_T("测试失败,是否重试!"),MB_YESNO)==IDYES)
{
break;
}
else
{
m_RunMark=false;
ResetEvent(m_StartHandle);
break;
}
}
m_Step++;
break;
}
case 2: //获取当前SN的ID
{
if (m_UpdateSql)
{
int m_SerachResult=-1;
m_SerachResult=SearchSNList(m_SNStr);
if (m_SerachResult==0) // 查找到当前SN的ID
{
m_Step++;
}
else
{
m_SQLResult=0;
m_Step=4; //返回测试结果
break;
}
}
else
{
m_SQLResult=1;
m_Step=4; //返回测试结果
break;
}
m_Step=3;
break;
}
case 3: //开始检查当前SN 在数据库中的记录
{
if (CheckSNInformation(m_SNID)!=Result_OK)
{
m_SQLResult=0;
m_Step=4;
break;
}
if (!InsertTestResult())
{
if(AfxMessageBox(_T("上传数据库失败,是否重试!"),MB_YESNO)==IDYES)
{
break;
}
else
{
m_RunMark=false;
ResetEvent(m_StartHandle);
break;
}
}
m_SQLResult=1;
m_Step++;
break;
}
case 4: //返回测试结果数据
{
if (m_UpdateSql)
{
if (!m_MesHttp.MesStartTEST(m_SNStr,m_MachineID,_T(""),m_Model,m_UpdateStr,m_ResPStr))
{
m_StatusLog.StatusOut(m_ResPStr+_T("\r\n"));
AfxMessageBox(_T("上传MES失败"));
SendMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_UpdateResult,false,(LPARAM)(LPCTSTR)m_UpdateStr);
m_Step++;
break;
}
m_StatusLog.StatusOut(m_ResPStr+_T("\r\n"));
}
if (m_TestFinalResult&m_SQLResult)//////////////
{
SendMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_UpdateResult,true,(LPARAM)(LPCTSTR)m_UpdateStr);
}
else
{
SendMessage(AfxGetMainWnd()->GetSafeHwnd(),WM_UpdateResult,false,(LPARAM)(LPCTSTR)m_UpdateStr);
}
m_Step++;
break;
}
case 5: //写入log文件
{
WriteLogFile();
m_Step=0;
m_RunMark=false ;
ResetEvent(m_StartHandle);
}
default:break;
}
}
Sleep(10);
}
return 1;
}
解释每一行代码
最新发布