0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

新功能发布 | TSMaster如何实现J1939多帧报文收发

上海同星智能科技有限公司 2022-09-06 10:01 次阅读

前言

众所周知,J1939协议是由美国汽车工程师协会(SAE)定义的一组标准。J1939标准用于卡车、公共汽车和移动液压等重型车辆。如今大多数车辆都通过CAN进行ECU通信。但是CAN总线仅仅是提供了通信的基础(就像是电话),但是没有提供对话的“语言”来进行更复杂的操作。所以在大多数大型车辆中,这个“语言”就是SAE定义的J1939标准。

今天我们继续来介绍TSMaster新功能—J1939多帧报文收发。这个功能属于J1939的高级功能,需要license的授权,具体操作需求可以联系我们。

J1939功能使用

Use of J1939 functionality/

我们假设已经拥有了带license的硬件,以TC1005为例,选择硬件通道后连接应用程序,随后打开about窗口,就可以看到拥有license的列表。其中有一个J1939的option,接下来介绍这个功能的使用。

fde64bf8-2af9-11ed-9ade-dac502259ad0.pngfe14fade-2af9-11ed-9ade-dac502259ad0.pngfe2b3b64-2af9-11ed-9ade-dac502259ad0.png

> 首先打开TSMaster的安装目录,进入demo文件夹,找到示例数据库J1939ILDemo的数据库文件。我们将其拖入TSMaster中,这个拖入的过程需要在程序断开连接的时候来完成,可以看到,这个数据库里面有四帧报文,它的PGN分别为EF00,EF00,FF02和FF01。

fde64bf8-2af9-11ed-9ade-dac502259ad0.pngfe6f0f4c-2af9-11ed-9ade-dac502259ad0.pngfe2b3b64-2af9-11ed-9ade-dac502259ad0.png

> 其中前两帧为点对点的多帧,分别是节点2往1发,1往2发;后两个是广播,分别是地址2的广播和地址1的广播。以第一帧为例,他的DLC=35个字节,这意味着这个信号可以在这35乘以8,也就是280个位置里面任意排布。那么报文中的sgn1~4就是模拟了这种情况。如果希望发送这些报文,我们可以直接使用发送窗口,我们打开CAN Transmit窗口,点击左上角的来自数据库的按钮,选择刚才看到的四帧报文,然后再将视图切换成J1939,这样协议相关的信息就一览无余了。

fde64bf8-2af9-11ed-9ade-dac502259ad0.pngfed61642-2af9-11ed-9ade-dac502259ad0.pngfe2b3b64-2af9-11ed-9ade-dac502259ad0.png

前两个是点对点,后两个是广播,可以从目的地址看出来,对于广播报文来讲,发送节点只要自顾自的发送就可以了。而对于前两个点对点的发送过程,不但需要发送节点,还需要接收节点在过程中进行应答,才能完成整个发送过程。所以我们还需要激活TSMaster内置的J1939的仿真节点。

> 接下来我们来到仿真,J1939的仿真配置对话框里面,可以看到节点1和2,分别被标注为Node1和Node2,所有的节点都勾选了仿真发送功能,但是仿真接收功能默认是没有勾选的。我们可以通过激活rbs的方法来自动激活这两个接收的功能,同时呢也可以手动勾上,在此我们就手动勾选,并且点击应用设置来关闭对话框。

fde64bf8-2af9-11ed-9ade-dac502259ad0.pngff302e70-2af9-11ed-9ade-dac502259ad0.pngfe2b3b64-2af9-11ed-9ade-dac502259ad0.png

> 这个时候就可以启动仿真了,我们按下F5,然后打开trace窗口,随后呢我们激活这4个节点的这4个报文的发送,就依次点击发送就可以了。于是在右侧的trace窗口中间就可以看到这4个多帧报文的接收情况。他们的DLC分别是右边的35,36,13和33,然后右边显示的就是他们的默认的数据段默认都是0。

fde64bf8-2af9-11ed-9ade-dac502259ad0.pngff9635ee-2af9-11ed-9ade-dac502259ad0.pngfe2b3b64-2af9-11ed-9ade-dac502259ad0.png

>我们当然可以修改他们的数据字节来任意的修改他们的数据,那这里就可以看到这是我们刚才修改的结果,我们当然还可以通过信号生成器的方式来改,比如说我们选中第一帧报文,在这个sgn1 a2上面选择正弦,然后点击配置,我们可以把峰值改的稍微大一点,然后点击应用、点击启动,这个时候就可以看到这个sgn1 a2就在发生变化。

fde64bf8-2af9-11ed-9ade-dac502259ad0.pngfff0efc0-2af9-11ed-9ade-dac502259ad0.pngfe2b3b64-2af9-11ed-9ade-dac502259ad0.png

