⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 k8110testdlg.cpp

📁 CAN总线通讯模块
💻 CPP
📖 第 1 页 / 共 2 页
字号:

//节点校时
void CK8110TestDlg::OnCorrectime() 
{
	txbuff[0] = 3;
	txbuff[1] = 32;
	txbuff[2] = 0;
	txbuff[3] = 12;//BYTE(hr);
	txbuff[4] = 12;//66
	txbuff[5] = 00;//BYTE(sec);
		
	if (CAN_Trans(atoi(strtmp), txbuff, 50) != 1)
	{
        MessageBox("发送失败");	
    }
}

//生命节点检测
void CK8110TestDlg::OnNmtEc() 
{
	NMT_EC_flag = ! NMT_EC_flag;
	if (NMT_EC_flag)
	{
        SetTimer(4, 2000, NULL);
	}
	else
	{
		KillTimer(4);
    }	
}

//停止设备
void CK8110TestDlg::OnStopdev8110() 
{
	KillTimer(2);
	KillTimer(3);
	KillTimer(4);
    NMT_EC_flag = false;
}


//读数据块
int CK8110TestDlg::data_blockread()
{
	long nwrite;
	if (fifo_num > 3000)
	{
		return 0;
	}

	nwrite = CAN_ReadDataNum(atoi(strtmp));
	//PCI_FIFO数据量
	UpdateData(true);
	m_tmp_3.Format("%d", nwrite);
	UpdateData(false);

	if ((nwrite + fifo_num) > 3000)
	{
		nwrite = 3000 - fifo_num;
	}
	if (nwrite > 1000)
	{
		nwrite = 1000;
	}

	if (nwrite == 0)
	{
		return 0;
	}

	CAN_ReadBlockData(atoi(strtmp), nwrite, writebuff);
	FIFO_write(nwrite);
	return 1;
}

//信息读取
void CK8110TestDlg::FIFO_read(int nread)
{
	int i;
	for (i = 0; i <= nread - 1; i++)
	{
		readbuff[i] = FIFO[pread];
		pread = pread + 1;
		if (pread > 3000)
		{
			pread = pread - 3001;
		}
	}
	fifo_num = fifo_num - nread;
}

//信息写入
void CK8110TestDlg::FIFO_write(long nwrite)
{
	int i;
	for (i = 0; i <= nwrite - 1; i++)
	{
		FIFO[pwrite] = writebuff[i];
		pwrite = pwrite + 1;
		if (pwrite > 3000)
		{
			pwrite = pwrite - 3001;
		}
	
	}
	fifo_num = fifo_num + nwrite;

	UpdateData(true);
	m_tmp_2.Format("%d", pwrite);
	UpdateData(false);
	//Label17.Caption = CStr(pwrite)
}


void CK8110TestDlg::NMT_EC_PeriodSend()
{
	int i;
	txbuff[0] = 0x40;
	txbuff[1] = 0xE0;
	txbuff[2] = 0x0;

	if (CAN_Trans(atoi(strtmp), txbuff, 50) != 1)
	{
		MessageBox("发送失败 ");
		KillTimer(4);
	}
	
	CString l_tmp;
	for (i = 0; i <= 15; i++)
	{
		if (ETN_lifeflag1[i] == ETN_lifeflag2[i])
		{
			
			m_ctrlList.DeleteItem(i);
			m_ctrlList.InsertItem(i, "");	
			l_tmp.Format("%x", i);
			l_tmp.MakeUpper();
			m_ctrlList.SetItemText(i, 0 , "0" + l_tmp);
			m_ctrlList.SetItemText(i, 1, "未在线");
		}
			ETN_lifeflag2[i] = ETN_lifeflag1[i];
	}
}

