LDF文件第一部分——ldf文件配置
LIN_description_file; //LIN描述文件
LIN_protocol_version = 2.1;//LIN协议版本
LIN_language_version = 2.1; //LIN语言版本
LIN_speed = 19.2 kbps; //LIN的通信速度
第一部分是必不可少的,属于全局定义。我们可以把等号左边的看作固定值,右边的看作变量或者参数进行理解,比如version可以为2.0、2.1、2.2,版本要一致,不然版本不兼容,生成的ldf文件就报错
LIN的通信速度是以kbps(每秒千比特率)为单位的,范围是1.0-20.0ksps,一般由19.2和9.6这两个参数
LDF文件第二部分——节点定义
Nodes
{
Master: BCM,,5 ms, 0.1 ms; //主机节点,名称:ECC,时基:5ms,抖动:0.1ms
Slaves: RLS, IP; // 从机节点名称:RLS,IP
}
抖动(Jitter)为帧的同步间隔段的下降沿与帧时隙起始时刻相差的时间。时基(Time Base)为LIN子网的最小计时单位,通常设定为5ms或10ms。
帧时隙必须为时基的整倍数,并且起始于时基的开始时刻(称为时基的节拍(Tick)),切换到另一个进度表时一定要等到当前帧时隙的结束
从机节点注意不要主机节点设置进去,如果自己写脚本或者程序,注意判断从机节点这一列是否打了X或者被调用,如果没有被调用就不要加。加了应该也没事(狗头)
LDF文件第三部分——信号定义
Signals
{
KeyInSts: 1, 0, BCM, IP; //信号名称:KeyInSts,size_bit=1,初始默认值=0 ,发送节点=BCM,接收节点IP
AmbientTemperature: 8, 100, BCM, RLS,IP; //信号名称:AmbientTemperature,size_bit=8,初始值=100,发送节点=BCM,接收节点=RLS,IP
LowBeamReq: 24, {0,0,0}, RLS, BCM;
//信号名称:LowBeamReq,size_bit=24,初始值={0,0,0},以数组形式呈现,发送节点=RLS,接收节点=BCM
}
size_bit小于等于16时,信号的类型是Scalar,初始默认值为16进制,需要进行转换,如果为空默认为0,大于16时就是Byte Array(字节数组)
size_bit后的第一个值为发送节点,发送节点只能有一个
发送节点之后的全部都是接收节点,接收节点可以有多个
LDF文件第四部分——设置默认的诊断数据
Diagnostic_signals {
MasterReqB0: 8, 0 ; 主节点名称:8bit ,默认为0
MasterReqB1: 8, 0 ;
MasterReqB2: 8, 0 ;
MasterReqB3: 8, 0 ;
MasterReqB4: 8, 0 ;
MasterReqB5: 8, 0 ;
MasterReqB6: 8, 0 ;
MasterReqB7: 8, 0 ;
SlaveRespB0: 8, 0 ; 从节点名称:8bit ,默认为0
SlaveRespB1: 8, 0 ;
SlaveRespB2: 8, 0 ;
SlaveRespB3: 8, 0 ;
SlaveRespB4: 8, 0 ;
SlaveRespB5: 8, 0 ;
SlaveRespB6: 8, 0 ;
SlaveRespB7: 8, 0 ;
}
默认设置无需更改
LDF文件第五部分——数据帧定义
Frames { //帧定义
BCMSts1: 0x2, BCM, 3 { //帧名称:BCMSts1,帧ID:0x2,帧的发布节点:BCM,帧数据段字节
KeyInSts, 0;
//帧的信号名称:KeyInSts,对应列Messagename 帧中的偏移量:0,对应列LSB
HighBeamCmdSts, 1;
LeftTurnLampSts, 2;
RightTurnLampSts, 3;
LeftPositionlLampSts, 4;
RightPositionlLampSts, 5;
LeftPosLampFailSts, 6;
RightPosLampFailSts, 7;
LHFDoorSts, 8;
LHRDoorSts, 9;
RHFDoorSts, 10;
RHRDoorSts, 11;
RearLidSts, 12;
DashboardBrightness, 13;
KeySts, 16;
}
BCMSts2: 3, BCM, 3 { //十进制帧ID
WiperSwitchSts, 0; //帧的信号名称,帧中的偏移量
RLSSensitivityReq, 3;
VehicleSpeed, 8;
RearLidSts, 12;
DashboardBrightness, 13;
AmbientTemperature, 16;
RearLis, 12;
DashboardBrig, 13;
}
}
一个帧的帧ID可以是十六进制的也可以是十进制的
帧中信号的偏移量只能越来越高,从底到高顺序,最小值0,最大值为63,如果有其他帧信号,可以继续添加
LDF文件第六部分——诊断帧
Diagnostic_frames { //诊断帧
MasterReq: 0x3c { // 主节点诊断发送帧:MasterReq,帧ID:0x3c或者十进值60
MasterReqB0, 0 ;
MasterReqB1, 8 ;
MasterReqB2, 16 ;
MasterReqB3, 24 ;
MasterReqB4, 32 ;
MasterReqB5, 40 ;
MasterReqB6, 48 ;
MasterReqB7, 56 ;
}
SlaveResp: 0x3d { // 从节点诊断接收帧:SlaveResp,帧ID:0x3D或者十进值61
SlaveRespB0, 0 ;
SlaveRespB1, 8 ;
SlaveRespB2, 16 ;
SlaveRespB3, 24 ;
SlaveRespB4, 32 ;
SlaveRespB5, 40 ;
SlaveRespB6, 48 ;
SlaveRespB7, 56 ;
}
}
诊断帧的值和数据为固定的,不需要更改
LDF文件第七部分——从节点属性定义
Node_attributes { //从节点属性定义,与第二部分节点定义映射
IP {// 从节点名称
LIN_protocol = "2.1"; //与第一部分ldf文件配置映射
configured_NAD = 0x68; // NAD值范围为1-255,可以使用十六进制值,也可使用十进制
product_id =
0x2, // supplier_id (0-0x7FFE) 供应商id
0x1, // function_id (0-0xFFFE) 功能id
0x1; // variant (0-0xFF) 可变id
response_error = IPErrorSts; // 1比特错误信号 可不加
P2_min = 50 ms; // 最小间隔
ST_min = 0 ms; // 最小准本时间
N_As_timeout = 500 ms; // 非必要 诊断帧传输时间
N_Cr_timeout = 1000 ms; // 非必要 上一帧到下一个连续帧的发完的时间
configurable_frames
{
BCMSts1 ; //message name 或 message id 消息名称或消息id,与上文第五部分数据帧定义映射
IPSts;
}
}
}
P2_min: 从 LIN 子网接收到主机请求帧到 LIN 的从机节点准备好数据发送应答之间的最小时间间隔。
ST_min: 从机节点准备接收下一个帧(主机请求帧)或准备发送下一个帧(从机应答帧)的应答部分所需要的最小准备时间。
LDF第八部分——调度表信息
Schedule_tables {
LIN2NormalTable_IGNON { // 调度表
BCMSts2 delay 30 ms ; // 帧的延时
RLSSts delay 30 ms ;
}
LIN2NormalTable_IGNOFF {
BCMSts1 delay 15 ms ;
BCMSts2 delay 15 ms ;
IPSts delay 15 ms ;
RLSSts delay 15 ms ;
}
}
除了帧延时lin2.1版本默认Max.Frame Time[ms]为9.05,Min.Frame Time[6.46]
一个调度表会将所有帧延时加起来
调度表可以有多个,比如进度表、诊断发送表、诊断应答表等。
一般信号周期就是单纯的NORMAL(进度表)。然后将进度表的延时时间相加就是信号的周期时间。
LDF第九部分——信号编码定义
Signal_encoding_types{
KeyInSts_Encoding{//信号名称加上_Encoding
physical_value, 0, 254, 1.417, 0, "VehicleSpeed";
//类型,计算机最小值,计算机最大值,精度(factor),偏差(offset),单位(Unit),没有可以不加
logical_value, 0, "Close"; //表示类型是coding:logical_value,序号0,对应的是矩阵十六进制数字,coding值=Close
logical_value, 1, "Open"; //表示类型是coding:logical_value,序号1,对应的是矩阵十六进制数字,coding值=Open
}
HighBeamCmdSts_Encoding{
physical_value, 0, 254, 0.5, -40,"AmbientTemperature";
//类型,计算机最小值,计算机最大值,精度(factor),偏差(offset),单位(Unit):AmbientTemperature,没有可以不加
logical_value, 0, "No";
logical_value, 1, "Yes";
}
LeftTurnLampSts_Encoding{
physical_value, 0, 4, 1, 0, "DashboardBrightness";
logical_value, 0, "Sensitivity 1";
logical_value, 1, "Sensitivity 2";
logical_value, 2, "Sensitivity 3";
logical_value, 3, "Sensitivity 4";
logical_value, 4, "Sensitivity 5";
logical_value, 5, "Not Used";
logical_value, 6, "Not Used";
logical_value, 7, "Not Used";
如果数值太多,可以这样写
logical_value, 5, "0x5~0x7,Not Used";
}
}
获取计算机最大值最小值,需要进行计算,步骤如下:
如果偏移量大于等于0
计算机最大值(计算机最小值) = (物理最大值(物理最小值) – 偏移量)/ 精度(factor)
如果偏移量大于0
计算机最大值(计算机最小值) = (物理最大值(物理最小值) + 偏移量)/ 精度(factor)
LDF第十部分——信号coding和信号名称映射
Signal_representation {
KeyInSts_Encoding: KeyInSts // 信号coding和信号名称映射
HighBeamCmdSts_Encoding: HighBeamCmdSts
LeftTurnLampSts_Encoding: LeftTurnLampSts
}
本质上就是将物理值(physical_value)和coding值添加到对应的信号中去
如果写的脚本仅供自己使用的话,能读取Excel数据的语言都可以,优先选择有LDF API的语言。但是如果想做成工具、python使用qt,不要使用gui技术,因为有很多功能无法实现,java使用javafx技术。
生成dbc文件的话,推荐使用python,因为python内置的有dbc核心API,可以调用dbc核心api进行转换非常方便
原文:
(10条消息) LIN ldf文件配置_allen_nmk的博客-CSDN博客_ldf中的jitter如何设置
对其补充说明