> 接下来可以打开图形窗口,将这个信号拖进来,就可以看到正弦波,当然这个正弦波的频率比较低,这是因为它是多帧,它发一帧需要200毫秒,所以一秒只有5个点,我们还可以通过其他的窗口来进行观察,比如说数值显示。

fde64bf8-2af9-11ed-9ade-dac502259ad0.png00498662-2afa-11ed-9ade-dac502259ad0.pngfe2b3b64-2af9-11ed-9ade-dac502259ad0.png

> 最后我们打开数值显示,点击这里的添加按钮,可以选择我们的信号,当然我们也可以通过拖动的方式将信号拖进去,之后可以调整窗口的大小,使得信号值可以在上面显示。我们还可以通过面板的方式添加,当然面板需要设计,所以首先需要停止仿真,停止仿真之后我们可以将信号拖入面板,再启动仿真,然后再启动报文的发送,这样就可以看到这些信号都可以在测量窗口里面正确的显示。

J1939一系列API函数

J1939 A series of API functions/

J1939有一套API的函数,通过这一套API就可以实现J1939的信号读写、报文发送等等一系列功能。

> 我们打开一个自动化模块,然后选中入口点,按回车增加一系列的动作。我们选第一个动作,然后设置他为API函数调用,在过滤器里面敲入1939,就可以看到1939的一系列API。这其中有1939的标识符的get和set方法以及下面的多帧报文的发送方法。关于标识符的get和set方法在此就不展开描述,大家完全可以查看c代码编辑器里面的小程序的帮助文档,里面有详细的介绍,在右侧也可以看到示例代码。那么这次我们着重介绍一下1939的多帧发送的API。

fde64bf8-2af9-11ed-9ade-dac502259ad0.png00ae3922-2afa-11ed-9ade-dac502259ad0.pngfe2b3b64-2af9-11ed-9ade-dac502259ad0.png

> 首先我们可以选中1939异步发送API,那么发送分为同步和异步两种,同步意味着发完之后程序才会往下走,异步则意味着只要将数据推入发送缓存,程序就可以继续往下,那么不管是同步还是异步,还分了两种类型。一种是不带字符串的发送,一种是基于字符串的发送。那么基于字符串方式的发送,他的数据是以逗号来进行分隔,那么这两种方式自动化模块都是支持的。因为在自动化模块里面,数组均以逗号分隔的字符串表达,那么我们可以选择一个异步发送,函数就可以看到这个函数有7个输入的参数

fde64bf8-2af9-11ed-9ade-dac502259ad0.png0112fd44-2afa-11ed-9ade-dac502259ad0.pngfe2b3b64-2af9-11ed-9ade-dac502259ad0.png

>那么第一个参数是通道号,我们可以选择常量,比如说,channel1然后PGN,在此我们就可以输入。比如说我们可以选广播,就是刚才看到的OxFF01,然后优先级是6,默认源地址是2,目的地址是1,然后PDU的数据我们可以随意填写。比如说Ox11,然后我们可以将这个复制多份,密贴多份,这里长度是可以很长。他的实际长度是被最后一个参数限制,那么在此我们可以保持跟dbc的一致,也就是35,然后我们就可以启动,按F9启动发送或者点击发送按钮,那么就可以发送成功。

fde64bf8-2af9-11ed-9ade-dac502259ad0.png01614b48-2afa-11ed-9ade-dac502259ad0.pngfe2b3b64-2af9-11ed-9ade-dac502259ad0.png

> 我们就可以看到trace窗口里面显示的发送的信号内容跟我们的设置是一模一样,最后如果说数据不够,就会以0来补充。那么我们可以把数据填多一点,再启动发送,这样的话,数据长度就会正好达到我们的所需要的长度。

fde64bf8-2af9-11ed-9ade-dac502259ad0.png01ac4fbc-2afa-11ed-9ade-dac502259ad0.pngfe2b3b64-2af9-11ed-9ade-dac502259ad0.png

那这是原始报文的发送方法,倘若需要修改报文里面的信号的值,就需要rbs的仿真引擎来支持,那我们可以点击CAN总线仿真窗口来模拟节点的行为,我们激活这两个节点,然后将总线仿真设置为自动启动,这个时候可以看到rbs已经在工作了,并且得到了我们通过发送窗口一样的结果。

