网站首页 > 技术文章 正文
摘要:CAN是控制器局域网络(Controller Area Network,CAN)的简称,是由以研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO 11898),是国际上应用最广泛的现场总线之一。本文将CAN总线的报文信息,存储在excel和dbc文件中,并利用python分别解析两种不同格式的文件,生成一个合理的GCKontrol模型,最终在GCAir中进行集成,实现端口和FMU的快速连线。
一、CAN总线
CAN 是Controller Area Network 的缩写(以下称为CAN),是ISO国际标准化的串行通信协议。在汽车产业中,出于对安全性、舒适性、方便性、低功耗、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的数据类型及对可靠性的要求不尽相同,由多条总线构成的情况很多,线束的数量也随之增加。为适应“减少线束的数量”、“通过多个LAN,进行大量数据的高速通信”的需要,1986年德国电气商BOSCH公司开发出面向汽车的CAN通信协议。此后,CAN通过ISO11898及ISO11519进行了标准化,在欧洲已是汽车网络的标准协议。
CAN 的高性能和可靠性已被认同,并被广泛地应用于工业自动化、船舶、医疗设备、工业设备等方面。现场总线是当今自动化领域技术发展的热点之一,被誉为自动化领域的计算机局域网。它的出现为分布式控制系统实现各节点之间实时、可靠的数据通信提供了强有力的技术支持。
●CAN可以完成对通信数据的成帧处理
CAN总线通信接口中集成了CAN协议的物理层和数据链路层功能,可完成对通信数据的成帧处理,包括位填充、数据块编码、循环冗余检验、优先级判别等项工作。
●使网络内的节点个数在理论上不受限制
CAN协议的一个最大特点是废除了传统的站地址编码,而代之以对通信数据块进行编码。采用这种方法的优点是可使网络内的节点个数在理论上不受限制,数据块的标识符可由11位或29位二进制数组成,因此可以定义2或2个以上不同的数据块,这种按数据块编码的方式,还可使不同的节点同时接收到相同的数据,这一点在分布式控制系统中非常有用。数据段长度最多为8个字节,可满足通常工业领域中控制命令、工作状态及测试数据的一般要求。同时,8个字节不会占用总线时间过长,从而保证了通信的实时性。CAN协议采用CRC检验并可提供相应的错误处理功能,保证了数据通信的可靠性。CAN卓越的特性、极高的可靠性和独特的设计,特别适合工业过程监控设备的互连,因此,越来越受到工业界的重视,并已公认为最有前途的现场总线之一。
●可在各节点之间实现自由通信
CAN总线采用了多主竞争式总线结构,具有多主站运行和分散仲裁的串行总线以及广播通信的特点。CAN总线上任意节点可在任意时刻主动地向网络上其它节点发送信息而不分主次,因此可在各节点之间实现自由通信。CAN总线协议已被国际标准化组织认证,技术比较成熟,控制的芯片已经商品化,性价比高,特别适用于分布式测控系统之间的数据通讯。CAN总线插卡可以任意插在PC AT XT兼容机上,方便地构成分布式监控系统。
●结构简单
只有2根线与外部相连,并且内部集成了错误探测和管理模块。
●传输距离和速率
CAN总线特点:(1) 数据通信没有主从之分,任意一个节点可以向任何其他(一个或多个)节点发起数据通信,靠各个节点信息优先级先后顺序来决定通信次序,高优先级节点信息在134μs通信; (2) 多个节点同时发起通信时,优先级低的避让优先级高的,不会对通信线路造成拥塞; (3) 通信距离最远可达10KM(速率低于5Kbps)速率可达到1Mbps(通信距离小于40M);(4) CAN总线传输介质可以是双绞线,同轴电缆。CAN总线适用于大数据量短距离通信或者长距离小数据量通信,实时性要求比较高,多主多从或者各个节点平等的现场中使用。
在建模仿真中,我们需要使用CAN总线来对FMU或其他工程文件进行收发数据,一个模型中可能包含上千种不同的报文信息。如此多的报文信息,如果每一条都需要人为手动处理收发关系,那工作量将会非常巨大。下面我们将具体介绍,如何使用python解析各类CAN总线信号信息,将这些信号信息数据在GCKontrol软件中自动建模,最后在GCAir集成,实现自动连线。流程图如下:
二、自动创建模型——excel文件
在excel中分别定义收发数据的信号信息,如下图:
在python脚本中,获取以上信号,并将每一个信号名称作为输入和输出模块,在GCKontrol自动创建模型,如下图:
三、自动创建模型——dbc文件
▎3.1 CAN DBC
CAN DBC指的是CAN报文的数据库。简单地说,通过CAN总线通信的数据类型可以用DBC文件来读取和理解。DBC是一种基于ASCII的翻译,是在20世纪90年代发展起来的标准文件,现在正在被全世界的汽车工业所使用。这些文件可以通过描述CAN帧内的数据来帮助识别它。作为这些CAN数据库,文本文件包含了将原始CAN总线解码为物理值的信息。因此,它也在作为一个信号库发挥作用。
对于DBC文件来说,信号不是一个电气输入或输出,而是一个物理参数,如温度、发动机转速、电压等。DBC是处理8字节十六进制CAN报文和原始CAN数据的识别和转换的最常用方法。一个CAN帧中的数据可以分成8个单byte的值、64个单bit值、一个64bit值或这些值的任何组合。数据字段最多可以包含8个字节的数据。一个CAN帧可以包含0到64个单独的信号(对于64个通道,它们都将是二进制的)。
DBC文件包含以下信息:
◆当前信号报文的CAN ID
◆信号在CAN报文中出现的位置
◆信号的字节顺序
◆信号的转换细节
◆信号的单位
报文中包含以下信息:
◆CAN ID:传输报文时使用的CAN ID
◆报文的名称
◆CAN报文的类型(CAN标准帧/扩展帧或CAN FD标准帧/扩展帧)
◆数据长度代码(DLC)——CAN报文中数据的长度
◆发送器:传输报文的CAN节点/控制单元
信号中包含以下信息:
◆信号名称:消息中存在的信号名称
◆单位:信号中存在的物理数据单位
◆起始位:信号的起始位
◆位计数:信号的位计数
◆Byte Order:信号的字节顺序
◆类型:数据类型
◆Factor:信号的转换系数
◆Offset:信号的转换偏移
◆最小和最大的信号值
由此可见,DBC文件有助于了解哪些数据是通过CAN总线进行通信的。
▎3.2文件解析
用python解析标准格式的dbc文件,并生成对应的GCKontrol模型。如下图:
四、模型集成
之前我们介绍过如何在GCAir中导入总线,以及配置总线的各类信息,并在子系统中使用。
在2章节和3章节中,我们已经成功创建收发数据的模型工程,接下来可以选择封装为FMU导入到GCAir集成环境,或是直接将GCKontrol工程导入GCAir中。
在GCAir中导入CAN总线的dbc文件,配置在子系统上,如下图:
导入模型工程,如下图:
由于端口名称与FMU输入、输出名称一致,按住ctrl,依次选中端口和FMU模块,可以实现快速连线,如下图:
除此之外,实际应用中可能存在很多变量的FMU之间的连线,并且变量不同名。为了适应这些情况GCAir支持为变量设置别名,别名只是辅助快速连线的动作,连线完成后可删除这些别名而对已连好的线无影响,对其他数据也无影响。
在弹出的窗口中可以编辑输入变量和输出变量,点击“下载输出变量”,同样将连线另一端的FMU导出其输入变量。
编辑下载的输入变量CSV文件,将连线终止端的input变量,对应拷贝到连线起始端的Output变量别名列中,这样就完成output变量与input的变量的对应。编辑完保存文件。
一个输出变量可以给多个别名,即一个输出变量可以给到多个输入变量中。一个输入变量只能给一个别名,即一个输入变量只能接收一个变量。
将上述csv文件导入到GCAir中,即可按照自定义规则快速生成连线。
五、总结
通过上面的例子可以得知,无论CAN总线的信息是以什么文件方式储存的,GCKontrol都可以生成一个合理的模型,在GCAir的集成中,可以实现快速连线,减少重复的工作量,提升建模效率。
文章来源:世冠科技(globalcrown)
猜你喜欢
- 2024-11-27 「重磅」Xilinx下载文件破解及LUT在线可编程研究
- 2024-11-27 2020年4月Redis面试题和答案整理
- 2024-11-27 分析Redis key,value的size
- 2024-11-27 自主可控的PLC编程软件:kVPAC/Beremiz操作实践
- 2024-11-27 面试官:说说 Redis 的缓存雪崩、缓存穿透和缓存击穿问题
- 2024-11-27 Redis内存管理:配置与版本事项
- 2024-11-27 Kubernetes全栈架构师(Docker基础)--学习笔记
- 2024-11-27 串口通讯继电器-modbus通信上位机调试软件工具项目开发案例
- 2024-11-27 推荐:工业数字化系统开发用到的串口调试小助手
- 2024-11-27 读完这46道Redis面试题之后,你就会觉得自己的Redis白学了
- 11-27echarts图形报表的入门案例
- 11-27Echarts仿电梯运行图
- 11-27微信小程序开发之wepy 引入echarts统计图方法 亲测可用
- 11-27yarn安装echarts教程
- 11-27微信小程序使用 ECharts
- 11-274、echarts 如何画图?(必会)
- 11-27JavaScript 前端数据可视化——ECharts.js
- 11-27vue+echarts使用
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)