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.1msSlaves: 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,接收节点IPAmbientTemperature: 8, 100, BCM, RLS,IP; //信号名称:AmbientTemperature,size_bit=8,初始值=100,发送节点=BCM,接收节点=RLS,IPLowBeamReq: 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 ,默认为0MasterReqB1: 8, 0 ;MasterReqB2: 8, 0 ;MasterReqB3: 8, 0 ;MasterReqB4: 8, 0 ;MasterReqB5: 8, 0 ;MasterReqB6: 8, 0 ;MasterReqB7: 8, 0 ;SlaveRespB0: 8, 0 ; 从节点名称:8bit ,默认为0SlaveRespB1: 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,对应列LSBHighBeamCmdSts, 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 { //十进制帧IDWiperSwitchSts, 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或者十进值60MasterReqB0, 0 ;MasterReqB1, 8 ;MasterReqB2, 16 ;MasterReqB3, 24 ;MasterReqB4, 32 ;MasterReqB5, 40 ;MasterReqB6, 48 ;MasterReqB7, 56 ;}SlaveResp: 0x3d { // 从节点诊断接收帧:SlaveResp,帧ID:0x3D或者十进值61SlaveRespB0, 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) 供应商id0x1, // function_id (0-0xFFFE) 功能id0x1; // variant (0-0xFF) 可变idresponse_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{//信号名称加上_Encodingphysical_value, 0, 254, 1.417, 0, "VehicleSpeed";
//类型,计算机最小值,计算机最大值,精度(factor),偏差(offset),单位(Unit),没有可以不加logical_value, 0, "Close"; //表示类型是coding:logical_value,序号0,对应的是矩阵十六进制数字,coding值=Closelogical_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: HighBeamCmdStsLeftTurnLampSts_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如何设置对其补充说明