> 当然发送窗口这个时候是不应该启动发送,回到自动化模块里面,删除我们的原始的报文发送的动作,设置一个新的动作衍生函数调用,在此我们搜索set Signal by address,通过这个函数就可以实现rbs里面信号的任意修改。那这里有两个参数,分别是信号地址和值,那么信号地址就是我们所需要发送的信号的数据库地址,我们可以随便选一个比如说A_Node1 signal 1_a1,我们可以点击复制数据库地址,然后到这里粘贴即可,然后他的值我们可以随意修改,然后我们可以点击启动,那么这样就实现了这个信号的修改,可以看到A_Node1里面的这个信号已经变成1111,就是我们所设置的值,那么这就是信号的发送。

fde64bf8-2af9-11ed-9ade-dac502259ad0.png0200123c-2afa-11ed-9ade-dac502259ad0.pngfe2b3b64-2af9-11ed-9ade-dac502259ad0.png

如果是希望接收一个信号的值,该怎么做呢?

我们可以用到signal server的方法:还是来到函数调用,删除我们刚才的发送,然后再多加几个动作。我们首先将它改为函数调用,然后输入SGN SRV,这就是signal server的系列函数。

> 那这里需要一个流程,首先需要注册我们关心的信号,需要用到register_can_signal_by_message ID或者是name,我们在这里选择message ID,那么我们就需要到rbs里面去copy这个报文的ID,copy过来的时候需要把后面的x删掉,让这个字符串是一个有效的16进制值,通道还是可以用之前的通道1,然后信号名称就是我们关心的信号。

fde64bf8-2af9-11ed-9ade-dac502259ad0.png02552524-2afa-11ed-9ade-dac502259ad0.pngfe2b3b64-2af9-11ed-9ade-dac502259ad0.png

> 比如说sgn1_a1,我们自己直接输入sgn1_a1,client ID是这个函数注册成功之后给到我们程序的一个handle,我们可以新建个变量来存储它,就命名ID就行。这个时候直接已经可以点击本地变量关联我们的ID,然后我们可以等一会再读取信号的值,那这个时候可以调用wait函数,比如说等个3秒,然后接下去就是一个读取过程,同样用到了Signal server sgnsrv get_can_signal物理值。最后通过这个方法去取得,得到的信号的物理值,那么在这里可以同样选择channel1 client ID就填我们刚才所得到的变量ID,然后这里就是输出的值,我们同样可以用一个变量来装,这里需要添加的就是个double型的变量,value写个v就行,然后在这个地方选择v,然后同时还会返回最后的时间戳,如果不需要的话,我们这里默认填个0就行或者不填。

fde64bf8-2af9-11ed-9ade-dac502259ad0.png02afb2aa-2afa-11ed-9ade-dac502259ad0.pngfe2b3b64-2af9-11ed-9ade-dac502259ad0.png

> 然后这个时候我们可以将我们读到的值打印出来,这时候就需要用到log函数字符串,我们可以写我们的变量v的值作为字符串,那么log level,可以用一种颜色,比如说绿色,然后我们点击启动,这个时候首先获取ID等待,然后最后获取值结束,那么我们会看一下每一步骤的运行结果。在这里都有反馈,这里是实际传入的参数值,wait然后读到的参数值然后我们可以看一下打印出来值就是111,就是我们之前设定的值,那么我们完全可以改一下这个值,比如说改成12345,这个值最大就是2047,我们就设它为2047,这个时候我们只要再启动一下程序,我们打开log,就可以看到我们获取的值跟我们设定值是一样。这就是1939系列API的用法。

fde64bf8-2af9-11ed-9ade-dac502259ad0.png02f8562c-2afa-11ed-9ade-dac502259ad0.pngfe2b3b64-2af9-11ed-9ade-dac502259ad0.png

以上就是我们本期介绍的TSMaster新功能之J1939多帧报文的收发,我们下期再见!(具体操作解说可以观看我们B站视频哦)

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 汽车
    +关注

    关注

    12

    文章

    2981

    浏览量

    36063
收藏 人收藏

    评论

    相关推荐

    在STM32的CAN收发通信中,接收超时为什么不能发出一个报文功能

    在STM32的CAN收发通信中,当接收超时(即在限定的时间内仍然没有接收到数据),发出一个报文功能,查询pending的返回值,为什么不能实现这个
    发表于 03-29 07:11

    TSMaster 2024年1月最新版本,新功能太实用

    2024年1月底,TSMaster软件迎来一波重磅更新!本次版本更新包括5大模块功能重点升级,新增2大功能模块,比如工具箱支持多线程和多语言、API添加的周期报文变得更加精确、仿真模块
    的头像 发表于 02-19 12:12 408次阅读
    <b class='flag-5'>TSMaster</b> 2024年1月最新版本,<b class='flag-5'>新功能</b>太实用

    TC3xx连续发CAN报文,超过40就死机了怎么解决?

    之前的应用只发送几个报文很正常,今天测试连续发送100(for循环内)时,发现最多只能连续发送40,超过40就死机了,不知道能从哪个标志上看出原因?如果遇到这种应用有啥好方法吗?
    发表于 02-06 07:18

    求助,为什么在CAN数据库(.dbc文本文件)中找不到报文

    我有CAN数据库(dbc文件)。这是一个文本文件。此文件的扩展名为 dbc。在Vector CANdb++编辑器中打开它时,将填充J1939报文和CAN ID。 但是,在.dbc文本文件中找不到
    发表于 01-23 06:28

    TSMaster报文发送的信号生成器操作说明

    信号生成器功能TSMaster分析中的报文发送模块。信号生成器用于发送和配置每个CAN/LIN信号的值变化行为,简而言之,这是一个可以控制和调整CAN/LIN信号值的功能。我们可选择
    的头像 发表于 12-23 08:21 317次阅读
    <b class='flag-5'>TSMaster</b><b class='flag-5'>报文</b>发送的信号生成器操作说明

    如何在TSMaster中对常用总线报文信号进行过滤?

    TSMaster软件平台支持对不同总线(CAN、LIN、FlexRay)的报文和信号过滤,过滤方法一般有全局接收过滤、数据流过滤、窗口过滤、字符串过滤、可编程过滤,针对不同的总线信号过滤器的使用方法
    的头像 发表于 12-16 08:21 235次阅读
    如何在<b class='flag-5'>TSMaster</b>中对常用总线<b class='flag-5'>报文</b>信号进行过滤?

    SAE J1939网络层与应用层#J1939 #汽车总线

    汽车总线网络层
    北汇信息POLELINK
    发布于 :2023年11月27日 11:23:33

    SAE J1939数据链路层#J1939 #汽车总线

    数据汽车总线
    北汇信息POLELINK
    发布于 :2023年11月21日 15:54:14

    SAE J1939协议解读--什么是J1939?#汽车总线 #J1939

    汽车总线
    北汇信息POLELINK
    发布于 :2023年11月15日 18:16:32

    SAE J1939协议解读

    在乘用车领域比较熟知的是CAN(FD)、LIN、FlexRay、Ethernet等通信协议,但对于J1939往往所知甚少。其实在CAN总线协议诞生之初,J1939协议便随之诞生,并且始终在商用车
    的头像 发表于 11-09 08:25 1236次阅读
    SAE <b class='flag-5'>J1939</b>协议解读

    一分钟带你了解TSMaster小程序编辑代码智能提示功能

    本文给大家带来TSMaster小程序编辑的新功能,其中主要包含:代码编辑智能提示功能、可用外部代码编辑器编辑小程序代码并同步。本文关键字:C小程序、Python小程序、代码智能提示、外部代码编辑器
    的头像 发表于 10-28 08:22 1216次阅读
    一分钟带你了解<b class='flag-5'>TSMaster</b>小程序编辑代码智能提示<b class='flag-5'>功能</b>

    CAN总线之J1939地址定义

    SAE J1939(以下简称J1939)是美国汽车工程协会(SAE)的推荐标准,广泛用于是商用车(重卡、大客车等道路车辆和工程机械、农业机械、轨道机车、船舶等非道路车辆及设备)上电子部件间的数字通讯
    的头像 发表于 08-15 10:47 1954次阅读
    CAN总线之<b class='flag-5'>J1939</b>地址定义

    TSMaster功能—Python小程序如何导入外部库

    今天给大家介绍TSMaster功能之Python小程序如何导入外部库。通过在TSMaster默认的解析器路径下导入外部库来介绍,以便我们去使用Python外部库。TSMaster默认P
    的头像 发表于 08-14 10:06 669次阅读
    <b class='flag-5'>TSMaster</b>小<b class='flag-5'>功能</b>—Python小程序如何导入外部库

    干货分享 | TSMaster标定模块自动化控制应用指南

    二、标定自动化控制场景与TSMaster实例2.1C脚本实现控制标定模块的启动与关闭的设计2.2C脚本代码实现2.3测试与验证C脚本的标定功能三、通过python调用
    的头像 发表于 06-21 17:45 509次阅读
    干货分享 | <b class='flag-5'>TSMaster</b>标定模块自动化控制应用指南

    干货分享 | TSMaster功能之如何在图形中监控某一条DBC报文发送周期?

    今天给大家介绍TSMaster功能之如何在图形中监控某一条DBC报文发送周期,想要实现这个功能,需要借助
    的头像 发表于 05-09 15:48 813次阅读
    干货分享 | <b class='flag-5'>TSMaster</b>小<b class='flag-5'>功能</b>之如何在图形中监控某一条DBC<b class='flag-5'>报文</b>发送周期?