fast/Plugin/Driver/DriverMainDlg.cpp
2025-01-20 10:30:01 +08:00

1105 lines
30 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// CanDeviceDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "DriverMainDlg.h"
#include "resource.h"
#include "afxdialogex.h"
#include "PluginDriver.h"
int StopFlag = 0;
unsigned long nextrow;
// CCanDeviceDlg 对话框
//控件ID只需要在当前窗口中唯一这里随便写一个就好
#define ID_VIRTUAL_LIST_CTRL (20000)
#define TIMER_ID_ADD_TEST_DATA (2024)
IMPLEMENT_DYNAMIC(CDriverMainDlg, CDialogEx)
CDriverMainDlg::CDriverMainDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(IDD_DEV_CAN_DLG, pParent)
{
m_bOpenCan = FALSE;
m_DevIndex = 0;
m_bCanRxEn = TRUE;
m_bAutoRefresh = TRUE;
m_bAutoSend2 = TRUE;
m_strSendID = "00 00 00 88";
m_strSendData = "01 02 03 04 05 06 07 08";
//m_pMainWnd = (CPluginMainDialog*) pParent;
m_StopSendFlag = 0;
m_StopSendFlag2 = 0;
m_DevType = VCI_USBCAN2;
m_nAgvAction = A_STOP;
m_nAgvReturnState= RE_A_STOP;
m_nSendCanIndex = 0;
m_nRecvCanIndex = 1;
m_pstVirtualList = new CEXVirtualListCtrl();
m_pQueue = NULL;
m_iniPath = theApp.m_strModulePath + "\\config.ini";
ReadConfigFromIni();
}
CDriverMainDlg::~CDriverMainDlg()
{
}
void CDriverMainDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_CBIndex(pDX, IDC_COMBO_SENDFRAMETYPE_IDX0, m_nSendFrameTypeIdx0);
DDX_CBIndex(pDX, IDC_COMBO_SENDFRAMEFORMAT_IDX0, m_nSendFrameFormatIdx0);
DDX_CBIndex(pDX, IDC_COMBO_SENDFRAMETYPE_IDX1, m_nSendFrameTypeIdx1);
DDX_CBIndex(pDX, IDC_COMBO_SENDFRAMEFORMAT_IDX1, m_nSendFrameFormatIdx1);
DDX_Check(pDX, IDC_CHECK_CANRX_EN, m_bCanRxEn);
DDX_Check(pDX, IDC_AUTO_SEND, m_bAutoSend);
DDX_Check(pDX, IDC_AUTO_SEND2, m_bAutoSend2);
DDX_Check(pDX, IDC_CHECK_AUTO_REFRESH_SHOW, m_bAutoRefresh);
DDX_Control(pDX, IDC_EDIT_FMagneticOffset, m_txFMagneticOffset);
DDX_Control(pDX, IDC_EDIT_BMagneticOffset, m_txBMagneticOffset);
DDX_Control(pDX, IDC_EDIT_RFID_ID , m_txRFIDID);
//DDX_Control(pDX, IDC_LIST1, m_MessageList);
}
BEGIN_MESSAGE_MAP(CDriverMainDlg, CDialogEx)
ON_BN_CLICKED(IDC_CHECK_CANRX_EN, OnCheckCanrxEn)
ON_BN_CLICKED(IDC_BTN_SEND_MAN, &CDriverMainDlg::OnBnClickedBtnSendMan)
ON_BN_CLICKED(IDC_AUTO_SEND, &CDriverMainDlg::OnBnClickedAutoSend)
ON_BN_CLICKED(IDC_CHECK_AUTO_REFRESH_SHOW, &CDriverMainDlg::OnBnClickedCheckAutoRefreshShow)
ON_BN_CLICKED(IDC_BTN_SEND_MAN2, &CDriverMainDlg::OnBnClickedBtnSendMan2)
ON_BN_CLICKED(IDC_AUTO_SEND2, &CDriverMainDlg::OnBnClickedAutoSend2)
ON_BN_CLICKED(IDC_BUTTON_AGVSTOP, &CDriverMainDlg::OnBnClickedButtonAgvstop)
ON_BN_CLICKED(IDC_BUTTON_AGVESTOP, &CDriverMainDlg::OnBnClickedButtonAgvestop)
ON_BN_CLICKED(IDC_BUTTON_AGVFORWARD, &CDriverMainDlg::OnBnClickedButtonAgvforward)
ON_BN_CLICKED(IDC_BUTTON_AGVBACKWARD, &CDriverMainDlg::OnBnClickedButtonAgvbackward)
END_MESSAGE_MAP()
//一位十六进制转换为十进制
int CDriverMainDlg::HexChar(char c)
{
if ((c >= '0') && (c <= '9'))
return c - 0x30;
else if ((c >= 'A') && (c <= 'F'))
return c - 'A' + 10;
else if ((c >= 'a') && (c <= 'f'))
return c - 'a' + 10;
else
return 0x10;
}
//两位十六进制数转换为十进制
int CDriverMainDlg::Str2Hex(CString str)
{
int len = str.GetLength();
if (len == 2)
{
int a = HexChar(str[0]);
int b = HexChar(str[1]);
if (a == 16 || b == 16)
{
AfxMessageBox("Format error");
return 256;
}
else
{
return a * 16 + b;
}
}
else
{
AfxMessageBox("input length must be 2");
return 256;
}
}
void CDriverMainDlg::InitVirtualList()
{
//信息显示列表初始化
m_pstVirtualList->InsertColumn(0, "Seq");
m_pstVirtualList->SetColumnWidth(0, 110);
m_pstVirtualList->InsertColumn(1, "Time");
m_pstVirtualList->SetColumnWidth(1, 110);
m_pstVirtualList->InsertColumn(2, "CANIndex");
m_pstVirtualList->SetColumnWidth(2, 100);
m_pstVirtualList->InsertColumn(3, "Tx-Rx");
m_pstVirtualList->SetColumnWidth(3, 80);
m_pstVirtualList->InsertColumn(4, " ID ");
m_pstVirtualList->SetColumnWidth(4, 100);
m_pstVirtualList->InsertColumn(5, "Frame");
m_pstVirtualList->SetColumnWidth(5, 80);
m_pstVirtualList->InsertColumn(6, "Type");
m_pstVirtualList->SetColumnWidth(6, 90);
m_pstVirtualList->InsertColumn(7, "DLC");
m_pstVirtualList->SetColumnWidth(7, 60);
m_pstVirtualList->InsertColumn(8, "Data");
m_pstVirtualList->SetColumnWidth(8, 250);
}
void CDriverMainDlg::WriteVirtualList(CString strFrameId, CString strFrameData, int nTxRx, int nCanIdx, int nFrameType, int nFrameFormat)
{
//数据按行格式化
char acTemp[DATA_LINE_SIZE + 1] = { 0 };
//发送信息列表显示
CString strTime;
SYSTEMTIME systime;
GetLocalTime(&systime);
char acId[11] = { 0 };
memset(acId, 32, 10); //初始化为空格字符串
memcpy(acId, strFrameId.GetBuffer(), strFrameId.GetLength());
char acData[33] = { 0 };
memset(acData, 32, 32); //初始化为空格字符串
memcpy(acData, strFrameData.GetBuffer(), strFrameData.GetLength());
sprintf_s(acTemp, "%-10d,%02d:%02d:%02d:%03d,%-3d,%-3d,%s,%-3d,%-3d,%-3d,%s\n", m_pQueue->GetAutoSn(),
systime.wHour, systime.wMinute, systime.wSecond, systime.wMilliseconds,
nCanIdx,
nTxRx,
acId,
nFrameFormat,
nFrameType,
8,
acData);
//调用接口写入数据
m_pQueue->WriteItem(acTemp);
}
//和模块进程通讯的管道回调函数:
void g_PipeCallBack(void* pObj, int lMsgId, WPARAM wparam, LPARAM lparam)
{
CDriverMainDlg* pModule = (CDriverMainDlg*)pObj;
if (CEXPIPE_CONNECT_OK == lMsgId)
{
//连接成功
//if (FALSE == pModule->PostMessage(WM_PLATFORM_CONNECT_OK, NULL, NULL)) { LogOutToFile("g_PipeCallBack PostMessage error[%d]", lMsgId); }
LogOutToFile("已连接父进程管道");
//向WMS服务器请求设备配置信息
theApp.SendMsg2Platform("WMS", DEVICE_CONFIG_REQ);
}
else if (CEXPIPE_DIS_CLIENT == lMsgId)
{
//管道断开,结束
#ifndef _DEBUG
LogOutToFile("父进程连接管道断开,本模块自动退出");
//if (FALSE == pModule->PostMessage(WM_CLOSE, NULL, NULL)) { LogOutToFile("g_PipeCallBack PostMessage error[%d]", lMsgId); }
pModule->PostMessage(WM_COMMAND, MAKEWPARAM(ID_TRAY_EXIT, 0), 0);
#endif
}
else if (CEXPIPE_NEW_DATA == lMsgId)
{
pModule->ProcessPipeMsg(lMsgId, (char*)wparam, (int)lparam);
}
else
{
;
}
}
void CDriverMainDlg::ProcessPipeMsg(int lMsgId, char* pData, int lLen)
{
if (lLen == 0)
{
return;
}
PIPE_DATA_STRUCT* pstData = (PIPE_DATA_STRUCT*)pData;
//平台转发给插件的消息
if (pstData->lMsgId == MAIN_2_MODULE_WMS && pstData->lDataLen > 0)
{
Json::Reader reader;
Json::Value root;
if (reader.parse((char*)pstData->acData, root))
{
CString strReceiver = root["receiver"].asString().c_str();
CString strSender = root["sender"].asString().c_str();
int nMsgType = root["type"].asInt();
//获取设备配置信息返回
/*if (nMsgType == DEVICE_CONFIG_RET)
{
}
else if (nMsgType == SET_TRANS_MODE_REQ && m_bDeviceInit) //设置输送线的工作模式
{
}
else if (nMsgType == GET_TRANS_STATE_REQ)//请求获取输送线状态
{
}*/
}
}
else if (pstData->lMsgId == MAIN_2_MODULE_SHOWWINDOW)
{
//PostMessage(WM_COMMAND, MAKEWPARAM(ID_TRAY_SHOW, 0), 0);
AfxGetApp()->m_pMainWnd->ShowWindow(SW_SHOWNORMAL);
SetForegroundWindow();
}
LogOutToFile("HttpServiceListener::OnRecvRequest End");
}
// CCanDeviceDlg 消息处理程序
BOOL CDriverMainDlg::OnInitDialog()
{
CString strPipe;
for (int i = 0; i < __argc; i++)
{
if (0 == strcmp(__argv[i], "-pipe") && i + 1 < __argc)
{
strPipe = __argv[i + 1];
}
}
if (strPipe.IsEmpty())
{
char acPipe[256] = "";
CString iniPath = theApp.m_strModulePath.Left(theApp.m_strModulePath.ReverseFind('\\') + 1);
//m_strModulePath = theApp.m_strModulePath.ReverseFind("\\");
iniPath = iniPath + "config.ini";
//中文名称,仅显示用
GetPrivateProfileString("AGV-MODULE", "PIPE_DRIVER", "", acPipe, 256, iniPath);
strPipe = acPipe;
}
g_pstPipeClient->RegisterCall(g_PipeCallBack, this);
g_pstPipeClient->Connect(strPipe.GetBuffer());
m_strDataDir = theApp.m_strModulePath + "\\data";
CreateDirectory(m_strDataDir.GetString(), NULL);
if (!m_pstVirtualList->Create(WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_OWNERDATA | LVS_EX_DOUBLEBUFFER, CRect(0, 0, 0, 0), this, ID_VIRTUAL_LIST_CTRL)) {
TRACE0("Failed to create MyVirtualListCtrl\n");
delete m_pstVirtualList;
m_pstVirtualList = nullptr;
return FALSE; // 返回 FALSE 以使框架知道未成功初始化
}
InitVirtualList();
OpenCanDevice();
CRect rectList;
GetDlgItem(IDC_STATIC_LIST)->GetWindowRect(&rectList);
ScreenToClient(rectList);
m_pstVirtualList->MoveWindow(rectList.left, rectList.top, rectList.Width(), rectList.Height());
m_pQueue = new CEXMemFileQueue(m_strDataDir.GetString());
m_pstVirtualList->SetData(m_pQueue);
//m_pstVirtualList->StartAutoRefresh(10);//列表10毫秒刷新一次
CDialogEx::OnInitDialog();
if (TRUE == m_bAutoRefresh)
{
m_pstVirtualList->StartAutoRefresh(10);
}
else
{
m_pstVirtualList->StopAutoRefresh();
}
if (m_bCanRxEn)
{
StopFlag = 0;
//开启接收线程
AfxBeginThread(ReceiveCanThread, this);
}
else
StopFlag = 1;
if (m_bAutoSend2)
{
m_StopSendFlag2 = 0;
//开启发送线程
AfxBeginThread(SendCanThread2, this);
}
else
m_StopSendFlag2 = 1;
return TRUE;
}
//打开设备
BOOL CDriverMainDlg::OpenCanDevice()
{
DWORD Reserved = 0;
//打开设备
if (VCI_OpenDevice(VCI_USBCAN2, 0, Reserved) != 1)
{
//MessageBox("open failed");
//m_pMainWnd->InsertLog(LOG_ERROR, "Open Can Device Failed");
return FALSE;
}
VCI_INIT_CONFIG InitInfo[1];
InitInfo->Timing0 = 0x01; //250K
InitInfo->Timing1 = 0x1C;
InitInfo->Filter = 0;
InitInfo->AccCode = 0x80000000;
InitInfo->AccMask = 0xFFFFFFFF;
InitInfo->Mode = 0; //Data ;Remote;
//初始化通道0
if (VCI_InitCAN(VCI_USBCAN2, 0, 0, InitInfo) != 1) //can-0
{
//MessageBox("Init-CAN failed!");
//m_pMainWnd->InsertLog(LOG_ERROR, "Init-CAN-Index0 Failed!");
return FALSE;
}
Sleep(100);
//初始化通道0
if (VCI_StartCAN(VCI_USBCAN2, 0, 0) != 1) //can-0
{
//MessageBox("Start-CAN failed!");
//m_pMainWnd->InsertLog(LOG_ERROR, "Start-CAN-Index0 Failed!");
return FALSE;
}
//初始化通道1
//if (m_nDevType == 1)
{
if (VCI_InitCAN(VCI_USBCAN2, 0, 1, InitInfo) != 1) //can-1
{
//MessageBox("Init-CAN failed!");
//m_pMainWnd->InsertLog(LOG_ERROR, "Init-CAN-Index1 Failed!");
return FALSE;
}
}
Sleep(100);
InitInfo->Mode = 0; //Data ;Remote;
//初始化通道1
if (VCI_StartCAN(VCI_USBCAN2, 0, 1) != 1) //can-0
{
//MessageBox("Start-CAN failed!");
//m_pMainWnd->InsertLog(LOG_ERROR, "Start-CAN-Index1 Failed!");
return FALSE;
}
//MessageBox("Open successfule!\n Start CAN OK!");
UpdateCanStatue(TRUE);
//InsertLog(LOG_INFO, "Open The CAN Device Successfule!");
//KillTimer(TIMER_RECONNECT_CAN);
return TRUE;
}
void CDriverMainDlg::UpdateCanStatue(BOOL bStatue)
{
if (TRUE == bStatue)
{
GetDlgItem(IDC_STATUS_CAN)->SetWindowText("已连接");
}
else
{
GetDlgItem(IDC_STATUS_CAN)->SetWindowText("已关闭");
}
}
void CDriverMainDlg::ReadConfigFromIni()
{
CString strIniPath = theApp.m_strModulePath + "\\config.ini";
// 初始化设备配置
m_nSendFrameFormatIdx0 = GetPrivateProfileInt("CAN", "FRAME_FORMAT_IDX0", 0, strIniPath);
m_nSendFrameTypeIdx0 = GetPrivateProfileInt("CAN", "FRAME_TYPE_IDX0", 0, strIniPath);
m_nSendFrameFormatIdx1 = GetPrivateProfileInt("CAN", "FRAME_FORMAT_IDX1", 0, strIniPath);
m_nSendFrameTypeIdx1 = GetPrivateProfileInt("CAN", "FRAME_TYPE_IDX1", 0, strIniPath);
return; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CDriverMainDlg::Drive_enable() //使能
{
char can2_buff[8] = { 0 };
can2_buff[0] = 0x23;
can2_buff[1] = 0x0D;
can2_buff[2] = 0x20;
can2_buff[3] = 0x01;
can2_buff[4] = 0;
can2_buff[5] = 0;
can2_buff[6] = 0;
can2_buff[7] = 0;
SendCanData(0, 0, m_nSendFrameTypeIdx0, m_nSendFrameFormatIdx0, 0x600001, can2_buff);
SendCanData(0, 0, m_nSendFrameTypeIdx0, m_nSendFrameFormatIdx0, 0x600002, can2_buff);
}
void CDriverMainDlg::Drive_disable() //失能
{
char can2_buff[8] = { 0 };
can2_buff[0] = 0x23;
can2_buff[1] = 0x0C;
can2_buff[2] = 0x20;
can2_buff[3] = 0x01;
can2_buff[4] = 0;
can2_buff[5] = 0;
can2_buff[6] = 0;
can2_buff[7] = 0;
SendCanData(0, 0, m_nSendFrameTypeIdx0, m_nSendFrameFormatIdx0, 0x600001, can2_buff);
SendCanData(0, 0, m_nSendFrameTypeIdx0, m_nSendFrameFormatIdx0, 0x600002, can2_buff);
}
/*
param0: can设备索引
param1: can口索引
param2: standard/extend
param3: data/remote
*/
void CDriverMainDlg::SendCanData(int nDevIdx, int nCanIdx, int nFrameType, int nFrameFormat, UINT32 acFrameId, char acFrameData[8])
{
//从界面获取发送信息
VCI_CAN_OBJ sendbuf[1];
int datanum = 8;
sendbuf->ExternFlag = nFrameType;
sendbuf->DataLen = datanum;
sendbuf->RemoteFlag = nFrameFormat;
sendbuf->ID = acFrameId;
memcpy(sendbuf->Data, acFrameData, datanum);
/*for (int i = 0; i < datanum; i++)
{
sendbuf->Data[i] = acFrameData[i];
}*/
/****************************************************************************/
/******************************从界面获取发送信息完毕***********************/
/****************************************************************************/
static bool snederr_flag = false;
//调用动态链接库发送函数
int flag = VCI_Transmit(m_DevType, m_DevIndex, nCanIdx, sendbuf, 1);//CAN message send
if (flag<1)
{
//VCI_CloseDevice(m_DevType, m_DevIndex);
if (flag == -1)
{
//Can设备已断开
//MessageBox("failed- device not open\n");
//m_pMainWnd->InsertLog(LOG_ERROR, "Failed- Device Not Open!");
OpenCanDevice();
UpdateCanStatue(FALSE);
}
else if (flag == 0)
{
//MessageBox("send error\n");
//m_pMainWnd->InsertLog(LOG_ERROR, "Send Can Mesaage Error!");
UpdateCanStatue(FALSE);
}
if (false == snederr_flag)
{
snederr_flag = true;
UpdateCanStatue(FALSE);
}
return;
}
snederr_flag = false;
BYTE data;
CString strFrameId, strTmp, strFrameData;
strFrameId.Format("%08X", acFrameId);
for (int i = 0; i<sendbuf->DataLen; i++)
{
data = sendbuf->Data[i];
strTmp.Format("%02X", data);
strFrameData += strTmp + " ";
}
WriteVirtualList(strFrameId, strFrameData, SEND_MSG, nCanIdx, nFrameType, nFrameFormat);
}
void CDriverMainDlg::OnCheckCanrxEn()
{
UpdateData(TRUE);
if (m_bCanRxEn)
{
StopFlag = 0;
//开启接收线程
AfxBeginThread(ReceiveCanThread, this);
}
else
StopFlag = 1;
}
void CDriverMainDlg::Control_Mode_Reset()
{
m_nAgvAction = A_STOP; //控制模式切换到自动停车模式
//m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.AGVControl_u.bits.LRollerF = 0; //滚筒停止
//m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.AGVControl_u.bits.LRollerB = 0;
//m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.AGVControl_u.bits.RRollerF = 0;
//m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.AGVControl_u.bits.RRollerB = 0;
}
int Control_Mode_Switch;
UINT CDriverMainDlg::ReceiveCanThread(LPVOID v)
{
CDriverMainDlg *pThis = (CDriverMainDlg*)v;
while (1)
{
VCI_CAN_OBJ pCanObj[200];
for (int kCanIndex = 0; kCanIndex<2; kCanIndex++)
{
//调用动态链接看接收函数
int NumValue = VCI_Receive(pThis->m_DevType, pThis->m_DevIndex, kCanIndex, pCanObj, 200, 0);
if (NumValue >0)
{
//接收信息列表显示
CString strTime;
SYSTEMTIME systime;
GetLocalTime(&systime);
strTime.Format("%02d:%02d:%02d:%03d", systime.wHour, systime.wMinute, systime.wSecond, systime.wMilliseconds);
for (int num = 0; num < NumValue; num++)
{
CString strFrameId, strFrameData, strTmp;
strFrameId.Format("%08X", pCanObj[num].ID);
for (int i = 0; i < (pCanObj[num].DataLen); i++) //数据信息
{
strTmp.Format("%02X ", pCanObj[num].Data[i]);
strFrameData += strTmp;
}
pThis->WriteVirtualList(strFrameId, strFrameData, 1, kCanIndex);
//在这里处理收到的CAN消息
//解析定位引导数据
pThis->AnalysiseCanData(kCanIndex, pCanObj[num]);
/*if (MANUAL_MODE ==pThis->m_pMainWnd->m_nAgvMode)
{
//计算运动控制参数(手动模式)
pThis->CalculateManualCanParam();
Control_Mode_Switch = 1;
}
else
{
//计算运动控制参数(自动模式),需要考虑m_nAgvAction值
if (Control_Mode_Switch)
{
pThis->Control_Mode_Reset();
Control_Mode_Switch = 0;
}
pThis->CalculateAutoCanParam();
}*/
//下发运动控制参数
//pThis->SendCanData();
}
}
else if (NumValue == -1)
{
// USB-CAN设备不存在或USB掉线可以调用VCI_CloseDevice并重新VCI_OpenDevice。如此可以达到USB-CAN设备热插拔的效果。
pThis->UpdateCanStatue(FALSE);
pThis->OpenCanDevice();
}
}
Sleep(10);
if (StopFlag == 1)
{
return 0;
}
}
return 1;
}
//解析接收到的CAN数据
void CDriverMainDlg::AnalysiseCanData(int nCanIndex, VCI_CAN_OBJ objCan)
{
CString nEdit;
if ( 0 == nCanIndex)
{
if (objCan.ID == 0x444)
{
//电池SOC
m_stSensorData.Battery_SOC = objCan.Data[6];
}
else if (objCan.ID == 0x01) //前磁导航数据 左负右正
{
//前磁条偏移
m_stSensorData.FMagnetism_Offset = -((int16_t)(int8_t)objCan.Data[4]) * 5;
nEdit.Format(_T("%d"), m_stSensorData.FMagnetism_Offset);
m_txFMagneticOffset.SetWindowText(nEdit);
if (objCan.Data[1] == 0 && objCan.Data[2] == 0) //都没检测到 出轨
{
m_stSensorData.FMagnetism_Valid = 0;
m_stSensorData.FMagnetism_ALLTrue = 0;
GetDlgItem(IDC_COMBO_FMagneticSta)->SetWindowText("前磁条无效");
}
else if (objCan.Data[1] == 0xFF && objCan.Data[2] == 0xFF) //都检测到 横磁条停车
{
m_stSensorData.FMagnetism_ALLTrue = 1;
m_stSensorData.FMagnetism_Valid = 1;
GetDlgItem(IDC_COMBO_FMagneticSta)->SetWindowText("前磁条横向");
}
else
{
m_stSensorData.FMagnetism_ALLTrue = 0;
m_stSensorData.FMagnetism_Valid = 1;
GetDlgItem(IDC_COMBO_FMagneticSta)->SetWindowText("前磁条有效");
}
}
else if (objCan.ID == 0x02) //后磁导航数据 左负右正
{
m_stSensorData.BMagnetism_Offset = ((int16_t)(int8_t)objCan.Data[4]) * 5;
nEdit.Format(_T("%d"), m_stSensorData.BMagnetism_Offset);
m_txBMagneticOffset.SetWindowText(nEdit);
if (objCan.Data[1] == 0 && objCan.Data[2] == 0) //都没检测到 出轨
{
m_stSensorData.BMagnetism_Valid = 0;
m_stSensorData.BMagnetism_ALLTrue = 0;
GetDlgItem(IDC_COMBO_BMagneticSta)->SetWindowText("后磁条无效");
}
else if (objCan.Data[1] == 0xFF && objCan.Data[2] == 0xFF) //都检测到 横磁条停车
{
m_stSensorData.BMagnetism_ALLTrue = 1;
m_stSensorData.BMagnetism_Valid = 1;
GetDlgItem(IDC_COMBO_BMagneticSta)->SetWindowText("后磁条横向");
}
else
{
m_stSensorData.BMagnetism_ALLTrue = 0;
m_stSensorData.BMagnetism_Valid = 1;
GetDlgItem(IDC_COMBO_BMagneticSta)->SetWindowText("后磁条有效");
}
}
else if (objCan.ID == 0x03) //RFID
{
m_stSensorData.RFID_Point = objCan.Data[7];
nEdit.Format(_T("%d"), m_stSensorData.RFID_Point);
m_txRFIDID.SetWindowText(nEdit);
}
}
else if (1 == nCanIndex)
{
}
}
void CDriverMainDlg::CalculateManualCanParam() //遥控器控制
{
/*static int reserve_flag = 0;
if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.Reserve == 0) //复用按键没有按下
{
if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.Forward)
m_stDrvierControl.Drive_Speed = 2000;
else if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.Backward)
m_stDrvierControl.Drive_Speed = -2000;
else
m_stDrvierControl.Drive_Speed = 0;
if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.LeftRotation) //左转
{
m_stDrvierControl.Diversion_Position += 4000;
if (m_stDrvierControl.Diversion_Position > m_stDrvierControl.MAN_Angle_L)
m_stDrvierControl.Diversion_Position = m_stDrvierControl.MAN_Angle_L;
}
else if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.RightRotation) //右转
{
m_stDrvierControl.Diversion_Position -= 4000;
if (m_stDrvierControl.Diversion_Position < m_stDrvierControl.MIX_Angle_R)
m_stDrvierControl.Diversion_Position = m_stDrvierControl.MIX_Angle_R;
}
else if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.ZeroHold) //零度角
{
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle;
}
if (reserve_flag == 1)
{
reserve_flag = 0;
m_pMainWnd->m_pPlcDeviceDlg->OnBnClickedBtnLrollerStop();
m_pMainWnd->m_pPlcDeviceDlg->OnBnClickedBtnRrollerStop();
}
}
else if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.Reserve) //复用按键按下
{
reserve_flag = 1;
if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.Forward) //左滚筒向前
m_pMainWnd->m_pPlcDeviceDlg->OnBnClickedBtnLrollerF();
else if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.LeftRotation)//左滚筒向后
m_pMainWnd->m_pPlcDeviceDlg->OnBnClickedBtnLrollerB();
else
m_pMainWnd->m_pPlcDeviceDlg->OnBnClickedBtnLrollerStop();
if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.Backward) //右滚筒向前
m_pMainWnd->m_pPlcDeviceDlg->OnBnClickedBtnRrollerF();
else if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.RemoteControl_u.bits.RightRotation)//右滚筒向后
m_pMainWnd->m_pPlcDeviceDlg->OnBnClickedBtnRrollerB();
else
m_pMainWnd->m_pPlcDeviceDlg->OnBnClickedBtnRrollerStop();
m_stDrvierControl.Drive_Speed = 0;
}*/
}
void CDriverMainDlg::CalculateAutoCanParam()
{
switch (m_nAgvAction)
{
case A_STOP:
m_nAgvReturnState = Auto_Stop();
break;
case FORWARD:
m_nAgvReturnState = Auto_Forward(m_stDrvierControl.SPEEDPAR);
break;
case BACKWARD:
m_nAgvReturnState = Auto_Backward(m_stDrvierControl.SPEEDPAR);
break;
case E_STOP: //急停立马刹车
m_nAgvReturnState = Auto_EStop();
break;
default:
break;
}
}
int CDriverMainDlg::Auto_Stop()
{
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle;
m_stDrvierControl.Drive_Speed = 0;
return RE_A_STOP;
}
int CDriverMainDlg::Auto_EStop()
{
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle;
m_stDrvierControl.Drive_Speed = 0;
return RE_E_STOP;
}
int CDriverMainDlg::Auto_Forward(float speedpar) //去载货区 进入雷达减速区通过速度系数调整速度
{
int Position_P = 4000; //转向比例
if (m_stSensorData.FMagnetism_Valid == 1) //磁条数据有效
{
m_stDrvierControl.Diversion_Position = Position_P * m_stSensorData.FMagnetism_Offset; // 计算出比例部分
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle - m_stDrvierControl.Diversion_Position;
m_stDrvierControl.Drive_Speed = 3000 * speedpar;
if (m_stDrvierControl.Diversion_Position < m_stDrvierControl.AutoMIN_Angle)
m_stDrvierControl.Diversion_Position = m_stDrvierControl.AutoMIN_Angle;
else if(m_stDrvierControl.Diversion_Position > m_stDrvierControl.AutoMAX_Angle)
m_stDrvierControl.Diversion_Position = m_stDrvierControl.AutoMAX_Angle;
if (m_stSensorData.FMagnetism_ALLTrue) //横向磁条停车 正常停车
{
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle;
m_stDrvierControl.Drive_Speed = 0;
return RE_POINT_STOP;
}
return RE_NORMAL_RUN;
}
else //磁条无效异常停车
{
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle;
m_stDrvierControl.Drive_Speed = 0;
return RE_UNUSUAL_STOP;
}
}
int CDriverMainDlg::Auto_Backward(float speedpar) //去卸货区
{
int Position_P = 4000;
if (m_stSensorData.BMagnetism_Valid == 1) //磁条数据有效
{
m_stDrvierControl.Diversion_Position = Position_P * m_stSensorData.BMagnetism_Offset; // 计算出比例部分
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle - m_stDrvierControl.Diversion_Position;
m_stDrvierControl.Drive_Speed = -2000 * speedpar;
if (m_stDrvierControl.Diversion_Position < m_stDrvierControl.AutoMIN_Angle)
m_stDrvierControl.Diversion_Position = m_stDrvierControl.AutoMIN_Angle;
else if (m_stDrvierControl.Diversion_Position > m_stDrvierControl.AutoMAX_Angle)
m_stDrvierControl.Diversion_Position = m_stDrvierControl.AutoMAX_Angle;
if (m_stSensorData.BMagnetism_ALLTrue) //横向磁条停车 正常停车
{
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle;
m_stDrvierControl.Drive_Speed = 0;
return RE_POINT_STOP;
}
return RE_NORMAL_RUN;
}
else
{
m_stDrvierControl.Diversion_Position = m_stDrvierControl.Zero_Angle;
m_stDrvierControl.Drive_Speed = 0;
return RE_UNUSUAL_STOP;
}
}
int Speed = 0;
int LastSpeed = 0;
void CDriverMainDlg::SendCanData()
{
/*
UINT32 Drive_acId = 0x6000001; //驱动帧ID
UINT32 Diversion_Id = 0x6000002; //转向帧ID
char acData[8] = { 0 };
acData[0] = 0x23;
acData[1] = 0x0D;
acData[2] = 0x20;
acData[3] = 0x01;
acData[4] = 0;
acData[5] = 0;
acData[6] = 0;
acData[7] = 0;
//发送驱动使能
SendCanData(0, 1, m_nSendFrameTypeIdx1, m_nSendFrameFormatIdx1, Drive_acId, acData);
Sleep(2);
//发送转向使能
SendCanData(0, 1, m_nSendFrameTypeIdx1, m_nSendFrameFormatIdx1, Diversion_Id, acData);
Sleep(2);
//速度控制
if (Speed < m_stDrvierControl.Drive_Speed && m_stDrvierControl.Drive_Speed > 0) //正向加速
{
Speed = Speed + 50;
if (Speed > m_stDrvierControl.Drive_Speed)
Speed = m_stDrvierControl.Drive_Speed;
}
else if (Speed > m_stDrvierControl.Drive_Speed && m_stDrvierControl.Drive_Speed < 0) //反向加速
{
Speed = Speed - 50;
if (Speed < m_stDrvierControl.Drive_Speed)
Speed = m_stDrvierControl.Drive_Speed;
}
else if (Speed > m_stDrvierControl.Drive_Speed && m_stDrvierControl.Drive_Speed > 0) //正向减速
{
Speed = Speed - 50;
if (Speed < m_stDrvierControl.Drive_Speed)
Speed = m_stDrvierControl.Drive_Speed;
}
else if (Speed < m_stDrvierControl.Drive_Speed && m_stDrvierControl.Drive_Speed < 0) //反向减速
{
Speed = Speed + 50;
if (Speed > m_stDrvierControl.Drive_Speed)
Speed = m_stDrvierControl.Drive_Speed;
}
else if (m_stDrvierControl.Drive_Speed == 0)
Speed = 0;
//行走方向显示
if (Speed > 0)
{
m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.RunStaControl_u.bits.GotoLoading = true;
m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.RunStaControl_u.bits.GotoUnloading = false;
}
else if(Speed < 0)
{
m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.RunStaControl_u.bits.GotoLoading = false;
m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.RunStaControl_u.bits.GotoUnloading = true;
}
else
{
m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.RunStaControl_u.bits.GotoLoading = false;
m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.RunStaControl_u.bits.GotoUnloading = false;
}
//急停
if (m_pMainWnd->m_pPlcDeviceDlg->m_stPLCTOAGVDATA.SafeState_u.bits.AGVEstop)
Speed = 0;
TRACE("%d\n\r", Speed);
acData[0] = 0x23;
acData[1] = 0x00;
acData[2] = 0x20;
acData[3] = 0x01;
acData[4] = (uint8_t)((((uint32_t)Speed) & 0xff000000) >> 24);;
acData[5] = (uint8_t)((((uint32_t)Speed) & 0xff0000) >> 16);
acData[6] = (uint8_t)((((uint32_t)Speed) & 0xff00) >> 8);
acData[7] = (uint8_t)(((uint32_t) Speed) & 0xff);
//发送驱动速度
SendCanData(0, 1, m_nSendFrameTypeIdx1, m_nSendFrameFormatIdx1, Drive_acId, acData); //驱动电机
Sleep(8);
acData[0] = 0x23;
acData[1] = 0x02;
acData[2] = 0x20;
acData[3] = 0x01;
acData[4] = (uint8_t)((((uint32_t)m_stDrvierControl.Diversion_Position) & 0xff000000) >> 24);;
acData[5] = (uint8_t)((((uint32_t)m_stDrvierControl.Diversion_Position) & 0xff0000) >> 16);
acData[6] = (uint8_t)((((uint32_t)m_stDrvierControl.Diversion_Position) & 0xff00) >> 8);
acData[7] = (uint8_t)(((uint32_t) m_stDrvierControl.Diversion_Position) & 0xff);
//发送转向位置
SendCanData(0, 1, m_nSendFrameTypeIdx1, m_nSendFrameFormatIdx1, Diversion_Id, acData); //转向电机
Sleep(8);
LastSpeed = Speed;*/
}
void CDriverMainDlg::OnBnClickedBtnSendMan()
{
UINT32 acId = 0x023;
char acData[8] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
SendCanData(0, 0, m_nSendFrameTypeIdx0, m_nSendFrameFormatIdx0, acId, acData);
}
UINT CDriverMainDlg::SendCanThread(LPVOID v)
{
CDriverMainDlg *dlg = (CDriverMainDlg*)v;
while ( 0 == dlg->m_StopSendFlag)
{
UINT32 acId = 0x11;
char acData[8] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 };
dlg->SendCanData(0, 1, dlg->m_nSendFrameTypeIdx0, dlg->m_nSendFrameFormatIdx0, acId, acData);
Sleep(10);
}
return 0;
}
void CDriverMainDlg::OnBnClickedAutoSend()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if (m_bAutoSend)
{
m_StopSendFlag = 0;
//开启接收线程
AfxBeginThread(SendCanThread, this);
}
else
m_StopSendFlag = 1;
}
void CDriverMainDlg::OnBnClickedCheckAutoRefreshShow()
{
// TODO: 在此添加控件通知处理程序代码
if (m_bAutoRefresh)
{
m_pstVirtualList->StartAutoRefresh(10);
}
else
{
m_pstVirtualList->StopAutoRefresh();
}
}
void CDriverMainDlg::OnBnClickedBtnSendMan2() //电机使能
{
UINT32 acId = 0x6000001;
char acData[8] = { 0x23, 0x0D, 0x20, 0x01, 0x00, 0x00, 0x00, 0x00 };
SendCanData(0, 1, m_nSendFrameTypeIdx1, m_nSendFrameFormatIdx1, acId, acData);
}
UINT CDriverMainDlg::SendCanThread2(LPVOID v)
{
/*CCanDeviceDlg *dlg = (CCanDeviceDlg*)v;
char acData[8] = { 0 };
static uint8_t Enable_time = 0;
static uint8_t Brake_time = 0;
while (0 == dlg->m_StopSendFlag2)
{
/速度不为0 打开刹车
if (dlg->m_stDrvierControl.Drive_Speed != 0)
{
dlg->m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.AGVControl_u.bits.Brake = 1;
Brake_time = 0;
}
else
Brake_time++;
if (Brake_time > 20 || E_STOP == dlg->m_nAgvAction) //正常停车计时 || 急停立马刹车
{
Brake_time = 100;
dlg->m_pMainWnd->m_pPlcDeviceDlg->m_stAGVTOPLCDATA.AGVControl_u.bits.Brake = 0;
}
dlg->SendCanData();
}*/
return 0;
}
void CDriverMainDlg::OnBnClickedAutoSend2()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
if (m_bAutoSend2)
{
m_StopSendFlag2 = 0;
//开启发送线程
AfxBeginThread(SendCanThread2, this);
}
else
m_StopSendFlag2 = 1;
}
int before_trafficstop_action;
int before_safestop_action;
void CDriverMainDlg::OnBnClickedButtonAgvstop()
{
// TODO: 在此添加控件通知处理程序代码
m_nAgvAction = A_STOP;
before_trafficstop_action = -1;
before_safestop_action = -1;
}
void CDriverMainDlg::OnBnClickedButtonAgvestop()
{
// TODO: 在此添加控件通知处理程序代码
m_nAgvAction = E_STOP;
before_trafficstop_action = -1;
before_safestop_action = -1;
}
void CDriverMainDlg::OnBnClickedButtonAgvforward()
{
// TODO: 在此添加控件通知处理程序代码
m_nAgvAction = FORWARD;
}
void CDriverMainDlg::OnBnClickedButtonAgvbackward()
{
// TODO: 在此添加控件通知处理程序代码
m_nAgvAction = BACKWARD;
}