//获取数据并分析(重点****)
int CK8110TestDlg::data_get()
{
    BYTE RXDLC;
    BYTE RXID[2];
    BYTE RXDATA[7];
    BYTE Frame_FC;
    BYTE Frame_NID;
    int i;
    int nread;
    int nid;
    BOOL RX_NMT_flag;
    int NMT_Status;
    int EXP_Status;
    CString str;
    int dat;
	CString ch_tmp;
	CString nmt_sta, exp_sta,rx_sta;
	CString fc_sta, nid_sta;
     
    if (fifo_num < 11)
	{
        return 0;
    }
    FIFO_read(11);
    RXDLC = readbuff[0] & 0xF;
    RXID[0] = readbuff[1];
    RXID[1] = readbuff[2];
    for (i = 0; i <= RXDLC - 1; i++)
	{
        RXDATA[i] = readbuff[i + 3];
    }
    nread = RXDLC + 3;
    
	UpdateData(true);
	m_tmp_1.Format("%d", pread);
	UpdateData(false);
    
	//接收的数据
    for (i = 0; i <= nread - 1; i++)
	{
        if (readbuff[i] < 16)
		{
			ch_tmp.Format("%x", readbuff[i]);
            str = str + " 0" + ch_tmp;
        }
		else
		{
			ch_tmp.Format("%x", readbuff[i]);
            str = str + " " + ch_tmp;
        }
    }
    str.MakeUpper();   

	//功能代码和结点标识符
    Frame_FC = static_cast<int>((RXID[0] & 0xF0) / (2*2*2*2));
	Frame_NID = 0x2F;
	Frame_NID = 0xE0;
    Frame_NID = ((RXID[0] & 0xF) * (2*2*2) + static_cast<int>((RXID[1] & 0xE0) / (2*2*2*2*2)));
    if (Frame_FC < 0x10)
	{
		ch_tmp.Format("%x", Frame_FC);
		ch_tmp.MakeUpper();
        fc_sta = "0" + ch_tmp;
	}
    else
	{
		ch_tmp.Format("%x", Frame_FC);
		ch_tmp.MakeUpper();
        fc_sta = "0" + ch_tmp;
    }
    if (Frame_NID < 0x10)
	{
		ch_tmp.Format("%x", Frame_NID);
		ch_tmp.MakeUpper();
        nid_sta = "0" + ch_tmp;
	}
	else
	{
		ch_tmp.Format("%x", Frame_NID);
		ch_tmp.MakeUpper();
        nid_sta = "0" + ch_tmp;
    }
	m_ctrlList2.InsertItem(0, "");
	m_ctrlList2.SetItemText(0, 0, str);
	m_ctrlList2.SetItemText(0, 1, fc_sta);
	m_ctrlList2.SetItemText(0, 2, nid_sta);
	//如果显示的行数大于50的话,去除多余数据
	if (m_ctrlList.GetItemCount() == 50)
	{
		m_ctrlList.DeleteAllItems();
	}

    
	//分析设备运行的状态
    nid = Frame_NID;
    if (nid > 15)
	{
        return 0;
    }
	ch_tmp.Format("%x", nid);
    str = "  0" + ch_tmp;
    if (Frame_FC == 0xE)
	{
        RX_NMT_flag = static_cast<int>((RXDATA[0] & 0x80) / (2*2*2*2*2*2*2));
        NMT_Status = RXDATA[0] & 0x7F;
        EXP_Status = RXDATA[1];
        ETN_lifeflag1[nid] = ! ETN_lifeflag2[nid];
        if (NMT_Status == 3)
		{
            ETN_flag[nid] = ! RX_NMT_flag;
        }
        if (RX_NMT_flag != ETN_flag[nid])
		{
            ETN_flag[nid] = RX_NMT_flag;
            rx_sta = "良好";
			
            if (NMT_Status == 5)
			{
                nmt_sta = "运行";
			}
			if (NMT_Status == 4)
			{
				nmt_sta = "停止";
			}
            if (NMT_Status == 127)
			{
                nmt_sta = "预运行";
			}
            if (NMT_Status == 3)
			{
                nmt_sta = "复位";
			}
			if (EXP_Status == 0)
			{
				exp_sta = "预初始化";
			}
			if (EXP_Status == 1)
			{
				exp_sta = "初始化";
			}
			if (EXP_Status == 2)
			{
				exp_sta = "等待";
			}
			if (EXP_Status == 4)
			{
				exp_sta = "停止";
			}
			if (EXP_Status == 5)
			{
				exp_sta = "运行";
			}
			if (EXP_Status == 6)
			{
				exp_sta = "暂停";
			}
			if (EXP_Status == 14)
			{
				exp_sta = "请求结束";
			}
			if (EXP_Status == 15)
			{
				exp_sta = "结束";
			}
		}
        else
		{
            rx_sta = "错误";
		}
		m_ctrlList.SetItemText(nid, 1, rx_sta);
		m_ctrlList.SetItemText(nid, 2, nmt_sta);
		m_ctrlList.SetItemText(nid, 3, exp_sta);
	}

    if (Frame_FC == 0x4)
	{
        str = "";
        for (i = 1; i <= RXDLC - 1; i++)
		{
            if (RXDATA[i] < 0x10)
			{
				ch_tmp.Format("%x", RXDATA[i]);
                str = str + " 0" + ch_tmp;
			}
            else
			{
				ch_tmp.Format("%x", RXDATA[i]);
                str = str + " " + ch_tmp;
            }
        }
	}
    else
	{
		if (Frame_FC == 0x6)
		{
			if (RXDATA[0] == 0x1)
			{
				str = "";
				for (i = 1; i <= 2; i++)
				{
					if (RXDATA[i] < 0x10)
					{
						ch_tmp.Format("%x", RXDATA[i]);
						str = str + " 0" + ch_tmp;
					}
					else
					{
						ch_tmp.Format("%x", RXDATA[i]);
						str = str + " " + ch_tmp;
					}
				}
				dat = RXDATA[3] + (RXDATA[4] & 0x7F) * 256;
				if ((RXDATA[4] & 0x80) == 0)
				{
					ch_tmp.Format("%d", dat);
					str = str + " " + ch_tmp;
				}
				else
				{
					ch_tmp.Format("%d", dat);
					str = str + " -" + ch_tmp;
				}
            }
        }
		else
		{
			if (Frame_FC == 0xC)
			{
				if (RXDATA[0] == 0x2F)
				{
					txbuff[0] = 0x1;
					txbuff[1] = (0xB0 | static_cast<int>((Frame_NID & 0x78) / (2*2*2)));
					txbuff[2] = ((Frame_NID & 0x7) * (2*2*2*2*2));
					txbuff[3] = 0x2F;
					CAN_Trans(atoi(strtmp), txbuff, 50);
				}
			}
		}
	}
	return 1;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -