CNA总线原理是什么

CNA总线原理是什么,第1张

现场总线就是用于现场仪表和控制器之问的一种全分散,全数字化,双向智能,多点多站,多变量的通信系统,是用于过程自动化和制造自动化最低层的现场设备或现场仪表互连的通信网络.()最初是由德国公司在二十世纪八十年代初期,为了解决汽车中众多控制器与测量设备之间的数据交换而开发的一种串行数据通信总线,属于现场总线的范畴,993年成为国际标准(011898:道路车辆的高速控制器局域网数字交换系统标准).总线是一种有效支持分布式控制系统或实时控制的串行通信网络,是一个多主总线,总线上的各节点都有权随时向其他节点发送信息,总线冲突是通过总线仲裁方式决定占用总线的节点.总线通信的传输介质可以是双绞线,同轴电缆或光纤,它可以通过简单的协议,实现在电磁干扰环境下远距离实时数据的可靠传输.总线描述的是/七层协议中的第一层和第二层的高速协议.总线的规范目前常见的是2.0和2.0版本.由于总线具有可靠性高,传输速率快,通信距离较远,易于使用,维护和网络扩展,目前已广泛应用于高档汽车(事实上是汽车中各控制部件之间通信的国际标准),火车,船舶,军工电子,医疗器械,农用器械,数控机床,机器人技术等诸多领域.2总线的主要特点总线的主要特点如下:(1)总线没有节点数量的限制,是一种多主总线,即总线上任一个节点均可在任意时刻主动向网络上的其他节点发送数据,而不分主从,因而通信非常灵活总线废除了传统的网络中节点站地址编码(如485,—一1553,它们的站地址由5位编码,因而最多只能有32个网络节点),代之以通信数据块进行编码,使得网络节点数理论上不受限制.对于相同功能的控制器,执行器可采用成组方式发送命令对于功能不同的控制器,传感器,执行器.则分别发送相应的命令,接收所需的数据(2).4总线采用非破坏性的总线仲裁,当多节点同时向总线发送报文()时,优先级低的节点主动停止数据发送(仲裁丢失),而优先级高的节点可以不受影响地八一科技现场总线技术简介】3继续发送数据,优先级最高的节点,其数据等等时间小于134,(3)总线具有点对点,一点对多点,以及全局广播传送数据的功能(4)总线将业务数据打包成报文发送,报文采用短帧结构,每一个报文的有效字节数最多为8个,保证传输时间短,提高了实时性,减少了受干扰而要求重发报文的几率,而且即使出错,自动重发的时间也很短(5)总线采用位校验,位填充校验,循环冗余码校验()和数据帧格式校验,数据出错概率一般在仃5以下,有效地保证了数据传输的正确性和可靠性(6)总线通信能力强,传输距离远,通信速率高.最远传输距离可达10,而最高传输速率可达1/总线系统内任意两个节点间的最大传输距离与传输位速率之间的关系如表1所示.袁系统节点传输距离与传输速率关系袁序号位速率(/)最大传输距离()000402503032527041255350620650】3∞72033∞8106700950(7)总线中,当节点出现重大故障时,可自动关闭总线,即当某一节点出错次数大于一定数量时,可自动退出总线 *** 作,切断该节点与总线上其他节点之间的联系,使总线上其他节点的 *** 作不受影响,使错误节点对总线的干扰降到最低程度.3总线的报文()总线系统中,各节点间以报文方式发送和接收命令或数据.总线有四种报文类型,即数据帧,远程帧,出错帧和过载帧,每种帧有其相应的帧格式.其中与应用层关系最密切的是数据帧和远程帧.3.1数据帧数据帧用于在发送节点到接收节点间传送数据,数据报文格式如图】所示.一个数据帧由7个"场()"组成:14现场总线技术简介八一科技1,34567一帧起始仲裁场控制场数据场校验场应答场帧结束帧起始(,,):由1个…0'位组成(在总线上为显性位),标志一个数据帧或远程帧的开始.节点只有在总线空阑时才能开始传输,接收节点必须同步于帧起始位的下降沿2,0110[卫[[02.0[29)●●11'1181日_1日40'图总线数据报文格式仲裁场(,):由报文标识符(,11/29)和1位(0)位组成.报文标识符的位数因报文格式的不同而不同仲裁场数据位的二进制数值越小,表示该报文的优先级越高.位用来表示接收节点要求远程发送节点向它发送报文时用若为(隐性位)表示该报文无数据场,而不管控制场中的数据长度码的数值为何.此时所有其它节点都可以检测网络中是否有相应的发送节点请求报文和可能的响应报文是两个完全不同的报文帧控制场(,):包含2个备用位(1,】)和4位数据长度码(4).若第1位()为0(显性位),表示报文无其它的标示位(标准报文格式),若为1,标示还有其它标识位(即扩展报文格式)0位为保留位.数据长度码的二进制数值就是报文中数据场所包含的字节数.数据场(,):数据场中包含的就是报文作要传送的数据.数据场中的数据个数与控制场中的数据长度码的二进制数值相同.数据场中的数据字节的个数最多为8个.校验场(,):0总线协议中采用循环冗余方式对接收报文的正确性进行检验,校验中包含有5位序列和位界定符(,"1",隐性位).校验码只用于检测发现错误,而不能校正错误.校验码的哈明距离()为6,因而可以检测出分散的6位错误,或检测出连续的15位错误.应答场(,):包含应答间隙和应答界定符各1位.发送节点发送的应答间隙和应答界定符皆为1(隐性位,),总线上所有收到正确报文的控制器将应答场的应答间隙由"1"(隐性位)改写为…0'(显性位,),发送节点0八一科技现场总线技术简介5借此确认它已正确发送完一个报文.若报文有误,或因优先级低,仲裁时退出,发送节点将在总线空闲时重发报文.需要说明的是当发送节点检测到正确的应答场的显性应答间隙时,不能保证接收节点应用程序已经正确收到报文,而只能说明数据报文已经正确地发送到总线上.

PGN – 参数组号码   (Parameter Group Number)的意思。

CAN技术的报文传输为多主方式工作,网络上任意节点均可在任意时刻主动地向网络上其它节点 发送信息,而不分主从。CAN节点只需通过对报文的标示符滤波即可实现点对点、一点对多点及全局广播等几种方式发送、接收数据。

CAN总线的数据传输(报文传输)采用帧格式。按帧格式的不同,分为含有11位标识符的标准帧和含有29位标识符的扩展帧。CAN总线的帧类型分为 数据帧、远程帧、错误帧和过载帧。

CAN与PGN的关系:

PGN是参数组编号,对于制定CAN协议来说十分重要,很多ECU在接受报文时识别的就是PGN而不是报文的ID,

扩展资料

CAN 总线的主要特点有:

( 1) CAN 为多主工作方式 ,网络上的任意节点在任意时刻都可以主动地向其他节点发送信息 ,不分主从 ,方式灵活。

( 2) CAN 网络节点可以安排优先级顺序 ,以满足和协调各自不同的实时性要求。

( 3) 采用非破坏性的总线仲裁技术 ,多点同时发送信息时 ,按优先级顺序通信 ,节省总线冲突仲裁时间 ,避免网络瘫痪。

( 4) 可以进行点对点、一点对多点和全域广播方式传递信息。

( 5) 通信速率最高可达 1M bps( 40m以内 ) ,最长传递距离达 10km(速率为 5kbps以下 )。

( 6) 网络节点目前可达 110个 ,报文标志符 2 032种 ( CAN2. 0A) ,扩展标准 ( CAN2. 0B)中报文标志符几乎不受限制。

参考资料来源:百度百科-can

void CCOMMUNICATIONSet::OnBtnStartcan() //“启动CAN”按钮

{

// TODO: Add

your control notification handler code here

if(m_connect==1) //如果已经连接

{

m_connect=0

m_startcanlight.SetIcon(m_hIConGrey1)

Sleep(500)

GetDlgItem(IDC_EDIT_BTR)->EnableWindow(!m_connect)

GetDlgItem(IDC_EDIT_STARTID)->EnableWindow(!m_connect)

GetDlgItem(IDC_EDIT_ENDID)->EnableWindow(!m_connect)

GetDlgItem(IDC_COMBO_BAUD)->EnableWindow(!m_connect)

GetDlgItem(IDC_COMBO_FILTER)->EnableWindow(!m_connect)

GetDlgItem(IDC_COMBO_MODE)->EnableWindow(!m_connect)

OnSelchangeComboBaud()

OnSelchangeComboFilter()

GetDlgItem(IDC_BTN_STARTCAN)->SetWindowText("启动CAN")

VCI_ResetCAN(m_devtype,m_devind,m_cannum)

VCI_CloseDevice(m_devtype,m_devind)//

此函数用以关闭设备。

return

}

//如果未连接

VCI_INIT_CONFIG

init_config//定义初始化CAN的数据类型的结构体

int index,mode,cannum,baud

UpdateData(true)//控件的值->变量

index=m_ComboIndex.GetCurSel()//设备索引号

mode=m_ComboMode.GetCurSel()//工作模式

cannum=m_ComboCANInd.GetCurSel()//第几路CAN

sscanf(m_strBTR, _T("%x"),

&baud)

m_devind=index//设备类型

m_cannum=cannum//第几路CAN

UpdateData(false)//变量值->控件显示

init_config.Mode=mode//模式

//滤波设置

DWORD

filterMode=m_ComboFilterMode.GetCurSel()//"滤波模式"

if

(filterMode!=2)

{

VCI_FILTER_RECORD filterRecord

filterRecord.ExtFrame=filterMode

UpdateData(TRUE)//控件的值->变量

DWORD

IDtemp

IDtemp=atoi(m_strStartID)//"滤波范围起始帧ID"字符转换为整形

//_stscanf_s(m_strStartID,

_T("%d"), &IDtemp)

filterRecord.Start =

IDtemp//Start:滤波范围的起始帧ID

IDtemp=atoi(m_strEndID)//"滤波范围结束帧ID"字符转换为整形

//_stscanf_s(m_strEndID,

_T("%d"), &IDtemp)

filterRecord.End=

IDtemp//End:滤波范围的结束帧ID

VCI_SetReference(m_devtype, m_devind,

cannum, 1, &filterRecord)//

设置报文滤波。为1表示 *** 作成功,0表示 *** 作失败

//使滤波表格生效

if

(VCI_SetReference(m_devtype, m_devind, cannum, 2,

NULL)!=STATUS_OK)//参数类型为2????????????????????

{

MessageBox(_T("设置滤波失败!"),

_T("警告"), MB_OK |

MB_ICONQUESTION)

VCI_CloseDevice(m_devtype,index)

return

}

}

m_connect=1

GetDlgItem(IDC_EDIT_BTR)->EnableWindow(!m_connect)//不激活"自定义波特率寄存器"编辑框

GetDlgItem(IDC_EDIT_STARTID)->EnableWindow(!m_connect)//不激活"滤波范围起始帧ID"编辑框

GetDlgItem(IDC_EDIT_ENDID)->EnableWindow(!m_connect)//不激活"滤波范围结束帧ID"编辑框

GetDlgItem(IDC_COMBO_BAUD)->EnableWindow(!m_connect)//不激活"波特率"组合框

GetDlgItem(IDC_COMBO_FILTER)->EnableWindow(!m_connect)//不激活"滤波模式"组合框

GetDlgItem(IDC_COMBO_MODE)->EnableWindow(!m_connect)//不激活"工作模式"组合框

GetDlgItem(IDC_BTN_STARTCAN)->SetWindowText("关闭CAN")//改变控件的文本内容

m_startcanlight.SetIcon(m_hIConGreen1)

VCI_StartCAN(m_devtype,m_devind,m_cannum)

AfxBeginThread(ReceiveThread,this)//启动线程,ReceiveThread为线程函数

//Sleep(8000)

}

UINT

CCOMMUNICATIONSet::ReceiveThread(void *param)//接收CAN报文 线程函数的定义

{

CCOMMUNICATIONSet *dlg=(CCOMMUNICATIONSet*)param

CListBox *box=(CListBox

*)dlg->GetDlgItem(IDC_LIST_INFO)

VCI_CAN_OBJ

frameinfo[50]//定义CAN信息帧数据类型的结构体

VCI_ERR_INFO

errinfo//定义错误信息数据类型的结构体

int len=1

int i=0

CString

str,tmpstr

while(1)

{

Sleep(1)

if(dlg->m_connect==0)//未连接

break

len=VCI_Receive(dlg->m_devtype,dlg->m_devind,dlg->m_cannum,frameinfo,50,200)//从指定的设备读取数据

if(len<=0)//没有读到数据

{

VCI_ReadErrInfo(dlg->m_devtype,dlg->m_devind,dlg->m_cannum,&errinfo)//获取最后一次错误信息

}

else//读到数据

{

for(i=0i<leni++)

{

str="接收到数据帧: "

if(frameinfo[i].TimeFlag==0)//无时间标识

tmpstr="时间标识:无 "

else

tmpstr.Format("时间标识:%08x

",frameinfo[i].TimeStamp)

str+=tmpstr//接收到信息帧时的时间标识

tmpstr.Format("帧ID:%08x

",frameinfo[i].ID)

str+=tmpstr//报文ID

str+="帧格式:"

if(frameinfo[i].RemoteFlag==0)

tmpstr="数据帧

"

else

tmpstr="远程帧

"

str+=tmpstr

str+="帧类型:"

if(frameinfo[i].ExternFlag==0)

tmpstr="标准帧

"

else

tmpstr="扩展帧

"

str+=tmpstr

box->InsertString(box->GetCount(),str)//插入字符串

if(frameinfo[i].RemoteFlag==0)//不是远程帧?

{

str="数据:"

if(frameinfo[i].DataLen>8)

frameinfo[i].DataLen=8

for(int

j=0j<frameinfo[i].DataLenj++)

{

tmpstr.Format("%02x

",frameinfo[i].Data[j])

str+=tmpstr

}

//EnterCriticalSection(&(dlg->m_Section))//获得指定的临界区对象的所有权

//LeaveCriticalSection(&(dlg->m_Section))//释放指定的临界区对象的所有权

box->InsertString(box->GetCount(),str)

}

CNaS_BMSDlg *m_Host =

(CNaS_BMSDlg*)AfxGetMainWnd()//获取主界面的指针

if(frameinfo[7].Data[2]!=1)

m_Host->xxx->m_page1.SendMessage(UM_ALARM,0,0)

}

box->SetCurSel(box->GetCount()-1)//box->GetCount():返回列表框中的字符串数目

}

}

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11362678.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存